Uniswap v2 简单实现闪电贷SwapLoan,超详细源码分析结合例子 [ 2 ]
实现过程
利用Uniswap v2 简单实现闪电贷SwapLoan
https://blog.csdn.net/weixin_43458715/article/details/141978935
闪电贷流程概述:
- 用户通过调用UniswapV2Pair合约的swap方法,将21 WETH 换成 20000 USDT, 其中 swap会先将 20000 USDT 转给用户
- 然后用户可以用这得到的 20000 USDT 换成 326448 USDC,再用这 326448 USDC换成 324 的WETH
- 得到 324 WETH后,用户将 21 的 WETH 支付给UniswapV2Pair合约
- 最后,swap方法检查是否收到了 21 WETH,收到则完成整个swap操作
1、假设现在有三个交易对
2、通过此代码给三个交易对添加流动性
结构如下:
3、现在有个笨蛋怨种用户用大量USDC换取USDT,而因为流动池太浅,出现了套利机会
4、套利攻击过程为 先用WETH1 换 USDT,再用USDT 换 USDC,最后再用USDC换回WETH2,发现WETH2的数量大于WETH1,套利完成。
4.1 这里是传入了amount0Out=20000,意味着套利机器人想转出20000的USDT。
通过UniswapV2Pair合约中的swap函数换取20000的USDT
4.2 swap函数会将20000 USDT转给机器人合约,后面才去验证用户是否将应支付的的21个 WETH转给weth_usdc_Pair交易对
4.3 这样bot合约中就有了20000的USDT,并且可以用来套利。swap函数中有个data参数,可用于调用其他函数,在还钱之前。
4.4 如果输入的data非空,就会调用uniswapV2Call函数,
而Bot合约继承了IUniswapV2Callee,实现uniswapV2Call函数
4.5 而uniswapV2Call函数调用了flashLoan()合约
4.6 flashLoan()合约,将Bot合约中的20000 USDT 换成 326448 USDC,然后再将 326448 USDC换回 324 WETH,最后调用transfer方法,将应付的 21 WETH付给weth_usdc_Pair交易对
4.7 UniswapV2Pair合约中的swap合约会检查库存是否收到的WETH的付款
4.8 付款成功则完成这次的swap
整个代币转换流程如下:
21
W
E
T
H
−
>
20000
U
S
D
T
21 WETH -> 20000 USDT
21WETH−>20000USDT
20000
U
S
D
T
−
>
326448
U
S
D
C
20000 USDT -> 326448 USDC
20000USDT−>326448USDC
326448
U
S
D
C
−
>
324
W
E
T
H
326448 USDC -> 324 WETH
326448USDC−>324WETH
21
W
E
T
H
<
324
W
E
T
H
21WETH < 324 WETH
21WETH<324WETH