Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 37 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Counterfa... | 11880845 | 1417 days ago | IN | 0 ETH | 0.04989405 | ||||
Create Counterfa... | 11783266 | 1432 days ago | IN | 0 ETH | 0.07322224 | ||||
Create Counterfa... | 11775680 | 1433 days ago | IN | 0 ETH | 0.0601417 | ||||
Create Counterfa... | 11759210 | 1436 days ago | IN | 0 ETH | 0.06114701 | ||||
Create Counterfa... | 11744124 | 1438 days ago | IN | 0 ETH | 0.0316196 | ||||
Create Counterfa... | 11451393 | 1483 days ago | IN | 0 ETH | 0.01310293 | ||||
Create Counterfa... | 11431160 | 1486 days ago | IN | 0 ETH | 0.01312796 | ||||
Create Counterfa... | 11411708 | 1489 days ago | IN | 0 ETH | 0.01987004 | ||||
Create Wallet | 11356057 | 1498 days ago | IN | 0 ETH | 0.00917486 | ||||
Create Counterfa... | 11288788 | 1508 days ago | IN | 0 ETH | 0.01581079 | ||||
Create Counterfa... | 11288471 | 1508 days ago | IN | 0 ETH | 0.01189287 | ||||
Create Counterfa... | 11248721 | 1514 days ago | IN | 0 ETH | 0.030828 | ||||
Create Counterfa... | 11237258 | 1516 days ago | IN | 0 ETH | 0.01576559 | ||||
Create Counterfa... | 11236779 | 1516 days ago | IN | 0 ETH | 0.02266765 | ||||
Create Counterfa... | 11231350 | 1517 days ago | IN | 0 ETH | 0.01533396 | ||||
Create Counterfa... | 11231064 | 1517 days ago | IN | 0 ETH | 0.01677406 | ||||
Create Counterfa... | 11230523 | 1517 days ago | IN | 0 ETH | 0.03082483 | ||||
Create Counterfa... | 11222804 | 1518 days ago | IN | 0 ETH | 0.00903996 | ||||
Create Counterfa... | 11146075 | 1530 days ago | IN | 0 ETH | 0.02152437 | ||||
Create Counterfa... | 11138982 | 1531 days ago | IN | 0 ETH | 0.01352961 | ||||
Create Counterfa... | 11112589 | 1535 days ago | IN | 0 ETH | 0.0200042 | ||||
Create Counterfa... | 11053276 | 1544 days ago | IN | 0 ETH | 0.03808064 | ||||
Create Counterfa... | 11052268 | 1544 days ago | IN | 0 ETH | 0.03788391 | ||||
Create Counterfa... | 11020909 | 1549 days ago | IN | 0 ETH | 0.04034841 | ||||
Create Counterfa... | 11020051 | 1549 days ago | IN | 0 ETH | 0.03264141 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
WalletFactory
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Copyright (C) 2018 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.6.12; import "../wallet/Proxy.sol"; import "../wallet/BaseWallet.sol"; import "./base/Owned.sol"; import "./base/Managed.sol"; import "./storage/IGuardianStorage.sol"; import "./IModuleRegistry.sol"; import "../modules/common/IVersionManager.sol"; /** * @title WalletFactory * @notice The WalletFactory contract creates and assigns wallets to accounts. * @author Julien Niset - <[email protected]> */ contract WalletFactory is Owned, Managed { // The address of the module dregistry address public moduleRegistry; // The address of the base wallet implementation address public walletImplementation; // The address of the GuardianStorage address public guardianStorage; // *************** Events *************************** // event ModuleRegistryChanged(address addr); event WalletCreated(address indexed wallet, address indexed owner, address indexed guardian); // *************** Constructor ********************** // /** * @notice Default constructor. */ constructor(address _moduleRegistry, address _walletImplementation, address _guardianStorage) public { require(_moduleRegistry != address(0), "WF: ModuleRegistry address not defined"); require(_walletImplementation != address(0), "WF: WalletImplementation address not defined"); require(_guardianStorage != address(0), "WF: GuardianStorage address not defined"); moduleRegistry = _moduleRegistry; walletImplementation = _walletImplementation; guardianStorage = _guardianStorage; } // *************** External Functions ********************* // /** * @notice Lets the manager create a wallet for an owner account. * The wallet is initialised with the version manager module, a version number and a first guardian. * The wallet is created using the CREATE opcode. * @param _owner The account address. * @param _versionManager The version manager module * @param _guardian The guardian address. * @param _version The version of the feature bundle. */ function createWallet( address _owner, address _versionManager, address _guardian, uint256 _version ) external onlyManager { validateInputs(_owner, _versionManager, _guardian, _version); Proxy proxy = new Proxy(walletImplementation); address payable wallet = address(proxy); configureWallet(BaseWallet(wallet), _owner, _versionManager, _guardian, _version); } /** * @notice Lets the manager create a wallet for an owner account at a specific address. * The wallet is initialised with the version manager module, the version number and a first guardian. * The wallet is created using the CREATE2 opcode. * @param _owner The account address. * @param _versionManager The version manager module * @param _guardian The guardian address. * @param _salt The salt. * @param _version The version of the feature bundle. */ function createCounterfactualWallet( address _owner, address _versionManager, address _guardian, bytes32 _salt, uint256 _version ) external onlyManager returns (address _wallet) { validateInputs(_owner, _versionManager, _guardian, _version); bytes32 newsalt = newSalt(_salt, _owner, _versionManager, _guardian, _version); Proxy proxy = new Proxy{salt: newsalt}(walletImplementation); address payable wallet = address(proxy); configureWallet(BaseWallet(wallet), _owner, _versionManager, _guardian, _version); return wallet; } /** * @notice Gets the address of a counterfactual wallet with a first default guardian. * @param _owner The account address. * @param _versionManager The version manager module * @param _guardian The guardian address. * @param _salt The salt. * @param _version The version of feature bundle. * @return _wallet The address that the wallet will have when created using CREATE2 and the same input parameters. */ function getAddressForCounterfactualWallet( address _owner, address _versionManager, address _guardian, bytes32 _salt, uint256 _version ) external view returns (address _wallet) { validateInputs(_owner, _versionManager, _guardian, _version); bytes32 newsalt = newSalt(_salt, _owner, _versionManager, _guardian, _version); bytes memory code = abi.encodePacked(type(Proxy).creationCode, uint256(walletImplementation)); bytes32 hash = keccak256(abi.encodePacked(bytes1(0xff), address(this), newsalt, keccak256(code))); _wallet = address(uint160(uint256(hash))); } /** * @notice Lets the owner change the address of the module registry contract. * @param _moduleRegistry The address of the module registry contract. */ function changeModuleRegistry(address _moduleRegistry) external onlyOwner { require(_moduleRegistry != address(0), "WF: address cannot be null"); moduleRegistry = _moduleRegistry; emit ModuleRegistryChanged(_moduleRegistry); } /** * @notice Inits the module for a wallet by doing nothing. * The method can only be called by the wallet itself. * @param _wallet The wallet. */ function init(BaseWallet _wallet) external pure { //do nothing } // *************** Internal Functions ********************* // /** * @notice Helper method to configure a wallet for a set of input parameters. * @param _wallet The target wallet * @param _owner The account address. * @param _versionManager The version manager module * @param _guardian The guardian address. * @param _version The version of the feature bundle. */ function configureWallet( BaseWallet _wallet, address _owner, address _versionManager, address _guardian, uint256 _version ) internal { // add the factory to modules so it can add a guardian and upgrade the wallet to the required version address[] memory extendedModules = new address[](2); extendedModules[0] = _versionManager; extendedModules[1] = address(this); // initialise the wallet with the owner and the extended modules _wallet.init(_owner, extendedModules); // add guardian IGuardianStorage(guardianStorage).addGuardian(address(_wallet), _guardian); // upgrade the wallet IVersionManager(_versionManager).upgradeWallet(address(_wallet), _version); // remove the factory from the authorised modules _wallet.authoriseModule(address(this), false); // emit event emit WalletCreated(address(_wallet), _owner, _guardian); } /** * @notice Generates a new salt based on a provided salt, an owner, a list of modules and an optional guardian. * @param _salt The slat provided. * @param _owner The owner address. * @param _versionManager The version manager module * @param _guardian The guardian address. * @param _version The version of feature bundle */ function newSalt(bytes32 _salt, address _owner, address _versionManager, address _guardian, uint256 _version) internal pure returns (bytes32) { return keccak256(abi.encodePacked(_salt, _owner, _versionManager, _guardian, _version)); } /** * @notice Throws if the owner, guardian, version or version manager is invalid. * @param _owner The owner address. * @param _versionManager The version manager module * @param _guardian The guardian address * @param _version The version of feature bundle */ function validateInputs(address _owner, address _versionManager, address _guardian, uint256 _version) internal view { require(_owner != address(0), "WF: owner cannot be null"); require(IModuleRegistry(moduleRegistry).isRegisteredModule(_versionManager), "WF: invalid _versionManager"); require(_guardian != (address(0)), "WF: guardian cannot be null"); require(_version > 0, "WF: invalid _version"); } }
// Copyright (C) 2020 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.4 <0.7.0; /** * @title IModuleRegistry * @notice Interface for the registry of authorised modules. */ interface IModuleRegistry { function registerModule(address _module, bytes32 _name) external; function deregisterModule(address _module) external; function registerUpgrader(address _upgrader, bytes32 _name) external; function deregisterUpgrader(address _upgrader) external; function recoverToken(address _token) external; function moduleInfo(address _module) external view returns (bytes32); function upgraderInfo(address _upgrader) external view returns (bytes32); function isRegisteredModule(address _module) external view returns (bool); function isRegisteredModule(address[] calldata _modules) external view returns (bool); function isRegisteredUpgrader(address _upgrader) external view returns (bool); }
// Copyright (C) 2018 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.4 <0.7.0; import "./Owned.sol"; /** * @title Managed * @notice Basic contract that defines a set of managers. Only the owner can add/remove managers. * @author Julien Niset - <[email protected]> */ contract Managed is Owned { // The managers mapping (address => bool) public managers; /** * @notice Throws if the sender is not a manager. */ modifier onlyManager { require(managers[msg.sender] == true, "M: Must be manager"); _; } event ManagerAdded(address indexed _manager); event ManagerRevoked(address indexed _manager); /** * @notice Adds a manager. * @param _manager The address of the manager. */ function addManager(address _manager) external onlyOwner { require(_manager != address(0), "M: Address must not be null"); if (managers[_manager] == false) { managers[_manager] = true; emit ManagerAdded(_manager); } } /** * @notice Revokes a manager. * @param _manager The address of the manager. */ function revokeManager(address _manager) external onlyOwner { require(managers[_manager] == true, "M: Target must be an existing manager"); delete managers[_manager]; emit ManagerRevoked(_manager); } }
// Copyright (C) 2018 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.4 <0.7.0; /** * @title Owned * @notice Basic contract to define an owner. * @author Julien Niset - <[email protected]> */ contract Owned { // The owner address public owner; event OwnerChanged(address indexed _newOwner); /** * @notice Throws if the sender is not the owner. */ modifier onlyOwner { require(msg.sender == owner, "Must be owner"); _; } constructor() public { owner = msg.sender; } /** * @notice 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); } }
// Copyright (C) 2018 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.4 <0.7.0; interface IGuardianStorage { /** * @notice Lets an authorised module add a guardian to a wallet. * @param _wallet The target wallet. * @param _guardian The guardian to add. */ function addGuardian(address _wallet, address _guardian) external; /** * @notice Lets an authorised module revoke a guardian from a wallet. * @param _wallet The target wallet. * @param _guardian The guardian to revoke. */ function revokeGuardian(address _wallet, address _guardian) external; /** * @notice Checks if an account is a guardian for a wallet. * @param _wallet The target wallet. * @param _guardian The account. * @return true if the account is a guardian for a wallet. */ function isGuardian(address _wallet, address _guardian) external view returns (bool); function isLocked(address _wallet) external view returns (bool); function getLock(address _wallet) external view returns (uint256); function getLocker(address _wallet) external view returns (address); function setLock(address _wallet, uint256 _releaseAfter) external; function getGuardians(address _wallet) external view returns (address[] memory); function guardianCount(address _wallet) external view returns (uint256); }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; /** * @title ILimitStorage * @notice LimitStorage interface */ interface ILimitStorage { struct Limit { // the current limit uint128 current; // the pending limit if any uint128 pending; // when the pending limit becomes the current limit uint64 changeAfter; } struct DailySpent { // The amount already spent during the current period uint128 alreadySpent; // The end of the current period uint64 periodEnd; } function setLimit(address _wallet, Limit memory _limit) external; function getLimit(address _wallet) external view returns (Limit memory _limit); function setDailySpent(address _wallet, DailySpent memory _dailySpent) external; function getDailySpent(address _wallet) external view returns (DailySpent memory _dailySpent); function setLimitAndDailySpent(address _wallet, Limit memory _limit, DailySpent memory _dailySpent) external; function getLimitAndDailySpent(address _wallet) external view returns (Limit memory _limit, DailySpent memory _dailySpent); }
// Copyright (C) 2018 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.4 <0.7.0; /** * @title IModule * @notice 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 IModule { /** * @notice Inits a module for a wallet by e.g. setting some wallet specific parameters in storage. * @param _wallet The wallet. */ function init(address _wallet) external; /** * @notice Adds a module to a wallet. Cannot execute when wallet is locked (or under recovery) * @param _wallet The target wallet. * @param _module The modules to authorise. */ function addModule(address _wallet, address _module) external; }
// Copyright (C) 2018 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.4 <0.7.0; pragma experimental ABIEncoderV2; import "../../infrastructure/storage/ILimitStorage.sol"; /** * @title IVersionManager * @notice Interface for the VersionManager module. * @author Olivier VDB - <[email protected]> */ interface IVersionManager { /** * @notice Returns true if the feature is authorised for the wallet * @param _wallet The target wallet. * @param _feature The feature. */ function isFeatureAuthorised(address _wallet, address _feature) external view returns (bool); /** * @notice Lets a feature (caller) invoke a wallet. * @param _wallet The target wallet. * @param _to The target address for the transaction. * @param _value The value of the transaction. * @param _data The data of the transaction. */ function checkAuthorisedFeatureAndInvokeWallet( address _wallet, address _to, uint256 _value, bytes calldata _data ) external returns (bytes memory _res); /* ******* Backward Compatibility with old Storages and BaseWallet *************** */ /** * @notice Sets a new owner for the wallet. * @param _newOwner The new owner. */ function setOwner(address _wallet, address _newOwner) external; /** * @notice Lets a feature write data to a storage contract. * @param _wallet The target wallet. * @param _storage The storage contract. * @param _data The data of the call */ function invokeStorage(address _wallet, address _storage, bytes calldata _data) external; /** * @notice Upgrade a wallet to a new version. * @param _wallet the wallet to upgrade * @param _toVersion the new version */ function upgradeWallet(address _wallet, uint256 _toVersion) external; }
// Copyright (C) 2018 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.6.12; import "../modules/common/IModule.sol"; import "./IWallet.sol"; /** * @title BaseWallet * @notice Simple modular wallet that authorises modules to call its invoke() method. * @author Julien Niset - <[email protected]> */ contract BaseWallet is IWallet { // The implementation of the proxy address public implementation; // The owner address public override owner; // The authorised modules mapping (address => bool) public override authorised; // The enabled static calls mapping (bytes4 => address) public override enabled; // The number of modules uint public override 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); /** * @notice Throws if the sender is not an authorised module. */ modifier moduleOnly { require(authorised[msg.sender], "BW: msg.sender not an authorized module"); _; } /** * @notice 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[] calldata _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; IModule(_modules[i]).init(address(this)); emit AuthorisedModule(_modules[i], true); } if (address(this).balance > 0) { emit Received(address(this).balance, address(0), ""); } } /** * @inheritdoc IWallet */ function authoriseModule(address _module, bool _value) external override moduleOnly { if (authorised[_module] != _value) { emit AuthorisedModule(_module, _value); if (_value == true) { modules += 1; authorised[_module] = true; IModule(_module).init(address(this)); } else { modules -= 1; require(modules > 0, "BW: wallet must have at least one module"); delete authorised[_module]; } } } /** * @inheritdoc IWallet */ function enableStaticCall(address _module, bytes4 _method) external override moduleOnly { require(authorised[_module], "BW: must be an authorised module for static call"); enabled[_method] = _module; emit EnabledStaticCall(_module, _method); } /** * @inheritdoc IWallet */ function setOwner(address _newOwner) external override moduleOnly { require(_newOwner != address(0), "BW: address cannot be null"); owner = _newOwner; emit OwnerChanged(_newOwner); } /** * @notice 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 calldata _data) external moduleOnly returns (bytes memory _result) { bool success; (success, _result) = _target.call{value: _value}(_data); if (!success) { // solhint-disable-next-line no-inline-assembly assembly { returndatacopy(0, 0, returndatasize()) revert(0, returndatasize()) } } emit Invoked(msg.sender, _target, _value, _data); } /** * @notice This method delegates the static call to a target contract if the data corresponds * to an enabled module, or logs the call otherwise. */ fallback() external payable { 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"); // solhint-disable-next-line 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())} } } } receive() external payable { } }
// Copyright (C) 2018 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.4 <0.7.0; /** * @title IWallet * @notice Interface for the BaseWallet */ interface IWallet { /** * @notice Returns the wallet owner. * @return The wallet owner address. */ function owner() external view returns (address); /** * @notice Returns the number of authorised modules. * @return The number of authorised modules. */ function modules() external view returns (uint); /** * @notice Sets a new owner for the wallet. * @param _newOwner The new owner. */ function setOwner(address _newOwner) external; /** * @notice Checks if a module is authorised on the wallet. * @param _module The module address to check. * @return `true` if the module is authorised, otherwise `false`. */ function authorised(address _module) external view returns (bool); /** * @notice Returns the module responsible for a static call redirection. * @param _sig The signature of the static call. * @return the module doing the redirection */ function enabled(bytes4 _sig) external view returns (address); /** * @notice 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; /** * @notice 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; }
// Copyright (C) 2018 Argent Labs Ltd. <https://argent.xyz> // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.6.12; /** * @title Proxy * @notice Basic proxy that delegates all calls to a fixed implementing contract. * The implementing contract cannot be upgraded. * @author Julien Niset - <[email protected]> */ contract Proxy { address implementation; event Received(uint indexed value, address indexed sender, bytes data); constructor(address _implementation) public { implementation = _implementation; } fallback() external payable { // solhint-disable-next-line no-inline-assembly assembly { let target := sload(0) calldatacopy(0, 0, calldatasize()) let result := delegatecall(gas(), target, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 {revert(0, returndatasize())} default {return (0, returndatasize())} } } receive() external payable { emit Received(msg.value, msg.sender, msg.data); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 999 }, "evmVersion": "istanbul", "libraries": { "": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_moduleRegistry","type":"address"},{"internalType":"address","name":"_walletImplementation","type":"address"},{"internalType":"address","name":"_guardianStorage","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_manager","type":"address"}],"name":"ManagerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_manager","type":"address"}],"name":"ManagerRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ModuleRegistryChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"guardian","type":"address"}],"name":"WalletCreated","type":"event"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_moduleRegistry","type":"address"}],"name":"changeModuleRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_versionManager","type":"address"},{"internalType":"address","name":"_guardian","type":"address"},{"internalType":"bytes32","name":"_salt","type":"bytes32"},{"internalType":"uint256","name":"_version","type":"uint256"}],"name":"createCounterfactualWallet","outputs":[{"internalType":"address","name":"_wallet","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_versionManager","type":"address"},{"internalType":"address","name":"_guardian","type":"address"},{"internalType":"uint256","name":"_version","type":"uint256"}],"name":"createWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_versionManager","type":"address"},{"internalType":"address","name":"_guardian","type":"address"},{"internalType":"bytes32","name":"_salt","type":"bytes32"},{"internalType":"uint256","name":"_version","type":"uint256"}],"name":"getAddressForCounterfactualWallet","outputs":[{"internalType":"address","name":"_wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardianStorage","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract BaseWallet","name":"_wallet","type":"address"}],"name":"init","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"managers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moduleRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"revokeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506040516113043803806113048339818101604052606081101561003357600080fd5b5080516020820151604090920151600080546001600160a01b031916331790559091906001600160a01b03831661009b5760405162461bcd60e51b815260040180806020018281038252602681526020018061128b6026913960400191505060405180910390fd5b6001600160a01b0382166100e05760405162461bcd60e51b815260040180806020018281038252602c8152602001806112d8602c913960400191505060405180910390fd5b6001600160a01b0381166101255760405162461bcd60e51b81526004018080602001828103825260278152602001806112b16027913960400191505060405180910390fd5b600280546001600160a01b039485166001600160a01b03199182161790915560038054938516938216939093179092556004805491909316911617905561111a806101716000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80638117abc11161008c578063a6f9dae111610066578063a6f9dae11461026a578063b95459e414610290578063d89784fc14610298578063fdff9b4d146102a0576100df565b80638117abc1146102185780638b334686146102205780638da5cb5b14610262576100df565b80632d06177a116100bd5780632d06177a1461019057806330b53798146101b6578063377e32e6146101f2576100df565b806308d668bc146100e457806319ab453c1461010c5780632cfc5d0b14610132575b600080fd5b61010a600480360360208110156100fa57600080fd5b50356001600160a01b03166102da565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166103e5565b610174600480360360a081101561014857600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001356103e8565b604080516001600160a01b039092168252519081900360200190f35b61010a600480360360208110156101a657600080fd5b50356001600160a01b0316610507565b61010a600480360360808110156101cc57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610620565b61010a6004803603602081101561020857600080fd5b50356001600160a01b03166106f8565b6101746107ed565b610174600480360360a081101561023657600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001356107fc565b6101746108ee565b61010a6004803603602081101561028057600080fd5b50356001600160a01b03166108fd565b6101746109fc565b610174610a0b565b6102c6600480360360208110156102b657600080fd5b50356001600160a01b0316610a1a565b604080519115158252519081900360200190f35b6000546001600160a01b03163314610329576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b038116610384576040805162461bcd60e51b815260206004820152601a60248201527f57463a20616464726573732063616e6e6f74206265206e756c6c000000000000604482015290519081900360640190fd5b600280546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f9bf4baeb20b6008af8dfd7fed5c50dce707a05623b022e5d61a00c7db7f90c729181900360200190a150565b50565b60006103f686868685610a2f565b60006104058488888887610c23565b905060606040518060200161041990610f72565b601f1982820381018352601f90910116604081905260035482516001600160a01b039091169160209081019182918501908083835b6020831061046d5780518252601f19909201916020918201910161044e565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815284830182528051908301207fff00000000000000000000000000000000000000000000000000000000000000828601523060601b6041860152605585019790975260758085019790975280518085039097018752609590930190925250835193019290922098975050505050505050565b6000546001600160a01b03163314610556576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b0381166105b1576040805162461bcd60e51b815260206004820152601b60248201527f4d3a2041646472657373206d757374206e6f74206265206e756c6c0000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526001602052604090205460ff166103e5576001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f3b4a40cccf2058c593542587329dd385be4f0b588db5471fbd9598e56dd7093a9190a250565b3360009081526001602081905260409091205460ff1615151461068a576040805162461bcd60e51b815260206004820152601260248201527f4d3a204d757374206265206d616e616765720000000000000000000000000000604482015290519081900360640190fd5b61069684848484610a2f565b6003546040516000916001600160a01b0316906106b290610f72565b6001600160a01b03909116815260405190819003602001906000f0801580156106df573d6000803e3d6000fd5b509050806106f08187878787610c80565b505050505050565b6000546001600160a01b03163314610747576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b03811660009081526001602081905260409091205460ff161515146107a45760405162461bcd60e51b81526004018080602001828103825260258152602001806110c06025913960400191505060405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe5def11e0516f317f9c37b8835aec29fc01db4d4b6d6fecaca339d3596a29bc19190a250565b6003546001600160a01b031681565b33600090815260016020819052604082205460ff16151514610865576040805162461bcd60e51b815260206004820152601260248201527f4d3a204d757374206265206d616e616765720000000000000000000000000000604482015290519081900360640190fd5b61087186868685610a2f565b60006108808488888887610c23565b60035460405191925060009183916001600160a01b0316906108a190610f72565b6001600160a01b0390911681526040518291819003602001906000f59050801580156108d1573d6000803e3d6000fd5b509050806108e2818a8a8a89610c80565b98975050505050505050565b6000546001600160a01b031681565b6000546001600160a01b0316331461094c576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b0381166109a7576040805162461bcd60e51b815260206004820152601860248201527f41646472657373206d757374206e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3691a250565b6002546001600160a01b031681565b6004546001600160a01b031681565b60016020526000908152604090205460ff1681565b6001600160a01b038416610a8a576040805162461bcd60e51b815260206004820152601860248201527f57463a206f776e65722063616e6e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b600254604080517f0bcd4ebb0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b158015610af057600080fd5b505afa158015610b04573d6000803e3d6000fd5b505050506040513d6020811015610b1a57600080fd5b5051610b6d576040805162461bcd60e51b815260206004820152601b60248201527f57463a20696e76616c6964205f76657273696f6e4d616e616765720000000000604482015290519081900360640190fd5b6001600160a01b038216610bc8576040805162461bcd60e51b815260206004820152601b60248201527f57463a20677561726469616e2063616e6e6f74206265206e756c6c0000000000604482015290519081900360640190fd5b60008111610c1d576040805162461bcd60e51b815260206004820152601460248201527f57463a20696e76616c6964205f76657273696f6e000000000000000000000000604482015290519081900360640190fd5b50505050565b604080516020808201979097526bffffffffffffffffffffffff19606096871b81168284015294861b851660548201529290941b9092166068820152607c8082019290925282518082039092018252609c01909152805191012090565b60408051600280825260608083018452926020830190803683370190505090508381600081518110610cae57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610cdc57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050856001600160a01b0316633c5a3cea86836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610d6b578181015183820152602001610d53565b505050509050019350505050600060405180830381600087803b158015610d9157600080fd5b505af1158015610da5573d6000803e3d6000fd5b505060048054604080517fc68452100000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116948201949094528884166024820152905192909116935063c6845210925060448082019260009290919082900301818387803b158015610e1c57600080fd5b505af1158015610e30573d6000803e3d6000fd5b50505050836001600160a01b031663e3495a3987846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610e8b57600080fd5b505af1158015610e9f573d6000803e3d6000fd5b5050604080517f1f17732d00000000000000000000000000000000000000000000000000000000815230600482015260006024820181905291516001600160a01b038b169450631f17732d93506044808301939282900301818387803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b50505050826001600160a01b0316856001600160a01b0316876001600160a01b03167fca0b7dde26052d34217ef1a0cee48085a07ca32da0a918609937a307d496bbf560405160405180910390a4505050505050565b61014080610f808339019056fe608060405234801561001057600080fd5b506040516101403803806101408339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b031990921691909117905560dc806100646000396000f3fe6080604052366083573373ffffffffffffffffffffffffffffffffffffffff16347f606834f57405380c4fb88d1f4850326ad3885f014bab3b568dfbf7a041eef73860003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a3005b600080543682833781823684845af490503d82833e80801560a2573d83f35b3d83fdfea264697066735822122081653946f6f0f024eb94b19bdaf1d69dc04d346dcb6092fa1369c9e2dacfa42164736f6c634300060c00334d3a20546172676574206d75737420626520616e206578697374696e67206d616e61676572a26469706673582212203e6230ba2430e25bbb7062a66cec02cd0bf3330e16f132008055dee6ded6c82f64736f6c634300060c003357463a204d6f64756c6552656769737472792061646472657373206e6f7420646566696e656457463a20477561726469616e53746f726167652061646472657373206e6f7420646566696e656457463a2057616c6c6574496d706c656d656e746174696f6e2061646472657373206e6f7420646566696e65640000000000000000000000008ff41919435d50f113afd5bc25b88acf4cc3d8cc000000000000000000000000bc0b5970a01ba7c22104c85a4e2b05e01157638d0000000000000000000000004cac0996ede3125a72be96942d299b1b26e5381b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100df5760003560e01c80638117abc11161008c578063a6f9dae111610066578063a6f9dae11461026a578063b95459e414610290578063d89784fc14610298578063fdff9b4d146102a0576100df565b80638117abc1146102185780638b334686146102205780638da5cb5b14610262576100df565b80632d06177a116100bd5780632d06177a1461019057806330b53798146101b6578063377e32e6146101f2576100df565b806308d668bc146100e457806319ab453c1461010c5780632cfc5d0b14610132575b600080fd5b61010a600480360360208110156100fa57600080fd5b50356001600160a01b03166102da565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166103e5565b610174600480360360a081101561014857600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001356103e8565b604080516001600160a01b039092168252519081900360200190f35b61010a600480360360208110156101a657600080fd5b50356001600160a01b0316610507565b61010a600480360360808110156101cc57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610620565b61010a6004803603602081101561020857600080fd5b50356001600160a01b03166106f8565b6101746107ed565b610174600480360360a081101561023657600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001356107fc565b6101746108ee565b61010a6004803603602081101561028057600080fd5b50356001600160a01b03166108fd565b6101746109fc565b610174610a0b565b6102c6600480360360208110156102b657600080fd5b50356001600160a01b0316610a1a565b604080519115158252519081900360200190f35b6000546001600160a01b03163314610329576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b038116610384576040805162461bcd60e51b815260206004820152601a60248201527f57463a20616464726573732063616e6e6f74206265206e756c6c000000000000604482015290519081900360640190fd5b600280546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f9bf4baeb20b6008af8dfd7fed5c50dce707a05623b022e5d61a00c7db7f90c729181900360200190a150565b50565b60006103f686868685610a2f565b60006104058488888887610c23565b905060606040518060200161041990610f72565b601f1982820381018352601f90910116604081905260035482516001600160a01b039091169160209081019182918501908083835b6020831061046d5780518252601f19909201916020918201910161044e565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815284830182528051908301207fff00000000000000000000000000000000000000000000000000000000000000828601523060601b6041860152605585019790975260758085019790975280518085039097018752609590930190925250835193019290922098975050505050505050565b6000546001600160a01b03163314610556576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b0381166105b1576040805162461bcd60e51b815260206004820152601b60248201527f4d3a2041646472657373206d757374206e6f74206265206e756c6c0000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526001602052604090205460ff166103e5576001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f3b4a40cccf2058c593542587329dd385be4f0b588db5471fbd9598e56dd7093a9190a250565b3360009081526001602081905260409091205460ff1615151461068a576040805162461bcd60e51b815260206004820152601260248201527f4d3a204d757374206265206d616e616765720000000000000000000000000000604482015290519081900360640190fd5b61069684848484610a2f565b6003546040516000916001600160a01b0316906106b290610f72565b6001600160a01b03909116815260405190819003602001906000f0801580156106df573d6000803e3d6000fd5b509050806106f08187878787610c80565b505050505050565b6000546001600160a01b03163314610747576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b03811660009081526001602081905260409091205460ff161515146107a45760405162461bcd60e51b81526004018080602001828103825260258152602001806110c06025913960400191505060405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe5def11e0516f317f9c37b8835aec29fc01db4d4b6d6fecaca339d3596a29bc19190a250565b6003546001600160a01b031681565b33600090815260016020819052604082205460ff16151514610865576040805162461bcd60e51b815260206004820152601260248201527f4d3a204d757374206265206d616e616765720000000000000000000000000000604482015290519081900360640190fd5b61087186868685610a2f565b60006108808488888887610c23565b60035460405191925060009183916001600160a01b0316906108a190610f72565b6001600160a01b0390911681526040518291819003602001906000f59050801580156108d1573d6000803e3d6000fd5b509050806108e2818a8a8a89610c80565b98975050505050505050565b6000546001600160a01b031681565b6000546001600160a01b0316331461094c576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b0381166109a7576040805162461bcd60e51b815260206004820152601860248201527f41646472657373206d757374206e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3691a250565b6002546001600160a01b031681565b6004546001600160a01b031681565b60016020526000908152604090205460ff1681565b6001600160a01b038416610a8a576040805162461bcd60e51b815260206004820152601860248201527f57463a206f776e65722063616e6e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b600254604080517f0bcd4ebb0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b158015610af057600080fd5b505afa158015610b04573d6000803e3d6000fd5b505050506040513d6020811015610b1a57600080fd5b5051610b6d576040805162461bcd60e51b815260206004820152601b60248201527f57463a20696e76616c6964205f76657273696f6e4d616e616765720000000000604482015290519081900360640190fd5b6001600160a01b038216610bc8576040805162461bcd60e51b815260206004820152601b60248201527f57463a20677561726469616e2063616e6e6f74206265206e756c6c0000000000604482015290519081900360640190fd5b60008111610c1d576040805162461bcd60e51b815260206004820152601460248201527f57463a20696e76616c6964205f76657273696f6e000000000000000000000000604482015290519081900360640190fd5b50505050565b604080516020808201979097526bffffffffffffffffffffffff19606096871b81168284015294861b851660548201529290941b9092166068820152607c8082019290925282518082039092018252609c01909152805191012090565b60408051600280825260608083018452926020830190803683370190505090508381600081518110610cae57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610cdc57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050856001600160a01b0316633c5a3cea86836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610d6b578181015183820152602001610d53565b505050509050019350505050600060405180830381600087803b158015610d9157600080fd5b505af1158015610da5573d6000803e3d6000fd5b505060048054604080517fc68452100000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116948201949094528884166024820152905192909116935063c6845210925060448082019260009290919082900301818387803b158015610e1c57600080fd5b505af1158015610e30573d6000803e3d6000fd5b50505050836001600160a01b031663e3495a3987846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610e8b57600080fd5b505af1158015610e9f573d6000803e3d6000fd5b5050604080517f1f17732d00000000000000000000000000000000000000000000000000000000815230600482015260006024820181905291516001600160a01b038b169450631f17732d93506044808301939282900301818387803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b50505050826001600160a01b0316856001600160a01b0316876001600160a01b03167fca0b7dde26052d34217ef1a0cee48085a07ca32da0a918609937a307d496bbf560405160405180910390a4505050505050565b61014080610f808339019056fe608060405234801561001057600080fd5b506040516101403803806101408339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b031990921691909117905560dc806100646000396000f3fe6080604052366083573373ffffffffffffffffffffffffffffffffffffffff16347f606834f57405380c4fb88d1f4850326ad3885f014bab3b568dfbf7a041eef73860003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a3005b600080543682833781823684845af490503d82833e80801560a2573d83f35b3d83fdfea264697066735822122081653946f6f0f024eb94b19bdaf1d69dc04d346dcb6092fa1369c9e2dacfa42164736f6c634300060c00334d3a20546172676574206d75737420626520616e206578697374696e67206d616e61676572a26469706673582212203e6230ba2430e25bbb7062a66cec02cd0bf3330e16f132008055dee6ded6c82f64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008ff41919435d50f113afd5bc25b88acf4cc3d8cc000000000000000000000000bc0b5970a01ba7c22104c85a4e2b05e01157638d0000000000000000000000004cac0996ede3125a72be96942d299b1b26e5381b
-----Decoded View---------------
Arg [0] : _moduleRegistry (address): 0x8FF41919435D50f113aFd5bC25b88aCF4Cc3D8Cc
Arg [1] : _walletImplementation (address): 0xbc0b5970A01BA7C22104c85A4e2b05E01157638D
Arg [2] : _guardianStorage (address): 0x4cAC0996Ede3125A72bE96942D299B1b26e5381b
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ff41919435d50f113afd5bc25b88acf4cc3d8cc
Arg [1] : 000000000000000000000000bc0b5970a01ba7c22104c85a4e2b05e01157638d
Arg [2] : 0000000000000000000000004cac0996ede3125a72be96942d299b1b26e5381b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.