首先通过给到的交易进行分析
0x8e5b2e425f1dbed4289d7aa47a9e7ba01d0b779c0078ed6cafba803b2acf1429
交易看到确实是通过Mdex的pair合约转出WHT代币的,我们知道Mdexpair合约的代码
和uniswap的pair代码基本一致,那么要想转出代币的话,可以调用skim函数进行转出。
这里涉及到uniswap的一个功能,它允许用户调用它转出多余的代币。这里多余的代币
指的是pair合约中未添加到流动性的代币。但是这里的套利合约并没有调用skim函数领取,
它是先查询两种代币的余额,然后再调用getReserves获取两种代币添加流动性的数量,
最后多余的XSquid代币换成WHT。
结合分析,确定了Mdex是没有问题的。带着疑问(为什么会多出XSquid代币),我们往下分析。
通过pair,找到了和WHT代币组成LP代币的XSquid代币。简单看了一下代码,发现该合约是仿造
safemoon编写的,但是写的有问题,代码中删除了添加奖励例外的。这里简单说一下safemoon
中的两种例外,如果添加了手续费例外,那么每次交易将不收取手续费。另一种例外是奖励例外,
如果添加奖励例外的话,持有safemoon类型代币将不收取奖励分红。那么多出来的XSquid代币
就是pair地址的分红。
看另外一笔交易就更加直观,这个是另外一个套利合约的交易:
从上图,我们可以看到是调用skim函数领取的代币,这里因为pair地址没有加奖励例外,所以
当有交易的时候,pair地址将收取分红。任何人都可以调用skim函数领取pair的分红。
参考safemoon的设置。
避免这种情况的话可以把pair地址加上奖励例外。