ETH Price: $2,359.70 (+0.83%)

Contract

0x645BA45dBe3c6942c812A46f9EE8115C89B524EC
 
Transaction Hash
Method
Block
From
To
Recover Token198819952024-05-16 10:39:11119 days ago1715855951IN
0x645BA45d...C89B524EC
0 ETH0.000144246
Execute154776282022-09-05 11:33:35738 days ago1662377615IN
0x645BA45d...C89B524EC
0 ETH0.000182386.205
Execute138714642021-12-25 1:52:11992 days ago1640397131IN
0x645BA45d...C89B524EC
0 ETH0.0019677967
Execute136764182021-11-24 9:25:481023 days ago1637745948IN
0x645BA45d...C89B524EC
0 ETH0.0026513390.2
Execute135793452021-11-09 1:43:431038 days ago1636422223IN
0x645BA45d...C89B524EC
0 ETH0.00955305325
Execute134492902021-10-19 16:37:001059 days ago1634661420IN
0x645BA45d...C89B524EC
0 ETH0.0022045575
Execute124756542021-05-21 4:47:081210 days ago1621572428IN
0x645BA45d...C89B524EC
0 ETH0.0015721753.53
Execute124577042021-05-18 10:01:071213 days ago1621332067IN
0x645BA45d...C89B524EC
0 ETH0.0015048551.196
Execute124151252021-05-11 19:58:181220 days ago1620763098IN
0x645BA45d...C89B524EC
0 ETH0.00773062263
Execute123445882021-04-30 22:42:121231 days ago1619822532IN
0x645BA45d...C89B524EC
0 ETH0.001140338.7937
Execute123344262021-04-29 8:57:281232 days ago1619686648IN
0x645BA45d...C89B524EC
0 ETH0.0013087644.525
Execute123287362021-04-28 11:39:451233 days ago1619609985IN
0x645BA45d...C89B524EC
0 ETH0.0012529742.627
Execute123230402021-04-27 14:47:091234 days ago1619534829IN
0x645BA45d...C89B524EC
0 ETH0.0023221279
Execute122969032021-04-23 14:11:341238 days ago1619187094IN
0x645BA45d...C89B524EC
0 ETH0.0022440876.345
Execute122922282021-04-22 20:42:271239 days ago1619124147IN
0x645BA45d...C89B524EC
0 ETH0.00299109101.7588
Execute122910932021-04-22 16:19:541239 days ago1619108394IN
0x645BA45d...C89B524EC
0 ETH0.00470112160
Execute122906732021-04-22 14:51:051239 days ago1619103065IN
0x645BA45d...C89B524EC
0 ETH0.00448625152.625
Execute122891412021-04-22 9:18:341239 days ago1619083114IN
0x645BA45d...C89B524EC
0 ETH0.00342449116.5032
Execute122613752021-04-18 2:24:521243 days ago1618712692IN
0x645BA45d...C89B524EC
0 ETH0.00323842110.263
Execute122421992021-04-15 3:20:221246 days ago1618456822IN
0x645BA45d...C89B524EC
0 ETH0.0020656477.1628
Execute122340562021-04-13 21:00:481248 days ago1618347648IN
0x645BA45d...C89B524EC
0 ETH0.0023179886.55
Execute122286602021-04-13 1:03:291248 days ago1618275809IN
0x645BA45d...C89B524EC
0 ETH0.0021171579.016
Execute122283862021-04-12 23:59:411248 days ago1618271981IN
0x645BA45d...C89B524EC
0 ETH0.0020238175.6
Execute122072802021-04-09 18:31:351252 days ago1617993095IN
0x645BA45d...C89B524EC
0 ETH0.00293369109.638
Execute122072622021-04-09 18:28:431252 days ago1617992923IN
0x645BA45d...C89B524EC
0 ETH0.00324207121
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
207368052024-09-12 20:05:352 hrs ago1726171535
0x645BA45d...C89B524EC
0 ETH
207368052024-09-12 20:05:352 hrs ago1726171535
0x645BA45d...C89B524EC
0 ETH
207368052024-09-12 20:05:352 hrs ago1726171535
0x645BA45d...C89B524EC
0 ETH
207368052024-09-12 20:05:352 hrs ago1726171535
0x645BA45d...C89B524EC
0x645BA45d...C89B524EC
0 ETH
207368052024-09-12 20:05:352 hrs ago1726171535
0x645BA45d...C89B524EC
0 ETH
207368052024-09-12 20:05:352 hrs ago1726171535
0x645BA45d...C89B524EC
0 ETH
207368052024-09-12 20:05:352 hrs ago1726171535
0x645BA45d...C89B524EC
0 ETH
207277612024-09-11 13:47:1133 hrs ago1726062431
0x645BA45d...C89B524EC
0 ETH
207277612024-09-11 13:47:1133 hrs ago1726062431
0x645BA45d...C89B524EC
0 ETH
207277612024-09-11 13:47:1133 hrs ago1726062431
0x645BA45d...C89B524EC
0 ETH
207277612024-09-11 13:47:1133 hrs ago1726062431
0x645BA45d...C89B524EC
0 ETH
207170162024-09-10 1:44:352 days ago1725932675
0x645BA45d...C89B524EC
0 ETH
207170162024-09-10 1:44:352 days ago1725932675
0x645BA45d...C89B524EC
0 ETH
207170162024-09-10 1:44:352 days ago1725932675
0x645BA45d...C89B524EC
0 ETH
207170162024-09-10 1:44:352 days ago1725932675
0x645BA45d...C89B524EC
0 ETH
206984692024-09-07 11:37:355 days ago1725709055
0x645BA45d...C89B524EC
0 ETH
206984692024-09-07 11:37:355 days ago1725709055
0x645BA45d...C89B524EC
0 ETH
206984692024-09-07 11:37:355 days ago1725709055
0x645BA45d...C89B524EC
0 ETH
206984692024-09-07 11:37:355 days ago1725709055
0x645BA45d...C89B524EC
0x645BA45d...C89B524EC
0 ETH
206984692024-09-07 11:37:355 days ago1725709055
0x645BA45d...C89B524EC
0 ETH
206984692024-09-07 11:37:355 days ago1725709055
0x645BA45d...C89B524EC
0 ETH
206984692024-09-07 11:37:355 days ago1725709055
0x645BA45d...C89B524EC
0 ETH
206963392024-09-07 4:29:595 days ago1725683399
0x645BA45d...C89B524EC
0 ETH
206963392024-09-07 4:29:595 days ago1725683399
0x645BA45d...C89B524EC
0 ETH
206963392024-09-07 4:29:595 days ago1725683399
0x645BA45d...C89B524EC
0 ETH
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xdec1C7a7...A67f4a707
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
VersionManager

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 999 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-16
*/

pragma experimental ABIEncoderV2;
// File: contracts/modules/common/Utils.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
/**
 * @title Utils
 * @notice Common utility methods used by modules.
 */
library Utils {
    /**
    * @notice Helper method to recover the signer at a given position from a list of concatenated signatures.
    * @param _signedHash The signed hash
    * @param _signatures The concatenated signatures.
    * @param _index The index of the signature to recover.
    */
    function recoverSigner(bytes32 _signedHash, bytes memory _signatures, uint _index) internal pure returns (address) {
        uint8 v;
        bytes32 r;
        bytes32 s;
        // we jump 32 (0x20) as the first slot of bytes contains the length
        // we jump 65 (0x41) per signature
        // for v we load 32 bytes ending with v (the first 31 come from s) then apply a mask
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(_signatures, add(0x20,mul(0x41,_index))))
            s := mload(add(_signatures, add(0x40,mul(0x41,_index))))
            v := and(mload(add(_signatures, add(0x41,mul(0x41,_index)))), 0xff)
        }
        require(v == 27 || v == 28);
        address recoveredAddress = ecrecover(_signedHash, v, r, s);
        require(recoveredAddress != address(0), "Utils: ecrecover returned 0");
        return recoveredAddress;
    }
    /**
    * @notice Helper method to parse data and extract the method signature.
    */
    function functionPrefix(bytes memory _data) internal pure returns (bytes4 prefix) {
        require(_data.length >= 4, "RM: Invalid functionPrefix");
        // solhint-disable-next-line no-inline-assembly
        assembly {
            prefix := mload(add(_data, 0x20))
        }
    }
    /**
    * @notice Returns ceil(a / b).
    */
    function ceil(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a / b;
        if (a % b == 0) {
            return c;
        } else {
            return c + 1;
        }
    }
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a < b) {
            return a;
        }
        return b;
    }
}
// File: contracts/infrastructure/base/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/>.
  
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: contracts/infrastructure/storage/ITransferStorage.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/>.
  
pragma solidity >=0.5.4 <0.7.0;
/**
 * @title ITransferStorage
 * @notice TransferStorage interface
 */
interface ITransferStorage {
    function setWhitelist(address _wallet, address _target, uint256 _value) external;
    function getWhitelist(address _wallet, address _target) external view returns (uint256);
}
// File: contracts/infrastructure/storage/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/>.
  
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);
}
// File: contracts/modules/common/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/>.
  
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;
}
// File: @openzeppelin/contracts/math/SafeMath.sol
/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }
    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
// File: contracts/wallet/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/>.
  
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: contracts/infrastructure/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/>.
  
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);
}
// File: contracts/infrastructure/storage/ILockStorage.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/>.
  
pragma solidity >=0.5.4 <0.7.0;
interface ILockStorage {
    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, address _locker, uint256 _releaseAfter) external;
}
// File: contracts/modules/common/IFeature.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/>.
  
pragma solidity >=0.5.4 <0.7.0;
/**
 * @title IFeature
 * @notice Interface for a Feature.
 * @author Julien Niset - <[email protected]>, Olivier VDB - <[email protected]>
 */
