Как рассчитать TVL в сети?

Я работаю над программой anchor/solana, которая обеспечивает ликвидность для ряда пулов, включая saber.so и invariant.app. Во время обмена мне нужно рассчитать TVL, чтобы предоставить токен по справедливому обменному курсу.

Мой вопрос: как лучше всего рассчитать TVL в сети?

Ниже приведены некоторые подходы, которые я имею в виду, каждый со своими недостатками:

(1) Рассчитайте вне цепочки и предоставьте это как оракул:

Мы могли бы рассчитать TVL вне сети, а затем предоставить этот TVL в качестве оракула. Недостатки: chainlink (поставщик оракула) на solana, похоже, не поддерживает пользовательские потоки данных, как в случае с ethereum. Кроме того, это решение увеличивает централизацию приложения, было бы неплохо иметь его в сети. также могут быть атаки оракулов, которые истощают резервы протокола.

(2) Иметь гигантский список ликвидных позиций:

Другой подход заключается в отслеживании всех позиций ликвидности, которым мы, как протокол, предоставили ликвидность. Хотя это возможно, я считаю, что это (очень быстро) достигнет лимита счета solana.

В этом случае у нас будет огромная учетная запись «состояние», которая отслеживает следующие переменные для каждого пула:

  • token1_mint: открытый ключ
  • token2_mint: открытый ключ
  • token1_amount: u64
  • token2_amount: u64
  • token1_to_currency_pyth_feed_address: Открытый ключ
  • token2_to_currency_pyth_feed_address: Открытый ключ
  • провайдер: u8

Учитывая, что у нас есть 4 * 32 + 2 * 64 байта + 8 байтов = 264 байта, у нас может быть около 20 пулов, которые мы можем внести в любой момент времени (из-за ограничения учетной записи 4 КБ на solana).

Второй вариант кажется подходящим, так как первый, если он не в сети и подвержен атакам оракулов. Тем не менее, второй вариант все еще кажется немного хакерским, так как мне придется включать эту структуру данных каждый раз, когда я собираюсь вычислить общий TVL.

Есть ли какие-либо другие дизайнерские идеи, которые приходят вам на ум или которые вы видели, которые были бы уместны?

1 ответ

Я мало знаю об общем дизайне вашей программы, чтобы предоставить вам хорошее решение. Я также не знаю, что такое инвариант, возможно, это нарушает то, что я собираюсь описать ниже.

Я предполагаю, что у вас есть некоторая инструкция в вашей программе, которая вызывает CPI в Sabre и т. д. и открывает позицию ликвидности. Предположим, что эта инструкция создает учетную запись в цепочке со следующей информацией:

      pool_address,
token_1_mint_address
token_2_mint_address
amount_token_1
amount_token_2
...

Одним из простых решений является перебор всех этих учетных записей, и, поскольку у вас есть количество и монетный двор каждого токена, вы можете рассчитать стоимость, используя что-то вроде оракула цены pyth. Я бы не стал делать это в цепочке, так как это может быстро стать довольно дорогим! Возможно, лучше всего сделать это на стороне клиента и записать эту информацию обратно в цепочку. В недавних видеороликах буткемпа solana на самом деле есть руководство по переносу информации о цепочке обратно в цепочку! https://www.youtube.com/watch?v=GwhRWde3Ckw&t=385s

Ниже приведена демонстрация ограничений времени выполнения программ в цепочке. Возможно, вы могли бы выполнить цикл по учетным записям пула, если вы используете некоторую индексацию и КПК для поиска адреса учетной записи и предполагаете, что у вас есть ограниченное количество позиций ликвидности! Однако я бы не стал жестко записывать всю информацию в одну учетную запись, это кажется неустойчивым подходом, который может вызвать много проблем в будущем. Однако может дать вам превосходную производительность, не уверен.

https://www.youtube.com/watch?v=5IrfSecDPeA&t=1191s

В любом случае ГЛ!

Другие вопросы по тегам