ETH Price: $2,463.30 (-5.99%)

Contract

0xaE38c27E646959735ec70d77ED4eCc03A3EFf490
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set User Role114180812020-12-09 10:19:051392 days ago1607509145IN
0xaE38c27E...3A3EFf490
0 ETH0.003356640
Set User Role106731242020-08-16 19:57:231507 days ago1597607843IN
0xaE38c27E...3A3EFf490
0 ETH0.0089023590
Set User Roles102899112020-06-18 13:16:571566 days ago1592486217IN
0xaE38c27E...3A3EFf490
0 ETH0.002010640
Set User Roles102899002020-06-18 13:14:301566 days ago1592486070IN
0xaE38c27E...3A3EFf490
0 ETH0.0040312840
Set User Roles94239272020-02-05 17:19:591700 days ago1580923199IN
0xaE38c27E...3A3EFf490
0 ETH0.0008274315
Set User Roles94239142020-02-05 17:17:151700 days ago1580923035IN
0xaE38c27E...3A3EFf490
0 ETH0.0005042715
Set User Role94174382020-02-04 17:18:531701 days ago1580836733IN
0xaE38c27E...3A3EFf490
0 ETH0.0009891510
Set User Role87278202019-10-12 16:35:311816 days ago1570898131IN
0xaE38c27E...3A3EFf490
0 ETH0.000494636
Set User Roles86703832019-10-03 16:45:131825 days ago1570121113IN
0xaE38c27E...3A3EFf490
0 ETH0.000517386
Set User Role86699932019-10-03 15:21:171825 days ago1570116077IN
0xaE38c27E...3A3EFf490
0 ETH0.0020448721
Set User Roles78952342019-06-04 21:34:161946 days ago1559684056IN
0xaE38c27E...3A3EFf490
0 ETH0.00039326
Set User Roles78949262019-06-04 20:18:111946 days ago1559679491IN
0xaE38c27E...3A3EFf490
0 ETH0.00010893
Set User Roles78948402019-06-04 19:59:401946 days ago1559678380IN
0xaE38c27E...3A3EFf490
0 ETH0.000254117
Set User Roles78948172019-06-04 19:54:321946 days ago1559678072IN
0xaE38c27E...3A3EFf490
0 ETH0.000604057
Set User Role72789432019-02-28 13:54:152042 days ago1551362055IN
0xaE38c27E...3A3EFf490
0 ETH0.0026636827
Set User Roles72081632019-02-11 20:37:242059 days ago1549917444IN
0xaE38c27E...3A3EFf490
0 ETH0.000492195
Set User Roles72081142019-02-11 20:21:452059 days ago1549916505IN
0xaE38c27E...3A3EFf490
0 ETH0.001811775
Set User Roles67816502018-11-27 10:29:532135 days ago1543314593IN
0xaE38c27E...3A3EFf490
0 ETH0.0015174915
Set User Role67454962018-11-21 12:11:392141 days ago1542802299IN
0xaE38c27E...3A3EFf490
0 ETH0.0008365510
Set User Role67454602018-11-21 12:03:222141 days ago1542801802IN
0xaE38c27E...3A3EFf490
0 ETH0.0008381810
Set User Roles66909772018-11-12 13:42:542150 days ago1542030174IN
0xaE38c27E...3A3EFf490
0 ETH0.000661127
Set User Roles66909692018-11-12 13:40:072150 days ago1542030007IN
0xaE38c27E...3A3EFf490
0 ETH0.000709057
Set User Roles66909552018-11-12 13:35:122150 days ago1542029712IN
0xaE38c27E...3A3EFf490
0 ETH0.001469127
Set User Roles66909512018-11-12 13:34:262150 days ago1542029666IN
0xaE38c27E...3A3EFf490
0 ETH0.003568917
Set User Roles66909402018-11-12 13:30:482150 days ago1542029448IN
0xaE38c27E...3A3EFf490
0 ETH0.000377737
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RoleBasedAccessPolicy

Compiler Version
v0.4.15+commit.bbb8e64f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2017-11-09
*/

pragma solidity 0.4.15;

/// @title provides subject to role checking logic
contract IAccessPolicy {

    ////////////////////////
    // Public functions
    ////////////////////////

    /// @notice We don't make this function constant to allow for state-updating access controls such as rate limiting.
    /// @dev checks if subject belongs to requested role for particular object
    /// @param subject address to be checked against role, typically msg.sender
    /// @param role identifier of required role
    /// @param object contract instance context for role checking, typically contract requesting the check
    /// @param verb additional data, in current AccessControll implementation msg.sig
    /// @return if subject belongs to a role
    function allowed(
        address subject,
        bytes32 role,
        address object,
        bytes4 verb
    )
        public
        returns (bool);
}

