區塊鏈交易所繫統開發(海外版)丨區塊鏈交易所繫統開發(開發案例及原始碼)

xiaofufu發表於2023-02-24

交易預計算

當使用者和 uniswap 前端進行互動時,前端需要預先計算出使用者輸入 token 能夠預期得到的 token 數量。


這個功能在 uniswap v2 有非常簡單的實現,只需要查詢處合約中兩個代幣的餘額就可以完成預計算。


但是在 v3 版本中,由於交易的計算需要使用合約內的 tick 資訊,預計算只能由 uniswap v3 pool 合約來完成,但是 pool 合約中的計算函式都是會更改合約狀態的 external 函式,那麼如何把這個函式當作 view/pure 函式來使用呢?uniswap v3 periphery 倉庫中給出了一個非常 tricky 的實現,程式碼在 contracts/lens/Quoter.sol 中:

function quoteExactInputSingle(

    address tokenIn,

    address tokenOut,

    uint24 fee,

    uint256 amountIn,

    uint160 sqrtPriceLimitX96

) public override returns (uint256 amountOut) {

    bool zeroForOne = tokenIn < tokenOut;

 

    try

        getPool(tokenIn, tokenOut, fee).swap(  // 呼叫 pool 合約的 swap 介面來模擬一次真實的交易

            address(this), // address(0) might cause issues with some tokens

            zeroForOne,

            amountIn.toInt256(),

            sqrtPriceLimitX96 == 0

                ? (zeroForOne ? TickMath.MIN_SQRT_RATIO + 1 : TickMath.MAX_SQRT_RATIO - 1)

                : sqrtPriceLimitX96,

            abi.encodePacked(tokenIn, fee, tokenOut)

        )

    {} catch (bytes memory reason) {

        return parseRevertReason(reason);

    }

}


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

相關文章