ETH Price: $3,306.57 (+2.98%)

Contract

0xc17D432Bd8e8850Fd7b32B0270f5AfAc65DB0105
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Change Owner71736322019-02-04 13:50:582177 days ago1549288258IN
0xc17D432B...c65DB0105
0 ETH0.000119814

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ModuleRegistry

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 999 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-02-04
*/

pragma solidity ^0.4.24;

/**
 * @title BaseWallet
 * @dev Simple modular wallet that authorises modules to call its invoke() method.
 * Based on https://gist.github.com/Arachnid/a619d31f6d32757a4328a428286da186 by 
 * @author Julien Niset - <[email protected]>
 */
contract BaseWallet {

    // The implementation of the proxy
    address public implementation;
    // The owner 
    address public owner;
    // The authorised modules
    mapping (address => bool) public authorised;
    // The enabled static calls
    mapping (bytes4 => address) public enabled;
    // The number of modules
    uint public modules;
    
    event AuthorisedModule(address indexed module, bool value);
    event EnabledStaticCall(address indexed module, bytes4 indexed method);
    event Invoked(address indexed module, address indexed target, uint indexed value, bytes data);
    event Received(uint indexed value, address indexed sender, bytes data);
    event OwnerChanged(address owner);
    
    /**
     * @dev Throws if the sender is not an authorised module.
     */
    modifier moduleOnly {
        require(authorised[msg.sender], "BW: msg.sender not an authorized module");
        _;
    }

    /**
     * @dev Inits the wallet by setting the owner and authorising a list of modules.
     * @param _owner The owner.
     * @param _modules The modules to authorise.
     */
    function init(address _owner, address[] _modules) external {
        require(owner == address(0) && modules == 0, "BW: wallet already initialised");
        require(_modules.length > 0, "BW: construction requires at least 1 module");
        owner = _owner;
        modules = _modules.length;
        for(uint256 i = 0; i < _modules.length; i++) {
            require(authorised[_modules[i]] == false, "BW: module is already added");
            authorised[_modules[i]] = true;
            Module(_modules[i]).init(this);
            emit AuthorisedModule(_modules[i], true);
        }
    }
    
    /**
     * @dev Enables/Disables a module.
     * @param _module The target module.
     * @param _value Set to true to authorise the module.
     */
    function authoriseModule(address _module, bool _value) external moduleOnly {
        if (authorised[_module] != _value) {
            if(_value == true) {
                modules += 1;
                authorised[_module] = true;
                Module(_module).init(this);
            }
            else {
                modules -= 1;
                require(modules > 0, "BW: wallet must have at least one module");
                delete authorised[_module];
            }
            emit AuthorisedModule(_module, _value);
        }
    }

    /**
    * @dev Enables a static method by specifying the target module to which the call
    * must be delegated.
    * @param _module The target module.
    * @param _method The static method signature.
    */
    function enableStaticCall(address _module, bytes4 _method) external moduleOnly {
        require(authorised[_module], "BW: must be an authorised module for static call");
        enabled[_method] = _module;
        emit EnabledStaticCall(_module, _method);
    }

    /**
     * @dev Sets a new owner for the wallet.
     * @param _newOwner The new owner.
     */
    function setOwner(address _newOwner) external moduleOnly {
        require(_newOwner != address(0), "BW: address cannot be null");
        owner = _newOwner;
        emit OwnerChanged(_newOwner);
    }
    
    /**
     * @dev Performs a generic transaction.
     * @param _target The address for the transaction.
     * @param _value The value of the transaction.
     * @param _data The data of the transaction.
     */
    function invoke(address _target, uint _value, bytes _data) external moduleOnly {
        // solium-disable-next-line security/no-call-value
        require(_target.call.value(_value)(_data), "BW: call to target failed");
        emit Invoked(msg.sender, _target, _value, _data);
    }

    /**
     * @dev This method makes it possible for the wallet to comply to interfaces expecting the wallet to
     * implement specific static methods. It delegates the static call to a target contract if the data corresponds 
     * to an enabled method, or logs the call otherwise.
     */
    function() public payable {
        if(msg.data.length > 0) { 
            address module = enabled[msg.sig];
            if(module == address(0)) {
                emit Received(msg.value, msg.sender, msg.data);
            } 
            else {
                require(authorised[module], "BW: must be an authorised module for static call");
                // solium-disable-next-line security/no-inline-assembly
                assembly {
                    calldatacopy(0, 0, calldatasize())
                    let result := staticcall(gas, module, 0, calldatasize(), 0, 0)
                    returndatacopy(0, 0, returndatasize())
                    switch result 
                    case 0 {revert(0, returndatasize())} 
                    default {return (0, returndatasize())}
                }
            }
        }
    }
}