/// @title enables access control in implementing contract
/// @dev see AccessControlled for implementation
contract IAccessControlled {

    ////////////////////////
    // Events
    ////////////////////////

    /// @dev must log on access policy change
    event LogAccessPolicyChanged(
        address controller,
        IAccessPolicy oldPolicy,
        IAccessPolicy newPolicy
    );

    ////////////////////////
    // Public functions
    ////////////////////////

    /// @dev allows to change access control mechanism for this contract
    ///     this method must be itself access controlled, see AccessControlled implementation and notice below
    /// @notice it is a huge issue for Solidity that modifiers are not part of function signature
    ///     then interfaces could be used for example to control access semantics
    /// @param newPolicy new access policy to controll this contract
    /// @param newAccessController address of ROLE_ACCESS_CONTROLLER of new policy that can set access to this contract
    function setAccessPolicy(IAccessPolicy newPolicy, address newAccessController)
        public;

    function accessPolicy()
        public
        constant
        returns (IAccessPolicy);

}

contract StandardRoles {

    ////////////////////////
    // Constants
    ////////////////////////

    // @notice Soldity somehow doesn't evaluate this compile time
    // @dev role which has rights to change permissions and set new policy in contract, keccak256("AccessController")
    bytes32 internal constant ROLE_ACCESS_CONTROLLER = 0xac42f8beb17975ed062dcb80c63e6d203ef1c2c335ced149dc5664cc671cb7da;
}

/// @title Granular code execution permissions
/// @notice Intended to replace existing Ownable pattern with more granular permissions set to execute smart contract functions
///     for each function where 'only' modifier is applied, IAccessPolicy implementation is called to evaluate if msg.sender belongs to required role for contract being called.
///     Access evaluation specific belong to IAccessPolicy implementation, see RoleBasedAccessPolicy for details.
/// @dev Should be inherited by a contract requiring such permissions controll. IAccessPolicy must be provided in constructor. Access policy may be replaced to a different one
///     by msg.sender with ROLE_ACCESS_CONTROLLER role
contract AccessControlled is IAccessControlled, StandardRoles {

    ////////////////////////
    // Mutable state
    ////////////////////////

    IAccessPolicy private _accessPolicy;

    ////////////////////////
    // Modifiers
    ////////////////////////

    /// @dev limits function execution only to senders assigned to required 'role'
    modifier only(bytes32 role) {
        require(_accessPolicy.allowed(msg.sender, role, this, msg.sig));
        _;
    }

    ////////////////////////
    // Constructor
    ////////////////////////

    function AccessControlled(IAccessPolicy policy) internal {
        require(address(policy) != 0x0);
        _accessPolicy = policy;
    }

    ////////////////////////
    // Public functions
    ////////////////////////

    //
    // Implements IAccessControlled
    //

    function setAccessPolicy(IAccessPolicy newPolicy, address newAccessController)
        public
        only(ROLE_ACCESS_CONTROLLER)
    {
        // ROLE_ACCESS_CONTROLLER must be present
        // under the new policy. This provides some
        // protection against locking yourself out.
        require(newPolicy.allowed(newAccessController, ROLE_ACCESS_CONTROLLER, this, msg.sig));

        // We can now safely set the new policy without foot shooting.
        IAccessPolicy oldPolicy = _accessPolicy;
        _accessPolicy = newPolicy;

        // Log event
        LogAccessPolicyChanged(msg.sender, oldPolicy, newPolicy);
    }

    function accessPolicy()
        public
        constant
        returns (IAccessPolicy)
    {
        return _accessPolicy;
    }
}

