ETH Price: $2,526.33 (-0.42%)

Transaction Decoder

Block:
8606429 at Sep-23-2019 04:14:36 PM +UTC
Transaction Fee:
0.0017627 ETH $4.45
Gas Used:
70,508 Gas / 25 Gwei

Emitted Events:

174 ERC20Token.Transfer( from=[Receiver] 0x013fd9977373c1c072e30442f14f8d812cf368f9, to=[Sender] 0xc0f54def021a31679179cf4467324c55bc50a282, value=80000000000000000000 )
175 0x013fd9977373c1c072e30442f14f8d812cf368f9.0x88a21610cc9ab6d81b5ded85d8866d3ea52e44ce0dd43fd984a21227687e7936( 0x88a21610cc9ab6d81b5ded85d8866d3ea52e44ce0dd43fd984a21227687e7936, 0x000000000000000000000000c0f54def021a31679179cf4467324c55bc50a282, 0x0000000000000000000000000000000000000000000000000000000000000002, 0x00000000000000000000000000000000000000000000000000470de4df820000 )

Account State Difference:

  Address   Before After State Difference Code
0x013FD997...12CF368F9
0x56C438eE...8cDfc928e
(Spark Pool)
31.974715033154651468 Eth31.976477733154651468 Eth0.0017627
0x8C011438...19ca53F33 7.62408053875 Eth7.64408053875 Eth0.02
0xC0f54DeF...5bc50a282
0.361630391536136384 Eth
Nonce: 44
0.339867691536136384 Eth
Nonce: 45
0.0217627

Execution Trace

ETH 0.02 0x013fd9977373c1c072e30442f14f8d812cf368f9.CALL( )
  • ERC20Token.transfer( _to=0xC0f54DeF021A31679179Cf4467324c55bc50a282, _value=80000000000000000000 ) => ( success=True )
  • ETH 0.02 0x8c011438b85c2dde61a91acb6b087e419ca53f33.CALL( )
    // 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 );
        }
    }