1. 문제

SimpleToken 을 생성하여 0.001 이더가 넣은 후 해당 토큰 계약 주소를 잃어버렸다.
잃어버린 계약 주소에서 0.001 이더를 회수하거나 제거하라.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Recovery {
    //generate tokens
    function generateToken(string memory _name, uint256 _initialSupply) public {
        new SimpleToken(_name, msg.sender, _initialSupply);
    }
}

contract SimpleToken {
    string public name;
    mapping(address => uint256) public balances;

    // constructor
    constructor(string memory _name, address _creator, uint256 _initialSupply) {
        name = _name;
        balances[_creator] = _initialSupply;
    }

    // collect ether in return for tokens
    receive() external payable {
        balances[msg.sender] = msg.value * 10;
    }

    // allow transfers of tokens
    function transfer(address _to, uint256 _amount) public {
        require(balances[msg.sender] >= _amount);
        balances[msg.sender] = balances[msg.sender] - _amount;
        balances[_to] = _amount;
    }

    // clean up after ourselves
    function destroy(address payable _to) public {
        selfdestruct(_to);
    }
}

2. SimpleToken contract의 주소를 찾아라

Recovery contract의 주소는 문제에서 제공해주지만, SimpleToken contract의 주소는 어느 곳에서도 발견할 수 없다.

→ 그러므로 일단 SimpleToken contract의 주소부터 찾자

2-1 이더스캔으로 찾기

image.png

Recovery contract 주소를 검색하여 Internal Transactions(EVM 내부 트랜잭션) 을 클릭ㄱㄱ

image.png

이런식으로 2가지 내부 트랜잭션이 보인다

여기서 위에 있는 트랜잭션의 To 부분에 Contract Creation 을 클릭하면