數字貨幣交易所開發(案例)丨數字貨幣交易所繫統開發(JAVA/PHP開發)及原始碼

xiaofufu發表於2023-02-24

  拆分後的交易計算


  交易是否能夠結束的關鍵計算在SwapMath.computeSwapStep中完成,這裡計算了交易是否能在目標價格範圍內結束,以及消耗的tokenIn和得到的tokenOut.這裡摘取此函式部分程式碼進行分析(這裡僅摘取exactIn時的程式碼):


  function computeSwapStep(


  uint160 sqrtRatioCurrentX96,


  uint160 sqrtRatioTargetX96,


  uint128 liquidity,


  int256 amountRemaining,


  uint24 feePips


  )


  internal


  pure


  returns(


  uint160 sqrtRatioNextX96,


  uint256 amountIn,


  uint256 amountOut,


  uint256 feeAmount


  )


  {


  //判斷交易的方向,即價格降低或升高


  bool zeroForOne=sqrtRatioCurrentX96>=sqrtRatioTargetX96;


  //判斷是否指定了精確的tokenIn數量


  bool exactIn=amountRemaining>=0;


  ...


  if(exactIn){


  //先將tokenIn的餘額扣除掉最大所需的手續費


  uint256 amountRemainingLessFee=FullMath.mulDiv(uint256(amountRemaining),1e6-feePips,1e6);


  //透過公式計算出到達目標價所需要的tokenIn數量,這裡對x token和y token計算的公式是不一樣的


  amountIn=zeroForOne


  ?SqrtPriceMath.getAmount0Delta(sqrtRatioTargetX96,sqrtRatioCurrentX96,liquidity,true)


  :SqrtPriceMath.getAmount1Delta(sqrtRatioCurrentX96,sqrtRatioTargetX96,liquidity,true);


  //判斷餘額是否充足,如果充足,那麼這次交易可以到達目標交易價格,否則需要計算出當前tokenIn能到達的目標交易價


  if(amountRemainingLessFee>=amountIn)sqrtRatioNextX96=sqrtRatioTargetX96;


  else


  //當餘額不充足的時候計算能夠到達的目標交易價


  sqrtRatioNextX96=SqrtPriceMath.getNextSqrtPriceFromInput(


  sqrtRatioCurrentX96,


  liquidity,


  amountRemainingLessFee,


  zeroForOne


  );


  }else{


  ...


  }


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

相關文章