stepn跑鞋鏈遊系統開發技術說明及案例原始碼

xiaofufu發表於2023-02-24

Δx=Δ1P−−√⋅LΔy=ΔP−−√⋅LΔx=Δ1P⋅LΔy=ΔP⋅L


假設交易是輸入 x token ,餘額為 xx(預先扣除最大所需的手續費後的餘額,以防止手續費不足),在計算得到 ΔxΔx 後,比較:


當 x≥Δxx≥Δx 時,表示交易可以到達目標價格

當 x<Δxx<Δx 時,表示交易不足以到達目標價格,此時還需要進一步當前餘額 xremainingxremaining 全部耗盡時所能夠達到的價格

如果 x<Δxx<Δx,我們需要計算 x 耗盡時的價格,即已知 Δx, P−−√c, LΔx, Pc, L,求 P−−√nPn. 根據:


Δx=Δ1P−−√⋅L=±(1P−−√c−1P−−√n)⋅LΔx=Δ1P⋅L=±(1Pc−1Pn)⋅L


得出:


Pn−−√=LPc−−√L±ΔxPc−−√Pn=LPcL±ΔxPc


具體上述公式計算僅對透過 x token 餘額求出下一個價格的公式進行了推導,如果輸入的時 y token,也可以額進行類似的推導。程式碼中具體的實現已經封裝在在 SqrtPriceMath.getNextSqrtPriceFromInput 函式中

// 判斷是否能夠到達目標價

bool max = sqrtRatioTargetX96 == sqrtRatioNextX96;

 

// get the input/output amounts

if (zeroForOne) {

    // 根據是否到達目標價格,計算 amountIn/amountOut 的值

    amountIn = max && exactIn

        ? amountIn

        : SqrtPriceMath.getAmount0Delta(sqrtRatioNextX96, sqrtRatioCurrentX96, liquidity, true);

    amountOut = max && !exactIn

        ? amountOut

        : SqrtPriceMath.getAmount1Delta(sqrtRatioNextX96, sqrtRatioCurrentX96, liquidity, false);

} else {

    ...

}

 

// 這裡對 Output 進行 cap 是因為前面在計算 amountOut 時,有可能會使用 sqrtRatioNextX96 來進行計算,而 sqrtRatioNextX96

// 可能被 Round 之後導致 sqrt_P 偏大,從而導致計算的 amountOut 偏大

if (!exactIn && amountOut > uint256(-amountRemaining)) {

    amountOut = uint256(-amountRemaining);

}

 

if (exactIn && sqrtRatioNextX96 != sqrtRatioTargetX96) {

    // 如果沒能到達目標價,即交易結束,剩餘的 tokenIn 將全部作為手續費

    // 為了不讓計算進一步複雜化,這裡直接將剩餘的 tokenIn 將全部作為手續費

    // 因此會多收取一部分手續費,即按本次交易的最大手續費收取

    feeAmount = uint256(amountRemaining) - amountIn;

} else {

    feeAmount = FullMath.mulDivRoundingUp(amountIn, feePips, 1e6 - feePips);

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69956839/viewspace-2936895/,如需轉載,請註明出處,否則將追究法律責任。

相關文章