interface IFeature {
    enum OwnerSignature {
        Anyone,             // Anyone
        Required,           // Owner required
        Optional,           // Owner and/or guardians
        Disallowed          // guardians only
    }
    /**
    * @notice Utility method to recover any ERC20 token that was sent to the Feature by mistake.
    * @param _token The token to recover.
    */
    function recoverToken(address _token) external;
    /**
     * @notice Inits a Feature for a wallet by e.g. setting some wallet specific parameters in storage.
     * @param _wallet The wallet.
     */
    function init(address _wallet) external;
    /**
     * @notice Helper method to check if an address is an authorised feature of a target wallet.
     * @param _wallet The target wallet.
     * @param _feature The address.
     */
    function isFeatureAuthorisedInVersionManager(address _wallet, address _feature) external view returns (bool);
    /**
    * @notice Gets the number of valid signatures that must be provided to execute a
    * specific relayed transaction.
    * @param _wallet The target wallet.
    * @param _data The data of the relayed transaction.
    * @return The number of required signatures and the wallet owner signature requirement.
    */
    function getRequiredSignatures(address _wallet, bytes calldata _data) external view returns (uint256, OwnerSignature);
    /**
    * @notice Gets the list of static call signatures that this feature responds to on behalf of wallets
    */
    function getStaticCallSignatures() external view returns (bytes4[] memory);
}
// File: lib/other/ERC20.sol
pragma solidity >=0.5.4 <0.7.0;
/**
 * ERC20 contract interface.
 */
interface ERC20 {
    function totalSupply() external view returns (uint);
    function decimals() external view returns (uint);
    function balanceOf(address tokenOwner) external view returns (uint balance);
    function allowance(address tokenOwner, address spender) external view returns (uint remaining);
    function transfer(address to, uint tokens) external returns (bool success);
    function approve(address spender, uint tokens) external returns (bool success);
    function transferFrom(address from, address to, uint tokens) external returns (bool success);
}
// File: contracts/infrastructure/storage/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/>.
  
/**
 * @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: contracts/modules/common/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/>.
  
pragma solidity >=0.5.4 <0.7.0;
/**
 * @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: contracts/modules/common/BaseFeature.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.s
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
  
/**
 * @title BaseFeature
 * @notice Base Feature contract that contains methods common to all Feature contracts.
 * @author Julien Niset - <[email protected]>, Olivier VDB - <[email protected]>
 */
