ETH Price: $2,632.94 (+0.97%)

Contract

0x9ae0AcdB750bFcF694675f46B580847fC49A48bF
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Counterfa...190167302024-01-16 3:21:59259 days ago1705375319IN
Argent: Wallet Factory 3
0 ETH0.0124303726.93844934
Create Counterfa...188444732023-12-22 22:52:11283 days ago1703285531IN
Argent: Wallet Factory 3
0 ETH0.0111422224.26046273
Create Counterfa...179335212023-08-17 9:03:23411 days ago1692263003IN
Argent: Wallet Factory 3
0 ETH0.0081329617.70873252
Create Counterfa...148107762022-05-20 11:12:46864 days ago1653045166IN
Argent: Wallet Factory 3
0 ETH0.0123869826.845
Create Counterfa...144996052022-04-01 9:46:02914 days ago1648806362IN
Argent: Wallet Factory 3
0 ETH0.0149266732.3490172
Create Counterfa...144782692022-03-29 1:54:07917 days ago1648518847IN
Argent: Wallet Factory 3
0 ETH0.0237214651.67265559
Create Counterfa...139540552022-01-06 20:30:43998 days ago1641501043IN
Argent: Wallet Factory 3
0 ETH0.05583109121
Create Counterfa...139255912022-01-02 10:58:081002 days ago1641121088IN
Argent: Wallet Factory 3
0 ETH0.027085758.7
Create Counterfa...138721102021-12-25 4:12:371011 days ago1640405557IN
Argent: Wallet Factory 3
0 ETH0.031517768.63
Create Counterfa...138261012021-12-18 1:24:361018 days ago1639790676IN
Argent: Wallet Factory 3
0 ETH0.04914186106.5
Create Counterfa...138083732021-12-15 7:29:141021 days ago1639553354IN
Argent: Wallet Factory 3
0 ETH0.0282623461.25
Create Counterfa...137091472021-11-29 14:32:461036 days ago1638196366IN
Argent: Wallet Factory 3
0 ETH0.0823211179.25
Create Counterfa...136859352021-11-25 21:46:181040 days ago1637876778IN
Argent: Wallet Factory 3
0 ETH0.0459118899.5
Create Counterfa...136520172021-11-20 12:55:511045 days ago1637412951IN
Argent: Wallet Factory 3
0 ETH0.0419886791
Create Counterfa...136019872021-11-12 15:09:351053 days ago1636729775IN
Argent: Wallet Factory 3
0 ETH0.06291766137
Create Counterfa...135946062021-11-11 11:19:181054 days ago1636629558IN
Argent: Wallet Factory 3
0 ETH0.05855475127.5
Create Counterfa...134598582021-10-21 8:12:031076 days ago1634803923IN
Argent: Wallet Factory 3
0 ETH0.0318983769.13
Create Counterfa...133478622021-10-03 18:30:351093 days ago1633285835IN
Argent: Wallet Factory 3
0 ETH0.05102493111.11
Create Counterfa...131336382021-08-31 13:41:041126 days ago1630417264IN
Argent: Wallet Factory 3
0 ETH0.04707678102.02720595
Create Counterfa...129479452021-08-02 19:58:491155 days ago1627934329IN
Argent: Wallet Factory 3
0 ETH0.0228544249.53
Create Counterfa...126629192021-06-19 5:28:301200 days ago1624080510IN
Argent: Wallet Factory 3
0 ETH0.003696028.01
Create Counterfa...126337502021-06-14 16:54:251204 days ago1623689665IN
Argent: Wallet Factory 3
0 ETH0.0125923427.43
Create Counterfa...125979542021-06-09 3:34:061210 days ago1623209646IN
Argent: Wallet Factory 3
0 ETH0.0059983813
Create Counterfa...125879222021-06-07 14:28:021211 days ago1623076082IN
Argent: Wallet Factory 3
0 ETH0.0075950716.46
Create Counterfa...125671312021-06-04 9:19:121215 days ago1622798352IN
Argent: Wallet Factory 3
0 ETH0.0069398415.04
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
190167302024-01-16 3:21:59259 days ago1705375319
Argent: Wallet Factory 3
 Contract Creation0 ETH
188444732023-12-22 22:52:11283 days ago1703285531
Argent: Wallet Factory 3
 Contract Creation0 ETH
