Uniswap交易所系统丨uniswap交易所系统开发
在进行两个代币交易时,是首先需要在链下计算出交易的路径,例如使用ETH->DAI: 可以直接通过ETH/DAI的交易池完成 也可以通过ETH->USDC->DAI路径,即经过ETH/USDC,USDC/DAI两个交易池完成交易 Uniswap的前端会帮用户实时计算出最优路径(即交易的收益最高),作为参数传给合约调用。前端中这部分计算的具体实现在这里,具体过程为先用需要交易的输入代币,输出代币,以及一系列可用的中间代币(代码中叫Base token)生成所有的路径(当然为了降低复杂度,路径中最多包含3个代币),然后遍历每个路径输出的输出代币数量,最后选取最佳路径。 交易的入口函数是exactInput函数,代码如下: struct ExactInputParams{开发案例I35功能7o98源码o7I8 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) {开发成品:mrsfu123 //通过循环,遍历传入的路径,进行交易 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'); }