/**
 * @title Module
 * @dev Interface for a module. 
 * A module MUST implement the addModule() method to ensure that a wallet with at least one module
 * can never end up in a "frozen" state.
 * @author Julien Niset - <[email protected]>
 */
interface Module {

    /**
     * @dev Inits a module for a wallet by e.g. setting some wallet specific parameters in storage.
     * @param _wallet The wallet.
     */
    function init(BaseWallet _wallet) external;

    /**
     * @dev Adds a module to a wallet.
     * @param _wallet The target wallet.
     * @param _module The modules to authorise.
     */
    function addModule(BaseWallet _wallet, Module _module) external;

    /**
    * @dev Utility method to recover any ERC20 token that was sent to the
    * module by mistake. 
    * @param _token The token to recover.
    */
    function recoverToken(address _token) external;
}

/**
 * @title Upgrader
 * @dev Interface for a contract that can upgrade wallets by enabling/disabling modules. 
 * @author Julien Niset - <[email protected]>
 */
interface Upgrader {

    /**
     * @dev Upgrades a wallet by enabling/disabling modules.
     * @param _wallet The owner.
     */
    function upgrade(address _wallet, address[] _toDisable, address[] _toEnable) external;

    function toDisable() external view returns (address[]);

    function toEnable() external view returns (address[]);
}

/**
 * @title Owned
 * @dev Basic contract to define an owner.
 * @author Julien Niset - <[email protected]>
 */
contract Owned {

    // The owner
    address public owner;

    event OwnerChanged(address indexed _newOwner);

    /**
     * @dev Throws if the sender is not the owner.
     */
    modifier onlyOwner {
        require(msg.sender == owner, "Must be owner");
        _;
    }

    constructor() public {
        owner = msg.sender;
    }

    /**
     * @dev Lets the owner transfer ownership of the contract to a new owner.
     * @param _newOwner The new owner.
     */
    function changeOwner(address _newOwner) external onlyOwner {
        require(_newOwner != address(0), "Address must not be null");
        owner = _newOwner;
        emit OwnerChanged(_newOwner);
    }
}

/**
 * ERC20 contract interface.
 */
contract ERC20 {
    function totalSupply() public view returns (uint);
    function decimals() public view returns (uint);
    function balanceOf(address tokenOwner) public view returns (uint balance);
    function allowance(address tokenOwner, address spender) public view returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);
}

/**
 * @title ModuleRegistry
 * @dev Registry of authorised modules. 
 * Modules must be registered before they can be authorised on a wallet.
 * @author Julien Niset - <[email protected]>
 */
