nftx闪电贷领取apecoin空投
May 20th, 2022

已经是两个多月前的事件了,这几天才对这个tx进行了分析和fork重现,记录下来加深一下理解。

apecoin的空投并没有限制调用方不能是合约地址,也不是用链下签名再到合约里验签的方式来领取空投,而是直接在合约里校验调用方的地址里有没有bayc/mayc,再加上apecoin当时的价格在8u左右,总体来说是有利可图的。

nftx是一个对NFT进行碎片化的平台,用户可以将nft碎片化成ERC20 token,并在sushiswap上添加token/eth交易对,有同类nft的用户可以在nftx上快速的卖掉nft成eth,一定程度上解决了nft的流动性问题,不过一般只能卖到地板价,甚至更低。也可以用nft去mint成ERC20代币,用代币可以再redeem成nft,bayc的池子mint需要收取10%手续费,redeem收4%手续费。平台同时支持闪电货,可以借出erc20 token,在同一tx内还回,免手续费。综合以上特点,就对apecoin空投提供了良好的支撑环境。

这位作者先是花106eth买了一只bayc#1060(其实作者是先对攻击合约进行了bayc nft授权后才买的#1060),从交易0x8a61927598ce26f296ba1be155301418e2c01fe8f5585f9b46369e1ec5c408b0可以看到,作者将bayc nft全授权给0x3EbD3D86f810B141F9b2e9B15961FC66364b54f3这个地址。之后再到opensea买了#1060。(买这只主要用来付nftx的手续费的)

然后就是0xeb8c3bebed11e2e4fcd30cbfc2fb3c55c4ca166003c7f7d319e78eaab9747098闪电贷交易,这笔交易部署了0x3EbD3D86f810B141F9b2e9B15961FC66364b54f3合约,而作者显然是有预备了,先用自己的地址和nonce=3算出了部署的合约地址,再提前approve,因为需要把#1060转到攻击合约里才能做claim,而攻击合约又还没有部署,之前转不过去,所以就先授权给攻击合约,再让攻击合约自己去transfer。在这个攻击合约里又部署了一个合约,实际上这个合约才是闪电贷合约0x7797A99a2e91646aBdc9DC30e838A149CCB3013B。作者应该是不想部署合约后,再重新发一笔交易去做闪电贷攻击,所以就用这种两个合约嵌套的方式来一步完成攻击,感觉更加“优雅”。

主要步骤如下:

  • 攻击合约转bayc#1060到闪电贷合约

  • 闪电贷合约向nftx借出5.2 bayc nft token

  • 闪电贷回调,用5.2 bayc nft token redeem回5只bayc,扣了0.2做手续费(因为当时池子里也只有5只bayc,所有作者没有借更多的token)

  • 闪电贷回调,redeem的5只加上转过来的#1060,一共6只bayc去认领空投,领了60564个apecoin

  • 闪电货回调,再把6只bayc mint成bayc nft token,扣10%手续费,得到5.4个token

  • 闪电贷回调,5.4-5.2=0.2,把0.2个token在sushi swap里换成eth,到此完成闪电贷回调

  • nftx里再将闪电贷合约上的5.2个token燃烧掉,查看flashLoan方法

    https://github.com/NFTX-project/nftx-protocol-v2/blob/08d077f10d496cffa0bfe767981b3a41c6ad0730/contracts/solidity/token/ERC20FlashMintUpgradeable.sol

  • 闪电贷合约将60564个apecoin和剩余的eth转到作者地址

nftx实现的是标准的ERC3156闪电贷接口,对接起来还是挺方便的。

参考资料

Subscribe to franx.eth
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from franx.eth

Skeleton

Skeleton

Skeleton