交易的入口函数是exactInput函数,代码如下:
struct ExactInputParams{
bytes path;//路径
address recipient;//收款地址
uint256 deadline;//交易有效期
uint256 amountIn;//输入的token数(输入的token地址就是path中的第一个地址)
uint256 amountOutMinimum;//预期交易最少获得的token数(获得的token地址就是path中最后一个地址)
}
function exactInput(ExactInputParams memory params)
external
payable
override
checkDeadline(params.deadline)
returns(uint256 amountOut)
{
//通过循环,遍历传入的路径,进行交易
while(true){
bool hasPools=params.path.hasPools();
//完成当前路径的交易
params.amountIn=exactInputSingle(
params.amountIn,
//如果是中间交易,又合约代为收取和支付中间代币
hasPools?address(this):params.recipient,
//给回调函数用的参数
SwapData({
path:params.path.getFirstPool(),
payer:msg.sender
})
);
//如果路径全部遍历完成,则退出循环,交易完成
if(hasPools){
//步进path中的值
params.path=params.path.skipToken();
}else{
amountOut=params.amountIn;
break;
}
}
//检查交易是否满足预期
require(amountOut>=params.amountOutMinimum,'Too little received');
}