Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Change Owner | 7173632 | 2177 days ago | IN | 0 ETH | 0.00011981 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
608060405260008054600160a060020a03191633179055610ba1806100256000396000f3006080604052600436106100b95763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630bcd4ebb81146100be5780630f0356d0146100f35780633f4985cf1461011957806356b97ec11461013d57806363047bd8146101705780636bb18a541461019157806378b1fa74146101b15780638b27f7f5146101d25780638da5cb5b146101f35780639be65a6014610224578063a6f9dae114610245578063ce03c0a214610266575b600080fd5b3480156100ca57600080fd5b506100df600160a060020a0360043516610287565b604080519115158252519081900360200190f35b3480156100ff57600080fd5b50610117600160a060020a03600435166024356102a5565b005b34801561012557600080fd5b50610117600160a060020a03600435166024356103fb565b34801561014957600080fd5b5061015e600160a060020a0360043516610552565b60408051918252519081900360200190f35b34801561017c57600080fd5b506100df600160a060020a0360043516610571565b34801561019d57600080fd5b506100df600480356024810191013561058f565b3480156101bd57600080fd5b50610117600160a060020a03600435166105f4565b3480156101de57600080fd5b50610117600160a060020a036004351661072f565b3480156101ff57600080fd5b5061020861086b565b60408051600160a060020a039092168252519081900360200190f35b34801561023057600080fd5b50610117600160a060020a036004351661087a565b34801561025157600080fd5b50610117600160a060020a0360043516610a0b565b34801561027257600080fd5b5061015e600160a060020a0360043516610b37565b600160a060020a031660009081526001602052604090205460ff1690565b600054600160a060020a0316331461030c5760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526001602052604090205460ff16156103825760408051600080516020610b56833981519152815260206004820152601960248201527f4d523a206d6f64756c6520616c72656164792065786973747300000000000000604482015290519081900360640190fd5b60408051808201825260018082526020808301858152600160a060020a03871660008181528484528690209451855460ff1916901515178555905193909201929092558251848152925190927f395917e06309940ec7275c89424ecba05a0c7accd8bdd546e6558c6c86c2523992908290030190a25050565b600054600160a060020a031633146104625760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526002602052604090205460ff16156104d85760408051600080516020610b56833981519152815260206004820152601b60248201527f4d523a20757067726164657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b60408051808201825260018082526020808301858152600160a060020a0387166000818152600284528690209451855460ff1916901515178555905193909201929092558251848152925190927fb72a133f42ef268c125f96c7c6e407143f1d2fc5e2854b5f99887ee5da14377592908290030190a25050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a031660009081526002602052604090205460ff1690565b6000805b828110156105e857600160008585848181106105ab57fe5b60209081029290920135600160a060020a03168352508101919091526040016000205460ff1615156105e057600091506105ed565b600101610593565b600191505b5092915050565b600054600160a060020a0316331461065b5760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460ff1615156106d25760408051600080516020610b56833981519152815260206004820152601a60248201527f4d523a206d6f64756c6520646f6573206e6f7420657869737473000000000000604482015290519081900360640190fd5b600160a060020a0381166000818152600160208181526040808420805460ff19168155909201929092558051928352517fb292997b2d53de11cc46b82b9a3b1a253cca7aa614fb9b5677cb67d08516f8639281900390910190a150565b600054600160a060020a031633146107965760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526002602052604090205460ff16151561080d5760408051600080516020610b56833981519152815260206004820152601c60248201527f4d523a20757067726164657220646f6573206e6f742065786973747300000000604482015290519081900360640190fd5b600160a060020a0381166000818152600260209081526040808320805460ff1916815560010192909255815192835290517f58d12929a3008fbe6cd82f81558a511b80afa47fc9fc81f366e094bb681af64d9281900390910190a150565b600054600160a060020a031681565b60008054600160a060020a031633146108e25760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038416916370a082319160248083019260209291908290030181600087803b15801561094357600080fd5b505af1158015610957573d6000803e3d6000fd5b505050506040513d602081101561096d57600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051919250600160a060020a0384169163a9059cbb916044808201926020929091908290030181600087803b1580156109db57600080fd5b505af11580156109ef573d6000803e3d6000fd5b505050506040513d6020811015610a0557600080fd5b50505050565b600054600160a060020a03163314610a725760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381161515610ad75760408051600080516020610b56833981519152815260206004820152601860248201527f41646472657373206d757374206e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016600160a060020a038316908117825560405190917fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3691a250565b600160a060020a031660009081526002602052604090206001015490560008c379a000000000000000000000000000000000000000000000000000000000a165627a7a72305820e6603d3339dfe6ec56f899e97de4934f5a92f951e0035acdcbc0468b79589b990029
Deployed Bytecode
0x6080604052600436106100b95763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630bcd4ebb81146100be5780630f0356d0146100f35780633f4985cf1461011957806356b97ec11461013d57806363047bd8146101705780636bb18a541461019157806378b1fa74146101b15780638b27f7f5146101d25780638da5cb5b146101f35780639be65a6014610224578063a6f9dae114610245578063ce03c0a214610266575b600080fd5b3480156100ca57600080fd5b506100df600160a060020a0360043516610287565b604080519115158252519081900360200190f35b3480156100ff57600080fd5b50610117600160a060020a03600435166024356102a5565b005b34801561012557600080fd5b50610117600160a060020a03600435166024356103fb565b34801561014957600080fd5b5061015e600160a060020a0360043516610552565b60408051918252519081900360200190f35b34801561017c57600080fd5b506100df600160a060020a0360043516610571565b34801561019d57600080fd5b506100df600480356024810191013561058f565b3480156101bd57600080fd5b50610117600160a060020a03600435166105f4565b3480156101de57600080fd5b50610117600160a060020a036004351661072f565b3480156101ff57600080fd5b5061020861086b565b60408051600160a060020a039092168252519081900360200190f35b34801561023057600080fd5b50610117600160a060020a036004351661087a565b34801561025157600080fd5b50610117600160a060020a0360043516610a0b565b34801561027257600080fd5b5061015e600160a060020a0360043516610b37565b600160a060020a031660009081526001602052604090205460ff1690565b600054600160a060020a0316331461030c5760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526001602052604090205460ff16156103825760408051600080516020610b56833981519152815260206004820152601960248201527f4d523a206d6f64756c6520616c72656164792065786973747300000000000000604482015290519081900360640190fd5b60408051808201825260018082526020808301858152600160a060020a03871660008181528484528690209451855460ff1916901515178555905193909201929092558251848152925190927f395917e06309940ec7275c89424ecba05a0c7accd8bdd546e6558c6c86c2523992908290030190a25050565b600054600160a060020a031633146104625760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526002602052604090205460ff16156104d85760408051600080516020610b56833981519152815260206004820152601b60248201527f4d523a20757067726164657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b60408051808201825260018082526020808301858152600160a060020a0387166000818152600284528690209451855460ff1916901515178555905193909201929092558251848152925190927fb72a133f42ef268c125f96c7c6e407143f1d2fc5e2854b5f99887ee5da14377592908290030190a25050565b600160a060020a03166000908152600160208190526040909120015490565b600160a060020a031660009081526002602052604090205460ff1690565b6000805b828110156105e857600160008585848181106105ab57fe5b60209081029290920135600160a060020a03168352508101919091526040016000205460ff1615156105e057600091506105ed565b600101610593565b600191505b5092915050565b600054600160a060020a0316331461065b5760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526001602052604090205460ff1615156106d25760408051600080516020610b56833981519152815260206004820152601a60248201527f4d523a206d6f64756c6520646f6573206e6f7420657869737473000000000000604482015290519081900360640190fd5b600160a060020a0381166000818152600160208181526040808420805460ff19168155909201929092558051928352517fb292997b2d53de11cc46b82b9a3b1a253cca7aa614fb9b5677cb67d08516f8639281900390910190a150565b600054600160a060020a031633146107965760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526002602052604090205460ff16151561080d5760408051600080516020610b56833981519152815260206004820152601c60248201527f4d523a20757067726164657220646f6573206e6f742065786973747300000000604482015290519081900360640190fd5b600160a060020a0381166000818152600260209081526040808320805460ff1916815560010192909255815192835290517f58d12929a3008fbe6cd82f81558a511b80afa47fc9fc81f366e094bb681af64d9281900390910190a150565b600054600160a060020a031681565b60008054600160a060020a031633146108e25760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038416916370a082319160248083019260209291908290030181600087803b15801561094357600080fd5b505af1158015610957573d6000803e3d6000fd5b505050506040513d602081101561096d57600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051919250600160a060020a0384169163a9059cbb916044808201926020929091908290030181600087803b1580156109db57600080fd5b505af11580156109ef573d6000803e3d6000fd5b505050506040513d6020811015610a0557600080fd5b50505050565b600054600160a060020a03163314610a725760408051600080516020610b56833981519152815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381161515610ad75760408051600080516020610b56833981519152815260206004820152601860248201527f41646472657373206d757374206e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016600160a060020a038316908117825560405190917fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3691a250565b600160a060020a031660009081526002602052604090206001015490560008c379a000000000000000000000000000000000000000000000000000000000a165627a7a72305820e6603d3339dfe6ec56f899e97de4934f5a92f951e0035acdcbc0468b79589b990029
Swarm Source
bzzr://e6603d3339dfe6ec56f899e97de4934f5a92f951e0035acdcbc0468b79589b99
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $13.67 | 400 | $5,468 |
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.