需要达成4个条件
Stake 合约的ETH余额必须大于0。totalStaked 必须大于 Stake 合约的 ETH 余额。根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令:
$ cd WTF-CTF $ forge test -C src/Ethernaut/Stake -vvvvv
Stake合约接受两种资产的质押,ETH和WETH。虽然两种资产在价值上是1:1等价的。但是WETH是ETH链原生代币的ERC20包装的版本(具体信息可以查看WTF-Solidity的41节WETH)。
但是Stake合约中将ETH和WETH混为一谈。如果我们质押的是WETH,提取的却是ETH(Stake合约并没有将 WETH兑换为ETH,Stake合约某种程度上成为了ETH/WETH交易对)。
所以,我们质押WETH,提取ETH。就可以把Stake合约的ETH全部提取出来。
而且,Stake合约在转移质押者的WETH代币时,并没有判断转移交易是否成功,所以,我们只需要在WETH代币中对Stake合约进行授权就好,我们实际有没有WETH代币并不重要。
先质押WETH,在提取ETH,就可以把我们的质押余额清零。
题目的其他两个条件
Stake 合约的ETH余额必须大于0。totalStaked 必须大于 Stake 合约的 ETH 余额。我们只需不提取完其他账户质押的ETH就好(为了完成题目,我们也可以切换个地址进行质押)。