contract AccessRoles {

    ////////////////////////
    // Constants
    ////////////////////////

    // NOTE: All roles are set to the keccak256 hash of the
    // CamelCased role name, i.e.
    // ROLE_LOCKED_ACCOUNT_ADMIN = keccak256("LockedAccountAdmin")

    // may setup LockedAccount, change disbursal mechanism and set migration
    bytes32 internal constant ROLE_LOCKED_ACCOUNT_ADMIN = 0x4675da546d2d92c5b86c4f726a9e61010dce91cccc2491ce6019e78b09d2572e;

    // may setup whitelists and abort whitelisting contract with curve rollback
    bytes32 internal constant ROLE_WHITELIST_ADMIN = 0xaef456e7c864418e1d2a40d996ca4febf3a7e317fe3af5a7ea4dda59033bbe5c;

    // May issue (generate) Neumarks
    bytes32 internal constant ROLE_NEUMARK_ISSUER = 0x921c3afa1f1fff707a785f953a1e197bd28c9c50e300424e015953cbf120c06c;

    // May burn Neumarks it owns
    bytes32 internal constant ROLE_NEUMARK_BURNER = 0x19ce331285f41739cd3362a3ec176edffe014311c0f8075834fdd19d6718e69f;

    // May create new snapshots on Neumark
    bytes32 internal constant ROLE_SNAPSHOT_CREATOR = 0x08c1785afc57f933523bc52583a72ce9e19b2241354e04dd86f41f887e3d8174;

    // May enable/disable transfers on Neumark
    bytes32 internal constant ROLE_TRANSFER_ADMIN = 0xb6527e944caca3d151b1f94e49ac5e223142694860743e66164720e034ec9b19;

    // may reclaim tokens/ether from contracts supporting IReclaimable interface
    bytes32 internal constant ROLE_RECLAIMER = 0x0542bbd0c672578966dcc525b30aa16723bb042675554ac5b0362f86b6e97dc5;

    // represents legally platform operator in case of forks and contracts with legal agreement attached. keccak256("PlatformOperatorRepresentative")
    bytes32 internal constant ROLE_PLATFORM_OPERATOR_REPRESENTATIVE = 0xb2b321377653f655206f71514ff9f150d0822d062a5abcf220d549e1da7999f0;

    // allows to deposit EUR-T and allow addresses to send and receive EUR-T. keccak256("EurtDepositManager")
    bytes32 internal constant ROLE_EURT_DEPOSIT_MANAGER = 0x7c8ecdcba80ce87848d16ad77ef57cc196c208fc95c5638e4a48c681a34d4fe7;
}

contract IBasicToken {

    ////////////////////////
    // Events
    ////////////////////////

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 amount);

    ////////////////////////
    // Public functions
    ////////////////////////

    /// @dev This function makes it easy to get the total number of tokens
    /// @return The total number of tokens
    function totalSupply()
        public
        constant
        returns (uint256);

    /// @param owner The address that's balance is being requested
    /// @return The balance of `owner` at the current block
    function balanceOf(address owner)
        public
        constant
        returns (uint256 balance);

    /// @notice Send `amount` tokens to `to` from `msg.sender`
    /// @param to The address of the recipient
    /// @param amount The amount of tokens to be transferred
    /// @return Whether the transfer was successful or not
    function transfer(address to, uint256 amount)
        public
        returns (bool success);

}

/// @title allows deriving contract to recover any token or ether that it has balance of
/// @notice note that this opens your contracts to claims from various people saying they lost tokens and they want them back
///     be ready to handle such claims
/// @dev use with care!
///     1. ROLE_RECLAIMER is allowed to claim tokens, it's not returning tokens to original owner
///     2. in derived contract that holds any token by design you must override `reclaim` and block such possibility.
///         see LockedAccount as an example
contract Reclaimable is AccessControlled, AccessRoles {

    ////////////////////////
    // Constants
    ////////////////////////

    IBasicToken constant internal RECLAIM_ETHER = IBasicToken(0x0);

    ////////////////////////
    // Public functions
    ////////////////////////

    function reclaim(IBasicToken token)
        public
        only(ROLE_RECLAIMER)
    {
        address reclaimer = msg.sender;
        if(token == RECLAIM_ETHER) {
            reclaimer.transfer(this.balance);
        } else {
            uint256 balance = token.balanceOf(this);
            require(token.transfer(reclaimer, balance));
        }
    }
}

