Transaction Hash:
Block:
6031684 at Jul-26-2018 05:36:00 AM +UTC
Transaction Fee:
0.001074015000071601 ETH
$2.13
Gas Used:
71,601 Gas / 15.000000001 Gwei
Emitted Events:
| 4 |
0x104ab94fa224e0b448dd5226dc35e665d609d988.0x24d1827423a4c66732fc6c67bc0748ab490dd042bf77a735f09ccc40e26e4932( 0x24d1827423a4c66732fc6c67bc0748ab490dd042bf77a735f09ccc40e26e4932, 000000000000000000000000279b045989bd4cd60ee4a53d2a1c0621a4b4623f )
|
| 5 |
0x104ab94fa224e0b448dd5226dc35e665d609d988.0x25b10c0526638e6891022dd8799ed694dbb9aaf113e89aa0c33e83af5b228cad( 0x25b10c0526638e6891022dd8799ed694dbb9aaf113e89aa0c33e83af5b228cad, 000000000000000000000000026bbf2be9987a4666c31221100609e315569145 )
|
| 6 |
0x279b045989bd4cd60ee4a53d2a1c0621a4b4623f.0xa9e1ee75e4263e8342f99947ca4f1085ef453a8540f800cd48c7d1e0a7621bae( 0xa9e1ee75e4263e8342f99947ca4f1085ef453a8540f800cd48c7d1e0a7621bae, 0x000000000000000000000000026bbf2be9987a4666c31221100609e315569145, 000000000000000000000000104ab94fa224e0b448dd5226dc35e665d609d988 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x104aB94F...5D609D988 | |||||
|
0x5A0b54D5...D3E029c4c
Miner
| (Spark Pool) | 6,070.595755861925490917 Eth | 6,070.596829876925562518 Eth | 0.001074015000071601 | |
| 0xde48A493...472DdBab7 |
7.207837001155147626 Eth
Nonce: 146364
|
7.206762986155076025 Eth
Nonce: 146365
| 0.001074015000071601 |
Execution Trace
0x279b045989bd4cd60ee4a53d2a1c0621a4b4623f.57202bfd( )
-
Ambi2.hasRole( _from=0x279B045989BD4CD60Ee4a53d2a1C0621a4B4623F, _role=61737369676E0000000000000000000000000000000000000000000000000000, _to=0xde48A49359d9F0c8609221F77f382e1472DdBab7 ) => ( True ) 0x104ab94fa224e0b448dd5226dc35e665d609d988.cb9fa366( )-
0xc3b2ae46792547a96b9f84405e36d0e07edcd05c.cb9fa366( )
-
// 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);
}
}