contract ModuleRegistry is Owned {

    mapping (address => Info) internal modules;
    mapping (address => Info) internal upgraders;

    event ModuleRegistered(address indexed module, bytes32 name);
    event ModuleDeRegistered(address module);
    event UpgraderRegistered(address indexed upgrader, bytes32 name);
    event UpgraderDeRegistered(address upgrader);

    struct Info {
        bool exists;
        bytes32 name;
    }

    /**
     * @dev Registers a module.
     * @param _module The module.
     * @param _name The unique name of the module.
     */
    function registerModule(address _module, bytes32 _name) external onlyOwner {
        require(!modules[_module].exists, "MR: module already exists");
        modules[_module] = Info({exists: true, name: _name});
        emit ModuleRegistered(_module, _name);
    }

    /**
     * @dev Deregisters a module.
     * @param _module The module.
     */
    function deregisterModule(address _module) external onlyOwner {
        require(modules[_module].exists, "MR: module does not exists");
        delete modules[_module];
        emit ModuleDeRegistered(_module);
    }

        /**
     * @dev Registers an upgrader.
     * @param _upgrader The upgrader.
     * @param _name The unique name of the upgrader.
     */
    function registerUpgrader(address _upgrader, bytes32 _name) external onlyOwner {
        require(!upgraders[_upgrader].exists, "MR: upgrader already exists");
        upgraders[_upgrader] = Info({exists: true, name: _name});
        emit UpgraderRegistered(_upgrader, _name);
    }

    /**
     * @dev Deregisters an upgrader.
     * @param _upgrader The _upgrader.
     */
    function deregisterUpgrader(address _upgrader) external onlyOwner {
        require(upgraders[_upgrader].exists, "MR: upgrader does not exists");
        delete upgraders[_upgrader];
        emit UpgraderDeRegistered(_upgrader);
    }

    /**
    * @dev Utility method enbaling the owner of the registry to claim any ERC20 token that was sent to the
    * registry.
    * @param _token The token to recover.
    */
    function recoverToken(address _token) external onlyOwner {
        uint total = ERC20(_token).balanceOf(address(this));
        ERC20(_token).transfer(msg.sender, total);
    } 

    /**
     * @dev Gets the name of a module from its address.
     * @param _module The module address.
     * @return the name.
     */
    function moduleInfo(address _module) external view returns (bytes32) {
        return modules[_module].name;
    }

    /**
     * @dev Gets the name of an upgrader from its address.
     * @param _upgrader The upgrader address.
     * @return the name.
     */
    function upgraderInfo(address _upgrader) external view returns (bytes32) {
        return upgraders[_upgrader].name;
    }

    /**
     * @dev Checks if a module is registered.
     * @param _module The module address.
     * @return true if the module is registered.
     */
    function isRegisteredModule(address _module) external view returns (bool) {
        return modules[_module].exists;
    }

    /**
     * @dev Checks if a list of modules are registered.
     * @param _modules The list of modules address.
     * @return true if all the modules are registered.
     */
    function isRegisteredModule(address[] _modules) external view returns (bool) {
        for(uint i = 0; i < _modules.length; i++) {
            if (!modules[_modules[i]].exists) {
                return false;
            }
        }
        return true;
    }  

    /**
     * @dev Checks if an upgrader is registered.
     * @param _upgrader The upgrader address.
     * @return true if the upgrader is registered.
     */
    function isRegisteredUpgrader(address _upgrader) external view returns (bool) {
        return upgraders[_upgrader].exists;
    } 

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_module","type":"address"}],"name":"isRegisteredModule","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_module","type":"address"},{"name":"_name","type":"bytes32"}],"name":"registerModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_upgrader","type":"address"},{"name":"_name","type":"bytes32"}],"name":"registerUpgrader","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_module","type":"address"}],"name":"moduleInfo","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_upgrader","type":"address"}],"name":"isRegisteredUpgrader","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_modules","type":"address[]"}],"name":"isRegisteredModule","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_module","type":"address"}],"name":"deregisterModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_upgrader","type":"address"}],"name":"deregisterUpgrader","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_upgrader","type":"address"}],"name":"upgraderInfo","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"module","type":"address"},{"indexed":false,"name":"name","type":"bytes32"}],"name":"ModuleRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"module","type":"address"}],"name":"ModuleDeRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"upgrader","type":"address"},{"indexed":false,"name":"name","type":"bytes32"}],"name":"UpgraderRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"upgrader","type":"address"}],"name":"UpgraderDeRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerChanged","type":"event"}]

