Damn Vulnerable DeFi - 5

Challenge #5 - The Rewarder

有一个池每 5 天为将 DVT 代币存入其中的人提供代币奖励。

Alice、Bob、Charlie 和 David 已经存入了一些 DVT 代币,并赢得了他们的奖励!

您没有任何 DVT 令牌。但在即将到来的一轮中,你必须为自己索取最多的奖励。

顺便说一句,有传言说新的矿池刚刚启动。它不是提供 DVT 代币的闪贷吗?

在TheRewarderPool合约中我们可以看到一个distributeRewards函数,这个函数是池子用来计算奖励数量的,公式是:amountDeposit * REWARDS / totalDeposit,因为REWARDS是个定值,amountDeposit是我们在池子中存入的数量,totalDeposit是池子中存入的总数量,所以当我们存入的金额越多,在池子中的占比就会越大,获得的奖励就会越多

同时,我们发现在合约中的deposit函数恰好会触发distributeRewards函数,并且FlashLoanerPool合约给我们提供了闪电贷功能,因为池子是五天结算一次奖励,所以我们可以在下一个奖励点(下一个5天),把池子中所有的钱借出来,存入池子中,取得最大奖励,再把钱提出来还给借贷池。

攻击合约attack.sol:

流程很简单,从借贷池借钱,借贷合调用我们的receiveFlashLoan函数,再这个函数中我们存入借来的钱,rewards变量是为了方便知道我们此时可以提出多少的奖励,然后提取奖励,把存入的钱提取出来还给借贷池即可。

the-rewarder.challenge.js:

这里我们等待五天用的是evm_increaseTime方法,通过ethers.provider.send调用它,基本单位是秒,所以五天就是[ 5 * 60 * 60 * 24 ] s。

测试:

扫描二维码关注公众号,回复: 15105476 查看本文章

猜你喜欢

转载自blog.csdn.net/m0_52030813/article/details/129231097