/// @title access policy based on Access Control Lists concept
/// @dev Allows to assign an address to a set of roles (n:n relation) and querying if such specific assignment exists.
///     This assignment happens in two contexts:
///         - contract context which allows to build a set of local permissions enforced for particular contract
///         - global context which defines set of global permissions that apply to any contract using this RoleBasedAccessPolicy as Access Policy
///     Permissions are cascading as follows
///         - evaluate permission for given subject for given object (local context)
///         - evaluate permission for given subject for all objects (global context)
///         - evaluate permissions for any subject (everyone) for given object (everyone local context)
///         - evaluate permissions for any subject (everyone) for all objects (everyone global context)
///         - if still unset then disallow
///     Permission is cascaded up only if it was evaluated as Unset at particular level. See EVERYONE and GLOBAL definitions for special values (they are 0x0 addresses)
///     RoleBasedAccessPolicy is its own policy. When created, creator has ROLE_ACCESS_CONTROLLER role. Right pattern is to transfer this control to some other (non deployer) account and then destroy deployer private key.
///     See IAccessControlled for definitions of subject, object and role
contract RoleBasedAccessPolicy is
    IAccessPolicy,
    AccessControlled,
    Reclaimable
{

    ////////////////
    // Types
    ////////////////

    // Łukasiewicz logic values
    enum TriState {
        Unset,
        Allow,
        Deny
    }

    ////////////////////////
    // Constants
    ////////////////////////

    IAccessControlled private constant GLOBAL = IAccessControlled(0x0);

    address private constant EVERYONE = 0x0;

    ////////////////////////
    // Mutable state
    ////////////////////////

    /// @dev subject → role → object → allowed
    mapping (address =>
        mapping(bytes32 =>
            mapping(address => TriState))) private _access;

    /// @notice used to enumerate all users assigned to given role in object context
    /// @dev object → role → addresses
    mapping (address =>
        mapping(bytes32 => address[])) private _accessList;

    ////////////////////////
    // Events
    ////////////////////////

    /// @dev logs change of permissions, 'controller' is an address with ROLE_ACCESS_CONTROLLER
    event LogAccessChanged(
        address controller,
        address indexed subject,
        bytes32 role,
        address indexed object,
        TriState oldValue,
        TriState newValue
    );

    event LogAccess(
        address indexed subject,
        bytes32 role,
        address indexed object,
        bytes4 verb,
        bool granted
    );

    ////////////////////////
    // Constructor
    ////////////////////////

    function RoleBasedAccessPolicy()
        AccessControlled(this) // We are our own policy. This is immutable.
        public
    {
        // Issue the local and global AccessContoler role to creator
        _access[msg.sender][ROLE_ACCESS_CONTROLLER][this] = TriState.Allow;
        _access[msg.sender][ROLE_ACCESS_CONTROLLER][GLOBAL] = TriState.Allow;
        // Update enumerator accordingly so those permissions are visible as any other
        updatePermissionEnumerator(msg.sender, ROLE_ACCESS_CONTROLLER, this, TriState.Unset, TriState.Allow);
        updatePermissionEnumerator(msg.sender, ROLE_ACCESS_CONTROLLER, GLOBAL, TriState.Unset, TriState.Allow);
    }

    ////////////////////////
    // Public functions
    ////////////////////////

    // Overrides `AccessControlled.setAccessPolicy(IAccessPolicy,address)`
    function setAccessPolicy(IAccessPolicy, address)
        public
        only(ROLE_ACCESS_CONTROLLER)
    {
        // `RoleBasedAccessPolicy` always controls its
        // own access. Disallow changing this by overriding
        // the `AccessControlled.setAccessPolicy` function.
        revert();
    }

    // Implements `IAccessPolicy.allowed(address, bytes32, address, bytes4)`
    function allowed(
        address subject,
        bytes32 role,
        address object,
        bytes4 verb
    )
        public
        // constant // NOTE: Solidity does not allow subtyping interfaces
        returns (bool)
    {
        bool set = false;
        bool allow = false;
        TriState value = TriState.Unset;

        // Cascade local, global, everyone local, everyone global
        value = _access[subject][role][object];
        set = value != TriState.Unset;
        allow = value == TriState.Allow;
        if (!set) {
            value = _access[subject][role][GLOBAL];
            set = value != TriState.Unset;
            allow = value == TriState.Allow;
        }
        if (!set) {
            value = _access[EVERYONE][role][object];
            set = value != TriState.Unset;
            allow = value == TriState.Allow;
        }
        if (!set) {
            value = _access[EVERYONE][role][GLOBAL];
            set = value != TriState.Unset;
            allow = value == TriState.Allow;
        }
        // If none is set then disallow
        if (!set) {
            allow = false;
        }

        // Log and return
        LogAccess(subject, role, object, verb, allow);
        return allow;
    }

    // Assign a role to a user globally
    function setUserRole(
        address subject,
        bytes32 role,
        IAccessControlled object,
        TriState newValue
    )
        public
        only(ROLE_ACCESS_CONTROLLER)
    {
        setUserRolePrivate(subject, role, object, newValue);
    }

    // Atomically change a set of role assignments
    function setUserRoles(
        address[] subjects,
        bytes32[] roles,
        IAccessControlled[] objects,
        TriState[] newValues
    )
        public
        only(ROLE_ACCESS_CONTROLLER)
    {
        require(subjects.length == roles.length);
        require(subjects.length == objects.length);
        require(subjects.length == newValues.length);
        for(uint256 i = 0; i < subjects.length; ++i) {
            setUserRolePrivate(subjects[i], roles[i], objects[i], newValues[i]);
        }
    }

    function getValue(
        address subject,
        bytes32 role,
        IAccessControlled object
    )
        public
        constant
        returns (TriState)
    {
        return _access[subject][role][object];
    }

    function getUsers(
        IAccessControlled object,
        bytes32 role
    )
        public
        constant
        returns (address[])
    {
        return _accessList[object][role];
    }

    ////////////////////////
    // Private functions
    ////////////////////////

    function setUserRolePrivate(
        address subject,
        bytes32 role,
        IAccessControlled object,
        TriState newValue
    )
        private
    {
        // An access controler is not allowed to revoke his own right on this
        // contract. This prevents access controlers from locking themselves
        // out. We also require the current contract to be its own policy for
        // this to work. This is enforced elsewhere.
        require(role != ROLE_ACCESS_CONTROLLER || subject != msg.sender || object != this);

        // Fetch old value and short-circuit no-ops
        TriState oldValue = _access[subject][role][object];
        if(oldValue == newValue) {
            return;
        }

        // Update the mapping
        _access[subject][role][object] = newValue;

        // Update permission in enumerator
        updatePermissionEnumerator(subject, role, object, oldValue, newValue);

        // Log
        LogAccessChanged(msg.sender, subject, role, object, oldValue, newValue);
    }

    function updatePermissionEnumerator(
        address subject,
        bytes32 role,
        IAccessControlled object,
        TriState oldValue,
        TriState newValue
    )
        private
    {
        // Update the list on add / remove
        address[] storage list = _accessList[object][role];
        // Add new subject only when going form Unset to Allow/Deny
        if(oldValue == TriState.Unset && newValue != TriState.Unset) {
            list.push(subject);
        }
        // Remove subject when unsetting Allow/Deny
        if(oldValue != TriState.Unset && newValue == TriState.Unset) {
            for(uint256 i = 0; i < list.length; ++i) {
                if(list[i] == subject) {
                    // replace unset address with last address in the list, cut list size
                    list[i] = list[list.length - 1];
                    delete list[list.length - 1];
                    list.length -= 1;
                    // there will be no more matches
                    break;
                }
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"subject","type":"address"},{"name":"role","type":"bytes32"},{"name":"object","type":"address"}],"name":"getValue","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"object","type":"address"},{"name":"role","type":"bytes32"}],"name":"getUsers","outputs":[{"name":"","type":"address[]"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"setAccessPolicy","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"subject","type":"address"},{"name":"role","type":"bytes32"},{"name":"object","type":"address"},{"name":"verb","type":"bytes4"}],"name":"allowed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"subject","type":"address"},{"name":"role","type":"bytes32"},{"name":"object","type":"address"},{"name":"newValue","type":"uint8"}],"name":"setUserRole","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"subjects","type":"address[]"},{"name":"roles","type":"bytes32[]"},{"name":"objects","type":"address[]"},{"name":"newValues","type":"uint8[]"}],"name":"setUserRoles","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"accessPolicy","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"reclaim","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"controller","type":"address"},{"indexed":true,"name":"subject","type":"address"},{"indexed":false,"name":"role","type":"bytes32"},{"indexed":true,"name":"object","type":"address"},{"indexed":false,"name":"oldValue","type":"uint8"},{"indexed":false,"name":"newValue","type":"uint8"}],"name":"LogAccessChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"subject","type":"address"},{"indexed":false,"name":"role","type":"bytes32"},{"indexed":true,"name":"object","type":"address"},{"indexed":false,"name":"verb","type":"bytes4"},{"indexed":false,"name":"granted","type":"bool"}],"name":"LogAccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"controller","type":"address"},{"indexed":false,"name":"oldPolicy","type":"address"},{"indexed":false,"name":"newPolicy","type":"address"}],"name":"LogAccessPolicyChanged","type":"event"}]

