Uniswap交易所開發(fā)功能版,uniswap交易所系統(tǒng)開發(fā)
交易分解 UniswapV3Pool.swap函數(shù)比較長(zhǎng),這里先簡(jiǎn)要描述其交易步驟: 假設(shè)支付的token為x 根據(jù)買入/賣出行為,P??√P會(huì)隨著交易下降或上升,即tick減小或增大 在tickBitmap中找到和當(dāng)前tick對(duì)應(yīng)的icic在一個(gè)word中的下一個(gè)tick對(duì)應(yīng)的inin,根據(jù)買入/賣出行為,這里分成向下查找和向上查找兩種情況 如果當(dāng)前word中沒有記錄其他tick index,開發(fā)分析I35搭建7o98設(shè)計(jì)o7I8 那么取這個(gè)word的最小/最大tick index,這么做的目的是,讓單步交易中tick的跨度不至于太大,以減少計(jì)算中溢出的可能性(計(jì)算中會(huì)需要使用ΔP??√ΔP)。 在[ic,in][ic,in]價(jià)格區(qū)間內(nèi),流動(dòng)性LL的值是不變的,我們可以根據(jù)LL的值計(jì)算出交易運(yùn)行到inin時(shí),所需要最多的ΔxΔx數(shù)量 根據(jù)上一步計(jì)算的ΔxΔx數(shù)量,如果滿足Δx<xremainingΔx<xremaining,那么將ii設(shè)置為inin,并將xremainingxremaining減去需要支付的ΔxΔx,隨后跳至第2步繼續(xù)計(jì)算(這里需要將i±tickSpacei±tickSpace使其進(jìn)入位圖中的下一個(gè)word),計(jì)算之前還需要根據(jù)元數(shù)據(jù)修改當(dāng)前的流動(dòng)性L=L±ΔLL=L±ΔL 如果上一步計(jì)算ΔxΔx,滿足Δx≥xremainingΔx≥xremaining,則表示x token將被耗盡,則交易在此結(jié)束。 記錄下結(jié)束時(shí)的價(jià)格P??√P,將所有交易階段的tokenOut數(shù)量總和返回,開發(fā)源碼:mrsfu123即為用戶得到的token數(shù)量 ... // 將交易前的元數(shù)據(jù)保存在內(nèi)存中,后續(xù)的訪問通過 `MLOAD` 完成,節(jié)省 gas Slot0 memory slot0Start = slot0; ... // 防止交易過程中回調(diào)到合約中其他的函數(shù)中修改狀態(tài)變量 slot0.unlocked = false; ? // 這里也是緩存交易錢的數(shù)據(jù),節(jié)省 gas SwapCache memory cache = ??SwapCache({技術(shù)詳細(xì):yy625019 ????liquidityStart: liquidity, ????blockTimestamp: _blockTimestamp(), ????feeProtocol: zeroForOne ? (slot0Start.feeProtocol % 16) : (slot0Start.feeProtocol >> 4) ??}); ? // 判斷是否指定了 tokenIn 的數(shù)量 bool exactInput = amountSpecified > 0; ? // 保存交易過程中計(jì)算所需的中間變量,這些值在交易的步驟中可能會(huì)發(fā)生變化 SwapState memory state = ??SwapState({ ????amountSpecifiedRemaining: amountSpecified, ????amountCalculated: 0, ????sqrtPriceX96: slot0Start.sqrtPriceX96, ????tick: slot0Start.tick, ????feeGrowthGlobalX128: zeroForOne ? feeGrowthGlobal0X128 : feeGrowthGlobal1X128, ????protocolFee: 0, ????liquidity: cache.liquidityStart ??}); ...