如何从UniswapV2里捡钱
如何从UniswapV2里捡钱
最近研读UniswapV2的代码,发现了一个有意思的小trick,做一个小分享。
 

0x1 添加流动性

要搞明白我要分享的小trick,得先搞明白UniswapV2添加流动性的机制,所以先随便找一个向UniSwapV2中添加流动性的交易观察一下流程
notion image
这是一笔向Uniswap的USDC-ETH交易对里添加流动性的交易,可以看到总共注入了约4.3ETH14672USDC,然后Uniswap给了这位流动性提供者约0.00014的Uniswap USDC-ETH交易对LP token
 
根据交易详情,可以看到这笔交易是通过调用Uniswap的Uniswap V2: Router 2合约的addLiquidityETH函数实现的,所以可以以这个函数为入口,读一下Uniswap添加流动性的整体流程。
notion image
然后看看内部函数_addLiquidity的实现
notion image
大体意思就是根据用户的参数取最优数量的币转到池子里,然后给用户铸造LP token,具体逻辑可以看注释,整体大逻辑是没啥问题的。
 

0x2 铸造LP token

铸造LP token的具体逻辑是在交易对合约(UniswapV2Pair)中,以USDC-ETH交易对合约为例,下面是合约地址
 
铸造LP token调用的是mint函数,看看具体实现
notion image
大体流程就是先获取到交易对里两个币的余额,然后减去储备,算出来的结果就是用户转过来的币的数量,然后通过这个数量来计算要铸造多少LP token,最后进入_update函数,看看这个函数的具体实现
notion image
主要看我注释的地方,其他的细节不重要,这个函数可以将最新余额更新到储备中。
现在我们来理一理从添加流动性到铸造LP token的整体流程。
notion image
发现有意思的点了吗?用户转了多少币进来不是通过传参实现的,而是通过计算储备最新余额差值实现的!如果用户走正常流程添加流动性,那当然没问题,因为所有操作都是在同一笔交易里完成的。
 
但是...有没有一种可能,出于不同的原因,会有人直接往UniswapV2Pair合约(也就是交易对合约)转币呢?比如说转错了或者空投?毕竟流动性都留存在交易对合约中,持币量是很大的,特别是那种有持币分红的币。
 
如果没添加流动性,直接往交易对合约里转了交易对中的币,那么最新余额就会和储备量产生一个差值,这时候我们再去调用交易对合约的mint函数(mint函数的修饰符是external,外部可调)岂不是...
 
不过不用这么麻烦
 

0x3 skim函数

UniswapV2Pair合约(交易对合约)中存在一个skim函数,也是external的,看看具体实现
notion image
甚至注释都不用写,因为实在是太简单了,这个函数的作用就是计算最新余额和储备的差值,把多出来的转出去,而且是谁都可以调!!!
 
真会有人往交易对合约里转币或者空投吗,有人以此获利吗?我简单找了一下...
notion image
这笔交易,就通过调用skim函数,获利了0.11stETH,价值144刀,不过减去91刀的手续费的话,利润也没有多少了。
很明显,这个利用点已经形成”黑暗森林“状态,一旦某个交易对合约的余额和储备存在差值,各种bot就会一哄而上把手续费拉高,最终导致利润所剩无几。不过UniswapV2的仿盘是很多的,特别是在其他链上,或许存在没被被盯上的。