179335212023-08-17 9:03:23411 days ago1692263003
Argent: Wallet Factory 3
 Contract Creation0 ETH
148107762022-05-20 11:12:46864 days ago1653045166
Argent: Wallet Factory 3
 Contract Creation0 ETH
144996052022-04-01 9:46:02914 days ago1648806362
Argent: Wallet Factory 3
 Contract Creation0 ETH
144782692022-03-29 1:54:07917 days ago1648518847
Argent: Wallet Factory 3
 Contract Creation0 ETH
139540552022-01-06 20:30:43998 days ago1641501043
Argent: Wallet Factory 3
 Contract Creation0 ETH
139255912022-01-02 10:58:081002 days ago1641121088
Argent: Wallet Factory 3
 Contract Creation0 ETH
138721102021-12-25 4:12:371011 days ago1640405557
Argent: Wallet Factory 3
 Contract Creation0 ETH
138261012021-12-18 1:24:361018 days ago1639790676
Argent: Wallet Factory 3
 Contract Creation0 ETH
138083732021-12-15 7:29:141021 days ago1639553354
Argent: Wallet Factory 3
 Contract Creation0 ETH
137091472021-11-29 14:32:461036 days ago1638196366
Argent: Wallet Factory 3
 Contract Creation0 ETH
136859352021-11-25 21:46:181040 days ago1637876778
Argent: Wallet Factory 3
 Contract Creation0 ETH
136520172021-11-20 12:55:511045 days ago1637412951
Argent: Wallet Factory 3
 Contract Creation0 ETH
136019872021-11-12 15:09:351053 days ago1636729775
Argent: Wallet Factory 3
 Contract Creation0 ETH
135946062021-11-11 11:19:181054 days ago1636629558
Argent: Wallet Factory 3
 Contract Creation0 ETH
134598582021-10-21 8:12:031076 days ago1634803923
Argent: Wallet Factory 3
 Contract Creation0 ETH
133478622021-10-03 18:30:351093 days ago1633285835
Argent: Wallet Factory 3
 Contract Creation0 ETH
131336382021-08-31 13:41:041126 days ago1630417264
Argent: Wallet Factory 3
 Contract Creation0 ETH
129479452021-08-02 19:58:491155 days ago1627934329
Argent: Wallet Factory 3
 Contract Creation0 ETH
126629192021-06-19 5:28:301200 days ago1624080510
Argent: Wallet Factory 3
 Contract Creation0 ETH
126337502021-06-14 16:54:251204 days ago1623689665
Argent: Wallet Factory 3
 Contract Creation0 ETH
125979542021-06-09 3:34:061210 days ago1623209646
Argent: Wallet Factory 3
 Contract Creation0 ETH
125879222021-06-07 14:28:021211 days ago1623076082
Argent: Wallet Factory 3
 Contract Creation0 ETH
125671312021-06-04 9:19:121215 days ago1622798352
Argent: Wallet Factory 3
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WalletFactory

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 999 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 11: WalletFactory.sol
// 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 "./Proxy.sol";
import "./BaseWallet.sol";
import "./Owned.sol";
import "./Managed.sol";
import "./IGuardianStorage.sol";
import "./IModuleRegistry.sol";
import "./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");
    }
}

File 2 of 11: BaseWallet.sol
// 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 "./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 {
    }
}

File 3 of 11: IGuardianStorage.sol
// 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;

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);
}

File 4 of 11: ILimitStorage.sol
// 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);
}

File 5 of 11: IModule.sol
// 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 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;
}

File 6 of 11: IModuleRegistry.sol
// 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.6.12;