contract BaseFeature is IFeature {
    // Empty calldata
    bytes constant internal EMPTY_BYTES = "";
    // Mock token address for ETH
    address constant internal ETH_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    // The address of the Lock storage
    ILockStorage internal lockStorage;
    // The address of the Version Manager
    IVersionManager internal versionManager;
    event FeatureCreated(bytes32 name);
    /**
     * @notice Throws if the wallet is locked.
     */
    modifier onlyWhenUnlocked(address _wallet) {
        require(!lockStorage.isLocked(_wallet), "BF: wallet locked");
        _;
    }
    /**
     * @notice Throws if the sender is not the VersionManager.
     */
    modifier onlyVersionManager() {
        require(msg.sender == address(versionManager), "BF: caller must be VersionManager");
        _;
    }
    /**
     * @notice Throws if the sender is not the owner of the target wallet.
     */
    modifier onlyWalletOwner(address _wallet) {
        require(isOwner(_wallet, msg.sender), "BF: must be wallet owner");
        _;
    }
    /**
     * @notice Throws if the sender is not an authorised feature of the target wallet.
     */
    modifier onlyWalletFeature(address _wallet) {
        require(versionManager.isFeatureAuthorised(_wallet, msg.sender), "BF: must be a wallet feature");
        _;
    }
    /**
     * @notice Throws if the sender is not the owner of the target wallet or the feature itself.
     */
    modifier onlyWalletOwnerOrFeature(address _wallet) {
        // Wrapping in an internal method reduces deployment cost by avoiding duplication of inlined code
        verifyOwnerOrAuthorisedFeature(_wallet, msg.sender);
        _;
    }
    constructor(
        ILockStorage _lockStorage,
        IVersionManager _versionManager,
        bytes32 _name
    ) public {
        lockStorage = _lockStorage;
        versionManager = _versionManager;
        emit FeatureCreated(_name);
    }
    /**
    * @inheritdoc IFeature
    */
    function recoverToken(address _token) external virtual override {
        uint total = ERC20(_token).balanceOf(address(this));
        _token.call(abi.encodeWithSelector(ERC20(_token).transfer.selector, address(versionManager), total));
    }
    /**
     * @notice Inits the feature for a wallet by doing nothing.
     * @dev !! Overriding methods need make sure `init()` can only be called by the VersionManager !!
     * @param _wallet The wallet.
     */
    function init(address _wallet) external virtual override  {}
    /**
     * @inheritdoc IFeature
     */
    function getRequiredSignatures(address, bytes calldata) external virtual view override returns (uint256, OwnerSignature) {
        revert("BF: disabled method");
    }
    /**
     * @inheritdoc IFeature
     */
    function getStaticCallSignatures() external virtual override view returns (bytes4[] memory _sigs) {}
    /**
     * @inheritdoc IFeature
     */
    function isFeatureAuthorisedInVersionManager(address _wallet, address _feature) public override view returns (bool) {
        return versionManager.isFeatureAuthorised(_wallet, _feature);
    }
    /**
    * @notice Checks that the wallet address provided as the first parameter of _data matches _wallet
    * @return false if the addresses are different.
    */
    function verifyData(address _wallet, bytes calldata _data) internal pure returns (bool) {
        require(_data.length >= 36, "RM: Invalid dataWallet");
        address dataWallet = abi.decode(_data[4:], (address));
        return dataWallet == _wallet;
    }
     /**
     * @notice Helper method to check if an address is the owner of a target wallet.
     * @param _wallet The target wallet.
     * @param _addr The address.
     */
    function isOwner(address _wallet, address _addr) internal view returns (bool) {
        return IWallet(_wallet).owner() == _addr;
    }
    /**
     * @notice Verify that the caller is an authorised feature or the wallet owner.
     * @param _wallet The target wallet.
     * @param _sender The caller.
     */
    function verifyOwnerOrAuthorisedFeature(address _wallet, address _sender) internal view {
        require(isFeatureAuthorisedInVersionManager(_wallet, _sender) || isOwner(_wallet, _sender), "BF: must be owner or feature");
    }
    /**
     * @notice Helper method to 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 invokeWallet(address _wallet, address _to, uint256 _value, bytes memory _data)
        internal
        returns (bytes memory _res) 
    {
        _res = versionManager.checkAuthorisedFeatureAndInvokeWallet(_wallet, _to, _value, _data);
    }
}
// File: modules/VersionManager.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/>.
  
/**
 * @title VersionManager
 * @notice Intermediate contract between features and wallets. VersionManager checks that a calling feature is
 * authorised for the wallet and if so, forwards the call to it. Note that VersionManager is meant to be the only
 * module authorised on a wallet and because some of its methods need to be called by the RelayerManager feature,
 * the VersionManager is both a module AND a feature.
 * @author Olivier VDB <[email protected]>
 */
contract VersionManager is IVersionManager, IModule, BaseFeature, Owned {
    bytes32 constant NAME = "VersionManager";
    bytes4 constant internal ADD_MODULE_PREFIX = bytes4(keccak256("addModule(address,address)"));
    bytes4 constant internal UPGRADE_WALLET_PREFIX = bytes4(keccak256("upgradeWallet(address,uint256)"));
    // Last bundle version
    uint256 public lastVersion;
    // Minimum allowed version
    uint256 public minVersion = 1;
    // Current bundle version for a wallet
    mapping(address => uint256) public walletVersions; // [wallet] => [version]
    // Features per version
    mapping(address => mapping(uint256 => bool)) public isFeatureInVersion; // [feature][version] => bool
    // Features requiring initialization for a wallet
    mapping(uint256 => address[]) public featuresToInit; // [version] => [features]
    // Supported static call signatures
    mapping(uint256 => bytes4[]) public staticCallSignatures; // [version] => [sigs]
    // Features executing static calls
    mapping(uint256 => mapping(bytes4 => address)) public staticCallExecutors; // [version][sig] => [feature]
    // Authorised Storages
    mapping(address => bool) public isStorage; // [storage] => bool
    event VersionAdded(uint256 _version, address[] _features);
    event WalletUpgraded(address indexed _wallet, uint256 _version);
    // The Module Registry
    IModuleRegistry private registry;
    /* ***************** Constructor ************************* */
    constructor(
        IModuleRegistry _registry,
        ILockStorage _lockStorage,
        IGuardianStorage _guardianStorage,
        ITransferStorage _transferStorage,
        ILimitStorage _limitStorage
    )
        BaseFeature(_lockStorage, IVersionManager(address(this)), NAME)
        public
    {
        registry = _registry;
        // Add initial storages
        if(address(_lockStorage) != address(0)) { 
            addStorage(address(_lockStorage));
        }
        if(address(_guardianStorage) != address(0)) { 
            addStorage(address(_guardianStorage));
        }
        if(address(_transferStorage) != address(0)) {
            addStorage(address(_transferStorage));
        }
        if(address(_limitStorage) != address(0)) {
            addStorage(address(_limitStorage));
        }
    }
    /* ***************** onlyOwner ************************* */
    /**
     * @inheritdoc IFeature
     */
    function recoverToken(address _token) external override onlyOwner {
        uint total = ERC20(_token).balanceOf(address(this));
        _token.call(abi.encodeWithSelector(ERC20(_token).transfer.selector, msg.sender, total));
    }
    /**
     * @notice Lets the owner change the minimum allowed version
     * @param _minVersion the minimum allowed version
     */
    function setMinVersion(uint256 _minVersion) external onlyOwner {
        require(_minVersion > 0 && _minVersion <= lastVersion, "VM: invalid _minVersion");
        minVersion = _minVersion;
    }
    /**
     * @notice Lets the owner add a new version, i.e. a new bundle of features.
     * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     * WARNING: if a feature was added to a version and later on removed from a subsequent version,
     * the feature may no longer be used in any future version without first being redeployed.
     * Otherwise, the feature could be initialized more than once.
     * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     * @param _features the list of features included in the new version
     * @param _featuresToInit the subset of features that need to be initialized for a wallet
     */
    function addVersion(address[] calldata _features, address[] calldata _featuresToInit) external onlyOwner {
        uint256 newVersion = ++lastVersion;
        for(uint256 i = 0; i < _features.length; i++) {
            isFeatureInVersion[_features[i]][newVersion] = true;
            // Store static call information to optimise its use by wallets
            bytes4[] memory sigs = IFeature(_features[i]).getStaticCallSignatures();
            for(uint256 j = 0; j < sigs.length; j++) {
                staticCallSignatures[newVersion].push(sigs[j]);
                staticCallExecutors[newVersion][sigs[j]] = _features[i];
            }
        }
        // Sanity check
        for(uint256 i = 0; i < _featuresToInit.length; i++) {
            require(isFeatureInVersion[_featuresToInit[i]][newVersion], "VM: invalid _featuresToInit");
        }
        featuresToInit[newVersion] = _featuresToInit;
        emit VersionAdded(newVersion, _features);
    }
    /**
     * @notice Lets the owner add a storage contract
     * @param _storage the storage contract to add
     */
    function addStorage(address _storage) public onlyOwner {
        require(!isStorage[_storage], "VM: storage already added");
        isStorage[_storage] = true;
    }
    /* ***************** View Methods ************************* */
    /**
     * @inheritdoc IVersionManager
     */
    function isFeatureAuthorised(address _wallet, address _feature) external view override returns (bool) {
        // Note that the VersionManager is the only feature that isn't stored in isFeatureInVersion
        return _isFeatureAuthorisedForWallet(_wallet, _feature) || _feature == address(this);
    }
    /**
     * @inheritdoc IFeature
     */
    function getRequiredSignatures(address /* _wallet */, bytes calldata _data) external view override returns (uint256, OwnerSignature) {
        bytes4 methodId = Utils.functionPrefix(_data);
        // This require ensures that the RelayerManager cannot be used to call a featureOnly VersionManager method
        // that calls a Storage or the BaseWallet for backward-compatibility reason
        require(methodId == UPGRADE_WALLET_PREFIX || methodId == ADD_MODULE_PREFIX, "VM: unknown method");     
        return (1, OwnerSignature.Required);
    }
    /* ***************** Static Call Delegation ************************* */
    /**
     * @notice This method is used by the VersionManager's fallback (via an internal call) to determine whether
     * the current transaction is a staticcall or not. The method succeeds if the current transaction is a static call, 
     * and reverts otherwise. 
     * @dev The use of an if/else allows to encapsulate the whole logic in a single function.
     */
    function verifyStaticCall() public {
        if(msg.sender != address(this)) { // first entry in the method (via an internal call)
            (bool success,) = address(this).call{gas: 3000}(abi.encodeWithSelector(VersionManager(0).verifyStaticCall.selector));
            require(!success, "VM: not in a staticcall");
        } else { // second entry in the method (via an external call)
            // solhint-disable-next-line no-inline-assembly
            assembly { log0(0, 0) }
        }
    }
    /**
     * @notice This method delegates the static call to a target feature
     */
    fallback() external {
        uint256 version = walletVersions[msg.sender];
        address feature = staticCallExecutors[version][msg.sig];
        require(feature != address(0), "VM: static call not supported for wallet version");
        verifyStaticCall();
        // solhint-disable-next-line no-inline-assembly
        assembly {
            calldatacopy(0, 0, calldatasize())
            let result := delegatecall(gas(), feature, 0, calldatasize(), 0, 0)
            returndatacopy(0, 0, returndatasize())
            switch result
            case 0 {revert(0, returndatasize())}
            default {return (0, returndatasize())}
        }
    }
    /* ***************** Wallet Upgrade ************************* */
    /**
     * @inheritdoc IFeature
     */
    function init(address _wallet) public override(IModule, BaseFeature) {}
    /**
     * @inheritdoc IVersionManager
     */
    function upgradeWallet(address _wallet, uint256 _toVersion) external override onlyWhenUnlocked(_wallet) {
        require(
            // Upgrade triggered by the RelayerManager (from version v>=1 to version v'>v)
            _isFeatureAuthorisedForWallet(_wallet, msg.sender) ||
            // Upgrade triggered by WalletFactory or UpgraderToVersionManager (from version v=0 to version v'>0)
            IWallet(_wallet).authorised(msg.sender) ||
            // Upgrade triggered directly by the owner (from version v>=1 to version v'>v)
            isOwner(_wallet, msg.sender), 
            "VM: sender may not upgrade wallet"
        );
        uint256 fromVersion = walletVersions[_wallet];
        uint256 minVersion_ = minVersion;
        uint256 toVersion;
        if(_toVersion < minVersion_ && fromVersion == 0 && IWallet(_wallet).modules() == 2) {
            // When the caller is the WalletFactory, we automatically change toVersion to minVersion if needed.
            // Note that when fromVersion == 0, the caller could be the WalletFactory or the UpgraderToVersionManager. 
            // The WalletFactory will be the only possible caller when the wallet has only 2 authorised modules 
            // (that number would be >= 3 for a call from the UpgraderToVersionManager)
            toVersion = minVersion_;
        } else {
            toVersion = _toVersion;
        }
        require(toVersion >= minVersion_ && toVersion <= lastVersion, "VM: invalid _toVersion");
        require(fromVersion < toVersion, "VM: already on new version");
        walletVersions[_wallet] = toVersion;
        // Setup static call redirection
        bytes4[] storage sigs = staticCallSignatures[toVersion];
        for(uint256 i = 0; i < sigs.length; i++) {
            bytes4 sig = sigs[i];
            if(IWallet(_wallet).enabled(sig) != address(this)) {
                IWallet(_wallet).enableStaticCall(address(this), sig);
            }
        }
        // Init features
        address[] storage featuresToInitInToVersion = featuresToInit[toVersion];
        for(uint256 i = 0; i < featuresToInitInToVersion.length; i++) {
            address feature = featuresToInitInToVersion[i];
            // We only initialize a feature that was not already initialized in the previous version
            if(fromVersion == 0 || !isFeatureInVersion[feature][fromVersion]) {
                IFeature(feature).init(_wallet);
            }
        }
        emit WalletUpgraded(_wallet, toVersion);
    }
    /**
     * @inheritdoc IModule
     */
    function addModule(address _wallet, address _module) external override onlyWalletOwnerOrFeature(_wallet) onlyWhenUnlocked(_wallet) {
        require(registry.isRegisteredModule(_module), "VM: module is not registered");
        IWallet(_wallet).authoriseModule(_module, true);
    }
    /* ******* Backward Compatibility with old Storages and BaseWallet *************** */
    /**
     * @inheritdoc IVersionManager
     */
    function checkAuthorisedFeatureAndInvokeWallet(
        address _wallet, 
        address _to, 
        uint256 _value, 
        bytes memory _data
    ) 
        external 
        override
        returns (bytes memory _res) 
    {
        require(_isFeatureAuthorisedForWallet(_wallet, msg.sender), "VM: sender may not invoke wallet");
        bool success;
        (success, _res) = _wallet.call(abi.encodeWithSignature("invoke(address,uint256,bytes)", _to, _value, _data));
        if (success && _res.length > 0) { //_res is empty if _wallet is an "old" BaseWallet that can't return output values
            (_res) = abi.decode(_res, (bytes));
        } else if (_res.length > 0) {
            // solhint-disable-next-line no-inline-assembly
            assembly {
                returndatacopy(0, 0, returndatasize())
                revert(0, returndatasize())
            }
        } else if (!success) {
            revert("VM: wallet invoke reverted");
        }
    }
    /**
     * @inheritdoc IVersionManager
     */
    function invokeStorage(address _wallet, address _storage, bytes calldata _data) external override {
        require(_isFeatureAuthorisedForWallet(_wallet, msg.sender), "VM: sender may not invoke storage");
        require(verifyData(_wallet, _data), "VM: target of _data != _wallet");
        require(isStorage[_storage], "VM: invalid storage invoked");
        (bool success,) = _storage.call(_data);
        require(success, "VM: _storage failed");
    }
    /**
     * @inheritdoc IVersionManager
     */
    function setOwner(address _wallet, address _newOwner) external override {
        require(_isFeatureAuthorisedForWallet(_wallet, msg.sender), "VM: sender should be authorized feature");
        IWallet(_wallet).setOwner(_newOwner);
    }
    /* ***************** Internal Methods ************************* */
    function _isFeatureAuthorisedForWallet(address _wallet, address _feature) private view returns (bool) {
        return isFeatureInVersion[_feature][walletVersions[_wallet]];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IModuleRegistry","name":"_registry","type":"address"},{"internalType":"contract ILockStorage","name":"_lockStorage","type":"address"},{"internalType":"contract IGuardianStorage","name":"_guardianStorage","type":"address"},{"internalType":"contract ITransferStorage","name":"_transferStorage","type":"address"},{"internalType":"contract ILimitStorage","name":"_limitStorage","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"FeatureCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_version","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"_features","type":"address[]"}],"name":"VersionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"_version","type":"uint256"}],"name":"WalletUpgraded","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"address","name":"_module","type":"address"}],"name":"addModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_storage","type":"address"}],"name":"addStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_features","type":"address[]"},{"internalType":"address[]","name":"_featuresToInit","type":"address[]"}],"name":"addVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"checkAuthorisedFeatureAndInvokeWallet","outputs":[{"internalType":"bytes","name":"_res","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"featuresToInit","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getRequiredSignatures","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"enum IFeature.OwnerSignature","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStaticCallSignatures","outputs":[{"internalType":"bytes4[]","name":"_sigs","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"address","name":"_storage","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"invokeStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"address","name":"_feature","type":"address"}],"name":"isFeatureAuthorised","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"address","name":"_feature","type":"address"}],"name":"isFeatureAuthorisedInVersionManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"isFeatureInVersion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isStorage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minVersion","type":"uint256"}],"name":"setMinVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"staticCallExecutors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"staticCallSignatures","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_toVersion","type":"uint256"}],"name":"upgradeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verifyStaticCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletVersions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a35760003560e01c80638da5cb5b116100ee578063a6f9dae111610097578063e6516a1511610071578063e6516a15146103f8578063ea2347e614610400578063eb40f32b14610415578063ef1243a414610428576101a3565b8063a6f9dae1146103bf578063e3495a39146103d2578063e452b790146103e5576101a3565b80639be65a60116100c85780639be65a6014610379578063a287fdbd1461038c578063a6cc33c61461039f576101a3565b80638da5cb5b1461033c5780639078c64114610351578063915c77b914610359576101a3565b80633b73d67f1161015057806364dfea061161012a57806364dfea061461030157806367d82ac3146103165780636d71633414610329576101a3565b80633b73d67f146102ba5780635a1db8c4146102db5780635a51fd43146102ee576101a3565b806319ab453c1161018157806319ab453c1461028157806324ee628214610294578063299a7bcc146102a7576101a3565b806309abb4f414610230578063162d58a514610245578063165783891461026e575b33600090815260056020908152604080832054808452600983528184206001600160e01b03198535168552909252909120546001600160a01b0316806102045760405162461bcd60e51b81526004016101fb9061242a565b60405180910390fd5b61020c61043b565b3660008037600080366000845af43d6000803e80801561022b573d6000f35b3d6000fd5b61024361023e366004611a80565b610509565b005b610258610253366004611a80565b610590565b6040516102659190611fcf565b60405180910390f35b61024361027c366004611c7f565b6105a5565b61024361028f366004611a80565b6108cb565b6102586102a2366004611c54565b6108ce565b6102436102b5366004611abf565b6108ee565b6102cd6102c8366004611c01565b61098f565b6040516102659291906125de565b6102436102e9366004611abf565b610a60565b6102586102fc366004611abf565b610c3d565b610309610c65565b6040516102659190612589565b610243610324366004611e07565b610c6b565b610309610337366004611a80565b610cc8565b610344610cda565b6040516102659190611ed4565b61024361043b565b61036c610367366004611b5a565b610ce9565b6040516102659190611fef565b610243610387366004611a80565b610e2c565b61025861039a366004611abf565b610f9c565b6103b26103ad366004611e5b565b611038565b6040516102659190611fda565b6102436103cd366004611a80565b61107b565b6102436103e0366004611c54565b611122565b6102436103f3366004611af7565b611661565b610309611765565b61040861176b565b6040516102659190611f81565b610344610423366004611e5b565b611770565b610344610436366004611e37565b6117a5565b3330146105025760408051600481526024810182526020810180516001600160e01b03167f9078c6410000000000000000000000000000000000000000000000000000000017905290516000913091610bb89161049791611eb8565b60006040518083038160008787f1925050503d80600081146104d5576040519150601f19603f3d011682016040523d82523d6000602084013e6104da565b606091505b5050905080156104fc5760405162461bcd60e51b81526004016101fb90612039565b50610507565b600080a05b565b6002546001600160a01b031633146105335760405162461bcd60e51b81526004016101fb906122ba565b6001600160a01b0381166000908152600a602052604090205460ff161561056c5760405162461bcd60e51b81526004016101fb9061235f565b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b600a6020526000908152604090205460ff1681565b6002546001600160a01b031633146105cf5760405162461bcd60e51b81526004016101fb906122ba565b600380546001019081905560005b848110156107ef576001600660008888858181106105f757fe5b905060200201602081019061060c9190611a80565b6001600160a01b03168152602080820192909252604090810160009081208682529092529020805460ff1916911515919091179055606086868381811061064f57fe5b90506020020160208101906106649190611a80565b6001600160a01b031663ea2347e66040518163ffffffff1660e01b815260040160006040518083038186803b15801561069c57600080fd5b505afa1580156106b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106d89190810190611cdc565b905060005b81518110156107e5576000848152600860205260409020825183908390811061070257fe5b60209081029190910181015182546001810184556000938452919092206008820401805463ffffffff60079093166004026101000a928302191660e09390931c9190910291909117905587878481811061075857fe5b905060200201602081019061076d9190611a80565b60096000868152602001908152602001600020600084848151811061078e57fe5b6020908102919091018101516001600160e01b0319168252810191909152604001600020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556001016106dd565b50506001016105dd565b5060005b8281101561086e576006600085858481811061080b57fe5b90506020020160208101906108209190611a80565b6001600160a01b031681526020808201929092526040908101600090812085825290925290205460ff166108665760405162461bcd60e51b81526004016101fb90612487565b6001016107f3565b506000818152600760205260409020610888908484611950565b507f57012e25cd9d1b245def3547b1bff6d3bb7e5e33194d7b85b3ceebdb940e96aa8186866040516108bc93929190612592565b60405180910390a15050505050565b50565b600660209081526000928352604080842090915290825290205460ff1681565b6108f882336117cb565b6109145760405162461bcd60e51b81526004016101fb90612396565b6040517f13af40350000000000000000000000000000000000000000000000000000000081526001600160a01b038316906313af403590610959908490600401611ed4565b600060405180830381600087803b15801561097357600080fd5b505af1158015610987573d6000803e3d6000fd5b505050505050565b60008060006109d385858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180492505050565b90506001600160e01b031981167fe3495a39000000000000000000000000000000000000000000000000000000001480610a3657506001600160e01b031981167f5a1db8c400000000000000000000000000000000000000000000000000000000145b610a525760405162461bcd60e51b81526004016101fb90612002565b506001958695509350505050565b81610a6b8133611830565b600054604051631293efbb60e21b815284916001600160a01b031690634a4fbeec90610a9b908490600401611ed4565b60206040518083038186803b158015610ab357600080fd5b505afa158015610ac7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aeb9190611d74565b15610b085760405162461bcd60e51b81526004016101fb906121a7565b600b546040517f0bcd4ebb0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690630bcd4ebb90610b51908690600401611ed4565b60206040518083038186803b158015610b6957600080fd5b505afa158015610b7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba19190611d74565b610bbd5760405162461bcd60e51b81526004016101fb90612070565b6040517f1f17732d0000000000000000000000000000000000000000000000000000000081526001600160a01b03851690631f17732d90610c05908690600190600401611f1b565b600060405180830381600087803b158015610c1f57600080fd5b505af1158015610c33573d6000803e3d6000fd5b5050505050505050565b6000610c4983836117cb565b80610c5c57506001600160a01b03821630145b90505b92915050565b60035481565b6002546001600160a01b03163314610c955760405162461bcd60e51b81526004016101fb906122ba565b600081118015610ca757506003548111155b610cc35760405162461bcd60e51b81526004016101fb906124be565b600455565b60056020526000908152604090205481565b6002546001600160a01b031681565b6060610cf585336117cb565b610d115760405162461bcd60e51b81526004016101fb906120de565b6000856001600160a01b0316858585604051602401610d3293929190611f59565b60408051601f198184030181529181526020820180516001600160e01b03167f8f6f03320000000000000000000000000000000000000000000000000000000017905251610d809190611eb8565b6000604051808303816000865af19150503d8060008114610dbd576040519150601f19603f3d011682016040523d82523d6000602084013e610dc2565b606091505b5092509050808015610dd5575060008251115b15610df55781806020019051810190610dee9190611d94565b9150610e23565b815115610e06573d6000803e3d6000fd5b80610e235760405162461bcd60e51b81526004016101fb906121de565b50949350505050565b6002546001600160a01b03163314610e565760405162461bcd60e51b81526004016101fb906122ba565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526000906001600160a01b038316906370a0823190610e9e903090600401611ed4565b60206040518083038186803b158015610eb657600080fd5b505afa158015610eca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eee9190611e1f565b9050816001600160a01b031663a9059cbb60e01b3383604051602401610f15929190611ee8565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f539190611eb8565b6000604051808303816000865af19150503d8060008114610f90576040519150601f19603f3d011682016040523d82523d6000602084013e610f95565b606091505b5050505050565b6001546040517f5a51fd430000000000000000000000000000000000000000000000000000000081526000916001600160a01b031690635a51fd4390610fe89086908690600401611f01565b60206040518083038186803b15801561100057600080fd5b505afa158015611014573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5c9190611d74565b6008602052816000526040600020818154811061105157fe5b9060005260206000209060089182820401919006600402915091509054906101000a900460e01b81565b6002546001600160a01b031633146110a55760405162461bcd60e51b81526004016101fb906122ba565b6001600160a01b0381166110cb5760405162461bcd60e51b81526004016101fb90612552565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3690600090a250565b600054604051631293efbb60e21b815283916001600160a01b031690634a4fbeec90611152908490600401611ed4565b60206040518083038186803b15801561116a57600080fd5b505afa15801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a29190611d74565b156111bf5760405162461bcd60e51b81526004016101fb906121a7565b6111c983336117cb565b8061126457506040517fd6eb1bbf0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063d6eb1bbf90611214903390600401611ed4565b60206040518083038186803b15801561122c57600080fd5b505afa158015611240573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112649190611d74565b806112745750611274833361186a565b6112905760405162461bcd60e51b81526004016101fb90612113565b6001600160a01b038316600090815260056020526040812054600454909181851080156112bb575082155b80156113375750856001600160a01b031663f7e80e986040518163ffffffff1660e01b815260040160206040518083038186803b1580156112fb57600080fd5b505afa15801561130f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113339190611e1f565b6002145b15611343575080611346565b50835b81811015801561135857506003548111155b6113745760405162461bcd60e51b81526004016101fb90612170565b8083106113935760405162461bcd60e51b81526004016101fb906122f1565b6001600160a01b038616600090815260056020908152604080832084905583835260089091528120905b815481101561151f5760008282815481106113d457fe5b600091825260209091206008820401546040517f5f54892b0000000000000000000000000000000000000000000000000000000081526004600790931683026101000a90910460e01b925030916001600160a01b038c1691635f54892b9161143e91869101611fda565b60206040518083038186803b15801561145657600080fd5b505afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190611aa3565b6001600160a01b031614611516576040517f13da30b20000000000000000000000000000000000000000000000000000000081526001600160a01b038a16906313da30b2906114e39030908590600401611f36565b600060405180830381600087803b1580156114fd57600080fd5b505af1158015611511573d6000803e3d6000fd5b505050505b506001016113bd565b506000828152600760205260408120905b815481101561161557600082828154811061154757fe5b6000918252602090912001546001600160a01b0316905086158061158f57506001600160a01b03811660009081526006602090815260408083208a845290915290205460ff16155b1561160c576040517f19ab453c0000000000000000000000000000000000000000000000000000000081526001600160a01b038216906319ab453c906115d9908d90600401611ed4565b600060405180830381600087803b1580156115f357600080fd5b505af1158015611607573d6000803e3d6000fd5b505050505b50600101611530565b50876001600160a01b03167f9953e0e47dcd74fd932e1162859214ea7142af9a476c782f129af1f3a5843ebd8460405161164f9190612589565b60405180910390a25050505050505050565b61166b84336117cb565b6116875760405162461bcd60e51b81526004016101fb906124f5565b6116928483836118f8565b6116ae5760405162461bcd60e51b81526004016101fb9061224c565b6001600160a01b0383166000908152600a602052604090205460ff166116e65760405162461bcd60e51b81526004016101fb906120a7565b6000836001600160a01b03168383604051611702929190611ea8565b6000604051808303816000865af19150503d806000811461173f576040519150601f19603f3d011682016040523d82523d6000602084013e611744565b606091505b5050905080610f955760405162461bcd60e51b81526004016101fb90612215565b60045481565b606090565b6007602052816000526040600020818154811061178957fe5b6000918252602090912001546001600160a01b03169150829050565b60096020908152600092835260408084209091529082529020546001600160a01b031681565b6001600160a01b038082166000908152600660209081526040808320938616835260058252808320548352929052205460ff1692915050565b60006004825110156118285760405162461bcd60e51b81526004016101fb90612283565b506020015190565b61183a8282610f9c565b8061184a575061184a828261186a565b6118665760405162461bcd60e51b81526004016101fb906123f3565b5050565b6000816001600160a01b0316836001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118af57600080fd5b505afa1580156118c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e79190611aa3565b6001600160a01b0316149392505050565b6000602482101561191b5760405162461bcd60e51b81526004016101fb90612328565b600061192a8360048187612667565b8101906119379190611a80565b6001600160a01b03908116908616149150509392505050565b8280548282559060005260206000209081019282156119b0579160200282015b828111156119b057815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03843516178255602090920191600190910190611970565b506119bc9291506119c0565b5090565b5b808211156119bc57805473ffffffffffffffffffffffffffffffffffffffff191681556001016119c1565b60008083601f8401126119fd578182fd5b50813567ffffffffffffffff811115611a14578182fd5b6020830191508360208083028501011115611a2e57600080fd5b9250929050565b8051610c5f816126d4565b60008083601f840112611a51578182fd5b50813567ffffffffffffffff811115611a68578182fd5b602083019150836020828501011115611a2e57600080fd5b600060208284031215611a91578081fd5b8135611a9c816126bf565b9392505050565b600060208284031215611ab4578081fd5b8151611a9c816126bf565b60008060408385031215611ad1578081fd5b8235611adc816126bf565b91506020830135611aec816126bf565b809150509250929050565b60008060008060608587031215611b0c578182fd5b8435611b17816126bf565b93506020850135611b27816126bf565b9250604085013567ffffffffffffffff811115611b42578283fd5b611b4e87828801611a40565b95989497509550505050565b60008060008060808587031215611b6f578384fd5b8435611b7a816126bf565b93506020850135611b8a816126bf565b925060408501359150606085013567ffffffffffffffff811115611bac578182fd5b8501601f81018713611bbc578182fd5b8035611bcf611bca82612643565b6125fc565b818152886020838501011115611be3578384fd5b81602084016020830137908101602001929092525092959194509250565b600080600060408486031215611c15578283fd5b8335611c20816126bf565b9250602084013567ffffffffffffffff811115611c3b578283fd5b611c4786828701611a40565b9497909650939450505050565b60008060408385031215611c66578182fd5b8235611c71816126bf565b946020939093013593505050565b60008060008060408587031215611c94578384fd5b843567ffffffffffffffff80821115611cab578586fd5b611cb7888389016119ec565b90965094506020870135915080821115611ccf578384fd5b50611b4e878288016119ec565b60006020808385031215611cee578182fd5b825167ffffffffffffffff811115611d04578283fd5b8301601f81018513611d14578283fd5b8051611d22611bca82612623565b8181528381019083850185840285018601891015611d3e578687fd5b8694505b83851015611d6857611d548982611a35565b835260019490940193918501918501611d42565b50979650505050505050565b600060208284031215611d85578081fd5b81518015158114611a9c578182fd5b600060208284031215611da5578081fd5b815167ffffffffffffffff811115611dbb578182fd5b8201601f81018413611dcb578182fd5b8051611dd9611bca82612643565b818152856020838501011115611ded578384fd5b611dfe82602083016020860161268f565b95945050505050565b600060208284031215611e18578081fd5b5035919050565b600060208284031215611e30578081fd5b5051919050565b60008060408385031215611e49578182fd5b823591506020830135611aec816126d4565b60008060408385031215611e6d578182fd5b50508035926020909101359150565b60008151808452611e9481602086016020860161268f565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251611eca81846020870161268f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b60006001600160a01b038516825283602083015260606040830152611dfe6060830184611e7c565b6020808252825182820181905260009190848201906040850190845b81811015611fc35783516001600160e01b03191683529284019291840191600101611f9d565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b600060208252610c5c6020830184611e7c565b60208082526012908201527f564d3a20756e6b6e6f776e206d6574686f640000000000000000000000000000604082015260600190565b60208082526017908201527f564d3a206e6f7420696e20612073746174696363616c6c000000000000000000604082015260600190565b6020808252601c908201527f564d3a206d6f64756c65206973206e6f74207265676973746572656400000000604082015260600190565b6020808252601b908201527f564d3a20696e76616c69642073746f7261676520696e766f6b65640000000000604082015260600190565b6020808252818101527f564d3a2073656e646572206d6179206e6f7420696e766f6b652077616c6c6574604082015260600190565b60208082526021908201527f564d3a2073656e646572206d6179206e6f7420757067726164652077616c6c6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526016908201527f564d3a20696e76616c6964205f746f56657273696f6e00000000000000000000604082015260600190565b60208082526011908201527f42463a2077616c6c6574206c6f636b6564000000000000000000000000000000604082015260600190565b6020808252601a908201527f564d3a2077616c6c657420696e766f6b65207265766572746564000000000000604082015260600190565b60208082526013908201527f564d3a205f73746f72616765206661696c656400000000000000000000000000604082015260600190565b6020808252601e908201527f564d3a20746172676574206f66205f6461746120213d205f77616c6c65740000604082015260600190565b6020808252601a908201527f524d3a20496e76616c69642066756e6374696f6e507265666978000000000000604082015260600190565b6020808252600d908201527f4d757374206265206f776e657200000000000000000000000000000000000000604082015260600190565b6020808252601a908201527f564d3a20616c7265616479206f6e206e65772076657273696f6e000000000000604082015260600190565b60208082526016908201527f524d3a20496e76616c6964206461746157616c6c657400000000000000000000604082015260600190565b60208082526019908201527f564d3a2073746f7261676520616c726561647920616464656400000000000000604082015260600190565b60208082526027908201527f564d3a2073656e6465722073686f756c6420626520617574686f72697a65642060408201527f6665617475726500000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f42463a206d757374206265206f776e6572206f72206665617475726500000000604082015260600190565b60208082526030908201527f564d3a207374617469632063616c6c206e6f7420737570706f7274656420666f60408201527f722077616c6c65742076657273696f6e00000000000000000000000000000000606082015260800190565b6020808252601b908201527f564d3a20696e76616c6964205f6665617475726573546f496e69740000000000604082015260600190565b60208082526017908201527f564d3a20696e76616c6964205f6d696e56657273696f6e000000000000000000604082015260600190565b60208082526021908201527f564d3a2073656e646572206d6179206e6f7420696e766f6b652073746f72616760408201527f6500000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f41646472657373206d757374206e6f74206265206e756c6c0000000000000000604082015260600190565b90815260200190565b83815260406020808301829052908201839052600090849060608401835b86811015611d685783356125c3816126bf565b6001600160a01b0316825292820192908201906001016125b0565b82815260408101600483106125ef57fe5b8260208301529392505050565b60405181810167ffffffffffffffff8111828210171561261b57600080fd5b604052919050565b600067ffffffffffffffff821115612639578081fd5b5060209081020190565b600067ffffffffffffffff821115612659578081fd5b50601f01601f191660200190565b60008085851115612676578182fd5b83861115612682578182fd5b5050820193919092039150565b60005b838110156126aa578181015183820152602001612692565b838111156126b9576000848401525b50505050565b6001600160a01b03811681146108cb57600080fd5b6001600160e01b0319811681146108cb57600080fdfea26469706673582212209ad909497819e231a4f73778bee9d64b22d2c89dc5ef5ef1b43590fcdaa9073464736f6c634300060c0033

Deployed Bytecode Sourcemap

34732:13214:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41965:10;41932:15;41950:26;;;:14;:26;;;;;;;;;42005:28;;;:19;:28;;;;;-1:-1:-1;;;;;;42034:7:0;;;42005:37;;;;;;;;;-1:-1:-1;;;;;42005:37:0;42061:21;42053:82;;;;-1:-1:-1;;;42053:82:0;;;;;;;:::i;:::-;;;;;;;;;42146:18;:16;:18::i;:::-;42275:14;42272:1;42269;42256:34;42369:1;42366;42350:14;42347:1;42338:7;42331:5;42318:53;42406:16;42403:1;42400;42385:38;42444:6;42464:36;;;;42534:16;42531:1;42523:28;42464:36;42482:16;42479:1;42472:27;39618:169;;;;;;:::i;:::-;;:::i;:::-;;35900:41;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38513:975;;;;;;:::i;:::-;;:::i;42693:71::-;;;;;;:::i;:::-;;:::i;35347:70::-;;;;;;:::i;:::-;;:::i;47444:240::-;;;;;;:::i;:::-;;:::i;40274:557::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;45422:285::-;;;;;;:::i;:::-;;:::i;39915:306::-;;;;;;:::i;:::-;;:::i;35092:26::-;;;:::i;:::-;;;;;;;:::i;37577:198::-;;;;;;:::i;:::-;;:::i;35237:49::-;;;;;;:::i;:::-;;:::i;3928:20::-;;;:::i;:::-;;;;;;;:::i;41295:508::-;;;:::i;45858:1004::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37198:234::-;;;;;;:::i;:::-;;:::i;31586:195::-;;;;;;:::i;:::-;;:::i;35635:56::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4385:205::-;;;;;;:::i;:::-;;:::i;42824:2546::-;;;;;;:::i;:::-;;:::i;46922:462::-;;;;;;:::i;:::-;;:::i;35157:29::-;;;:::i;31433:100::-;;;:::i;:::-;;;;;;;:::i;35509:51::-;;;;;;:::i;:::-;;:::i;35761:73::-;;;;;;:::i;:::-;;:::i;41295:508::-;41344:10;41366:4;41344:27;41341:455;;41488:67;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41488:67:0;41511:43;41488:67;;;41458:98;;41441:12;;41466:4;;41482;;41458:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41440:116;;;41580:7;41579:8;41571:44;;;;-1:-1:-1;;;41571:44:0;;;;;;;:::i;:::-;41341:455;;;;41781:1;;41773:10;41771:14;41295:508::o;39618:169::-;4132:5;;-1:-1:-1;;;;;4132:5:0;4118:10;:19;4110:45;;;;-1:-1:-1;;;4110:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39693:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;::::1;;39692:20;39684:58;;;;-1:-1:-1::0;;;39684:58:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39753:19:0::1;;::::0;;;:9:::1;:19;::::0;;;;:26;;-1:-1:-1;;39753:26:0::1;39775:4;39753:26;::::0;;39618:169::o;35900:41::-;;;;;;;;;;;;;;;:::o;38513:975::-;4132:5;;-1:-1:-1;;;;;4132:5:0;4118:10;:19;4110:45;;;;-1:-1:-1;;;4110:45:0;;;;;;;:::i;:::-;38652:11:::1;38650:13:::0;;::::1;;::::0;;;;38629:18:::1;38674:497;38693:20:::0;;::::1;38674:497;;;38782:4;38735:18;:32;38754:9;;38764:1;38754:12;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38735:32:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;38735:32:0;;;:44;;;;;;;;:51;;-1:-1:-1;;38735:51:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38878:20:::1;38910:9:::0;;38920:1;38910:12;;::::1;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38901:46:0::1;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;38901:48:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;38878:71;;38968:9;38964:196;38987:4;:11;38983:1;:15;38964:196;;;39024:32;::::0;;;:20:::1;:32;::::0;;;;39062:7;;:4;;39067:1;;39062:7;::::1;;;;;;::::0;;::::1;::::0;;;;;;;39024:46;;::::1;::::0;::::1;::::0;;-1:-1:-1;39024:46:0;;;;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;::::1;;;;::::0;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;39132:9;;39142:1;39132:12;;::::1;;;;;;;;;;;;;;;;;;:::i;:::-;39089:19;:31;39109:10;39089:31;;;;;;;;;;;:40;39121:4;39126:1;39121:7;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;;39089:40:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;39089:40:0;:55;;-1:-1:-1;;39089:55:0::1;-1:-1:-1::0;;;;;39089:55:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;39000:3:0::1;38964:196;;;-1:-1:-1::0;;38715:3:0::1;;38674:497;;;;39210:9;39206:169;39225:26:::0;;::::1;39206:169;;;39281:18;:38;39300:15;;39316:1;39300:18;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39281:38:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;39281:38:0;;;:50;;;;;;;;;::::1;;39273:90;;;;-1:-1:-1::0;;;39273:90:0::1;;;;;;;:::i;:::-;39253:3;;39206:169;;;-1:-1:-1::0;39385:26:0::1;::::0;;;:14:::1;:26;::::0;;;;:44:::1;::::0;39414:15;;39385:44:::1;:::i;:::-;;39445:35;39458:10;39470:9;;39445:35;;;;;;;;:::i;:::-;;;;;;;;4166:1;38513:975:::0;;;;:::o;42693:71::-;;:::o;35347:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47444:240::-;47535:50;47565:7;47574:10;47535:29;:50::i;:::-;47527:102;;;;-1:-1:-1;;;47527:102:0;;;;;;;:::i;:::-;47640:36;;;;;-1:-1:-1;;;;;47640:25:0;;;;;:36;;47666:9;;47640:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47444:240;;:::o;40274:557::-;40382:7;40391:14;40418:15;40436:27;40457:5;;40436:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40436:20:0;;-1:-1:-1;;;40436:27:0:i;:::-;40418:45;-1:-1:-1;;;;;;;40683:33:0;;;;;:66;;-1:-1:-1;;;;;;;40720:29:0;;;;40683:66;40675:97;;;;-1:-1:-1;;;40675:97:0;;;;;;;:::i;:::-;-1:-1:-1;40796:1:0;;;;-1:-1:-1;40274:557:0;-1:-1:-1;;;;40274:557:0:o;45422:285::-;45518:7;30245:51;30276:7;30285:10;30245:30;:51::i;:::-;29130:11:::1;::::0;:29:::1;::::0;-1:-1:-1;;;29130:29:0;;45544:7;;-1:-1:-1;;;;;29130:11:0::1;::::0;:20:::1;::::0;:29:::1;::::0;45544:7;;29130:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29129:30;29121:60;;;;-1:-1:-1::0;;;29121:60:0::1;;;;;;;:::i;:::-;45572:8:::2;::::0;:36:::2;::::0;;;;-1:-1:-1;;;;;45572:8:0;;::::2;::::0;:27:::2;::::0;:36:::2;::::0;45600:7;;45572:36:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45564:77;;;;-1:-1:-1::0;;;45564:77:0::2;;;;;;;:::i;:::-;45652:47;::::0;;;;-1:-1:-1;;;;;45652:32:0;::::2;::::0;::::2;::::0;:47:::2;::::0;45685:7;;45694:4:::2;::::0;45652:47:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;30307:1:::1;45422:285:::0;;;:::o;39915:306::-;40011:4;40136:48;40166:7;40175:8;40136:29;:48::i;:::-;:77;;;-1:-1:-1;;;;;;40188:25:0;;40208:4;40188:25;40136:77;40129:84;;39915:306;;;;;:::o;35092:26::-;;;;:::o;37577:198::-;4132:5;;-1:-1:-1;;;;;4132:5:0;4118:10;:19;4110:45;;;;-1:-1:-1;;;4110:45:0;;;;;;;:::i;:::-;37673:1:::1;37659:11;:15;:45;;;;;37693:11;;37678;:26;;37659:45;37651:81;;;;-1:-1:-1::0;;;37651:81:0::1;;;;;;;:::i;:::-;37743:10;:24:::0;37577:198::o;35237:49::-;;;;;;;;;;;;;:::o;3928:20::-;;;-1:-1:-1;;;;;3928:20:0;;:::o;45858:1004::-;46073:17;46117:50;46147:7;46156:10;46117:29;:50::i;:::-;46109:95;;;;-1:-1:-1;;;46109:95:0;;;;;;;:::i;:::-;46215:12;46256:7;-1:-1:-1;;;;;46256:12:0;46326:3;46331:6;46339:5;46269:76;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;46269:76:0;;;;;;;;;;;;;;-1:-1:-1;;;;;46269:76:0;;;;;46256:90;;;46269:76;46256:90;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46238:108:0;-1:-1:-1;46238:108:0;-1:-1:-1;46238:108:0;46361:26;;;;;46386:1;46372:4;:11;:15;46361:26;46357:498;;;46506:4;46495:25;;;;;;;;;;;;:::i;:::-;46486:34;;46357:498;;;46542:11;;:15;46538:317;;46684:16;46681:1;;46663:38;46729:16;46681:1;46719:27;46644:117;46783:7;46778:77;;46807:36;;-1:-1:-1;;;46807:36:0;;;;;;;:::i;46778:77::-;45858:1004;;;;;;;:::o;37198:234::-;4132:5;;-1:-1:-1;;;;;4132:5:0;4118:10;:19;4110:45;;;;-1:-1:-1;;;4110:45:0;;;;;;;:::i;:::-;37288:38:::1;::::0;;;;37275:10:::1;::::0;-1:-1:-1;;;;;37288:23:0;::::1;::::0;::::1;::::0;:38:::1;::::0;37320:4:::1;::::0;37288:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37275:51;;37337:6;-1:-1:-1::0;;;;;37337:11:0::1;37372:31;;;37405:10;37417:5;37349:74;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;37349:74:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;37349:74:0::1;-1:-1:-1::0;;;;;;37349:74:0;;::::1;::::0;;;::::1;::::0;;;37337:87;;::::1;::::0;37349:74;37337:87:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4166:1;37198:234:::0;:::o;31586:195::-;31720:14;;:53;;;;;31696:4;;-1:-1:-1;;;;;31720:14:0;;:34;;:53;;31755:7;;31764:8;;31720:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35635:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4385:205::-;4132:5;;-1:-1:-1;;;;;4132:5:0;4118:10;:19;4110:45;;;;-1:-1:-1;;;4110:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4463:23:0;::::1;4455:60;;;;-1:-1:-1::0;;;4455:60:0::1;;;;;;;:::i;:::-;4526:5;:17:::0;;-1:-1:-1;;4526:17:0::1;-1:-1:-1::0;;;;;4526:17:0;::::1;::::0;;::::1;::::0;;;4559:23:::1;::::0;::::1;::::0;-1:-1:-1;;4559:23:0::1;4385:205:::0;:::o;42824:2546::-;29130:11;;:29;;-1:-1:-1;;;29130:29:0;;42919:7;;-1:-1:-1;;;;;29130:11:0;;:20;;:29;;42919:7;;29130:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29129:30;29121:60;;;;-1:-1:-1;;;29121:60:0;;;;;;;:::i;:::-;43053:50:::1;43083:7;43092:10;43053:29;:50::i;:::-;:220;;;-1:-1:-1::0;43234:39:0::1;::::0;;;;-1:-1:-1;;;;;43234:27:0;::::1;::::0;::::1;::::0;:39:::1;::::0;43262:10:::1;::::0;43234:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43053:357;;;;43382:28;43390:7;43399:10;43382:7;:28::i;:::-;42939:533;;;;-1:-1:-1::0;;;42939:533:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43505:23:0;::::1;43483:19;43505:23:::0;;;:14:::1;:23;::::0;;;;;43561:10:::1;::::0;43505:23;;43613:24;;::::1;:44:::0;::::1;;;-1:-1:-1::0;43641:16:0;;43613:44:::1;:79;;;;;43669:7;-1:-1:-1::0;;;;;43661:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43691:1;43661:31;43613:79;43610:626;;;-1:-1:-1::0;44158:11:0;43610:626:::1;;;-1:-1:-1::0;44214:10:0;43610:626:::1;44267:11;44254:9;:24;;:52;;;;;44295:11;;44282:9;:24;;44254:52;44246:87;;;;-1:-1:-1::0;;;44246:87:0::1;;;;;;;:::i;:::-;44366:9;44352:11;:23;44344:62;;;;-1:-1:-1::0;;;44344:62:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44417:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;:35;;;44529:31;;;:20:::1;:31:::0;;;;;;44571:241:::1;44594:11:::0;;44590:15;::::1;44571:241;;;44627:10;44640:4;44645:1;44640:7;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;44665:29:::1;::::0;;;;44640:7:::1;::::0;;;;;::::1;;;::::0;;::::1;;;::::0;-1:-1:-1;44706:4:0::1;::::0;-1:-1:-1;;;;;44665:24:0;::::1;::::0;::::1;::::0;:29:::1;::::0;44640:7;;44665:29:::1;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44665:46:0::1;;44662:139;;44732:53;::::0;;;;-1:-1:-1;;;;;44732:33:0;::::1;::::0;::::1;::::0;:53:::1;::::0;44774:4:::1;::::0;44781:3;;44732:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44662:139;-1:-1:-1::0;44607:3:0::1;;44571:241;;;-1:-1:-1::0;44848:43:0::1;44894:25:::0;;;:14:::1;:25;::::0;;;;;44930:383:::1;44953:32:::0;;44949:36;::::1;44930:383;;;45007:15;45025:25;45051:1;45025:28;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;45025:28:0::1;::::0;-1:-1:-1;45173:16:0;;;:61:::1;;-1:-1:-1::0;;;;;;45194:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;:40;;;;;;;;;::::1;;45193:41;45173:61;45170:132;;;45255:31;::::0;;;;-1:-1:-1;;;;;45255:22:0;::::1;::::0;::::1;::::0;:31:::1;::::0;45278:7;;45255:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45170:132;-1:-1:-1::0;44987:3:0::1;;44930:383;;;;45343:7;-1:-1:-1::0;;;;;45328:34:0::1;;45352:9;45328:34;;;;;;:::i;:::-;;;;;;;;29192:1;;;;;42824:2546:::0;;;:::o;46922:462::-;47039:50;47069:7;47078:10;47039:29;:50::i;:::-;47031:96;;;;-1:-1:-1;;;47031:96:0;;;;;;;:::i;:::-;47146:26;47157:7;47166:5;;47146:10;:26::i;:::-;47138:69;;;;-1:-1:-1;;;47138:69:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47226:19:0;;;;;;:9;:19;;;;;;;;47218:59;;;;-1:-1:-1;;;47218:59:0;;;;;;;:::i;:::-;47289:12;47306:8;-1:-1:-1;;;;;47306:13:0;47320:5;;47306:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47288:38;;;47345:7;47337:39;;;;-1:-1:-1;;;47337:39:0;;;;;;;:::i;35157:29::-;;;;:::o;31433:100::-;31508:21;31433:100;:::o;35509:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35509:51:0;;-1:-1:-1;35509:51:0;;-1:-1:-1;35509:51:0:o;35761:73::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35761:73:0;;:::o;47762:181::-;-1:-1:-1;;;;;47882:28:0;;;47858:4;47882:28;;;:18;:28;;;;;;;;47911:23;;;;;:14;:23;;;;;;47882:53;;;;;;;;;47762:181;;;;:::o;2246:292::-;2313:13;2363:1;2347:5;:12;:17;;2339:56;;;;-1:-1:-1;;;2339:56:0;;;;;;;:::i;:::-;-1:-1:-1;2514:4:0;2503:16;2497:23;;2472:59::o;32733:230::-;32840:53;32876:7;32885;32840:35;:53::i;:::-;:82;;;;32897:25;32905:7;32914;32897;:25::i;:::-;32832:123;;;;-1:-1:-1;;;32832:123:0;;;;;;;:::i;:::-;32733:230;;:::o;32410:137::-;32482:4;32534:5;-1:-1:-1;;;;;32506:33:0;32514:7;-1:-1:-1;;;;;32506:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32506:33:0;;;32410:137;-1:-1:-1;;;32410:137:0:o;31960:263::-;32042:4;32083:2;32067:18;;;32059:53;;;;-1:-1:-1;;;32059:53:0;;;;;;;:::i;:::-;32123:18;32155:9;:5;32161:1;32155:5;;:9;:::i;:::-;32144:32;;;;;;;:::i;:::-;-1:-1:-1;;;;;32194:21:0;;;;;;;;-1:-1:-1;;31960:263:0;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;454:352;;;584:3;577:4;569:6;565:17;561:27;551:2;;-1:-1;;592:12;551:2;-1:-1;622:20;;662:18;651:30;;648:2;;;-1:-1;;684:12;648:2;728:4;720:6;716:17;704:29;;779:3;728:4;;763:6;759:17;720:6;745:32;;742:41;739:2;;;796:1;;786:12;739:2;544:262;;;;;:::o;1828:132::-;1905:13;;1923:32;1905:13;1923:32;:::i;1981:336::-;;;2095:3;2088:4;2080:6;2076:17;2072:27;2062:2;;-1:-1;;2103:12;2062:2;-1:-1;2133:20;;2173:18;2162:30;;2159:2;;;-1:-1;;2195:12;2159:2;2239:4;2231:6;2227:17;2215:29;;2290:3;2239:4;2270:17;2231:6;2256:32;;2253:41;2250:2;;;2307:1;;2297:12;3503:241;;3607:2;3595:9;3586:7;3582:23;3578:32;3575:2;;;-1:-1;;3613:12;3575:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3665:63;3569:175;-1:-1;;;3569:175::o;3751:263::-;;3866:2;3854:9;3845:7;3841:23;3837:32;3834:2;;;-1:-1;;3872:12;3834:2;226:6;220:13;238:33;265:5;238:33;:::i;4285:366::-;;;4406:2;4394:9;4385:7;4381:23;4377:32;4374:2;;;-1:-1;;4412:12;4374:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4464:63;-1:-1;4564:2;4603:22;;72:20;97:33;72:20;97:33;:::i;:::-;4572:63;;;;4368:283;;;;;:::o;4658:615::-;;;;;4815:2;4803:9;4794:7;4790:23;4786:32;4783:2;;;-1:-1;;4821:12;4783:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4873:63;-1:-1;4973:2;5012:22;;72:20;97:33;72:20;97:33;:::i;:::-;4981:63;-1:-1;5109:2;5094:18;;5081:32;5133:18;5122:30;;5119:2;;;-1:-1;;5155:12;5119:2;5193:64;5249:7;5240:6;5229:9;5225:22;5193:64;:::i;:::-;4777:496;;;;-1:-1;5175:82;-1:-1;;;;4777:496::o;5280:721::-;;;;;5444:3;5432:9;5423:7;5419:23;5415:33;5412:2;;;-1:-1;;5451:12;5412:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5503:63;-1:-1;5603:2;5642:22;;72:20;97:33;72:20;97:33;:::i;:::-;5611:63;-1:-1;5711:2;5750:22;;3292:20;;-1:-1;5847:2;5832:18;;5819:32;5871:18;5860:30;;5857:2;;;-1:-1;;5893:12;5857:2;5953:22;;2420:4;2408:17;;2404:27;-1:-1;2394:2;;-1:-1;;2435:12;2394:2;2482:6;2469:20;2504:64;2519:48;2560:6;2519:48;:::i;:::-;2504:64;:::i;:::-;2588:6;2581:5;2574:21;2692:3;5603:2;2683:6;2616;2674:16;;2671:25;2668:2;;;-1:-1;;2699:12;2668:2;41044:6;5603:2;2616:6;2612:17;5603:2;2650:5;2646:16;41021:30;41082:16;;;5603:2;41082:16;41075:27;;;;-1:-1;5406:595;;;;-1:-1;5406:595;-1:-1;5406:595::o;6008:490::-;;;;6148:2;6136:9;6127:7;6123:23;6119:32;6116:2;;;-1:-1;;6154:12;6116:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6206:63;-1:-1;6334:2;6319:18;;6306:32;6358:18;6347:30;;6344:2;;;-1:-1;;6380:12;6344:2;6418:64;6474:7;6465:6;6454:9;6450:22;6418:64;:::i;:::-;6110:388;;6400:82;;-1:-1;6400:82;;-1:-1;;;;6110:388::o;6505:366::-;;;6626:2;6614:9;6605:7;6601:23;6597:32;6594:2;;;-1:-1;;6632:12;6594:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6684:63;6784:2;6823:22;;;;3292:20;;-1:-1;;;6588:283::o;6878:678::-;;;;;7069:2;7057:9;7048:7;7044:23;7040:32;7037:2;;;-1:-1;;7075:12;7037:2;7133:17;7120:31;7171:18;;7163:6;7160:30;7157:2;;;-1:-1;;7193:12;7157:2;7231:80;7303:7;7294:6;7283:9;7279:22;7231:80;:::i;:::-;7213:98;;-1:-1;7213:98;-1:-1;7376:2;7361:18;;7348:32;;-1:-1;7389:30;;;7386:2;;;-1:-1;;7422:12;7386:2;;7460:80;7532:7;7523:6;7512:9;7508:22;7460:80;:::i;7563:390::-;;7702:2;;7690:9;7681:7;7677:23;7673:32;7670:2;;;-1:-1;;7708:12;7670:2;7759:17;7753:24;7797:18;7789:6;7786:30;7783:2;;;-1:-1;;7819:12;7783:2;7905:22;;951:4;939:17;;935:27;-1:-1;925:2;;-1:-1;;966:12;925:2;1006:6;1000:13;1028:79;1043:63;1099:6;1043:63;:::i;1028:79::-;1135:21;;;1192:14;;;;1167:17;;;1281;;;1272:27;;;;1269:36;-1:-1;1266:2;;;-1:-1;;1308:12;1266:2;-1:-1;1334:10;;1328:216;1353:6;1350:1;1347:13;1328:216;;;1433:47;1476:3;1464:10;1433:47;:::i;:::-;1421:60;;1375:1;1368:9;;;;;1495:14;;;;1523;;1328:216;;;-1:-1;7839:98;7664:289;-1:-1;;;;;;;7664:289::o;7960:257::-;;8072:2;8060:9;8051:7;8047:23;8043:32;8040:2;;;-1:-1;;8078:12;8040:2;1639:6;1633:13;41959:5;39901:13;39894:21;41937:5;41934:32;41924:2;;-1:-1;;41970:12;8224:360;;8348:2;8336:9;8327:7;8323:23;8319:32;8316:2;;;-1:-1;;8354:12;8316:2;8405:17;8399:24;8443:18;8435:6;8432:30;8429:2;;;-1:-1;;8465:12;8429:2;8536:22;;2880:4;2868:17;;2864:27;-1:-1;2854:2;;-1:-1;;2895:12;2854:2;2935:6;2929:13;2957:64;2972:48;3013:6;2972:48;:::i;2957:64::-;3041:6;3034:5;3027:21;3145:3;8348:2;3136:6;3069;3127:16;;3124:25;3121:2;;;-1:-1;;3152:12;3121:2;3172:39;3204:6;8348:2;3103:5;3099:16;8348:2;3069:6;3065:17;3172:39;:::i;:::-;8485:83;8310:274;-1:-1;;;;;8310:274::o;8591:241::-;;8695:2;8683:9;8674:7;8670:23;8666:32;8663:2;;;-1:-1;;8701:12;8663:2;-1:-1;3292:20;;8657:175;-1:-1;8657:175::o;8839:263::-;;8954:2;8942:9;8933:7;8929:23;8925:32;8922:2;;;-1:-1;;8960:12;8922:2;-1:-1;3440:13;;8916:186;-1:-1;8916:186::o;9109:364::-;;;9229:2;9217:9;9208:7;9204:23;9200:32;9197:2;;;-1:-1;;9235:12;9197:2;3305:6;3292:20;9287:63;;9387:2;9429:9;9425:22;1759:20;1784:32;1810:5;1784:32;:::i;9480:366::-;;;9601:2;9589:9;9580:7;9576:23;9572:32;9569:2;;;-1:-1;;9607:12;9569:2;-1:-1;;3292:20;;;9759:2;9798:22;;;3292:20;;-1:-1;9563:283::o;12835:343::-;;12977:5;37909:12;38440:6;38435:3;38428:19;13070:52;13115:6;38477:4;38472:3;38468:14;38477:4;13096:5;13092:16;13070:52;:::i;:::-;41477:7;41461:14;-1:-1;;41457:28;13134:39;;;;38477:4;13134:39;;12925:253;-1:-1;;12925:253::o;21697:291::-;;41044:6;41039:3;41034;41021:30;41082:16;;41075:27;;;41082:16;21841:147;-1:-1;21841:147::o;21995:271::-;;13345:5;37909:12;13456:52;13501:6;13496:3;13489:4;13482:5;13478:16;13456:52;:::i;:::-;13520:16;;;;;22129:137;-1:-1;;22129:137::o;22273:222::-;-1:-1;;;;;40289:54;;;;10449:45;;22400:2;22385:18;;22371:124::o;22747:365::-;-1:-1;;;;;40289:54;;;;10449:45;;23098:2;23083:18;;21648:37;22918:2;22903:18;;22889:223::o;23119:333::-;-1:-1;;;;;40289:54;;;10449:45;;40289:54;;23438:2;23423:18;;10449:45;23274:2;23259:18;;23245:207::o;23459:321::-;-1:-1;;;;;40289:54;;;;10449:45;;39901:13;39894:21;23766:2;23751:18;;12224:34;23608:2;23593:18;;23579:201::o;23787:329::-;-1:-1;;;;;40289:54;;;;10449:45;;-1:-1;;;;;;39988:78;24102:2;24087:18;;12329:36;23940:2;23925:18;;23911:205::o;24123:528::-;;-1:-1;;;;;10487:5;40289:54;10456:3;10449:45;21678:5;24488:2;24477:9;24473:18;21648:37;24324:2;24525;24514:9;24510:18;24503:48;24565:76;24324:2;24313:9;24309:18;24627:6;24565:76;:::i;24658:366::-;24833:2;24847:47;;;37909:12;;24818:18;;;38428:19;;;24658:366;;24833:2;37764:14;;;;38468;;;;24658:366;11872:257;11897:6;11894:1;11891:13;11872:257;;;11958:13;;-1:-1;;;;;;39988:78;12329:36;;38169:14;;;;10185;;;;11919:1;11912:9;11872:257;;;-1:-1;24900:114;;24804:220;-1:-1;;;;;;24804:220::o;25031:210::-;39901:13;;39894:21;12224:34;;25152:2;25137:18;;25123:118::o;25248:218::-;-1:-1;;;;;;39988:78;;;;12329:36;;25373:2;25358:18;;25344:122::o;25473:306::-;;25618:2;25639:17;25632:47;25693:76;25618:2;25607:9;25603:18;25755:6;25693:76;:::i;25786:416::-;25986:2;26000:47;;;13938:2;25971:18;;;38428:19;13974:20;38468:14;;;13954:41;14014:12;;;25957:245::o;26209:416::-;26409:2;26423:47;;;14265:2;26394:18;;;38428:19;14301:25;38468:14;;;14281:46;14346:12;;;26380:245::o;26632:416::-;26832:2;26846:47;;;14597:2;26817:18;;;38428:19;14633:30;38468:14;;;14613:51;14683:12;;;26803:245::o;27055:416::-;27255:2;27269:47;;;14934:2;27240:18;;;38428:19;14970:29;38468:14;;;14950:50;15019:12;;;27226:245::o;27478:416::-;27678:2;27692:47;;;27663:18;;;38428:19;15306:34;38468:14;;;15286:55;15360:12;;;27649:245::o;27901:416::-;28101:2;28115:47;;;15611:2;28086:18;;;38428:19;15647:34;38468:14;;;15627:55;15716:3;15702:12;;;15695:25;15739:12;;;28072:245::o;28324:416::-;28524:2;28538:47;;;15990:2;28509:18;;;38428:19;16026:24;38468:14;;;16006:45;16070:12;;;28495:245::o;28747:416::-;28947:2;28961:47;;;16321:2;28932:18;;;38428:19;16357;38468:14;;;16337:40;16396:12;;;28918:245::o;29170:416::-;29370:2;29384:47;;;16647:2;29355:18;;;38428:19;16683:28;38468:14;;;16663:49;16731:12;;;29341:245::o;29593:416::-;29793:2;29807:47;;;16982:2;29778:18;;;38428:19;17018:21;38468:14;;;16998:42;17059:12;;;29764:245::o;30016:416::-;30216:2;30230:47;;;17310:2;30201:18;;;38428:19;17346:32;38468:14;;;17326:53;17398:12;;;30187:245::o;30439:416::-;30639:2;30653:47;;;17649:2;30624:18;;;38428:19;17685:28;38468:14;;;17665:49;17733:12;;;30610:245::o;30862:416::-;31062:2;31076:47;;;17984:2;31047:18;;;38428:19;18020:15;38468:14;;;18000:36;18055:12;;;31033:245::o;31285:416::-;31485:2;31499:47;;;18306:2;31470:18;;;38428:19;18342:28;38468:14;;;18322:49;18390:12;;;31456:245::o;31708:416::-;31908:2;31922:47;;;18641:2;31893:18;;;38428:19;18677:24;38468:14;;;18657:45;18721:12;;;31879:245::o;32131:416::-;32331:2;32345:47;;;18972:2;32316:18;;;38428:19;19008:27;38468:14;;;18988:48;19055:12;;;32302:245::o;32554:416::-;32754:2;32768:47;;;19306:2;32739:18;;;38428:19;19342:34;38468:14;;;19322:55;19411:9;19397:12;;;19390:31;19440:12;;;32725:245::o;32977:416::-;33177:2;33191:47;;;19691:2;33162:18;;;38428:19;19727:30;38468:14;;;19707:51;19777:12;;;33148:245::o;33400:416::-;33600:2;33614:47;;;20028:2;33585:18;;;38428:19;20064:34;38468:14;;;20044:55;20133:18;20119:12;;;20112:40;20171:12;;;33571:245::o;33823:416::-;34023:2;34037:47;;;20422:2;34008:18;;;38428:19;20458:29;38468:14;;;20438:50;20507:12;;;33994:245::o;34246:416::-;34446:2;34460:47;;;20758:2;34431:18;;;38428:19;20794:25;38468:14;;;20774:46;20839:12;;;34417:245::o;34669:416::-;34869:2;34883:47;;;21090:2;34854:18;;;38428:19;21126:34;38468:14;;;21106:55;21195:3;21181:12;;;21174:25;21218:12;;;34840:245::o;35092:416::-;35292:2;35306:47;;;21469:2;35277:18;;;38428:19;21505:26;38468:14;;;21485:47;21551:12;;;35263:245::o;35515:222::-;21648:37;;;35642:2;35627:18;;35613:124::o;35744:501::-;21648:37;;;35959:2;36077;36062:18;;;36055:48;;;35944:18;;;38428:19;;;35744:501;;11092:21;;38468:14;;;35744:501;11119:291;11144:6;11141:1;11138:13;11119:291;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;-1:-1;;;;;40289:54;10449:45;;39279:12;;;;10007:14;;;;11166:1;11159:9;11119:291;;36252:365;21648:37;;;36423:2;36408:18;;41585:1;41575:12;;41565:2;;41591:9;41565:2;40665:42;36603:2;36592:9;36588:18;13635:66;36394:223;;;;;:::o;36624:256::-;36686:2;36680:9;36712:17;;;36787:18;36772:34;;36808:22;;;36769:62;36766:2;;;36844:1;;36834:12;36766:2;36686;36853:22;36664:216;;-1:-1;36664:216::o;36887:303::-;;37045:18;37037:6;37034:30;37031:2;;;-1:-1;;37067:12;37031:2;-1:-1;37112:4;37100:17;;;37165:15;;36968:222::o;37197:321::-;;37340:18;37332:6;37329:30;37326:2;;;-1:-1;;37362:12;37326:2;-1:-1;41477:7;37416:17;-1:-1;;37412:33;37503:4;37493:15;;37263:255::o;39306:318::-;;;39456:8;39444:10;39441:24;39438:2;;;-1:-1;;39468:12;39438:2;39503:6;39493:8;39490:20;39487:2;;;-1:-1;;39513:12;39487:2;-1:-1;;39545:31;;;39594:25;;;;;-1:-1;39432:192::o;41117:268::-;41182:1;41189:101;41203:6;41200:1;41197:13;41189:101;;;41270:11;;;41264:18;41251:11;;;41244:39;41225:2;41218:10;41189:101;;;41305:6;41302:1;41299:13;41296:2;;;41182:1;41361:6;41356:3;41352:16;41345:27;41296:2;;41166:219;;;:::o;41614:117::-;-1:-1;;;;;41701:5;40289:54;41676:5;41673:35;41663:2;;41722:1;;41712:12;41996:115;-1:-1;;;;;;42081:5;39988:78;42057:5;42054:34;42044:2;;42102:1;;42092:12

Swarm Source

ipfs://9ad909497819e231a4f73778bee9d64b22d2c89dc5ef5ef1b43590fcdaa90734

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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