阿凡達(dá)(泰山眾籌)開發(fā)丨泰山眾籌(阿凡達(dá))系統(tǒng)開發(fā)方案及邏輯
//只要tokenIn while(state.amountSpecifiedRemaining!=0&&state.sqrtPriceX96!=sqrtPriceLimitX96){ //交易過程每一次循環(huán)的狀態(tài)變量 StepComputations memory step; //交易的起始價(jià)格 step.sqrtPriceStartX96=state.sqrtPriceX96; //通過位圖找到下一個可以選的交易價(jià)格,這里可能是下一個流動性的邊界,也可能還是在本流動性中 (step.tickNext,step.initialized)=tickBitmap.nextInitializedTickWithinOneWord(開發(fā)眾籌模式I35流程7o98詳細(xì)o7I8 state.tick, tickSpacing, zeroForOne ); ... //從tick index計(jì)算sqrt(price) step.sqrtPriceNextX96=TickMath.getSqrtRatioAtTick(step.tickNext);案例版開發(fā):mrsfu123 //計(jì)算當(dāng)價(jià)格到達(dá)下一個交易價(jià)格時(shí),tokenIn是否被耗盡,如果被耗盡,則交易結(jié)束,還需要重新計(jì)算出tokenIn耗盡時(shí)的價(jià)格 //如果沒被耗盡,那么還需要繼續(xù)進(jìn)入下一個循環(huán) (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數(shù)量,注意當(dāng)指定tokenIn的數(shù)量進(jìn)行交易時(shí),這里的tokenOut是負(fù)數(shù) 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) ); //根據(jù)價(jià)格增加/減少,即向左或向右移動,增加/減少相應(yīng)的流動性 if(zeroForOne)liquidityNet=-liquidityNet; secondsOutside.cross(step.tickNext,tickSpacing,cache.blockTimestamp); //更新流動性 state.liquidity=LiquidityMath.addDelta(state.liquidity,liquidityNet); } //在這里更tick的值,使得下一次循環(huán)時(shí)讓tickB