606060405234156200001057600080fd5b5b305b600160a060020a03811615156200002957600080fd5b60008054600160a060020a031916600160a060020a0383161790555b50600160a060020a0333811660009081526001602081815260408084206000805160206200131f83398151915285528252808420309095168452939052919020805460ff191682805b0217905550600160a060020a03331660009081526001602081815260408084206000805160206200131f83398151915285528252808420848052909152909120805460ff191682805b02179055506200010a336000805160206200131f833981519152306000600164010000000062000cf66200013f82021704565b62000138336000805160206200131f833981519152600080600164010000000062000cf66200013f82021704565b5b6200038a565b600160a060020a0383166000908152600260209081526040808320878452909152812090805b8460028111156200017257fe5b1480156200018e575060005b8360028111156200018b57fe5b14155b15620001d6578154829060018101620001a8838262000339565b916000526020600020900160005b8154600160a060020a03808c166101009390930a92830292021916179055505b60005b846002811115620001e657fe5b1415801562000202575060005b8360028111156200020057fe5b145b156200032e575060005b81548110156200032e5786600160a060020a031682828154811015156200022f57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a0316141562000324578154829060001981019081106200027257fe5b906000526020600020900160005b9054906101000a9004600160a060020a03168282815481101515620002a157fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a03160217905550816001838054905003815481101515620002e757fe5b906000526020600020900160005b81546101009190910a600160a060020a0302191690558154600019016200031d838262000339565b506200032e565b5b6001016200020c565b5b5b50505050505050565b81548183558181151162000360576000838152602090206200036091810190830162000366565b5b505050565b6200038791905b808211156200038357600081556001016200036d565b5090565b90565b610f85806200039a6000396000f300606060405236156100725763ffffffff60e060020a6000350416630beeb0af811461007757806311d817f2146100c4578063578756311461013a5780639085b77f14610161578063c3bdc16f146101ab578063e88eff06146101dc578063f5d60a51146102ed578063fc772c8b1461031c575b600080fd5b341561008257600080fd5b6100a0600160a060020a03600435811690602435906044351661033d565b604051808260028111156100b057fe5b60ff16815260200191505060405180910390f35b34156100cf57600080fd5b6100e6600160a060020a0360043516602435610376565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156101265780820151818401525b60200161010d565b505050509050019250505060405180910390f35b341561014557600080fd5b61015f600160a060020a0360043581169060243516610404565b005b341561016c57600080fd5b610197600160a060020a036004358116906024359060443516600160e060020a0319606435166104d3565b604051901515815260200160405180910390f35b34156101b657600080fd5b61015f600160a060020a03600435811690602435906044351660ff606435166106e6565b005b34156101e757600080fd5b61015f60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506107bf95505050505050565b005b34156102f857600080fd5b61030061092a565b604051600160a060020a03909116815260200160405180910390f35b341561032757600080fd5b61015f600160a060020a036004351661093a565b005b600160a060020a03808416600090815260016020908152604080832086845282528083209385168352929052205460ff165b9392505050565b61037e610edc565b600160a060020a03831660009081526002602090815260408083208584528252918290208054909290918281020190519081016040528092919081815260200182805480156103f657602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116103d8575b505050505090505b92915050565b60008054600080516020610f3a83398151915291600160a060020a0390911690639085b77f90339084903090600160e060020a0319813516906040516020015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152602481019390935292166044820152600160e060020a03199091166064820152608401602060405180830381600087803b15156104a257600080fd5b6102c65a03f115156104b357600080fd5b50505060405180519050151561007257600080fd5b600080fd5b5b505050565b600160a060020a03808516600090815260016020908152604080832087845282528083209386168352929052908120548190819060ff16815b81600281111561051857fe5b1415925060015b81600281111561052b57fe5b14915082151561058a5750600160a060020a0387166000908152600160209081526040808320898452825280832083805290915281205460ff16905b81600281111561057357fe5b1415925060015b81600281111561058657fe5b1491505b8215156105fc575060008681527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4960209081526040808320600160a060020a038916845290915281205460ff16905b8160028111156105e557fe5b1415925060015b8160028111156105f857fe5b1491505b821515610665575060008681527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496020908152604080832083805290915281205460ff16905b81600281111561064e57fe5b1415925060015b81600281111561066157fe5b1491505b82151561067157600091505b85600160a060020a031688600160a060020a03167ff5122232b588fd8926743beb8e1ce73bb77585b17da27b759a60596bcb80e416898886604051928352600160e060020a0319909116602083015215156040808301919091526060909101905180910390a38193505b505050949350505050565b60008054600080516020610f3a83398151915291600160a060020a0390911690639085b77f90339084903090600160e060020a0319813516906040516020015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152602481019390935292166044820152600160e060020a03199091166064820152608401602060405180830381600087803b151561078457600080fd5b6102c65a03f1151561079557600080fd5b5050506040518051905015156107aa57600080fd5b6107b685858585610b5f565b5b5b5050505050565b60008054600080516020610f3a83398151915290600160a060020a0316639085b77f338330600160e060020a0319873516876040516020015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152602481019390935292166044820152600160e060020a03199091166064820152608401602060405180830381600087803b151561085657600080fd5b6102c65a03f1151561086757600080fd5b50505060405180519050151561087c57600080fd5b845186511461088a57600080fd5b835186511461089857600080fd5b82518651146108a657600080fd5b600091505b8551821015610920576109148683815181106108c357fe5b906020019060200201518684815181106108d957fe5b906020019060200201518685815181106108ef57fe5b9060200190602002015186868151811061090557fe5b90602001906020020151610b5f565b5b8160010191506108ab565b5b5b505050505050565b600054600160a060020a03165b90565b6000805481907f0542bbd0c672578966dcc525b30aa16723bb042675554ac5b0362f86b6e97dc590600160a060020a0316639085b77f338330600160e060020a0319873516876040516020015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152602481019390935292166044820152600160e060020a03199091166064820152608401602060405180830381600087803b15156109e557600080fd5b6102c65a03f115156109f657600080fd5b505050604051805190501515610a0b57600080fd5b339250600160a060020a0384161515610a605782600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f193505050501515610a5b57600080fd5b610b56565b83600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610ab757600080fd5b6102c65a03f11515610ac857600080fd5b5050506040518051925050600160a060020a03841663a9059cbb848460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b3057600080fd5b6102c65a03f11515610b4157600080fd5b505050604051805190501515610b5657600080fd5b5b5b5b50505050565b6000600080516020610f3a83398151915284141580610b90575033600160a060020a031685600160a060020a031614155b80610bad575030600160a060020a031683600160a060020a031614155b1515610bb857600080fd5b50600160a060020a03808516600090815260016020908152604080832087845282528083209386168352929052205460ff16816002811115610bf657fe5b816002811115610c0257fe5b1415610c0d576107b6565b600160a060020a038086166000908152600160208181526040808420898552825280842094881684529390529190208054849260ff1990911690836002811115610c5357fe5b0217905550610c658585858486610cf6565b82600160a060020a031685600160a060020a03167f56e428fc9adc34022bed992b624158401d97ef3bfa2763cacbdb984ec1af89bf33878587604051600160a060020a03851681526020810184905260408101836002811115610cc457fe5b60ff168152602001826002811115610cd857fe5b60ff16815260200194505050505060405180910390a35b5050505050565b600160a060020a0383166000908152600260209081526040808320878452909152812090805b846002811115610d2857fe5b148015610d42575060005b836002811115610d3f57fe5b14155b15610d87578154829060018101610d598382610eee565b916000526020600020900160005b8154600160a060020a03808c166101009390930a92830292021916179055505b60005b846002811115610d9657fe5b14158015610db0575060005b836002811115610dae57fe5b145b15610ed1575060005b8154811015610ed15786600160a060020a03168282815481101515610dda57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03161415610ec857815482906000198101908110610e1b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a03168282815481101515610e4957fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a03160217905550816001838054905003815481101515610e8e57fe5b906000526020600020900160005b81546101009190910a600160a060020a030219169055815460001901610ec28382610eee565b50610ed1565b5b600101610db9565b5b5b50505050505050565b60206040519081016040526000815290565b8154818355818115116104cd576000838152602090206104cd918101908301610f18565b5b505050565b61093791905b80821115610f325760008155600101610f1e565b5090565b905600ac42f8beb17975ed062dcb80c63e6d203ef1c2c335ced149dc5664cc671cb7daa165627a7a72305820e7a9dcfedd0e78aabf9d840c8660e0b34fd29bbdc2fe767e5fc96c77260eed220029ac42f8beb17975ed062dcb80c63e6d203ef1c2c335ced149dc5664cc671cb7da

