1. 문제

내 계정은 전체 토큰을 가지고 있는 계정이다
transfer() 함수에는 timeLock 제한이 있어서 10년이 지나야 실행 가능하니 다른 방법으로 전송할 방법을 찾아야한다.
player 주소의 토큰 잔액을 0으로 만들어라
pragma solidity ^0.8.0;

import "openzeppelin-contracts-08/token/ERC20/ERC20.sol";

contract NaughtCoin is ERC20 {
    // string public constant name = 'NaughtCoin';
    // string public constant symbol = '0x0';
    // uint public constant decimals = 18;
    uint256 public timeLock = block.timestamp + 10 * 365 days;
    uint256 public INITIAL_SUPPLY;
    address public player;

    constructor(address _player) ERC20("NaughtCoin", "0x0") {
        player = _player;
        INITIAL_SUPPLY = 1000000 * (10 ** uint256(decimals()));
        // _totalSupply = INITIAL_SUPPLY;
        // _balances[player] = INITIAL_SUPPLY;
        _mint(player, INITIAL_SUPPLY);
        emit Transfer(address(0), player, INITIAL_SUPPLY);
    }

    function transfer(address _to, uint256 _value) public override lockTokens returns (bool) {
        super.transfer(_to, _value);
    }

    // Prevent the initial owner from transferring tokens until the timelock has passed
    modifier lockTokens() {
        if (msg.sender == player) {
            require(block.timestamp > timeLock);
            _;
        } else {
            _;
        }
    }
}

2. 문제 해결 방법

1. 10년 기다리기

uint256 public timeLock = block.timestamp + 10 * 365 days;

timeLock이 block.timestamp에 10년을 곱한 값이 들어가고

modifier lockTokens() {
    if (msg.sender == player) {
        require(block.timestamp > timeLock);
        _;
    } else {
        _;
    }
}

require(block.timestamp > timeLock); 부분을 살펴보니 컨트랙트 배포 후 10년이 지나면 문제가 풀릴거다!!

→ 네 말도 안되는 문제 풀이 과정입니다.

2. 다른 계정을 이용하여 transfer() 시키기

modifier lockTokens() {
    if (msg.sender == player) {
        require(block.timestamp > timeLock);
        _;
    } else {
        _;
    }
}

player 의 값을 조회해보니 나의 EOA 주소가 저장되어 있다.

2-1 시도 1 - subAccount 생성