Web3套利之源码分析-swap


池子交易的核心代码,每一次的交易对换取都必须经过这段代码。
AMM(自动做市商)的价格是由池子内部状态决定的,而外部市场(CEX、其他 DEX、预言机)可能给出不同价格。套利者的任务就是:
只要池子价格 ≠ 外部价格,就调用 swap() 推动池子价格回到真实价格,同时赚取差价利润。
也就是说 swap() 是 价格发现的执行器。
需要理解的重点
1. 驱动价格沿着一条双曲线移动
Uniswap V3 的价格不是一步到位,而是根据当前 price、liquidity 和输入量。swap 是“连续微小移动价格的过程”,直到满足输入/输出目标或触及 priceLimit。
2. 跨 tick 时自动更新流动性
tick 是 LP 区间的边界。当价格移动到某个 tick 边界时可能进入新的 LP 区间或离开某些 LP 的区间因此需要改变 state.liquidity。
3. 计算并分配手续费
每次 swap 步骤会计算输入金额消耗多少,扣多少 fee,fee 中多少属于 LP,fee 中多少属于协议
4. 写入 Oracle
Oracle 需要记录tick 累积值,secondsPerLiquidity 累积值,但只在 swap 跨过至少一个 tick 时才写。
5. 和用户做最终 token 结算(回调机制)
swap 不会提前从用户账户扣款,池子首先把输出 token 转给用户,调用者必须在 uniswapV3SwapCallback() 中把应付的 token 转进池子,swap() 最终检查余额是否满足要求。
夜雨聆风