Deployed Bytecode

0x606060405236156100725763ffffffff60e060020a6000350416630beeb0af811461007757806311d817f2146100c4578063578756311461013a5780639085b77f14610161578063c3bdc16f146101ab578063e88eff06146101dc578063f5d60a51146102ed578063fc772c8b1461031c575b600080fd5b341561008257600080fd5b6100a0600160a060020a03600435811690602435906044351661033d565b604051808260028111156100b057fe5b60ff16815260200191505060405180910390f35b34156100cf57600080fd5b6100e6600160a060020a0360043516602435610376565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156101265780820151818401525b60200161010d565b505050509050019250505060405180910390f35b341561014557600080fd5b61015f600160a060020a0360043581169060243516610404565b005b341561016c57600080fd5b610197600160a060020a036004358116906024359060443516600160e060020a0319606435166104d3565b604051901515815260200160405180910390f35b34156101b657600080fd5b61015f600160a060020a03600435811690602435906044351660ff606435166106e6565b005b34156101e757600080fd5b61015f60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496506107bf95505050505050565b005b34156102f857600080fd5b61030061092a565b604051600160a060020a03909116815260200160405180910390f35b341561032757600080fd5b61015f600160a060020a036004351661093a565b005b600160a060020a03808416600090815260016020908152604080832086845282528083209385168352929052205460ff165b9392505050565b61037e610edc565b600160a060020a03831660009081526002602090815260408083208584528252918290208054909290918281020190519081016040528092919081815260200182805480156103f657602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116103d8575b505050505090505b92915050565b60008054600080516020610f3a83398151915291600160a060020a0390911690639085b77f90339084903090600160e060020a0319813516906040516020015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152602481019390935292166044820152600160e060020a03199091166064820152608401602060405180830381600087803b15156104a257600080fd5b6102c65a03f115156104b357600080fd5b50505060405180519050151561007257600080fd5b600080fd5b5b505050565b600160a060020a03808516600090815260016020908152604080832087845282528083209386168352929052908120548190819060ff16815b81600281111561051857fe5b1415925060015b81600281111561052b57fe5b14915082151561058a5750600160a060020a0387166000908152600160209081526040808320898452825280832083805290915281205460ff16905b81600281111561057357fe5b1415925060015b81600281111561058657fe5b1491505b8215156105fc575060008681527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4960209081526040808320600160a060020a038916845290915281205460ff16905b8160028111156105e557fe5b1415925060015b8160028111156105f857fe5b1491505b821515610665575060008681527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb496020908152604080832083805290915281205460ff16905b81600281111561064e57fe5b1415925060015b81600281111561066157fe5b1491505b82151561067157600091505b85600160a060020a031688600160a060020a03167ff5122232b588fd8926743beb8e1ce73bb77585b17da27b759a60596bcb80e416898886604051928352600160e060020a0319909116602083015215156040808301919091526060909101905180910390a38193505b505050949350505050565b60008054600080516020610f3a83398151915291600160a060020a0390911690639085b77f90339084903090600160e060020a0319813516906040516020015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152602481019390935292166044820152600160e060020a03199091166064820152608401602060405180830381600087803b151561078457600080fd5b6102c65a03f1151561079557600080fd5b5050506040518051905015156107aa57600080fd5b6107b685858585610b5f565b5b5b5050505050565b60008054600080516020610f3a83398151915290600160a060020a0316639085b77f338330600160e060020a0319873516876040516020015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152602481019390935292166044820152600160e060020a03199091166064820152608401602060405180830381600087803b151561085657600080fd5b6102c65a03f1151561086757600080fd5b50505060405180519050151561087c57600080fd5b845186511461088a57600080fd5b835186511461089857600080fd5b82518651146108a657600080fd5b600091505b8551821015610920576109148683815181106108c357fe5b906020019060200201518684815181106108d957fe5b906020019060200201518685815181106108ef57fe5b9060200190602002015186868151811061090557fe5b90602001906020020151610b5f565b5b8160010191506108ab565b5b5b505050505050565b600054600160a060020a03165b90565b6000805481907f0542bbd0c672578966dcc525b30aa16723bb042675554ac5b0362f86b6e97dc590600160a060020a0316639085b77f338330600160e060020a0319873516876040516020015260405160e060020a63ffffffff8716028152600160a060020a039485166004820152602481019390935292166044820152600160e060020a03199091166064820152608401602060405180830381600087803b15156109e557600080fd5b6102c65a03f115156109f657600080fd5b505050604051805190501515610a0b57600080fd5b339250600160a060020a0384161515610a605782600160a060020a03166108fc30600160a060020a0316319081150290604051600060405180830381858888f193505050501515610a5b57600080fd5b610b56565b83600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610ab757600080fd5b6102c65a03f11515610ac857600080fd5b5050506040518051925050600160a060020a03841663a9059cbb848460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b3057600080fd5b6102c65a03f11515610b4157600080fd5b505050604051805190501515610b5657600080fd5b5b5b5b50505050565b6000600080516020610f3a83398151915284141580610b90575033600160a060020a031685600160a060020a031614155b80610bad575030600160a060020a031683600160a060020a031614155b1515610bb857600080fd5b50600160a060020a03808516600090815260016020908152604080832087845282528083209386168352929052205460ff16816002811115610bf657fe5b816002811115610c0257fe5b1415610c0d576107b6565b600160a060020a038086166000908152600160208181526040808420898552825280842094881684529390529190208054849260ff1990911690836002811115610c5357fe5b0217905550610c658585858486610cf6565b82600160a060020a031685600160a060020a03167f56e428fc9adc34022bed992b624158401d97ef3bfa2763cacbdb984ec1af89bf33878587604051600160a060020a03851681526020810184905260408101836002811115610cc457fe5b60ff168152602001826002811115610cd857fe5b60ff16815260200194505050505060405180910390a35b5050505050565b600160a060020a0383166000908152600260209081526040808320878452909152812090805b846002811115610d2857fe5b148015610d42575060005b836002811115610d3f57fe5b14155b15610d87578154829060018101610d598382610eee565b916000526020600020900160005b8154600160a060020a03808c166101009390930a92830292021916179055505b60005b846002811115610d9657fe5b14158015610db0575060005b836002811115610dae57fe5b145b15610ed1575060005b8154811015610ed15786600160a060020a03168282815481101515610dda57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a03161415610ec857815482906000198101908110610e1b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a03168282815481101515610e4957fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a03160217905550816001838054905003815481101515610e8e57fe5b906000526020600020900160005b81546101009190910a600160a060020a030219169055815460001901610ec28382610eee565b50610ed1565b5b600101610db9565b5b5b50505050505050565b60206040519081016040526000815290565b8154818355818115116104cd576000838152602090206104cd918101908301610f18565b5b505050565b61093791905b80821115610f325760008155600101610f1e565b5090565b905600ac42f8beb17975ed062dcb80c63e6d203ef1c2c335ced149dc5664cc671cb7daa165627a7a72305820e7a9dcfedd0e78aabf9d840c8660e0b34fd29bbdc2fe767e5fc96c77260eed220029

Swarm Source

bzzr://e7a9dcfedd0e78aabf9d840c8660e0b34fd29bbdc2fe767e5fc96c77260eed22

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.