ETH Price: $1,903.39 (-0.42%)

Transaction Decoder

Block:
8925027 at Nov-13-2019 06:51:18 AM +UTC
Transaction Fee:
0.001248608 ETH $2.38
Gas Used:
78,038 Gas / 16 Gwei

Emitted Events:

Account State Difference:

  Address   Before After State Difference Code
0x0f067B25...C33b94185
0x56C438eE...8cDfc928e
0x60Cf2840...7d3185236 6,923.402089292224 Eth6,923.162089292224 Eth0.24
0x80ae2Bad...D6C23e30F
0xE2b6dFb3...681B5c6bB
0.8695090232 Eth
Nonce: 30
1.1082604152 Eth
Nonce: 31
0.238751392
(Ethermine)
438.674799559697332339 Eth438.676048167697332339 Eth0.001248608

Execution Trace

0x60cf284021f58e87d3360cbec8b906e7d3185236.CALL( )
  • 0x4637e862967a7178f61073acb5b6cf0ec66c2580.232012a5( )
  • ERC20Token.balanceOf( _owner=0xE2b6dFb3046F633d5d7Ef8c6E195f69681B5c6bB ) => ( balance=745600000000000000000 )
  • ERC20Token.API_MoveToken( _from=0xE2b6dFb3046F633d5d7Ef8c6E195f69681B5c6bB, _to=0x0000000000000000000000000000000000000000, _value=21600000000000000000 )
  • ETH 0.24 0xe2b6dfb3046f633d5d7ef8c6e195f69681b5c6bb.CALL( )
  • 0x0f067b256a0c72e309c99a061e132a9c33b94185.ecf54bde( )
  • 0x80ae2badded437e5f5e1b3d5c667828d6c23e30f.72d455d9( )
    // File: contracts/interface/token/ERC20Interface.sol
    
    ///////////////////////////////////////////////////////////////////////////////////
    ////                     Standard ERC-20 token contract (EPK)                   ///
    ///////////////////////////////////////////////////////////////////////////////////
    ///                                                                             ///
    /// Standard ERC-20 token contract definition as mentioned above                ///
    ///                                                                             ///
    ///////////////////////////////////////////////////////////////////////////////////
    ///                                                          Mr.K by 2019/08/01 ///
    ///////////////////////////////////////////////////////////////////////////////////
    
    pragma solidity >=0.5.0 <0.6.0;
    
    contract ERC20Interface
    {
        uint256 public totalSupply;
        string  public name;
        uint8   public decimals;
        string  public symbol;
    
        function balanceOf(address _owner) public view returns (uint256 balance);
        function transfer(address _to, uint256 _value) public returns (bool success);
        function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    
        function approve(address _spender, uint256 _value) public returns (bool success);
        function allowance(address _owner, address _spender) public view returns (uint256 remaining);
    
        event Transfer(address indexed _from, address indexed _to, uint256 _value);
        event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    
        /// 只有合约可以调用的内部API
        function API_MoveToken(address _from, address _to, uint256 _value) external;
    }
    
    // File: contracts/interface/ticket/TicketInterface.sol
    
    ///////////////////////////////////////////////////////////////////////////////////
    ////                           EPK record contract                              ///
    ///////////////////////////////////////////////////////////////////////////////////
    ///                                                                             ///
    /// Used to pay EPK to unlock accounts, record payment results, and provide a   ///
    /// query method for querying whether one account has been unlocked.            ///
    ///                                                                             ///
    ///////////////////////////////////////////////////////////////////////////////////
    ///                                                          Mr.K by 2019/08/01 ///
    ///////////////////////////////////////////////////////////////////////////////////
    
    pragma solidity >=0.5.0 <0.6.0;
    
    interface TicketInterface {
    
        //One address needs to have enough EPK to unlock accounts. If one account has been unlocked before, the method will not take effect.
        function PaymentTicket() external;
    
        //Check if the one address has paid EPK to unlock the account.
        function HasTicket( address ownerAddr ) external view returns (bool);
    }
    
    // File: contracts/InternalModule.sol
    
    pragma solidity >=0.5.0 <0.6.0;
    
    
    contract InternalModule {
    
        address[] _authAddress;
    
        address _contractOwner;
    
        address _managerAddress;
    
        constructor() public {
            _contractOwner = msg.sender;
        }
    
        modifier OwnerOnly() {
            require( _contractOwner == msg.sender ); _;
        }
    
        modifier ManagerOnly() {
            require(msg.sender == _managerAddress); _;
        }
    
        modifier APIMethod() {
    
            bool exist = false;
    
            for (uint i = 0; i < _authAddress.length; i++) {
                if ( _authAddress[i] == msg.sender ) {
                    exist = true;
                    break;
                }
            }
    
            require(exist); _;
        }
    
        function SetRoundManager(address rmaddr ) external OwnerOnly {
            _managerAddress = rmaddr;
        }
    
        function AddAuthAddress(address _addr) external ManagerOnly {
            _authAddress.push(_addr);
        }
    
        function DelAuthAddress(address _addr) external ManagerOnly {
    
            for (uint i = 0; i < _authAddress.length; i++) {
    
                if (_authAddress[i] == _addr) {
    
                    for (uint j = 0; j < _authAddress.length - 1; j++) {
    
                        _authAddress[j] = _authAddress[j+1];
    
                    }
    
                    delete _authAddress[_authAddress.length - 1];
                    _authAddress.length--;
                }
    
            }
        }
    
    
    }
    
    // File: contracts/ERC20Token.sol
    
    pragma solidity >=0.5.0 <0.6.0;
    
    
    
    
    contract ERC20Token is ERC20Interface, InternalModule {
        string  public name                     = "Name";
        string  public symbol                   = "Symbol";
        uint8   public decimals                 = 18;
        uint256 public totalSupply              = 1000000000 * 10 ** 18;
        uint256 constant private MAX_UINT256    = 2 ** 256 - 1;
        uint256 private constant brunMaxLimit = (1000000000 * 10 ** 18) - (10000000 * 10 ** 18);
    
        mapping (address => uint256) public balances;
        mapping (address => mapping (address => uint256)) public allowed;
    
        event Transfer(address indexed from, address indexed to, uint256 value);
        event Approval(address indexed owner, address indexed spender, uint256 value);
    
        constructor(string memory tokenName, string memory tokenSymbol, uint256 tokenTotalSupply, uint256 mint) public {
    
            name = tokenName;
            symbol = tokenSymbol;
            totalSupply = tokenTotalSupply;
    
            balances[_contractOwner] = mint;
            balances[address(this)] = tokenTotalSupply - mint;
        }
    
        function transfer(address _to, uint256 _value) public
        returns (bool success) {
            require(balances[msg.sender] >= _value);
            balances[msg.sender] -= _value;
            balances[_to] += _value;
            emit Transfer(msg.sender, _to, _value);
            return true;
        }
    
        function transferFrom(address _from, address _to, uint256 _value) public
        returns (bool success) {
            uint256 allowance = allowed[_from][msg.sender];
            require(balances[_from] >= _value && allowance >= _value);
            balances[_to] += _value;
            balances[_from] -= _value;
            if (allowance < MAX_UINT256) {
                allowed[_from][msg.sender] -= _value;
            }
            emit Transfer(_from, _to, _value);
            return true;
        }
    
        function balanceOf(address _owner) public view
        returns (uint256 balance) {
            return balances[_owner];
        }
    
        function approve(address _spender, uint256 _value) public
        returns (bool success) {
            allowed[msg.sender][_spender] = _value;
            emit Approval(msg.sender, _spender, _value);
            return true;
        }
    
        function allowance(address _owner, address _spender) public view
        returns (uint256 remaining) {
            return allowed[_owner][_spender];
        }
    
        uint256 private ticketPrice = 60000000000000000000;
    
        mapping( address => bool ) private _paymentTicketAddrMapping;
    
        function PaymentTicket() external {
    
            require( _paymentTicketAddrMapping[msg.sender] == false, "ERC20_ERR_001");
            require( balances[msg.sender] >= ticketPrice, "ERC20_ERR_002");
    
            balances[msg.sender] -= ticketPrice;
    
            if ( balances[address(0x0)] == brunMaxLimit ) {
                balances[_contractOwner] += ticketPrice;
            } else if ( balances[address(0x0)] + ticketPrice >= brunMaxLimit ) {
                balances[_contractOwner] += (balances[address(0x0)] + ticketPrice) - brunMaxLimit;
                balances[address(0x0)] = brunMaxLimit;
            } else {
                balances[address(0x0)] += ticketPrice;
            }
            _paymentTicketAddrMapping[msg.sender] = true;
        }
    
        function HasTicket( address ownerAddr ) external view returns (bool) {
            return _paymentTicketAddrMapping[ownerAddr];
        }
        function API_MoveToken(address _from, address _to, uint256 _value) external APIMethod {
    
            require( balances[_from] >= _value, "ERC20_ERR_003" );
    
            balances[_from] -= _value;
    
            if ( _to == address(0x0) ) {
                if ( balances[address(0x0)] == brunMaxLimit ) {
                    balances[_contractOwner] += _value;
                } else if ( balances[address(0x0)] + _value >= brunMaxLimit ) {
                    balances[_contractOwner] += (balances[address(0x0)] + _value) - brunMaxLimit;
                    balances[address(0x0)] = brunMaxLimit;
                } else {
                    balances[address(0x0)] += _value;
                }
            } else {
                balances[_to] += _value;
            }
    
            emit Transfer( _from, _to, _value );
        }
    }