ETH Price: $1,880.50 (+1.09%)

Transaction Decoder

Block:
4800803 at Dec-26-2017 01:31:57 PM +UTC
Transaction Fee:
0.000231091311121089 ETH $0.43
Gas Used:
231,089 Gas / 1.000010001 Gwei

Emitted Events:

52 0x71d271f8b14adef568f8f28f1587ce7271ac4ca5.0x09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20( 0x09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20, 000000000000000000000000f358d53f0e6f6d43ed80df3d8bb72b45cda20e5f, 000000000000000000000000f9806cf9e60d1643faa6bdb4fda88c82ea3ffe23 )

Account State Difference:

  Address   Before After State Difference Code
0x71d271f8...271AC4Ca5
(F2Pool Old)
3,507.094337396675869882 Eth3,507.094568487986990971 Eth0.000231091311121089
0x9901C66F...708BECA70
37.46939953713351002 Eth
Nonce: 283177
37.469168445822388931 Eth
Nonce: 283178
0.000231091311121089
0xf358D53F...5CdA20E5F
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 1135446039619403524202016138352207812135339023439126778783100530404154628287047131436261575173055122805376197829428778122576767321622553158242749763332235063998863792388363758958056595295631555042497774188947433983151522651301609913286952630340814822649613489111724775884515006315370096586567946423511582919632683049
0xF9806cf9...2ea3ffe23
0 Eth
Nonce: 0
0 Eth
Nonce: 1
From: 0 To: 1135446039619403524202016138352207812135339023439126778783100530404154628287047131436261575173055122805376197829428769451457626143465163541075901579277759120439864780633872212054014336535030698151273453811692422864762470983036961036566192549591367716382163473534779528485392738869805663539461305947206701041331470377

Execution Trace

0x71d271f8b14adef568f8f28f1587ce7271ac4ca5.a6ec80e2( )
  • Ambi2.hasRole( _from=0x71d271f8B14adEf568F8f28f1587ce7271AC4Ca5, _role=6465706C6F790000000000000000000000000000000000000000000000000000, _to=0x9901C66F2d4b95F7074b553DA78084D708BECA70 ) => ( True )
  • 0xf9806cf9e60d1643faa6bdb4fda88c82ea3ffe23.60606040( )
  • 0xf358d53f0e6f6d43ed80df3d8bb72b45cda20e5f.60606040( )
  • 0xf9806cf9e60d1643faa6bdb4fda88c82ea3ffe23.f8a6c595( )
    • 0x072461a5e18f444b1cf2e8dde6dfb1af39197316.f8a6c595( )
    • 0xf358d53f0e6f6d43ed80df3d8bb72b45cda20e5f.4525f804( )
      • 0xc3b2ae46792547a96b9f84405e36d0e07edcd05c.4525f804( )
        // This software is a subject to Ambisafe License Agreement.
        // No use or distribution is allowed without written permission from Ambisafe.
        // https://www.ambisafe.com/terms-of-use/
        
        pragma solidity ^0.4.8;
        
        contract Ambi2 {
            bytes32 constant OWNER = "__root__";
            uint constant LIFETIME = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
            mapping(bytes32 => uint) rolesExpiration;
            mapping(address => bool) nodes;
        
            event Assign(address indexed from, bytes32 indexed role, address indexed to, uint expirationDate);
            event Unassign(address indexed from, bytes32 indexed role, address indexed to);
            event Error(bytes32 message);
        
            modifier onlyNodeOwner(address _node) {
                if (isOwner(_node, msg.sender)) {
                    _;
                } else {
                    _error("Access denied: only node owner");
                }
            }
        
            function claimFor(address _address, address _owner) returns(bool) {
                if (nodes[_address]) {
                    _error("Access denied: already owned");
                    return false;
                }
                nodes[_address] = true;
                _assignRole(_address, OWNER, _owner, LIFETIME);
                return true;
            }
        
            function claim(address _address) returns(bool) {
                return claimFor(_address, msg.sender);
            }
        
            function assignOwner(address _node, address _owner) returns(bool) {
                return assignRole(_node, OWNER, _owner);
            }
        
            function assignRole(address _from, bytes32 _role, address _to) returns(bool) {
                return assignRoleWithExpiration(_from, _role, _to, LIFETIME);
            }
        
            function assignRoleWithExpiration(address _from, bytes32 _role, address _to, uint _expirationDate) onlyNodeOwner(_from) returns(bool) {
                if (hasRole(_from, _role, _to) && rolesExpiration[_getRoleSignature(_from, _role, _to)] == _expirationDate) {
                    _error("Role already assigned");
                    return false;
                }
                if (_isPast(_expirationDate)) {
                    _error("Invalid expiration date");
                    return false;
                }
        
                _assignRole(_from, _role, _to, _expirationDate);
                return true;
            }
        
            function _assignRole(address _from, bytes32 _role, address _to, uint _expirationDate) internal {
                rolesExpiration[_getRoleSignature(_from, _role, _to)] = _expirationDate;
                Assign(_from, _role, _to, _expirationDate);
            }
        
            function unassignOwner(address _node, address _owner) returns(bool) {
                if (_owner == msg.sender) {
                    _error("Cannot remove ownership");
                    return false;
                }
        
                return unassignRole(_node, OWNER, _owner);
            }
        
            function unassignRole(address _from, bytes32 _role, address _to) onlyNodeOwner(_from) returns(bool) {
                if (!hasRole(_from, _role, _to)) {
                    _error("Role not assigned");
                    return false;
                }
        
                delete rolesExpiration[_getRoleSignature(_from, _role, _to)];
                Unassign(_from, _role, _to);
                return true;
            }
        
            function hasRole(address _from, bytes32 _role, address _to) constant returns(bool) {
                return _isFuture(rolesExpiration[_getRoleSignature(_from, _role, _to)]);
            }
        
            function isOwner(address _node, address _owner) constant returns(bool) {
                return hasRole(_node, OWNER, _owner);
            }
        
            function _error(bytes32 _message) internal {
                Error(_message);
            }
        
            function _getRoleSignature(address _from, bytes32 _role, address _to) internal constant returns(bytes32) {
                return sha3(_from, _role, _to);
            }
        
            function _isPast(uint _timestamp) internal constant returns(bool) {
                return _timestamp < now;
            }
        
            function _isFuture(uint _timestamp) internal constant returns(bool) {
                return !_isPast(_timestamp);
            }
        }