608060405260008054600160a060020a03191633179055610ba1806100256000396000f3006080604052600436106100b95763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630bcd4ebb81146100be5780630f0356d0146100f35780633f4985cf1461011957806356b97ec11461013d57806363047bd8146101705780636bb18a541461019157806378b1fa74146101b15780638b27f7f5146101d25780638da5cb5b146101f35780639be65a6014610224578063a6f9dae114610245578063ce03c0a214610266575b600080fd5b3480156100ca57600080fd5b506100df600160a060020a0360043516610287565b604080519115158252519081900360200190f35b3480156100ff57600080fd5b50610117600160a060020a03600435166024356102a5565b005b34801561012557600080fd5b50610117600160a060020a03600435166024356103fb565b34801561014957600080fd5b5061015e600160a060020a0360043516610552565b60408051918252519081900360200190f35b34801561017c57600080fd5b506100df600160a060020a0360043516610571565b34801561019d57600080fd5b506100df600480356024810191013561058f565b3480156101bd57600080fd5b50610117600160a060020a03600435166105f4565b3480156101de57600080fd5b50610117600160a060020a036004351661072f565b3480156101ff57600080fd5b5061020861086b565b60408051600160a060020a039092168252519081900360200190f35b34801561023057600080fd5b50610117600160a060020a036004351661087a565b34801561025157600080fd5b50610117600160a060020a0360043516610a0b565b34801561027257600080fd5b5061015e600160a060020a0360043516610b37565b600160a060020a031660009081526001602052604090205460ff1690565b600054600160a060020a0316331461030c5760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526001602052604090205460ff16156103825760408051600080516020610b56833981519152815260206004820152601960248201527f4d523a206d6f64756c6520616c72656164792065786973747300000000000000604482015290519081900360640190fd5b60408051808201825260018082526020808301858152600160a060020a03871660008181528484528690209451855460ff1916901515178555905193909201929092558251848152925190927f395917e06309940ec7275c89424ecba05a0c7accd8bdd546e6558c6c86c2523992908290030190a25050565b600054600160a060020a031633146104625760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526002602052604090205460ff16156104d85760408051600080516020610b56833981519152815260206004820152601b60248201527f4d523a20757067726164657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b60408051808201825260018082526020808301858152600160a060020a0387166000818152600284528690209451855460ff1916901515178555905193909201929092558251848152925190927fb72a133f42ef268c125f96c7c6e407143f1d2fc5e2854b5f99887ee5da14377592908290030190a25050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a031660009081526002602052604090205460ff1690565b6000805b828110156105e857600160008585848181106105ab57fe5b60209081029290920135600160a060020a03168352508101919091526040016000205460ff1615156105e057600091506105ed565b600101610593565b600191505b5092915050565b600054600160a060020a0316331461065b5760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460ff1615156106d25760408051600080516020610b56833981519152815260206004820152601a60248201527f4d523a206d6f64756c6520646f6573206e6f7420657869737473000000000000604482015290519081900360640190fd5b600160a060020a0381166000818152600160208181526040808420805460ff19168155909201929092558051928352517fb292997b2d53de11cc46b82b9a3b1a253cca7aa614fb9b5677cb67d08516f8639281900390910190a150565b600054600160a060020a031633146107965760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526002602052604090205460ff16151561080d5760408051600080516020610b56833981519152815260206004820152601c60248201527f4d523a20757067726164657220646f6573206e6f742065786973747300000000604482015290519081900360640190fd5b600160a060020a0381166000818152600260209081526040808320805460ff1916815560010192909255815192835290517f58d12929a3008fbe6cd82f81558a511b80afa47fc9fc81f366e094bb681af64d9281900390910190a150565b600054600160a060020a031681565b60008054600160a060020a031633146108e25760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038416916370a082319160248083019260209291908290030181600087803b15801561094357600080fd5b505af1158015610957573d6000803e3d6000fd5b505050506040513d602081101561096d57600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051919250600160a060020a0384169163a9059cbb916044808201926020929091908290030181600087803b1580156109db57600080fd5b505af11580156109ef573d6000803e3d6000fd5b505050506040513d6020811015610a0557600080fd5b50505050565b600054600160a060020a03163314610a725760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381161515610ad75760408051600080516020610b56833981519152815260206004820152601860248201527f41646472657373206d757374206e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016600160a060020a038316908117825560405190917fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3691a250565b600160a060020a031660009081526002602052604090206001015490560008c379a000000000000000000000000000000000000000000000000000000000a165627a7a72305820e6603d3339dfe6ec56f899e97de4934f5a92f951e0035acdcbc0468b79589b990029

Deployed Bytecode

