Transaction Hash:
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:
82 |
ERC20Token.Transfer( from=[Sender] 0xe2b6dfb3046f633d5d7ef8c6e195f69681b5c6bb, to=0x0000000000000000000000000000000000000000, value=21600000000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x0f067B25...C33b94185 | |||||
0x56C438eE...8cDfc928e | |||||
0x60Cf2840...7d3185236 | 6,923.402089292224 Eth | 6,923.162089292224 Eth | 0.24 | ||
0x80ae2Bad...D6C23e30F | |||||
0xE2b6dFb3...681B5c6bB |
0.8695090232 Eth
Nonce: 30
|
1.1082604152 Eth
Nonce: 31
| 0.238751392 | ||
0xEA674fdD...16B898ec8
Miner
| (Ethermine) | 438.674799559697332339 Eth | 438.676048167697332339 Eth | 0.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 ); } }