我正在开发一个锚/solana 程序,该程序为多个池提供流动性,包括 saber.so 和 invariant.app。在交换期间,我需要计算 TVL,以公平的汇率提供代币。
我的问题是:计算链上 TVL 的最佳方法是什么?
以下是我想到的一些方法,每种方法都有其缺点:
(1) 计算链下计算,并将其作为预言机提供:
我们可以在链下计算 TVL,然后将该 TVL 作为预言机提供。缺点是:solana 上的 chainlink(一个预言机提供者)似乎不支持自定义数据馈送,就像以太坊一样。此外,该解决方案增加了应用程序的集中化,将它放在链上会很好。也可能存在耗尽协议储备的预言机攻击。
(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 个可以存入的池(因为 solana 的帐户限制为 4KB)
第二种选择似乎是要走的路,第一种选择是脱链并且容易受到预言机攻击。然而,第二个选项似乎仍然有点 hacky,因为我必须在任何时候包含这个数据结构来计算总 TVL。
是否有任何其他的设计理念浮现在您的脑海或您已经看到,这将是合适的?