Ethernaut-solution 7. Force



7. Force

Some contracts will simply not take your money ¯_(ツ)_/¯

The goal of this level is to make the balance of the contract greater than zero.

Things that might help:

  • Fallback methods

  • Sometimes the best way to attack a contract is with another contract.

  • See the Help page above, section "Beyond the console"

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

contract Force {/*

                   MEOW ?
         /\_/\   /
    ____/ o o \
  /~____  =ø= /


//make AttackFile


// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ForceAttack {
    constructor() public payable {

    function attack(address payable _constractAddr) public {//errorが出たのでpayableはoriginal 

ref: https://ethereum.stackexchange.com/questions/68059/invalid-implicit-conversion-from-address-to-address-payable-requested

await getBalance(contract.address)


await getBalance(contract.address)

In solidity, for a contract to be able to receive ether, the fallback function must be marked payable.

However, there is no way to stop an attacker from sending ether to a contract by self destroying.

Hence, it is important not to count on the invariant address(this).balance == 0 for any contract logic.