0x6080604052600436106100b95763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630bcd4ebb81146100be5780630f0356d0146100f35780633f4985cf1461011957806356b97ec11461013d57806363047bd8146101705780636bb18a541461019157806378b1fa74146101b15780638b27f7f5146101d25780638da5cb5b146101f35780639be65a6014610224578063a6f9dae114610245578063ce03c0a214610266575b600080fd5b3480156100ca57600080fd5b506100df600160a060020a0360043516610287565b604080519115158252519081900360200190f35b3480156100ff57600080fd5b50610117600160a060020a03600435166024356102a5565b005b34801561012557600080fd5b50610117600160a060020a03600435166024356103fb565b34801561014957600080fd5b5061015e600160a060020a0360043516610552565b60408051918252519081900360200190f35b34801561017c57600080fd5b506100df600160a060020a0360043516610571565b34801561019d57600080fd5b506100df600480356024810191013561058f565b3480156101bd57600080fd5b50610117600160a060020a03600435166105f4565b3480156101de57600080fd5b50610117600160a060020a036004351661072f565b3480156101ff57600080fd5b5061020861086b565b60408051600160a060020a039092168252519081900360200190f35b34801561023057600080fd5b50610117600160a060020a036004351661087a565b34801561025157600080fd5b50610117600160a060020a0360043516610a0b565b34801561027257600080fd5b5061015e600160a060020a0360043516610b37565b600160a060020a031660009081526001602052604090205460ff1690565b600054600160a060020a0316331461030c5760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526001602052604090205460ff16156103825760408051600080516020610b56833981519152815260206004820152601960248201527f4d523a206d6f64756c6520616c72656164792065786973747300000000000000604482015290519081900360640190fd5b60408051808201825260018082526020808301858152600160a060020a03871660008181528484528690209451855460ff1916901515178555905193909201929092558251848152925190927f395917e06309940ec7275c89424ecba05a0c7accd8bdd546e6558c6c86c2523992908290030190a25050565b600054600160a060020a031633146104625760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526002602052604090205460ff16156104d85760408051600080516020610b56833981519152815260206004820152601b60248201527f4d523a20757067726164657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b60408051808201825260018082526020808301858152600160a060020a0387166000818152600284528690209451855460ff1916901515178555905193909201929092558251848152925190927fb72a133f42ef268c125f96c7c6e407143f1d2fc5e2854b5f99887ee5da14377592908290030190a25050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a031660009081526002602052604090205460ff1690565b6000805b828110156105e857600160008585848181106105ab57fe5b60209081029290920135600160a060020a03168352508101919091526040016000205460ff1615156105e057600091506105ed565b600101610593565b600191505b5092915050565b600054600160a060020a0316331461065b5760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460ff1615156106d25760408051600080516020610b56833981519152815260206004820152601a60248201527f4d523a206d6f64756c6520646f6573206e6f7420657869737473000000000000604482015290519081900360640190fd5b600160a060020a0381166000818152600160208181526040808420805460ff19168155909201929092558051928352517fb292997b2d53de11cc46b82b9a3b1a253cca7aa614fb9b5677cb67d08516f8639281900390910190a150565b600054600160a060020a031633146107965760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526002602052604090205460ff16151561080d5760408051600080516020610b56833981519152815260206004820152601c60248201527f4d523a20757067726164657220646f6573206e6f742065786973747300000000604482015290519081900360640190fd5b600160a060020a0381166000818152600260209081526040808320805460ff1916815560010192909255815192835290517f58d12929a3008fbe6cd82f81558a511b80afa47fc9fc81f366e094bb681af64d9281900390910190a150565b600054600160a060020a031681565b60008054600160a060020a031633146108e25760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038416916370a082319160248083019260209291908290030181600087803b15801561094357600080fd5b505af1158015610957573d6000803e3d6000fd5b505050506040513d602081101561096d57600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051919250600160a060020a0384169163a9059cbb916044808201926020929091908290030181600087803b1580156109db57600080fd5b505af11580156109ef573d6000803e3d6000fd5b505050506040513d6020811015610a0557600080fd5b50505050565b600054600160a060020a03163314610a725760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381161515610ad75760408051600080516020610b56833981519152815260206004820152601860248201527f41646472657373206d757374206e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016600160a060020a038316908117825560405190917fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3691a250565b600160a060020a031660009081526002602052604090206001015490560008c379a000000000000000000000000000000000000000000000000000000000a165627a7a72305820e6603d3339dfe6ec56f899e97de4934f5a92f951e0035acdcbc0468b79589b990029

Swarm Source

bzzr://e6603d3339dfe6ec56f899e97de4934f5a92f951e0035acdcbc0468b79589b99

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.