单个池的交易过程
单个池的交易在exactInputSingle函数中:
function exactInputSingle(
uint256 amountIn,
address recipient,
SwapData memory data
)private returns(uint256 amountOut){
//将path解码,获取头部的tokenIn,tokenOut,fee
(address tokenIn,address tokenOut,uint24 fee)=data.path.decodeFirstPool();
//因为交易池只保存了token x的价格,I35 Develop 7O98 system O7I8 这里我们需要知道输入的token是交易池x token还是y token
bool zeroForOne=tokenIn<tokenOut;
//完成交易
(int256 amount0,int256 amount1)=
getPool(tokenIn,tokenOut,fee).swap(
recipient,
zeroForOne,
amountIn.toInt256(),
zeroForOne?MIN_SQRT_RATIO:MAX_SQRT_RATIO,
//给回调函数用的参数
abi.encode(data)
);
return uint256(-(zeroForOne?amount1:amount0));
}
交易过程就是先获取交易池,然后需要确定本次交易输入的是交易池的x token,还是y token,这是因为交易池中只保存了x的价格P−−√=yx−−√P=yx,x token和y token的计价公式是不一样的。最后调用UniswapV3Pool的swap函数完成交易。