本文展示的所有代码全部开源:
https://github.com/KeFuCode/ApeFlashLoan
攻击者主要执行三个步骤:
**步骤1:**攻击者通过闪电贷从NFTX金库获取无聊猿碎片--ERC20代币,并将其转换为NFT。

**步骤2:**攻击者使用获取的 NFT 获取空投代币$Ape。

**步骤3:**将 NFT 质押到NFTX金库,获取质押的 ERC20 代币,闪电贷还款,并将获利资金转移到钱包地址。
https://etherscan.io/tx/0xeb8c3bebed11e2e4fcd30cbfc2fb3c55c4ca166003c7f7d319e78eaab9747098
闪电贷借5.2个vToken
通过借到的5.2个vToken赎回5个BAYC,这里费用为randomRedeemFee为0.04,所以5*0.04=0.2个vToken交给FeeDistributor进行分配。到这时,0x77有6个BAYC。
用6个BAYC领取$Ape空投
将6个BAYC铸造为vToken,这里因为有mintFee 0.1,所以0.6个vToken再次被分配。最终得到5.4个vToken。
将5.2个vToken归还闪电贷,0.2个vToken在sushiswap上卖出得到14个eth。
投入:1BAYC + 100ETH
产出:14ETH + 60000$Ape(213ETH)
利润:227ETH - 100ETH = 127ETH
flashLoan是进行闪电贷的核心代码,注意到下图第三行调用了onFlashLoan,所有调用闪电贷进行的套利行为,都发生在onFlashLoan中。

在你调用NFTX金库进行闪电贷的合约中,最关键的也就是将onFlashLoan重写。

这一步主要调用redeem,将闪电贷获得的bayc碎片从NFX金库中,全部换成bayc。

可以看到redeem调用了redeemTo函数,兑换bayc的逻辑都在redeemTo里。

合约内获取bayc之后,调用$ApeCoin领域空投的智能合约。

使用合约内的bayc领取空投之后,调用NFTX金库的mint函数,将合约内的bayc重新铸造为bayc碎片token,并还给NFTX金库,完成闪电贷流程。

https://github.com/KeFuCode/ApeFlashLoan/blob/main/contracts/Hunter.sol
https://github.com/KeFuCode/ApeFlashLoan/blob/main/scripts/run.js

