首先通過給到的交易進行分析
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地址加上獎勵例外。