流動性質押挖礦開發原始碼(海外版)丨流動性質押挖礦系統開發(詳細及規則)

xiaofufu發表於2023-02-24

  //只要tokenIn


  while(state.amountSpecifiedRemaining!=0&&state.sqrtPriceX96!=sqrtPriceLimitX96){


  //交易過程每一次迴圈的狀態變數


  StepComputations memory step;


  //交易的起始價格


  step.sqrtPriceStartX96=state.sqrtPriceX96;


  //透過點陣圖找到下一個可以選的交易價格,這裡可能是下一個流動性的邊界,也可能還是在本流動性中


  (step.tickNext,step.initialized)=tickBitmap.nextInitializedTickWithinOneWord(


  state.tick,


  tickSpacing,


  zeroForOne


  );


  ...


  //從tick index計算sqrt(price)


  step.sqrtPriceNextX96=TickMath.getSqrtRatioAtTick(step.tickNext);


  //計算當價格到達下一個交易價格時,tokenIn是否被耗盡,如果被耗盡,則交易結束,還需要重新計算出tokenIn耗盡時的價格


  //如果沒被耗盡,那麼還需要繼續進入下一個迴圈


  (state.sqrtPriceX96,step.amountIn,step.amountOut,step.feeAmount)=SwapMath.computeSwapStep(


  state.sqrtPriceX96,


  (zeroForOne?step.sqrtPriceNextX96<sqrtPriceLimitX96:step.sqrtPriceNextX96>sqrtPriceLimitX96)


  ?sqrtPriceLimitX96


  :step.sqrtPriceNextX96,


  state.liquidity,


  state.amountSpecifiedRemaining,


  fee


  );


  //更新tokenIn的餘額,以及tokenOut數量,注意當指定tokenIn的數量進行交易時,這裡的tokenOut是負數


  if(exactInput){


  state.amountSpecifiedRemaining-=(step.amountIn+step.feeAmount).toInt256();


  state.amountCalculated=state.amountCalculated.sub(step.amountOut.toInt256());


  }else{


  state.amountSpecifiedRemaining+=step.amountOut.toInt256();


  state.amountCalculated=state.amountCalculated.add((step.amountIn+step.feeAmount).toInt256());


  }


  ...


  //按需決定是否需要更新流動性L的值


  if(state.sqrtPriceX96==step.sqrtPriceNextX96){


  //檢查tick index是否為另一個流動性的邊界


  if(step.initialized){


  int128 liquidityNet=


  ticks.cross(


  step.tickNext,


  (zeroForOne?state.feeGrowthGlobalX128:feeGrowthGlobal0X128),


  (zeroForOne?feeGrowthGlobal1X128:state.feeGrowthGlobalX128)


  );


  //根據價格增加/減少,即向左或向右移動,增加/減少相應的流動性


  if(zeroForOne)liquidityNet=-liquidityNet;


  secondsOutside.cross(step.tickNext,tickSpacing,cache.blockTimestamp);


  //更新流動性


  state.liquidity=LiquidityMath.addDelta(state.liquidity,liquidityNet);


  }


  //在這裡更tick的值,使得下一次迴圈時讓tickBitmap進入下一個word中查詢


  state.tick=zeroForOne?step.tickNext-1:step.tickNext;


  }else if(state.sqrtPriceX96!=step.sqrtPriceStartX96){


  //如果tokenIn被耗盡,那麼計算當前價格對應的tick


  state.tick=TickMath.getTickAtSqrtRatio(state.sqrtPriceX96);


  }


  }


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

相關文章