/**
 * @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);
}

File 7 of 11: IVersionManager.sol
// 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;
pragma experimental ABIEncoderV2;

import "./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;
 
}

File 8 of 11: IWallet.sol
// 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;
}

File 9 of 11: Managed.sol
// 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);
    }
}

File 10 of 11: Owned.sol
// 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);
    }
}

File 11 of 11: Proxy.sol
// 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);
    }
}

Contract Security Audit

Contract ABI

[{"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"}]

608060405234801561001057600080fd5b506040516113043803806113048339818101604052606081101561003357600080fd5b5080516020820151604090920151600080546001600160a01b031916331790559091906001600160a01b03831661009b5760405162461bcd60e51b815260040180806020018281038252602681526020018061128b6026913960400191505060405180910390fd5b6001600160a01b0382166100e05760405162461bcd60e51b815260040180806020018281038252602c8152602001806112d8602c913960400191505060405180910390fd5b6001600160a01b0381166101255760405162461bcd60e51b81526004018080602001828103825260278152602001806112b16027913960400191505060405180910390fd5b600280546001600160a01b039485166001600160a01b03199182161790915560038054938516938216939093179092556004805491909316911617905561111a806101716000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80638117abc11161008c578063a6f9dae111610066578063a6f9dae11461026a578063b95459e414610290578063d89784fc14610298578063fdff9b4d146102a0576100df565b80638117abc1146102185780638b334686146102205780638da5cb5b14610262576100df565b80632d06177a116100bd5780632d06177a1461019057806330b53798146101b6578063377e32e6146101f2576100df565b806308d668bc146100e457806319ab453c1461010c5780632cfc5d0b14610132575b600080fd5b61010a600480360360208110156100fa57600080fd5b50356001600160a01b03166102da565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166103e5565b610174600480360360a081101561014857600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001356103e8565b604080516001600160a01b039092168252519081900360200190f35b61010a600480360360208110156101a657600080fd5b50356001600160a01b0316610507565b61010a600480360360808110156101cc57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610620565b61010a6004803603602081101561020857600080fd5b50356001600160a01b03166106f8565b6101746107ed565b610174600480360360a081101561023657600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001356107fc565b6101746108ee565b61010a6004803603602081101561028057600080fd5b50356001600160a01b03166108fd565b6101746109fc565b610174610a0b565b6102c6600480360360208110156102b657600080fd5b50356001600160a01b0316610a1a565b604080519115158252519081900360200190f35b6000546001600160a01b03163314610329576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b038116610384576040805162461bcd60e51b815260206004820152601a60248201527f57463a20616464726573732063616e6e6f74206265206e756c6c000000000000604482015290519081900360640190fd5b600280546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f9bf4baeb20b6008af8dfd7fed5c50dce707a05623b022e5d61a00c7db7f90c729181900360200190a150565b50565b60006103f686868685610a2f565b60006104058488888887610c23565b905060606040518060200161041990610f72565b601f1982820381018352601f90910116604081905260035482516001600160a01b039091169160209081019182918501908083835b6020831061046d5780518252601f19909201916020918201910161044e565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815284830182528051908301207fff00000000000000000000000000000000000000000000000000000000000000828601523060601b6041860152605585019790975260758085019790975280518085039097018752609590930190925250835193019290922098975050505050505050565b6000546001600160a01b03163314610556576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b0381166105b1576040805162461bcd60e51b815260206004820152601b60248201527f4d3a2041646472657373206d757374206e6f74206265206e756c6c0000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526001602052604090205460ff166103e5576001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f3b4a40cccf2058c593542587329dd385be4f0b588db5471fbd9598e56dd7093a9190a250565b3360009081526001602081905260409091205460ff1615151461068a576040805162461bcd60e51b815260206004820152601260248201527f4d3a204d757374206265206d616e616765720000000000000000000000000000604482015290519081900360640190fd5b61069684848484610a2f565b6003546040516000916001600160a01b0316906106b290610f72565b6001600160a01b03909116815260405190819003602001906000f0801580156106df573d6000803e3d6000fd5b509050806106f08187878787610c80565b505050505050565b6000546001600160a01b03163314610747576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b03811660009081526001602081905260409091205460ff161515146107a45760405162461bcd60e51b81526004018080602001828103825260258152602001806110c06025913960400191505060405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe5def11e0516f317f9c37b8835aec29fc01db4d4b6d6fecaca339d3596a29bc19190a250565b6003546001600160a01b031681565b33600090815260016020819052604082205460ff16151514610865576040805162461bcd60e51b815260206004820152601260248201527f4d3a204d757374206265206d616e616765720000000000000000000000000000604482015290519081900360640190fd5b61087186868685610a2f565b60006108808488888887610c23565b60035460405191925060009183916001600160a01b0316906108a190610f72565b6001600160a01b0390911681526040518291819003602001906000f59050801580156108d1573d6000803e3d6000fd5b509050806108e2818a8a8a89610c80565b98975050505050505050565b6000546001600160a01b031681565b6000546001600160a01b0316331461094c576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b0381166109a7576040805162461bcd60e51b815260206004820152601860248201527f41646472657373206d757374206e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3691a250565b6002546001600160a01b031681565b6004546001600160a01b031681565b60016020526000908152604090205460ff1681565b6001600160a01b038416610a8a576040805162461bcd60e51b815260206004820152601860248201527f57463a206f776e65722063616e6e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b600254604080517f0bcd4ebb0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b158015610af057600080fd5b505afa158015610b04573d6000803e3d6000fd5b505050506040513d6020811015610b1a57600080fd5b5051610b6d576040805162461bcd60e51b815260206004820152601b60248201527f57463a20696e76616c6964205f76657273696f6e4d616e616765720000000000604482015290519081900360640190fd5b6001600160a01b038216610bc8576040805162461bcd60e51b815260206004820152601b60248201527f57463a20677561726469616e2063616e6e6f74206265206e756c6c0000000000604482015290519081900360640190fd5b60008111610c1d576040805162461bcd60e51b815260206004820152601460248201527f57463a20696e76616c6964205f76657273696f6e000000000000000000000000604482015290519081900360640190fd5b50505050565b604080516020808201979097526bffffffffffffffffffffffff19606096871b81168284015294861b851660548201529290941b9092166068820152607c8082019290925282518082039092018252609c01909152805191012090565b60408051600280825260608083018452926020830190803683370190505090508381600081518110610cae57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610cdc57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050856001600160a01b0316633c5a3cea86836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610d6b578181015183820152602001610d53565b505050509050019350505050600060405180830381600087803b158015610d9157600080fd5b505af1158015610da5573d6000803e3d6000fd5b505060048054604080517fc68452100000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116948201949094528884166024820152905192909116935063c6845210925060448082019260009290919082900301818387803b158015610e1c57600080fd5b505af1158015610e30573d6000803e3d6000fd5b50505050836001600160a01b031663e3495a3987846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610e8b57600080fd5b505af1158015610e9f573d6000803e3d6000fd5b5050604080517f1f17732d00000000000000000000000000000000000000000000000000000000815230600482015260006024820181905291516001600160a01b038b169450631f17732d93506044808301939282900301818387803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b50505050826001600160a01b0316856001600160a01b0316876001600160a01b03167fca0b7dde26052d34217ef1a0cee48085a07ca32da0a918609937a307d496bbf560405160405180910390a4505050505050565b61014080610f808339019056fe608060405234801561001057600080fd5b506040516101403803806101408339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b031990921691909117905560dc806100646000396000f3fe6080604052366083573373ffffffffffffffffffffffffffffffffffffffff16347f606834f57405380c4fb88d1f4850326ad3885f014bab3b568dfbf7a041eef73860003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a3005b600080543682833781823684845af490503d82833e80801560a2573d83f35b3d83fdfea264697066735822122081653946f6f0f024eb94b19bdaf1d69dc04d346dcb6092fa1369c9e2dacfa42164736f6c634300060c00334d3a20546172676574206d75737420626520616e206578697374696e67206d616e61676572a26469706673582212203e6230ba2430e25bbb7062a66cec02cd0bf3330e16f132008055dee6ded6c82f64736f6c634300060c003357463a204d6f64756c6552656769737472792061646472657373206e6f7420646566696e656457463a20477561726469616e53746f726167652061646472657373206e6f7420646566696e656457463a2057616c6c6574496d706c656d656e746174696f6e2061646472657373206e6f7420646566696e6564000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db010500000000000000000000000029b94b045a0b828d9eb99136a16d97c7ff3d260000000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100df5760003560e01c80638117abc11161008c578063a6f9dae111610066578063a6f9dae11461026a578063b95459e414610290578063d89784fc14610298578063fdff9b4d146102a0576100df565b80638117abc1146102185780638b334686146102205780638da5cb5b14610262576100df565b80632d06177a116100bd5780632d06177a1461019057806330b53798146101b6578063377e32e6146101f2576100df565b806308d668bc146100e457806319ab453c1461010c5780632cfc5d0b14610132575b600080fd5b61010a600480360360208110156100fa57600080fd5b50356001600160a01b03166102da565b005b61010a6004803603602081101561012257600080fd5b50356001600160a01b03166103e5565b610174600480360360a081101561014857600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001356103e8565b604080516001600160a01b039092168252519081900360200190f35b61010a600480360360208110156101a657600080fd5b50356001600160a01b0316610507565b61010a600480360360808110156101cc57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610620565b61010a6004803603602081101561020857600080fd5b50356001600160a01b03166106f8565b6101746107ed565b610174600480360360a081101561023657600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001356107fc565b6101746108ee565b61010a6004803603602081101561028057600080fd5b50356001600160a01b03166108fd565b6101746109fc565b610174610a0b565b6102c6600480360360208110156102b657600080fd5b50356001600160a01b0316610a1a565b604080519115158252519081900360200190f35b6000546001600160a01b03163314610329576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b038116610384576040805162461bcd60e51b815260206004820152601a60248201527f57463a20616464726573732063616e6e6f74206265206e756c6c000000000000604482015290519081900360640190fd5b600280546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f9bf4baeb20b6008af8dfd7fed5c50dce707a05623b022e5d61a00c7db7f90c729181900360200190a150565b50565b60006103f686868685610a2f565b60006104058488888887610c23565b905060606040518060200161041990610f72565b601f1982820381018352601f90910116604081905260035482516001600160a01b039091169160209081019182918501908083835b6020831061046d5780518252601f19909201916020918201910161044e565b51815160209384036101000a600019018019909216911617905292019384525060408051808503815284830182528051908301207fff00000000000000000000000000000000000000000000000000000000000000828601523060601b6041860152605585019790975260758085019790975280518085039097018752609590930190925250835193019290922098975050505050505050565b6000546001600160a01b03163314610556576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b0381166105b1576040805162461bcd60e51b815260206004820152601b60248201527f4d3a2041646472657373206d757374206e6f74206265206e756c6c0000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526001602052604090205460ff166103e5576001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f3b4a40cccf2058c593542587329dd385be4f0b588db5471fbd9598e56dd7093a9190a250565b3360009081526001602081905260409091205460ff1615151461068a576040805162461bcd60e51b815260206004820152601260248201527f4d3a204d757374206265206d616e616765720000000000000000000000000000604482015290519081900360640190fd5b61069684848484610a2f565b6003546040516000916001600160a01b0316906106b290610f72565b6001600160a01b03909116815260405190819003602001906000f0801580156106df573d6000803e3d6000fd5b509050806106f08187878787610c80565b505050505050565b6000546001600160a01b03163314610747576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b03811660009081526001602081905260409091205460ff161515146107a45760405162461bcd60e51b81526004018080602001828103825260258152602001806110c06025913960400191505060405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fe5def11e0516f317f9c37b8835aec29fc01db4d4b6d6fecaca339d3596a29bc19190a250565b6003546001600160a01b031681565b33600090815260016020819052604082205460ff16151514610865576040805162461bcd60e51b815260206004820152601260248201527f4d3a204d757374206265206d616e616765720000000000000000000000000000604482015290519081900360640190fd5b61087186868685610a2f565b60006108808488888887610c23565b60035460405191925060009183916001600160a01b0316906108a190610f72565b6001600160a01b0390911681526040518291819003602001906000f59050801580156108d1573d6000803e3d6000fd5b509050806108e2818a8a8a89610c80565b98975050505050505050565b6000546001600160a01b031681565b6000546001600160a01b0316331461094c576040805162461bcd60e51b815260206004820152600d60248201526c26bab9ba1031329037bbb732b960991b604482015290519081900360640190fd5b6001600160a01b0381166109a7576040805162461bcd60e51b815260206004820152601860248201527f41646472657373206d757374206e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3691a250565b6002546001600160a01b031681565b6004546001600160a01b031681565b60016020526000908152604090205460ff1681565b6001600160a01b038416610a8a576040805162461bcd60e51b815260206004820152601860248201527f57463a206f776e65722063616e6e6f74206265206e756c6c0000000000000000604482015290519081900360640190fd5b600254604080517f0bcd4ebb0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291519190921691630bcd4ebb916024808301926020929190829003018186803b158015610af057600080fd5b505afa158015610b04573d6000803e3d6000fd5b505050506040513d6020811015610b1a57600080fd5b5051610b6d576040805162461bcd60e51b815260206004820152601b60248201527f57463a20696e76616c6964205f76657273696f6e4d616e616765720000000000604482015290519081900360640190fd5b6001600160a01b038216610bc8576040805162461bcd60e51b815260206004820152601b60248201527f57463a20677561726469616e2063616e6e6f74206265206e756c6c0000000000604482015290519081900360640190fd5b60008111610c1d576040805162461bcd60e51b815260206004820152601460248201527f57463a20696e76616c6964205f76657273696f6e000000000000000000000000604482015290519081900360640190fd5b50505050565b604080516020808201979097526bffffffffffffffffffffffff19606096871b81168284015294861b851660548201529290941b9092166068820152607c8082019290925282518082039092018252609c01909152805191012090565b60408051600280825260608083018452926020830190803683370190505090508381600081518110610cae57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110610cdc57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050856001600160a01b0316633c5a3cea86836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610d6b578181015183820152602001610d53565b505050509050019350505050600060405180830381600087803b158015610d9157600080fd5b505af1158015610da5573d6000803e3d6000fd5b505060048054604080517fc68452100000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116948201949094528884166024820152905192909116935063c6845210925060448082019260009290919082900301818387803b158015610e1c57600080fd5b505af1158015610e30573d6000803e3d6000fd5b50505050836001600160a01b031663e3495a3987846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610e8b57600080fd5b505af1158015610e9f573d6000803e3d6000fd5b5050604080517f1f17732d00000000000000000000000000000000000000000000000000000000815230600482015260006024820181905291516001600160a01b038b169450631f17732d93506044808301939282900301818387803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b50505050826001600160a01b0316856001600160a01b0316876001600160a01b03167fca0b7dde26052d34217ef1a0cee48085a07ca32da0a918609937a307d496bbf560405160405180910390a4505050505050565b61014080610f808339019056fe608060405234801561001057600080fd5b506040516101403803806101408339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b031990921691909117905560dc806100646000396000f3fe6080604052366083573373ffffffffffffffffffffffffffffffffffffffff16347f606834f57405380c4fb88d1f4850326ad3885f014bab3b568dfbf7a041eef73860003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a3005b600080543682833781823684845af490503d82833e80801560a2573d83f35b3d83fdfea264697066735822122081653946f6f0f024eb94b19bdaf1d69dc04d346dcb6092fa1369c9e2dacfa42164736f6c634300060c00334d3a20546172676574206d75737420626520616e206578697374696e67206d616e61676572a26469706673582212203e6230ba2430e25bbb7062a66cec02cd0bf3330e16f132008055dee6ded6c82f64736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db010500000000000000000000000029b94b045a0b828d9eb99136a16d97c7ff3d260000000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f

-----Decoded View---------------
Arg [0] : _moduleRegistry (address): 0xc17D432Bd8e8850Fd7b32B0270f5AfAc65DB0105
Arg [1] : _walletImplementation (address): 0x29b94b045a0b828d9eb99136A16d97c7fF3d2600
Arg [2] : _guardianStorage (address): 0x44DA3A8051bA88EAB0440DB3779cAB9D679ae76f

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c17d432bd8e8850fd7b32b0270f5afac65db0105
Arg [1] : 00000000000000000000000029b94b045a0b828d9eb99136a16d97c7ff3d2600
Arg [2] : 00000000000000000000000044da3a8051ba88eab0440db3779cab9d679ae76f


Deployed Bytecode Sourcemap

1122:7890:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5724:254;;;;;;;;;;;;;;;;-1:-1:-1;5724:254:10;-1:-1:-1;;;;;5724:254:10;;:::i;:::-;;6156:76;;;;;;;;;;;;;;;;-1:-1:-1;6156:76:10;-1:-1:-1;;;;;6156:76:10;;:::i;4869:676::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4869:676:10;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;4869:676:10;;;;;;;;;;;;;;1455:269:7;;;;;;;;;;;;;;;;-1:-1:-1;1455:269:7;-1:-1:-1;;;;;1455:269:7;;:::i;2796:451:10:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2796:451:10;;;;;;;;;;;;;;;;;;;;;;:::i;1828:227:7:-;;;;;;;;;;;;;;;;-1:-1:-1;1828:227:7;-1:-1:-1;;;;;1828:227:7;;:::i;1301:35:10:-;;;:::i;3761:648::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3761:648:10;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;934:20:8:-;;;:::i;1379:201::-;;;;;;;;;;;;;;;;-1:-1:-1;1379:201:8;-1:-1:-1;;;;;1379:201:8;;:::i;1213:29:10:-;;;:::i;1384:30::-;;;:::i;1025:41:7:-;;;;;;;;;;;;;;;;-1:-1:-1;1025:41:7;-1:-1:-1;;;;;1025:41:7;;:::i;:::-;;;;;;;;;;;;;;;;;;5724:254:10;1134:5:8;;-1:-1:-1;;;;;1134:5:8;1120:10;:19;1112:45;;;;;-1:-1:-1;;;1112:45:8;;;;;;;;;;;;-1:-1:-1;;;1112:45:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;5816:29:10;::::1;5808:68;;;::::0;;-1:-1:-1;;;5808:68:10;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;5886:14;:32:::0;;-1:-1:-1;;;;;5886:32:10;::::1;-1:-1:-1::0;;5886:32:10;;::::1;::::0;::::1;::::0;;;5933:38:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;5724:254:::0;:::o;6156:76::-;;:::o;4869:676::-;5098:15;5129:60;5144:6;5152:15;5169:9;5180:8;5129:14;:60::i;:::-;5199:15;5217:60;5225:5;5232:6;5240:15;5257:9;5268:8;5217:7;:60::i;:::-;5199:78;;5287:17;5324:24;;;;;;;;:::i;:::-;-1:-1:-1;;5324:24:10;;;;;;;;;;;;;;;;5358:20;;5307:73;;-1:-1:-1;;;;;5358:20:10;;;;5324:24;5307:73;;;;;;5324:24;;;5307:73;;5324:24;5307:73;;;;;;;;;;-1:-1:-1;;5307:73:10;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5307:73:10;;;;;;;;;;;;;;;;-1:-1:-1;5307:73:10;;;;;;;;;;;;;5470:15;;;;;;5432:12;5415:71;;;;5454:4;5415:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5405:82:10;;;;;;;;;;-1:-1:-1;;;;;;;;4869:676:10:o;1455:269:7:-;1134:5:8;;-1:-1:-1;;;;;1134:5:8;1120:10;:19;1112:45;;;;;-1:-1:-1;;;1112:45:8;;;;;;;;;;;;-1:-1:-1;;;1112:45:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;1530:22:7;::::1;1522:62;;;::::0;;-1:-1:-1;;;1522:62:7;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;1598:18:7;::::1;;::::0;;;:8:::1;:18;::::0;;;;;::::1;;1594:124;;-1:-1:-1::0;;;;;1641:18:7;::::1;;::::0;;;1662:4:::1;1641:18;::::0;;;;;;;:25;;-1:-1:-1;;1641:25:7::1;::::0;;::::1;::::0;;;1685:22;::::1;::::0;1641:18;1685:22:::1;1455:269:::0;:::o;2796:451:10:-;1191:10:7;1182:20;;;;:8;:20;;;;;;;;;;;:28;;;1174:59;;;;;-1:-1:-1;;;1174:59:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;2985:60:10::1;3000:6;3008:15;3025:9;3036:8;2985:14;:60::i;:::-;3079:20;::::0;3069:31:::1;::::0;3055:11:::1;::::0;-1:-1:-1;;;;;3079:20:10::1;::::0;3069:31:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;3069:31:10;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;3055:45:10;-1:-1:-1;3055:45:10;3159:81:::1;3055:45:::0;3195:6;3203:15;3220:9;3231:8;3159:15:::1;:81::i;:::-;1243:1:7;;2796:451:10::0;;;;:::o;1828:227:7:-;1134:5:8;;-1:-1:-1;;;;;1134:5:8;1120:10;:19;1112:45;;;;;-1:-1:-1;;;1112:45:8;;;;;;;;;;;;-1:-1:-1;;;1112:45:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;1906:18:7;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;;;::::1;;:26;;;1898:76;;;;-1:-1:-1::0;;;1898:76:7::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;1991:18:7;::::1;;::::0;;;:8:::1;:18;::::0;;;;;1984:25;;-1:-1:-1;;1984:25:7::1;::::0;;2024:24;::::1;::::0;1991:18;2024:24:::1;1828:227:::0;:::o;1301:35:10:-;;;-1:-1:-1;;;;;1301:35:10;;:::o;3761:648::-;1191:10:7;3990:15:10;1182:20:7;;;:8;:20;;;;;;;;;;:28;;;1174:59;;;;;-1:-1:-1;;;1174:59:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;4021:60:10::1;4036:6;4044:15;4061:9;4072:8;4021:14;:60::i;:::-;4091:15;4109:60;4117:5;4124:6;4132:15;4149:9;4160:8;4109:7;:60::i;:::-;4218:20;::::0;4193:46:::1;::::0;4091:78;;-1:-1:-1;4179:11:10::1;::::0;4091:78;;-1:-1:-1;;;;;4218:20:10::1;::::0;4193:46:::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;4193:46:10;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;4179:60:10;-1:-1:-1;4179:60:10;4298:81:::1;4179:60:::0;4334:6;4342:15;4359:9;4370:8;4298:15:::1;:81::i;:::-;4396:6:::0;3761:648;-1:-1:-1;;;;;;;;3761:648:10:o;934:20:8:-;;;-1:-1:-1;;;;;934:20:8;;:::o;1379:201::-;1134:5;;-1:-1:-1;;;;;1134:5:8;1120:10;:19;1112:45;;;;;-1:-1:-1;;;1112:45:8;;;;;;;;;;;;-1:-1:-1;;;1112:45:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;1456:23:8;::::1;1448:60;;;::::0;;-1:-1:-1;;;1448:60:8;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;1518:5;:17:::0;;-1:-1:-1;;1518:17:8::1;-1:-1:-1::0;;;;;1518:17:8;::::1;::::0;;::::1;::::0;;1550:23:::1;::::0;1518:17;;1550:23:::1;::::0;::::1;1379:201:::0;:::o;1213:29:10:-;;;-1:-1:-1;;;;;1213:29:10;;:::o;1384:30::-;;;-1:-1:-1;;;;;1384:30:10;;:::o;1025:41:7:-;;;;;;;;;;;;;;;:::o;8573:437:10:-;-1:-1:-1;;;;;8707:20:10;;8699:57;;;;;-1:-1:-1;;;8699:57:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;8790:14;;8774:67;;;;;;-1:-1:-1;;;;;8774:67:10;;;;;;;;;8790:14;;;;;8774:50;;:67;;;;;;;;;;;;;;8790:14;8774:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8774:67:10;8766:107;;;;;-1:-1:-1;;;8766:107:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8891:25:10;;8883:65;;;;;-1:-1:-1;;;8883:65:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;8977:1;8966:8;:12;8958:45;;;;;-1:-1:-1;;;8958:45:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;8573:437;;;;:::o;8025:246::-;8194:69;;;;;;;;;;;-1:-1:-1;;8194:69:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8184:80;;;;;;8025:246::o;6647:1005::-;6992:16;;;7006:1;6992:16;;;6957:32;6992:16;;;;;6957:32;6992:16;;;;;;;;;;-1:-1:-1;6992:16:10;6957:51;;7039:15;7018;7034:1;7018:18;;;;;;;;;;;;;:36;-1:-1:-1;;;;;7018:36:10;;;-1:-1:-1;;;;;7018:36:10;;;;;7093:4;7064:15;7080:1;7064:18;;;;;;;;;;;;;:34;-1:-1:-1;;;;;7064:34:10;;;-1:-1:-1;;;;;7064:34:10;;;;;7182:7;-1:-1:-1;;;;;7182:12:10;;7195:6;7203:15;7182:37;;;;;;;;;;;;;-1:-1:-1;;;;;7182:37:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7271:15:10;;;7254:74;;;;;;-1:-1:-1;;;;;7254:74:10;;;;;;;;;;;;;;;;;;;7271:15;;;;;-1:-1:-1;7254:45:10;;-1:-1:-1;7254:74:10;;;;;7271:15;;7254:74;;;;;;;;7271:15;;7254:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7385:15;-1:-1:-1;;;;;7369:46:10;;7424:7;7434:8;7369:74;;;;;;;;;;;;;-1:-1:-1;;;;;7369:74:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7512:45:10;;;;;;7544:4;7512:45;;;;7551:5;7512:45;;;;;;;;-1:-1:-1;;;;;7512:23:10;;;-1:-1:-1;7512:23:10;;-1:-1:-1;7512:45:10;;;;;7551:5;7512:45;;;;;7551:5;7512:23;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7635:9;-1:-1:-1;;;;;7595:50:10;7627:6;-1:-1:-1;;;;;7595:50:10;7617:7;-1:-1:-1;;;;;7595:50:10;;;;;;;;;;;6647:1005;;;;;;:::o;-1:-1:-1:-;;;;;;;;:::o

Swarm Source

ipfs://3e6230ba2430e25bbb7062a66cec02cd0bf3330e16f132008055dee6ded6c82f

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  ]
[ 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.