需要达成4个条件
Stake
合约的ETH余额必须大于0。totalStaked
必须大于Stake
合约的 ETH 余额。- 我们的账户地址必须为质押者。
- 我们质押的余额必须为 0。
根据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就好(为了完成题目,我们也可以切换个地址进行质押)。