我目前正在使用 Go 在以太坊网络上构建一个交易机器人。我正在通过 Uniswap V3 和 SushiSwap 的 API 检索数据,并且正在努力正确计算价格影响。
对于 Uniswap V3,我可以从 API 访问以下数据点:
对于SushiSwap(类似于Uniswap V2),我可以检索:
我知道对于SushiSwap,使用恒定乘积公式
x * y = k
,我可以通过模拟交易前后准备金的变化来得出价格影响。然而,我在将此方法应用于 Uniswap V3 时遇到了麻烦,因为它使用基于 sqrtPrice
和流动性的不同定价模型。
我想使用 Uniswap V3 和 SushiSwap 的 API 提供的数据来计算其价格影响。
我的具体问题是:
sqrtPrice
和流动性值中得出代币储备?我希望有任何示例或详细解释,尤其是 Go(如果可能的话),因为那是我正在使用的语言。
到目前为止,我尝试了两种不同的方法来计算 Uniswap V3 的价格影响:
sqrtPrice
和流动性直接计算:我尝试通过直接使用提供的sqrtPrice
和流动性模拟交易来计算价格影响。然而,这通常会导致不正确或极端的值,例如-100%的价格影响,特别是对于流动性低或无效的矿池sqrtPrice
。sqrtPrice
和流动性中得出储备金:我还尝试根据这些值计算代币储备金,并应用 SushiSwap 中使用的相同方法,但这也没有产生准确的结果,可能是由于 Uniswap V3 处理方式的差异定价。尽管做出了这些努力,我仍无法匹配实际 dApp 上显示的结果。任何有关如何正确计算 Uniswap V3 和 SushiSwap 价格影响的指导将不胜感激。
在 Uniswap v3 上,您可以直接向他们的报价者智能合约询问价格影响。
如何从 Uniswap V3 的 sqrtPrice 和流动性值中得出代币储备?
你不能,因为你不知道流动性的形状以及以 NFT 表示的个人范围内的流动性头寸。
一旦我有了储备金或任何其他必要的值,我应该如何计算价格影响?
其他必要的值包括 Uniswap v3 池中 CLMM 流动性的状态,这很难从以太坊 VM 状态中提取出来。直接调用报价者智能合约更简单。
SushiSwap 相当于 Uniswap v2,您可以找到大量如何计算 Uniswap v2 价格的示例,包括此处的教程。
从技术上讲,这些是“ABI”(应用程序二进制接口),它只是智能合约代码上的符号转储。 API 是您对 JSON-RPC 节点调用的内容。