ETH Price: $2,616.26 (-0.33%)

Contract

0x9134C9975244b46692Ad9A7Da36DBa8734Ec6DA3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create New Fund154276812022-08-28 12:01:44765 days ago1661688104IN
0x9134C997...734Ec6DA3
0 ETH0.000201832
Create New Fund127317042021-06-29 22:50:551189 days ago1625007055IN
0x9134C997...734Ec6DA3
0 ETH0.0009924410
Create New Fund123862622021-05-07 9:07:001243 days ago1620378420IN
0x9134C997...734Ec6DA3
0 ETH0.0481241446
Create New Fund123770362021-05-05 22:44:131244 days ago1620254653IN
0x9134C997...734Ec6DA3
0 ETH0.0640918575
Create New Fund123765902021-05-05 21:08:311244 days ago1620248911IN
0x9134C997...734Ec6DA3
0 ETH0.0815756676
Create New Fund123761962021-05-05 19:42:041244 days ago1620243724IN
0x9134C997...734Ec6DA3
0 ETH0.0647013965
Create New Fund123726262021-05-05 6:31:301245 days ago1620196290IN
0x9134C997...734Ec6DA3
0 ETH0.022354727
Create New Fund123717112021-05-05 3:09:521245 days ago1620184192IN
0x9134C997...734Ec6DA3
0 ETH0.0416468734
Create New Fund123702532021-05-04 21:39:141245 days ago1620164354IN
0x9134C997...734Ec6DA3
0 ETH0.0395321746
Create New Fund123663552021-05-04 7:07:491246 days ago1620112069IN
0x9134C997...734Ec6DA3
0 ETH0.0194663929
Create New Fund123632732021-05-03 19:57:511246 days ago1620071871IN
0x9134C997...734Ec6DA3
0 ETH0.0464780
Create New Fund123596542021-05-03 6:41:571247 days ago1620024117IN
0x9134C997...734Ec6DA3
0 ETH0.0196597123
Create New Fund123579062021-05-03 0:12:321247 days ago1620000752IN
0x9134C997...734Ec6DA3
0 ETH0.0336828832
Create New Fund123555762021-05-02 15:33:241247 days ago1619969604IN
0x9134C997...734Ec6DA3
0 ETH0.16918347198
Create New Fund123553192021-05-02 14:33:411247 days ago1619966021IN
0x9134C997...734Ec6DA3
0 ETH0.0422496840
Create New Fund123548402021-05-02 12:39:461248 days ago1619959186IN
0x9134C997...734Ec6DA3
0 ETH0.0214875725
Create New Fund123548162021-05-02 12:34:191248 days ago1619958859IN
0x9134C997...734Ec6DA3
0 ETH0.0316418232
Create New Fund123546622021-05-02 12:04:311248 days ago1619957071IN
0x9134C997...734Ec6DA3
0 ETH0.0218419523
Create New Fund123539522021-05-02 9:27:301248 days ago1619947650IN
0x9134C997...734Ec6DA3
0 ETH0.0224878926
Create New Fund123536112021-05-02 8:07:421248 days ago1619942862IN
0x9134C997...734Ec6DA3
0 ETH0.0139964824
Create New Fund123523902021-05-02 3:32:521248 days ago1619926372IN
0x9134C997...734Ec6DA3
0 ETH0.0220988323.5
Create New Fund123497072021-05-01 17:36:201248 days ago1619890580IN
0x9134C997...734Ec6DA3
0 ETH0.0438315951
Create New Fund123486382021-05-01 13:41:331248 days ago1619876493IN
0x9134C997...734Ec6DA3
0 ETH0.0285490533
Create New Fund123484372021-05-01 12:59:521249 days ago1619873992IN
0x9134C997...734Ec6DA3
0 ETH0.0307671136
Create New Fund123484122021-05-01 12:53:111249 days ago1619873591IN
0x9134C997...734Ec6DA3
0 ETH0.036327642
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
154276812022-08-28 12:01:44765 days ago1661688104
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
127317042021-06-29 22:50:551189 days ago1625007055
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123862622021-05-07 9:07:001243 days ago1620378420
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123770362021-05-05 22:44:131244 days ago1620254653
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123765902021-05-05 21:08:311244 days ago1620248911
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123761962021-05-05 19:42:041244 days ago1620243724
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123726262021-05-05 6:31:301245 days ago1620196290
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123717112021-05-05 3:09:521245 days ago1620184192
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123702532021-05-04 21:39:141245 days ago1620164354
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123663552021-05-04 7:07:491246 days ago1620112069
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123632732021-05-03 19:57:511246 days ago1620071871
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123596542021-05-03 6:41:571247 days ago1620024117
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123579062021-05-03 0:12:321247 days ago1620000752
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123555762021-05-02 15:33:241247 days ago1619969604
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123553192021-05-02 14:33:411247 days ago1619966021
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123548402021-05-02 12:39:461248 days ago1619959186
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123548162021-05-02 12:34:191248 days ago1619958859
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123546622021-05-02 12:04:311248 days ago1619957071
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123539522021-05-02 9:27:301248 days ago1619947650
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123536112021-05-02 8:07:421248 days ago1619942862
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123533872021-05-02 7:19:301248 days ago1619939970
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123523902021-05-02 3:32:521248 days ago1619926372
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123497072021-05-01 17:36:201248 days ago1619890580
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123486382021-05-01 13:41:331248 days ago1619876493
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
123484372021-05-01 12:59:521249 days ago1619873992
0x9134C997...734Ec6DA3
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FundDeployer

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license
File 1 of 9 : FundDeployer.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "../../../persistent/dispatcher/IDispatcher.sol";
import "../../../persistent/utils/IMigrationHookHandler.sol";
import "../fund/comptroller/IComptroller.sol";
import "../fund/comptroller/ComptrollerProxy.sol";
import "../fund/vault/IVault.sol";
import "./IFundDeployer.sol";

/// @title FundDeployer Contract
/// @author Enzyme Council <[email protected]>
/// @notice The top-level contract of the release.
/// It primarily coordinates fund deployment and fund migration, but
/// it is also deferred to for contract access control and for allowed calls
/// that can be made with a fund's VaultProxy as the msg.sender.
contract FundDeployer is IFundDeployer, IMigrationHookHandler {
    event ComptrollerLibSet(address comptrollerLib);

    event ComptrollerProxyDeployed(
        address indexed creator,
        address comptrollerProxy,
        address indexed denominationAsset,
        uint256 sharesActionTimelock,
        bytes feeManagerConfigData,
        bytes policyManagerConfigData,
        bool indexed forMigration
    );

    event NewFundCreated(
        address indexed creator,
        address comptrollerProxy,
        address vaultProxy,
        address indexed fundOwner,
        string fundName,
        address indexed denominationAsset,
        uint256 sharesActionTimelock,
        bytes feeManagerConfigData,
        bytes policyManagerConfigData
    );

    event ReleaseStatusSet(ReleaseStatus indexed prevStatus, ReleaseStatus indexed nextStatus);

    event VaultCallDeregistered(address indexed contractAddress, bytes4 selector);

    event VaultCallRegistered(address indexed contractAddress, bytes4 selector);

    // Constants
    address private immutable CREATOR;
    address private immutable DISPATCHER;
    address private immutable VAULT_LIB;

    // Pseudo-constants (can only be set once)
    address private comptrollerLib;

    // Storage
    ReleaseStatus private releaseStatus;
    mapping(address => mapping(bytes4 => bool)) private contractToSelectorToIsRegisteredVaultCall;
    mapping(address => address) private pendingComptrollerProxyToCreator;

    modifier onlyLiveRelease() {
        require(releaseStatus == ReleaseStatus.Live, "Release is not Live");
        _;
    }

    modifier onlyMigrator(address _vaultProxy) {
        require(
            IVault(_vaultProxy).canMigrate(msg.sender),
            "Only a permissioned migrator can call this function"
        );
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == getOwner(), "Only the contract owner can call this function");
        _;
    }

    modifier onlyPendingComptrollerProxyCreator(address _comptrollerProxy) {
        require(
            msg.sender == pendingComptrollerProxyToCreator[_comptrollerProxy],
            "Only the ComptrollerProxy creator can call this function"
        );
        _;
    }

    constructor(
        address _dispatcher,
        address _vaultLib,
        address[] memory _vaultCallContracts,
        bytes4[] memory _vaultCallSelectors
    ) public {
        if (_vaultCallContracts.length > 0) {
            __registerVaultCalls(_vaultCallContracts, _vaultCallSelectors);
        }
        CREATOR = msg.sender;
        DISPATCHER = _dispatcher;
        VAULT_LIB = _vaultLib;
    }

    /////////////
    // GENERAL //
    /////////////

    /// @notice Sets the comptrollerLib
    /// @param _comptrollerLib The ComptrollerLib contract address
    /// @dev Can only be set once
    function setComptrollerLib(address _comptrollerLib) external onlyOwner {
        require(
            comptrollerLib == address(0),
            "setComptrollerLib: This value can only be set once"
        );

        comptrollerLib = _comptrollerLib;

        emit ComptrollerLibSet(_comptrollerLib);
    }

    /// @notice Sets the status of the protocol to a new state
    /// @param _nextStatus The next status state to set
    function setReleaseStatus(ReleaseStatus _nextStatus) external {
        require(
            msg.sender == IDispatcher(DISPATCHER).getOwner(),
            "setReleaseStatus: Only the Dispatcher owner can call this function"
        );
        require(
            _nextStatus != ReleaseStatus.PreLaunch,
            "setReleaseStatus: Cannot return to PreLaunch status"
        );
        require(
            comptrollerLib != address(0),
            "setReleaseStatus: Can only set the release status when comptrollerLib is set"
        );

        ReleaseStatus prevStatus = releaseStatus;
        require(_nextStatus != prevStatus, "setReleaseStatus: _nextStatus is the current status");

        releaseStatus = _nextStatus;

        emit ReleaseStatusSet(prevStatus, _nextStatus);
    }

    /// @notice Gets the current owner of the contract
    /// @return owner_ The contract owner address
    /// @dev Dynamically gets the owner based on the Protocol status. The owner is initially the
    /// contract's deployer, for convenience in setting up configuration.
    /// Ownership is claimed when the owner of the Dispatcher contract (the Enzyme Council)
    /// sets the releaseStatus to `Live`.
    function getOwner() public view override returns (address owner_) {
        if (releaseStatus == ReleaseStatus.PreLaunch) {
            return CREATOR;
        }

        return IDispatcher(DISPATCHER).getOwner();
    }

    ///////////////////
    // FUND CREATION //
    ///////////////////

    /// @notice Creates a fully-configured ComptrollerProxy, to which a fund from a previous
    /// release can migrate in a subsequent step
    /// @param _denominationAsset The contract address of the denomination asset for the fund
    /// @param _sharesActionTimelock The minimum number of seconds between any two "shares actions"
    /// (buying or selling shares) by the same user
    /// @param _feeManagerConfigData Bytes data for the fees to be enabled for the fund
    /// @param _policyManagerConfigData Bytes data for the policies to be enabled for the fund
    /// @return comptrollerProxy_ The address of the ComptrollerProxy deployed during this action
    function createMigratedFundConfig(
        address _denominationAsset,
        uint256 _sharesActionTimelock,
        bytes calldata _feeManagerConfigData,
        bytes calldata _policyManagerConfigData
    ) external onlyLiveRelease returns (address comptrollerProxy_) {
        comptrollerProxy_ = __deployComptrollerProxy(
            _denominationAsset,
            _sharesActionTimelock,
            _feeManagerConfigData,
            _policyManagerConfigData,
            true
        );

        pendingComptrollerProxyToCreator[comptrollerProxy_] = msg.sender;

        return comptrollerProxy_;
    }

    /// @notice Creates a new fund
    /// @param _fundOwner The address of the owner for the fund
    /// @param _fundName The name of the fund
    /// @param _denominationAsset The contract address of the denomination asset for the fund
    /// @param _sharesActionTimelock The minimum number of seconds between any two "shares actions"
    /// (buying or selling shares) by the same user
    /// @param _feeManagerConfigData Bytes data for the fees to be enabled for the fund
    /// @param _policyManagerConfigData Bytes data for the policies to be enabled for the fund
    /// @return comptrollerProxy_ The address of the ComptrollerProxy deployed during this action
    function createNewFund(
        address _fundOwner,
        string calldata _fundName,
        address _denominationAsset,
        uint256 _sharesActionTimelock,
        bytes calldata _feeManagerConfigData,
        bytes calldata _policyManagerConfigData
    ) external onlyLiveRelease returns (address comptrollerProxy_, address vaultProxy_) {
        return
            __createNewFund(
                _fundOwner,
                _fundName,
                _denominationAsset,
                _sharesActionTimelock,
                _feeManagerConfigData,
                _policyManagerConfigData
            );
    }

    /// @dev Helper to avoid the stack-too-deep error during createNewFund
    function __createNewFund(
        address _fundOwner,
        string memory _fundName,
        address _denominationAsset,
        uint256 _sharesActionTimelock,
        bytes memory _feeManagerConfigData,
        bytes memory _policyManagerConfigData
    ) private returns (address comptrollerProxy_, address vaultProxy_) {
        require(_fundOwner != address(0), "__createNewFund: _owner cannot be empty");

        comptrollerProxy_ = __deployComptrollerProxy(
            _denominationAsset,
            _sharesActionTimelock,
            _feeManagerConfigData,
            _policyManagerConfigData,
            false
        );

        vaultProxy_ = IDispatcher(DISPATCHER).deployVaultProxy(
            VAULT_LIB,
            _fundOwner,
            comptrollerProxy_,
            _fundName
        );

        IComptroller(comptrollerProxy_).activate(vaultProxy_, false);

        emit NewFundCreated(
            msg.sender,
            comptrollerProxy_,
            vaultProxy_,
            _fundOwner,
            _fundName,
            _denominationAsset,
            _sharesActionTimelock,
            _feeManagerConfigData,
            _policyManagerConfigData
        );

        return (comptrollerProxy_, vaultProxy_);
    }

    /// @dev Helper function to deploy a configured ComptrollerProxy
    function __deployComptrollerProxy(
        address _denominationAsset,
        uint256 _sharesActionTimelock,
        bytes memory _feeManagerConfigData,
        bytes memory _policyManagerConfigData,
        bool _forMigration
    ) private returns (address comptrollerProxy_) {
        require(
            _denominationAsset != address(0),
            "__deployComptrollerProxy: _denominationAsset cannot be empty"
        );

        bytes memory constructData = abi.encodeWithSelector(
            IComptroller.init.selector,
            _denominationAsset,
            _sharesActionTimelock
        );
        comptrollerProxy_ = address(new ComptrollerProxy(constructData, comptrollerLib));

        if (_feeManagerConfigData.length > 0 || _policyManagerConfigData.length > 0) {
            IComptroller(comptrollerProxy_).configureExtensions(
                _feeManagerConfigData,
                _policyManagerConfigData
            );
        }

        emit ComptrollerProxyDeployed(
            msg.sender,
            comptrollerProxy_,
            _denominationAsset,
            _sharesActionTimelock,
            _feeManagerConfigData,
            _policyManagerConfigData,
            _forMigration
        );

        return comptrollerProxy_;
    }

    //////////////////
    // MIGRATION IN //
    //////////////////

    /// @notice Cancels fund migration
    /// @param _vaultProxy The VaultProxy for which to cancel migration
    function cancelMigration(address _vaultProxy) external {
        __cancelMigration(_vaultProxy, false);
    }

    /// @notice Cancels fund migration, bypassing any failures.
    /// Should be used in an emergency only.
    /// @param _vaultProxy The VaultProxy for which to cancel migration
    function cancelMigrationEmergency(address _vaultProxy) external {
        __cancelMigration(_vaultProxy, true);
    }

    /// @notice Executes fund migration
    /// @param _vaultProxy The VaultProxy for which to execute the migration
    function executeMigration(address _vaultProxy) external {
        __executeMigration(_vaultProxy, false);
    }

    /// @notice Executes fund migration, bypassing any failures.
    /// Should be used in an emergency only.
    /// @param _vaultProxy The VaultProxy for which to execute the migration
    function executeMigrationEmergency(address _vaultProxy) external {
        __executeMigration(_vaultProxy, true);
    }

    /// @dev Unimplemented
    function invokeMigrationInCancelHook(
        address,
        address,
        address,
        address
    ) external virtual override {
        return;
    }

    /// @notice Signal a fund migration
    /// @param _vaultProxy The VaultProxy for which to signal the migration
    /// @param _comptrollerProxy The ComptrollerProxy for which to signal the migration
    function signalMigration(address _vaultProxy, address _comptrollerProxy) external {
        __signalMigration(_vaultProxy, _comptrollerProxy, false);
    }

    /// @notice Signal a fund migration, bypassing any failures.
    /// Should be used in an emergency only.
    /// @param _vaultProxy The VaultProxy for which to signal the migration
    /// @param _comptrollerProxy The ComptrollerProxy for which to signal the migration
    function signalMigrationEmergency(address _vaultProxy, address _comptrollerProxy) external {
        __signalMigration(_vaultProxy, _comptrollerProxy, true);
    }

    /// @dev Helper to cancel a migration
    function __cancelMigration(address _vaultProxy, bool _bypassFailure)
        private
        onlyLiveRelease
        onlyMigrator(_vaultProxy)
    {
        IDispatcher(DISPATCHER).cancelMigration(_vaultProxy, _bypassFailure);
    }

    /// @dev Helper to execute a migration
    function __executeMigration(address _vaultProxy, bool _bypassFailure)
        private
        onlyLiveRelease
        onlyMigrator(_vaultProxy)
    {
        IDispatcher dispatcherContract = IDispatcher(DISPATCHER);

        (, address comptrollerProxy, , ) = dispatcherContract
            .getMigrationRequestDetailsForVaultProxy(_vaultProxy);

        dispatcherContract.executeMigration(_vaultProxy, _bypassFailure);

        IComptroller(comptrollerProxy).activate(_vaultProxy, true);

        delete pendingComptrollerProxyToCreator[comptrollerProxy];
    }

    /// @dev Helper to signal a migration
    function __signalMigration(
        address _vaultProxy,
        address _comptrollerProxy,
        bool _bypassFailure
    )
        private
        onlyLiveRelease
        onlyPendingComptrollerProxyCreator(_comptrollerProxy)
        onlyMigrator(_vaultProxy)
    {
        IDispatcher(DISPATCHER).signalMigration(
            _vaultProxy,
            _comptrollerProxy,
            VAULT_LIB,
            _bypassFailure
        );
    }

    ///////////////////
    // MIGRATION OUT //
    ///////////////////

    /// @notice Allows "hooking into" specific moments in the migration pipeline
    /// to execute arbitrary logic during a migration out of this release
    /// @param _vaultProxy The VaultProxy being migrated
    function invokeMigrationOutHook(
        MigrationOutHook _hook,
        address _vaultProxy,
        address,
        address,
        address
    ) external override {
        if (_hook != MigrationOutHook.PreMigrate) {
            return;
        }

        require(
            msg.sender == DISPATCHER,
            "postMigrateOriginHook: Only Dispatcher can call this function"
        );

        // Must use PreMigrate hook to get the ComptrollerProxy from the VaultProxy
        address comptrollerProxy = IVault(_vaultProxy).getAccessor();

        // Wind down fund and destroy its config
        IComptroller(comptrollerProxy).destruct();
    }

    //////////////
    // REGISTRY //
    //////////////

    /// @notice De-registers allowed arbitrary contract calls that can be sent from the VaultProxy
    /// @param _contracts The contracts of the calls to de-register
    /// @param _selectors The selectors of the calls to de-register
    function deregisterVaultCalls(address[] calldata _contracts, bytes4[] calldata _selectors)
        external
        onlyOwner
    {
        require(_contracts.length > 0, "deregisterVaultCalls: Empty _contracts");
        require(
            _contracts.length == _selectors.length,
            "deregisterVaultCalls: Uneven input arrays"
        );

        for (uint256 i; i < _contracts.length; i++) {
            require(
                isRegisteredVaultCall(_contracts[i], _selectors[i]),
                "deregisterVaultCalls: Call not registered"
            );

            contractToSelectorToIsRegisteredVaultCall[_contracts[i]][_selectors[i]] = false;

            emit VaultCallDeregistered(_contracts[i], _selectors[i]);
        }
    }

    /// @notice Registers allowed arbitrary contract calls that can be sent from the VaultProxy
    /// @param _contracts The contracts of the calls to register
    /// @param _selectors The selectors of the calls to register
    function registerVaultCalls(address[] calldata _contracts, bytes4[] calldata _selectors)
        external
        onlyOwner
    {
        require(_contracts.length > 0, "registerVaultCalls: Empty _contracts");

        __registerVaultCalls(_contracts, _selectors);
    }

    /// @dev Helper to register allowed vault calls
    function __registerVaultCalls(address[] memory _contracts, bytes4[] memory _selectors)
        private
    {
        require(
            _contracts.length == _selectors.length,
            "__registerVaultCalls: Uneven input arrays"
        );

        for (uint256 i; i < _contracts.length; i++) {
            require(
                !isRegisteredVaultCall(_contracts[i], _selectors[i]),
                "__registerVaultCalls: Call already registered"
            );

            contractToSelectorToIsRegisteredVaultCall[_contracts[i]][_selectors[i]] = true;

            emit VaultCallRegistered(_contracts[i], _selectors[i]);
        }
    }

    ///////////////////
    // STATE GETTERS //
    ///////////////////

    /// @notice Gets the `comptrollerLib` variable value
    /// @return comptrollerLib_ The `comptrollerLib` variable value
    function getComptrollerLib() external view returns (address comptrollerLib_) {
        return comptrollerLib;
    }

    /// @notice Gets the `CREATOR` variable value
    /// @return creator_ The `CREATOR` variable value
    function getCreator() external view returns (address creator_) {
        return CREATOR;
    }

    /// @notice Gets the `DISPATCHER` variable value
    /// @return dispatcher_ The `DISPATCHER` variable value
    function getDispatcher() external view returns (address dispatcher_) {
        return DISPATCHER;
    }

    /// @notice Gets the creator of a pending ComptrollerProxy
    /// @return pendingComptrollerProxyCreator_ The pending ComptrollerProxy creator
    function getPendingComptrollerProxyCreator(address _comptrollerProxy)
        external
        view
        returns (address pendingComptrollerProxyCreator_)
    {
        return pendingComptrollerProxyToCreator[_comptrollerProxy];
    }

    /// @notice Gets the `releaseStatus` variable value
    /// @return status_ The `releaseStatus` variable value
    function getReleaseStatus() external view override returns (ReleaseStatus status_) {
        return releaseStatus;
    }

    /// @notice Gets the `VAULT_LIB` variable value
    /// @return vaultLib_ The `VAULT_LIB` variable value
    function getVaultLib() external view returns (address vaultLib_) {
        return VAULT_LIB;
    }

    /// @notice Checks if a contract call is registered
    /// @param _contract The contract of the call to check
    /// @param _selector The selector of the call to check
    /// @return isRegistered_ True if the call is registered
    function isRegisteredVaultCall(address _contract, bytes4 _selector)
        public
        view
        override
        returns (bool isRegistered_)
    {
        return contractToSelectorToIsRegisteredVaultCall[_contract][_selector];
    }
}

File 2 of 9 : IDispatcher.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

/// @title IDispatcher Interface
/// @author Enzyme Council <[email protected]>
interface IDispatcher {
    function cancelMigration(address _vaultProxy, bool _bypassFailure) external;

    function claimOwnership() external;

    function deployVaultProxy(
        address _vaultLib,
        address _owner,
        address _vaultAccessor,
        string calldata _fundName
    ) external returns (address vaultProxy_);

    function executeMigration(address _vaultProxy, bool _bypassFailure) external;

    function getCurrentFundDeployer() external view returns (address currentFundDeployer_);

    function getFundDeployerForVaultProxy(address _vaultProxy)
        external
        view
        returns (address fundDeployer_);

    function getMigrationRequestDetailsForVaultProxy(address _vaultProxy)
        external
        view
        returns (
            address nextFundDeployer_,
            address nextVaultAccessor_,
            address nextVaultLib_,
            uint256 executableTimestamp_
        );

    function getMigrationTimelock() external view returns (uint256 migrationTimelock_);

    function getNominatedOwner() external view returns (address nominatedOwner_);

    function getOwner() external view returns (address owner_);

    function getSharesTokenSymbol() external view returns (string memory sharesTokenSymbol_);

    function getTimelockRemainingForMigrationRequest(address _vaultProxy)
        external
        view
        returns (uint256 secondsRemaining_);

    function hasExecutableMigrationRequest(address _vaultProxy)
        external
        view
        returns (bool hasExecutableRequest_);

    function hasMigrationRequest(address _vaultProxy)
        external
        view
        returns (bool hasMigrationRequest_);

    function removeNominatedOwner() external;

    function setCurrentFundDeployer(address _nextFundDeployer) external;

    function setMigrationTimelock(uint256 _nextTimelock) external;

    function setNominatedOwner(address _nextNominatedOwner) external;

    function setSharesTokenSymbol(string calldata _nextSymbol) external;

    function signalMigration(
        address _vaultProxy,
        address _nextVaultAccessor,
        address _nextVaultLib,
        bool _bypassFailure
    ) external;
}

File 3 of 9 : IMigratableVault.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

/// @title IMigratableVault Interface
/// @author Enzyme Council <[email protected]>
/// @dev DO NOT EDIT CONTRACT
interface IMigratableVault {
    function canMigrate(address _who) external view returns (bool canMigrate_);

    function init(
        address _owner,
        address _accessor,
        string calldata _fundName
    ) external;

    function setAccessor(address _nextAccessor) external;

    function setVaultLib(address _nextVaultLib) external;
}

File 4 of 9 : IMigrationHookHandler.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

/// @title IMigrationHookHandler Interface
/// @author Enzyme Council <[email protected]>
interface IMigrationHookHandler {
    enum MigrationOutHook {PreSignal, PostSignal, PreMigrate, PostMigrate, PostCancel}

    function invokeMigrationInCancelHook(
        address _vaultProxy,
        address _prevFundDeployer,
        address _nextVaultAccessor,
        address _nextVaultLib
    ) external;

    function invokeMigrationOutHook(
        MigrationOutHook _hook,
        address _vaultProxy,
        address _nextFundDeployer,
        address _nextVaultAccessor,
        address _nextVaultLib
    ) external;
}

File 5 of 9 : IFundDeployer.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

/// @title IFundDeployer Interface
/// @author Enzyme Council <[email protected]>
interface IFundDeployer {
    enum ReleaseStatus {PreLaunch, Live, Paused}

    function getOwner() external view returns (address);

    function getReleaseStatus() external view returns (ReleaseStatus);

    function isRegisteredVaultCall(address, bytes4) external view returns (bool);
}

File 6 of 9 : ComptrollerProxy.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

import "../../../utils/Proxy.sol";

/// @title ComptrollerProxy Contract
/// @author Enzyme Council <[email protected]>
/// @notice A proxy contract for all ComptrollerProxy instances
contract ComptrollerProxy is Proxy {
    constructor(bytes memory _constructData, address _comptrollerLib)
        public
        Proxy(_constructData, _comptrollerLib)
    {}
}

File 7 of 9 : IComptroller.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

/// @title IComptroller Interface
/// @author Enzyme Council <[email protected]>
interface IComptroller {
    enum VaultAction {
        None,
        BurnShares,
        MintShares,
        TransferShares,
        ApproveAssetSpender,
        WithdrawAssetTo,
        AddTrackedAsset,
        RemoveTrackedAsset
    }

    function activate(address, bool) external;

    function calcGav(bool) external returns (uint256, bool);

    function calcGrossShareValue(bool) external returns (uint256, bool);

    function callOnExtension(
        address,
        uint256,
        bytes calldata
    ) external;

    function configureExtensions(bytes calldata, bytes calldata) external;

    function destruct() external;

    function getDenominationAsset() external view returns (address);

    function getVaultProxy() external view returns (address);

    function init(address, uint256) external;

    function permissionedVaultAction(VaultAction, bytes calldata) external;
}

File 8 of 9 : IVault.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

import "../../../../persistent/utils/IMigratableVault.sol";

/// @title IVault Interface
/// @author Enzyme Council <[email protected]>
interface IVault is IMigratableVault {
    function addTrackedAsset(address) external;

    function approveAssetSpender(
        address,
        address,
        uint256
    ) external;

    function burnShares(address, uint256) external;

    function callOnContract(address, bytes calldata) external;

    function getAccessor() external view returns (address);

    function getOwner() external view returns (address);

    function getTrackedAssets() external view returns (address[] memory);

    function isTrackedAsset(address) external view returns (bool);

    function mintShares(address, uint256) external;

    function removeTrackedAsset(address) external;

    function transferShares(
        address,
        address,
        uint256
    ) external;

    function withdrawAssetTo(
        address,
        address,
        uint256
    ) external;
}

File 9 of 9 : Proxy.sol
// SPDX-License-Identifier: GPL-3.0

/*
    This file is part of the Enzyme Protocol.

    (c) Enzyme Council <[email protected]>

    For the full license information, please view the LICENSE
    file that was distributed with this source code.
*/

pragma solidity 0.6.12;

/// @title Proxy Contract
/// @author Enzyme Council <[email protected]>
/// @notice A proxy contract for all Proxy instances
/// @dev The recommended implementation of a Proxy in EIP-1822, updated for solc 0.6.12,
/// and using the EIP-1967 storage slot for the proxiable implementation.
/// i.e., `bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)`, which is
/// "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
/// See: https://eips.ethereum.org/EIPS/eip-1822
contract Proxy {
    constructor(bytes memory _constructData, address _contractLogic) public {
        assembly {
            sstore(
                0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,
                _contractLogic
            )
        }
        (bool success, bytes memory returnData) = _contractLogic.delegatecall(_constructData);
        require(success, string(returnData));
    }

    fallback() external payable {
        assembly {
            let contractLogic := sload(
                0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc
            )
            calldatacopy(0x0, 0x0, calldatasize())
            let success := delegatecall(
                sub(gas(), 10000),
                contractLogic,
                0x0,
                calldatasize(),
                0,
                0
            )
            let retSz := returndatasize()
            returndatacopy(0, 0, retSz)
            switch success
                case 0 {
                    revert(0, retSz)
                }
                default {
                    return(0, retSz)
                }
        }
    }
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "details": {
      "constantOptimizer": true,
      "cse": true,
      "deduplicate": true,
      "jumpdestRemover": true,
      "orderLiterals": true,
      "peephole": true,
      "yul": false
    },
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_dispatcher","type":"address"},{"internalType":"address","name":"_vaultLib","type":"address"},{"internalType":"address[]","name":"_vaultCallContracts","type":"address[]"},{"internalType":"bytes4[]","name":"_vaultCallSelectors","type":"bytes4[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"comptrollerLib","type":"address"}],"name":"ComptrollerLibSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"comptrollerProxy","type":"address"},{"indexed":true,"internalType":"address","name":"denominationAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesActionTimelock","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"feeManagerConfigData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"policyManagerConfigData","type":"bytes"},{"indexed":true,"internalType":"bool","name":"forMigration","type":"bool"}],"name":"ComptrollerProxyDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"comptrollerProxy","type":"address"},{"indexed":false,"internalType":"address","name":"vaultProxy","type":"address"},{"indexed":true,"internalType":"address","name":"fundOwner","type":"address"},{"indexed":false,"internalType":"string","name":"fundName","type":"string"},{"indexed":true,"internalType":"address","name":"denominationAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesActionTimelock","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"feeManagerConfigData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"policyManagerConfigData","type":"bytes"}],"name":"NewFundCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum IFundDeployer.ReleaseStatus","name":"prevStatus","type":"uint8"},{"indexed":true,"internalType":"enum IFundDeployer.ReleaseStatus","name":"nextStatus","type":"uint8"}],"name":"ReleaseStatusSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"VaultCallDeregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"VaultCallRegistered","type":"event"},{"inputs":[{"internalType":"address","name":"_vaultProxy","type":"address"}],"name":"cancelMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultProxy","type":"address"}],"name":"cancelMigrationEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_denominationAsset","type":"address"},{"internalType":"uint256","name":"_sharesActionTimelock","type":"uint256"},{"internalType":"bytes","name":"_feeManagerConfigData","type":"bytes"},{"internalType":"bytes","name":"_policyManagerConfigData","type":"bytes"}],"name":"createMigratedFundConfig","outputs":[{"internalType":"address","name":"comptrollerProxy_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundOwner","type":"address"},{"internalType":"string","name":"_fundName","type":"string"},{"internalType":"address","name":"_denominationAsset","type":"address"},{"internalType":"uint256","name":"_sharesActionTimelock","type":"uint256"},{"internalType":"bytes","name":"_feeManagerConfigData","type":"bytes"},{"internalType":"bytes","name":"_policyManagerConfigData","type":"bytes"}],"name":"createNewFund","outputs":[{"internalType":"address","name":"comptrollerProxy_","type":"address"},{"internalType":"address","name":"vaultProxy_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contracts","type":"address[]"},{"internalType":"bytes4[]","name":"_selectors","type":"bytes4[]"}],"name":"deregisterVaultCalls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultProxy","type":"address"}],"name":"executeMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultProxy","type":"address"}],"name":"executeMigrationEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getComptrollerLib","outputs":[{"internalType":"address","name":"comptrollerLib_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCreator","outputs":[{"internalType":"address","name":"creator_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDispatcher","outputs":[{"internalType":"address","name":"dispatcher_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_comptrollerProxy","type":"address"}],"name":"getPendingComptrollerProxyCreator","outputs":[{"internalType":"address","name":"pendingComptrollerProxyCreator_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReleaseStatus","outputs":[{"internalType":"enum IFundDeployer.ReleaseStatus","name":"status_","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaultLib","outputs":[{"internalType":"address","name":"vaultLib_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"invokeMigrationInCancelHook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IMigrationHookHandler.MigrationOutHook","name":"_hook","type":"uint8"},{"internalType":"address","name":"_vaultProxy","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"invokeMigrationOutHook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"isRegisteredVaultCall","outputs":[{"internalType":"bool","name":"isRegistered_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contracts","type":"address[]"},{"internalType":"bytes4[]","name":"_selectors","type":"bytes4[]"}],"name":"registerVaultCalls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_comptrollerLib","type":"address"}],"name":"setComptrollerLib","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum IFundDeployer.ReleaseStatus","name":"_nextStatus","type":"uint8"}],"name":"setReleaseStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultProxy","type":"address"},{"internalType":"address","name":"_comptrollerProxy","type":"address"}],"name":"signalMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultProxy","type":"address"},{"internalType":"address","name":"_comptrollerProxy","type":"address"}],"name":"signalMigrationEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e06040523480156200001157600080fd5b50604051620032743803806200327483398101604081905262000034916200035a565b81511562000048576200004882826200006f565b505033606090811b6080526001600160601b031992811b831660a0521b1660c05262000573565b80518251146200009c5760405162461bcd60e51b81526004016200009390620004c5565b60405180910390fd5b60005b82518110156200020157620000e3838281518110620000ba57fe5b6020026020010151838381518110620000cf57fe5b60200260200101516200020660201b60201c565b15620001035760405162461bcd60e51b81526004016200009390620004b3565b60018060008584815181106200011557fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008484815181106200014c57fe5b60200260200101516001600160e01b0319166001600160e01b031916815260200190815260200160002060006101000a81548160ff0219169083151502179055508281815181106200019a57fe5b60200260200101516001600160a01b03167f355d4742de92efa1dcd9085b88ede27d7cfda96747ea062a59010a992c8af150838381518110620001d957fe5b6020026020010151604051620001f09190620004a3565b60405180910390a26001016200009f565b505050565b6001600160a01b03821660009081526001602090815260408083206001600160e01b03198516845290915290205460ff165b92915050565b805162000238816200054e565b600082601f8301126200025d57600080fd5b8151620002746200026e82620004fe565b620004d7565b915081818352602084019350602081019050838560208402820111156200029a57600080fd5b60005b83811015620002ca5781620002b388826200023e565b84525060209283019291909101906001016200029d565b5050505092915050565b600082601f830112620002e657600080fd5b8151620002f76200026e82620004fe565b915081818352602084019350602081019050838560208402820111156200031d57600080fd5b60005b83811015620002ca57816200033688826200034d565b845250602092830192919091019060010162000320565b8051620002388162000568565b600080600080608085870312156200037157600080fd5b60006200037f87876200023e565b945050602062000392878288016200023e565b93505060408501516001600160401b03811115620003af57600080fd5b620003bd878288016200024b565b92505060608501516001600160401b03811115620003da57600080fd5b620003e887828801620002d4565b91505092959194509250565b620003ff8162000535565b82525050565b600062000414602d836200051f565b7f5f5f72656769737465725661756c7443616c6c733a2043616c6c20616c72656181526c191e481c9959da5cdd195c9959609a1b602082015260400192915050565b6000620004656029836200051f565b7f5f5f72656769737465725661756c7443616c6c733a20556e6576656e20696e7081526875742061727261797360b81b602082015260400192915050565b60208101620002388284620003f4565b60208082528101620002388162000405565b60208082528101620002388162000456565b6040518181016001600160401b0381118282101715620004f657600080fd5b604052919050565b60006001600160401b038211156200051557600080fd5b5060209081020190565b90815260200190565b6000620002388262000542565b6001600160e01b03191690565b6001600160a01b031690565b620005598162000528565b81146200056557600080fd5b50565b620005598162000535565b60805160601c60a05160601c60c05160601c612c99620005db60003980610995528061152b528061179d525080610672528061086d5280610a1e5280610d1a5280610f2752806111ae52806114f9528061176f52508061042552806109f75250612c996000f3fe60806040523480156200001157600080fd5b5060043610620001605760003560e01c80639eb2c7b211620000c9578063d2456de11162000087578063d2456de114620002bd578063da29fcfe14620002d4578063dc77205314620002eb578063df369ba71462000311578063ebb3d5891462000328578063f0bb66ac14620003325762000160565b80639eb2c7b21462000248578063a08d967d146200025f578063a5fede1d1462000276578063c108b47d146200028f578063c166f9ea14620002a65762000160565b806351dfdb48116200012357806351dfdb4814620001e5578063682cea1914620001fc5780636f022ac4146200020657806378ed2293146200021d578063893d20e8146200023457806393a2ecd9146200023e5762000160565b80630d2fcd7614620001655780630ee2cb10146200017e5780630fe6972b14620001a057806328eb9ca514620001b75780633f84c12c14620001ce575b600080fd5b6200017c62000176366004620019fd565b62000359565b005b6200018862000423565b604051620001979190620024ee565b60405180910390f35b6200017c620001b136600462001d14565b62000448565b6200017c620001c836600462001e4d565b62000670565b6200017c620001df36600462001dcd565b62000847565b6200017c620001f6366004620019fd565b62000983565b6200018862000993565b6200017c62000217366004620019fd565b620009b7565b6200017c6200022e366004620019fd565b620009c4565b62000188620009d1565b6200018862000ab6565b6200017c62000259366004620019fd565b62000ac5565b6200018862000270366004620019fd565b62000ad2565b6200028062000af3565b6040516200019791906200272b565b62000188620002a036600462001c70565b62000b03565b6200017c620002b736600462001a47565b62000bee565b6200017c620002ce36600462001a47565b62000c00565b6200017c620002e536600462001d14565b62000c0e565b62000302620002fc36600462001b4e565b62000ce0565b604051620001979190620026be565b6200017c6200032236600462001a86565b62000cda565b6200018862000d18565b620003496200034336600462001b83565b62000d3c565b604051620001979291906200250e565b62000363620009d1565b6001600160a01b0316336001600160a01b0316146200039f5760405162461bcd60e51b81526004016200039690620027a7565b60405180910390fd5b6000546001600160a01b031615620003cb5760405162461bcd60e51b815260040162000396906200273b565b600080546001600160a01b0319166001600160a01b0383161790556040517f38e37d5fdf60e4358769c3b616594ad451626b1e023c65eaa1062116feadacf89062000418908390620024ee565b60405180910390a150565b7f00000000000000000000000000000000000000000000000000000000000000005b90565b62000452620009d1565b6001600160a01b0316336001600160a01b031614620004855760405162461bcd60e51b81526004016200039690620027a7565b82620004a55760405162461bcd60e51b8152600401620003969062002825565b828114620004c75760405162461bcd60e51b815260040162000396906200285b565b60005b8381101562000669576200051f858583818110620004e457fe5b9050602002016020810190620004fb9190620019fd565b8484848181106200050857fe5b9050602002016020810190620002fc919062001dac565b6200053e5760405162461bcd60e51b81526004016200039690620027b9565b6000600160008787858181106200055157fe5b9050602002016020810190620005689190620019fd565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008585858181106200059757fe5b9050602002016020810190620005ae919062001dac565b6001600160e01b03191681526020810191909152604001600020805460ff1916911515919091179055848482818110620005e457fe5b9050602002016020810190620005fb9190620019fd565b6001600160a01b03167f04a77425d9eba3b1260e976806c0cdefae7f41bb1106222790dd45e863ceaf978484848181106200063257fe5b905060200201602081019062000649919062001dac565b604051620006589190620026ce565b60405180910390a2600101620004ca565b5050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015620006ca57600080fd5b505afa158015620006df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000705919062001a26565b6001600160a01b0316336001600160a01b031614620007385760405162461bcd60e51b8152600401620003969062002837565b60008160028111156200074757fe5b1415620007685760405162461bcd60e51b815260040162000396906200286d565b6000546001600160a01b0316620007935760405162461bcd60e51b8152600401620003969062002795565b600054600160a01b900460ff16806002811115620007ad57fe5b826002811115620007ba57fe5b1415620007db5760405162461bcd60e51b8152600401620003969062002849565b6000805483919060ff60a01b1916600160a01b836002811115620007fb57fe5b02179055508160028111156200080d57fe5b8160028111156200081a57fe5b6040517ffaab041807e925180f5d7036a295923ff66f30f9d7957c96b898d16b0e90b7d890600090a35050565b60028560048111156200085657fe5b14620008625762000669565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614620008ad5760405162461bcd60e51b81526004016200039690620027dd565b6000846001600160a01b0316635a53e3486040518163ffffffff1660e01b815260040160206040518083038186803b158015620008e957600080fd5b505afa158015620008fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000924919062001a26565b9050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200096257600080fd5b505af115801562000977573d6000803e3d6000fd5b50505050505050505050565b6200099081600062000e3a565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b62000990816000620010b9565b6200099081600162000e3a565b600080600054600160a01b900460ff166002811115620009ed57fe5b141562000a1c57507f000000000000000000000000000000000000000000000000000000000000000062000445565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801562000a7657600080fd5b505afa15801562000a8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ab1919062001a26565b905090565b6000546001600160a01b031690565b62000990816001620010b9565b6001600160a01b03808216600090815260026020526040902054165b919050565b600054600160a01b900460ff1690565b60006001600054600160a01b900460ff16600281111562000b2057fe5b1462000b405760405162461bcd60e51b815260040162000396906200275f565b62000bba878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152506001925062001220915050565b6001600160a01b038116600090815260026020526040902080546001600160a01b0319163317905590509695505050505050565b62000bfc82826001620013c6565b5050565b62000bfc82826000620013c6565b62000c18620009d1565b6001600160a01b0316336001600160a01b03161462000c4b5760405162461bcd60e51b81526004016200039690620027a7565b8262000c6b5760405162461bcd60e51b8152600401620003969062002813565b62000cda848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805160208088028281018201909352878252909350879250869182918501908490808284376000920191909152506200159192505050565b50505050565b6001600160a01b03821660009081526001602090815260408083206001600160e01b03198516845290915290205460ff165b92915050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000806001600054600160a01b900460ff16600281111562000d5a57fe5b1462000d7a5760405162461bcd60e51b815260040162000396906200275f565b62000e288b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c908190840183828082843760009201919091525050604080516020601f8e018190048102820181019092528c815292508c91508b90819084018382808284376000920191909152506200171992505050565b91509150995099975050505050505050565b6001600054600160a01b900460ff16600281111562000e5557fe5b1462000e755760405162461bcd60e51b815260040162000396906200275f565b604051633ef03e7560e11b815282906001600160a01b03821690637de07cea9062000ea5903390600401620024fe565b60206040518083038186803b15801562000ebe57600080fd5b505afa15801562000ed3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ef9919062001d8b565b62000f185760405162461bcd60e51b81526004016200039690620027cb565b604051630fb5b3f960e31b81527f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b03831690637dad9fc89062000f6b908890600401620024ee565b60806040518083038186803b15801562000f8457600080fd5b505afa15801562000f99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fbf919062001af0565b50506040516338b3eb1b60e01b81529092506001600160a01b03841691506338b3eb1b9062000ff5908890889060040162002637565b600060405180830381600087803b1580156200101057600080fd5b505af115801562001025573d6000803e3d6000fd5b50506040516382d3a1dd60e01b81526001600160a01b03841692506382d3a1dd91506200105a90889060019060040162002637565b600060405180830381600087803b1580156200107557600080fd5b505af11580156200108a573d6000803e3d6000fd5b505050506001600160a01b0316600090815260026020526040902080546001600160a01b031916905550505050565b6001600054600160a01b900460ff166002811115620010d457fe5b14620010f45760405162461bcd60e51b815260040162000396906200275f565b604051633ef03e7560e11b815282906001600160a01b03821690637de07cea9062001124903390600401620024fe565b60206040518083038186803b1580156200113d57600080fd5b505afa15801562001152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001178919062001d8b565b620011975760405162461bcd60e51b81526004016200039690620027cb565b604051634e4ea46d60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639c9d48da90620011e7908690869060040162002637565b600060405180830381600087803b1580156200120257600080fd5b505af115801562001217573d6000803e3d6000fd5b50505050505050565b60006001600160a01b0386166200124b5760405162461bcd60e51b81526004016200039690620027ef565b606063399ae72460e01b87876040516024016200126a92919062002656565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600054915190925082916001600160a01b031690620012bb90620018f6565b620012c8929190620026de565b604051809103906000f080158015620012e5573d6000803e3d6000fd5b509150600085511180620012fa575060008451115b1562001365576040516396aed58760e01b81526001600160a01b038316906396aed5879062001330908890889060040162002702565b600060405180830381600087803b1580156200134b57600080fd5b505af115801562001360573d6000803e3d6000fd5b505050505b821515876001600160a01b0316336001600160a01b03167f0e6310be2c106224ea5db41e7f599982b85c8524b0e7cd0c4fb88e2ac46554b5858a8a8a604051620013b3949392919062002675565b60405180910390a4505b95945050505050565b6001600054600160a01b900460ff166002811115620013e157fe5b14620014015760405162461bcd60e51b815260040162000396906200275f565b6001600160a01b0382811660009081526002602052604090205483911633146200143f5760405162461bcd60e51b8152600401620003969062002783565b604051633ef03e7560e11b815284906001600160a01b03821690637de07cea906200146f903390600401620024fe565b60206040518083038186803b1580156200148857600080fd5b505afa1580156200149d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014c3919062001d8b565b620014e25760405162461bcd60e51b81526004016200039690620027cb565b604051633457e6e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d15f9b9c906200155690889088907f000000000000000000000000000000000000000000000000000000000000000090899060040162002534565b600060405180830381600087803b1580156200157157600080fd5b505af115801562001586573d6000803e3d6000fd5b505050505050505050565b8051825114620015b55760405162461bcd60e51b8152600401620003969062002801565b60005b82518110156200171457620015f6838281518110620015d357fe5b6020026020010151838381518110620015e857fe5b602002602001015162000ce0565b15620016165760405162461bcd60e51b8152600401620003969062002771565b60018060008584815181106200162857fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008484815181106200165f57fe5b60200260200101516001600160e01b0319166001600160e01b031916815260200190815260200160002060006101000a81548160ff021916908315150217905550828181518110620016ad57fe5b60200260200101516001600160a01b03167f355d4742de92efa1dcd9085b88ede27d7cfda96747ea062a59010a992c8af150838381518110620016ec57fe5b6020026020010151604051620017039190620026ce565b60405180910390a2600101620015b8565b505050565b6000806001600160a01b038816620017455760405162461bcd60e51b815260040162000396906200274d565b6200175586868686600062001220565b6040516322a0c08b60e01b81529092506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906322a0c08b90620017cc907f0000000000000000000000000000000000000000000000000000000000000000908c9087908d9060040162002571565b602060405180830381600087803b158015620017e757600080fd5b505af1158015620017fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001822919062001a26565b6040516382d3a1dd60e01b81529091506001600160a01b038316906382d3a1dd906200185690849060009060040162002637565b600060405180830381600087803b1580156200187157600080fd5b505af115801562001886573d6000803e3d6000fd5b50505050856001600160a01b0316886001600160a01b0316336001600160a01b03167f38d3196918721ec4627522d424d47f608e3f0f7e7a8f8abe5369150f7fc4b2a585858c8b8b8b604051620018e396959493929190620025bd565b60405180910390a4965096945050505050565b6102e1806200298383390190565b803562000d12816200292e565b805162000d12816200292e565b60008083601f8401126200193157600080fd5b50813567ffffffffffffffff8111156200194a57600080fd5b6020830191508360208202830111156200196357600080fd5b9250929050565b805162000d128162002945565b803562000d128162002950565b60008083601f8401126200199757600080fd5b50813567ffffffffffffffff811115620019b057600080fd5b6020830191508360018202830111156200196357600080fd5b803562000d12816200295b565b803562000d128162002969565b803562000d128162002977565b805162000d128162002977565b60006020828403121562001a1057600080fd5b600062001a1e848462001904565b949350505050565b60006020828403121562001a3957600080fd5b600062001a1e848462001911565b6000806040838503121562001a5b57600080fd5b600062001a69858562001904565b925050602062001a7c8582860162001904565b9150509250929050565b6000806000806080858703121562001a9d57600080fd5b600062001aab878762001904565b945050602062001abe8782880162001904565b935050604062001ad18782880162001904565b925050606062001ae48782880162001904565b91505092959194509250565b6000806000806080858703121562001b0757600080fd5b600062001b15878762001911565b945050602062001b288782880162001911565b935050604062001b3b8782880162001911565b925050606062001ae487828801620019f0565b6000806040838503121562001b6257600080fd5b600062001b70858562001904565b925050602062001a7c8582860162001977565b600080600080600080600080600060c08a8c03121562001ba257600080fd5b600062001bb08c8c62001904565b99505060208a013567ffffffffffffffff81111562001bce57600080fd5b62001bdc8c828d0162001984565b9850985050604062001bf18c828d0162001904565b965050606062001c048c828d01620019e3565b95505060808a013567ffffffffffffffff81111562001c2257600080fd5b62001c308c828d0162001984565b945094505060a08a013567ffffffffffffffff81111562001c5057600080fd5b62001c5e8c828d0162001984565b92509250509295985092959850929598565b6000806000806000806080878903121562001c8a57600080fd5b600062001c98898962001904565b965050602062001cab89828a01620019e3565b955050604087013567ffffffffffffffff81111562001cc957600080fd5b62001cd789828a0162001984565b9450945050606087013567ffffffffffffffff81111562001cf757600080fd5b62001d0589828a0162001984565b92509250509295509295509295565b6000806000806040858703121562001d2b57600080fd5b843567ffffffffffffffff81111562001d4357600080fd5b62001d51878288016200191e565b9450945050602085013567ffffffffffffffff81111562001d7157600080fd5b62001d7f878288016200191e565b95989497509550505050565b60006020828403121562001d9e57600080fd5b600062001a1e84846200196a565b60006020828403121562001dbf57600080fd5b600062001a1e848462001977565b600080600080600060a0868803121562001de657600080fd5b600062001df48888620019c9565b955050602062001e078882890162001904565b945050604062001e1a8882890162001904565b935050606062001e2d8882890162001904565b925050608062001e408882890162001904565b9150509295509295909350565b60006020828403121562001e6057600080fd5b600062001a1e8484620019d6565b62001e7981620028c3565b82525050565b62001e79816200288c565b62001e798162002899565b62001e79816200289e565b600062001ead826200287f565b62001eb9818562002883565b935062001ecb818560208601620028ea565b62001ed68162002919565b9093019392505050565b62001e7981620028d0565b600062001efa60328362002883565b7f736574436f6d7074726f6c6c65724c69623a20546869732076616c75652063618152716e206f6e6c7920626520736574206f6e636560701b602082015260400192915050565b600062001f5060278362002883565b7f5f5f6372656174654e657746756e643a205f6f776e65722063616e6e6f7420628152666520656d70747960c81b602082015260400192915050565b600062001f9b60138362002883565b7252656c65617365206973206e6f74204c69766560681b815260200192915050565b600062001fcc602d8362002883565b7f5f5f72656769737465725661756c7443616c6c733a2043616c6c20616c72656181526c191e481c9959da5cdd195c9959609a1b602082015260400192915050565b60006200201d60388362002883565b7f4f6e6c792074686520436f6d7074726f6c6c657250726f78792063726561746f81527f722063616e2063616c6c20746869732066756e6374696f6e0000000000000000602082015260400192915050565b60006200207e604c8362002883565b7f73657452656c656173655374617475733a2043616e206f6e6c7920736574207481527f68652072656c6561736520737461747573207768656e20636f6d7074726f6c6c60208201526b195c931a58881a5cc81cd95d60a21b604082015260600192915050565b6000620020f4602e8362002883565b7f4f6e6c792074686520636f6e7472616374206f776e65722063616e2063616c6c81526d103a3434b990333ab731ba34b7b760911b602082015260400192915050565b60006200214660298362002883565b7f646572656769737465725661756c7443616c6c733a2043616c6c206e6f7420728152681959da5cdd195c995960ba1b602082015260400192915050565b60006200219360338362002883565b7f4f6e6c792061207065726d697373696f6e6564206d69677261746f722063616e8152721031b0b636103a3434b990333ab731ba34b7b760691b602082015260400192915050565b6000620021ea603d8362002883565b7f706f73744d6967726174654f726967696e486f6f6b3a204f6e6c79204469737081527f6174636865722063616e2063616c6c20746869732066756e6374696f6e000000602082015260400192915050565b60006200224b603c8362002883565b7f5f5f6465706c6f79436f6d7074726f6c6c657250726f78793a205f64656e6f6d81527f696e6174696f6e41737365742063616e6e6f7420626520656d70747900000000602082015260400192915050565b6000620022ac60298362002883565b7f5f5f72656769737465725661756c7443616c6c733a20556e6576656e20696e7081526875742061727261797360b81b602082015260400192915050565b6000620022f960248362002883565b7f72656769737465725661756c7443616c6c733a20456d707479205f636f6e74728152636163747360e01b602082015260400192915050565b60006200234160268362002883565b7f646572656769737465725661756c7443616c6c733a20456d707479205f636f6e81526574726163747360d01b602082015260400192915050565b60006200238b60428362002883565b7f73657452656c656173655374617475733a204f6e6c792074686520446973706181527f7463686572206f776e65722063616e2063616c6c20746869732066756e63746960208201526137b760f11b604082015260600192915050565b6000620023f760338362002883565b7f73657452656c656173655374617475733a205f6e657874537461747573206973815272207468652063757272656e742073746174757360681b602082015260400192915050565b60006200244e60298362002883565b7f646572656769737465725661756c7443616c6c733a20556e6576656e20696e7081526875742061727261797360b81b602082015260400192915050565b60006200249b60338362002883565b7f73657452656c656173655374617475733a2043616e6e6f742072657475726e20815272746f205072654c61756e63682073746174757360681b602082015260400192915050565b62001e798162000445565b6020810162000d12828462001e7f565b6020810162000d12828462001e6e565b604081016200251e828562001e7f565b6200252d602083018462001e7f565b9392505050565b6080810162002544828762001e7f565b62002553602083018662001e7f565b62002562604083018562001e7f565b620013bd606083018462001e8a565b6080810162002581828762001e7f565b62002590602083018662001e7f565b6200259f604083018562001e7f565b8181036060830152620025b3818462001ea0565b9695505050505050565b60c08101620025cd828962001e7f565b620025dc602083018862001e7f565b8181036040830152620025f0818762001ea0565b9050620026016060830186620024e3565b818103608083015262002615818562001ea0565b905081810360a08301526200262b818462001ea0565b98975050505050505050565b6040810162002647828562001e7f565b6200252d602083018462001e8a565b6040810162002666828562001e7f565b6200252d6020830184620024e3565b6080810162002685828762001e7f565b620026946020830186620024e3565b8181036040830152620026a8818562001ea0565b90508181036060830152620025b3818462001ea0565b6020810162000d12828462001e8a565b6020810162000d12828462001e95565b60408082528101620026f1818562001ea0565b90506200252d602083018462001e7f565b6040808252810162002715818562001ea0565b9050818103602083015262001a1e818462001ea0565b6020810162000d12828462001ee0565b6020808252810162000d128162001eeb565b6020808252810162000d128162001f41565b6020808252810162000d128162001f8c565b6020808252810162000d128162001fbd565b6020808252810162000d12816200200e565b6020808252810162000d12816200206f565b6020808252810162000d1281620020e5565b6020808252810162000d128162002137565b6020808252810162000d128162002184565b6020808252810162000d1281620021db565b6020808252810162000d12816200223c565b6020808252810162000d12816200229d565b6020808252810162000d1281620022ea565b6020808252810162000d128162002332565b6020808252810162000d12816200237c565b6020808252810162000d1281620023e8565b6020808252810162000d12816200243f565b6020808252810162000d12816200248c565b5190565b90815260200190565b600062000d1282620028b7565b151590565b6001600160e01b03191690565b8062000aee8162002923565b6001600160a01b031690565b600062000d1282620028dd565b600062000d1282620028ab565b600062000d12826200288c565b60005b8381101562002907578181015183820152602001620028ed565b8381111562000cda5750506000910152565b601f01601f191690565b600381106200099057fe5b62002939816200288c565b81146200099057600080fd5b620029398162002899565b62002939816200289e565b600581106200099057600080fd5b600381106200099057600080fd5b62002939816200044556fe608060405234801561001057600080fd5b506040516102e13803806102e18339818101604052604081101561003357600080fd5b810190808051604051939291908464010000000082111561005357600080fd5b90830190602082018581111561006857600080fd5b825164010000000081118282018810171561008257600080fd5b82525081516020918201929091019080838360005b838110156100af578181015183820152602001610097565b50505050905090810190601f1680156100dc5780820380516001836020036101000a031916815260200191505b50604052602001805190602001909291905050508181807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5560006060826001600160a01b0316846040518082805190602001908083835b602083106101535780518252601f199092019160209182019101610134565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146101b3576040519150601f19603f3d011682016040523d82523d6000602084013e6101b8565b606091505b50915091508181906102485760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561020d5781810151838201526020016101f5565b50505050905090810190601f16801561023a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050505060848061025d6000396000f3fe60806040527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc543660008037600080366000846127105a03f43d806000803e818015604957816000f35b816000fdfea2646970667358221220479fe1a45f639b2b28264f0664c5040a754e68dd3840b29a2a20405474a7d2b164736f6c634300060c0033a26469706673582212201fc017016bd33cb57d8f2a34d07045a85f3ad8cc8d28daafac75d8a06cf7e6b764736f6c634300060c0033000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab32000000000000000000000000ac3fe07f51c51153e181be892e4e37326eea13da000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620001605760003560e01c80639eb2c7b211620000c9578063d2456de11162000087578063d2456de114620002bd578063da29fcfe14620002d4578063dc77205314620002eb578063df369ba71462000311578063ebb3d5891462000328578063f0bb66ac14620003325762000160565b80639eb2c7b21462000248578063a08d967d146200025f578063a5fede1d1462000276578063c108b47d146200028f578063c166f9ea14620002a65762000160565b806351dfdb48116200012357806351dfdb4814620001e5578063682cea1914620001fc5780636f022ac4146200020657806378ed2293146200021d578063893d20e8146200023457806393a2ecd9146200023e5762000160565b80630d2fcd7614620001655780630ee2cb10146200017e5780630fe6972b14620001a057806328eb9ca514620001b75780633f84c12c14620001ce575b600080fd5b6200017c62000176366004620019fd565b62000359565b005b6200018862000423565b604051620001979190620024ee565b60405180910390f35b6200017c620001b136600462001d14565b62000448565b6200017c620001c836600462001e4d565b62000670565b6200017c620001df36600462001dcd565b62000847565b6200017c620001f6366004620019fd565b62000983565b6200018862000993565b6200017c62000217366004620019fd565b620009b7565b6200017c6200022e366004620019fd565b620009c4565b62000188620009d1565b6200018862000ab6565b6200017c62000259366004620019fd565b62000ac5565b6200018862000270366004620019fd565b62000ad2565b6200028062000af3565b6040516200019791906200272b565b62000188620002a036600462001c70565b62000b03565b6200017c620002b736600462001a47565b62000bee565b6200017c620002ce36600462001a47565b62000c00565b6200017c620002e536600462001d14565b62000c0e565b62000302620002fc36600462001b4e565b62000ce0565b604051620001979190620026be565b6200017c6200032236600462001a86565b62000cda565b6200018862000d18565b620003496200034336600462001b83565b62000d3c565b604051620001979291906200250e565b62000363620009d1565b6001600160a01b0316336001600160a01b0316146200039f5760405162461bcd60e51b81526004016200039690620027a7565b60405180910390fd5b6000546001600160a01b031615620003cb5760405162461bcd60e51b815260040162000396906200273b565b600080546001600160a01b0319166001600160a01b0383161790556040517f38e37d5fdf60e4358769c3b616594ad451626b1e023c65eaa1062116feadacf89062000418908390620024ee565b60405180910390a150565b7f00000000000000000000000087a60129375d22489bbd287ec0d23129ef9290ef5b90565b62000452620009d1565b6001600160a01b0316336001600160a01b031614620004855760405162461bcd60e51b81526004016200039690620027a7565b82620004a55760405162461bcd60e51b8152600401620003969062002825565b828114620004c75760405162461bcd60e51b815260040162000396906200285b565b60005b8381101562000669576200051f858583818110620004e457fe5b9050602002016020810190620004fb9190620019fd565b8484848181106200050857fe5b9050602002016020810190620002fc919062001dac565b6200053e5760405162461bcd60e51b81526004016200039690620027b9565b6000600160008787858181106200055157fe5b9050602002016020810190620005689190620019fd565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008585858181106200059757fe5b9050602002016020810190620005ae919062001dac565b6001600160e01b03191681526020810191909152604001600020805460ff1916911515919091179055848482818110620005e457fe5b9050602002016020810190620005fb9190620019fd565b6001600160a01b03167f04a77425d9eba3b1260e976806c0cdefae7f41bb1106222790dd45e863ceaf978484848181106200063257fe5b905060200201602081019062000649919062001dac565b604051620006589190620026ce565b60405180910390a2600101620004ca565b5050505050565b7f000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab326001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015620006ca57600080fd5b505afa158015620006df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000705919062001a26565b6001600160a01b0316336001600160a01b031614620007385760405162461bcd60e51b8152600401620003969062002837565b60008160028111156200074757fe5b1415620007685760405162461bcd60e51b815260040162000396906200286d565b6000546001600160a01b0316620007935760405162461bcd60e51b8152600401620003969062002795565b600054600160a01b900460ff16806002811115620007ad57fe5b826002811115620007ba57fe5b1415620007db5760405162461bcd60e51b8152600401620003969062002849565b6000805483919060ff60a01b1916600160a01b836002811115620007fb57fe5b02179055508160028111156200080d57fe5b8160028111156200081a57fe5b6040517ffaab041807e925180f5d7036a295923ff66f30f9d7957c96b898d16b0e90b7d890600090a35050565b60028560048111156200085657fe5b14620008625762000669565b336001600160a01b037f000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab321614620008ad5760405162461bcd60e51b81526004016200039690620027dd565b6000846001600160a01b0316635a53e3486040518163ffffffff1660e01b815260040160206040518083038186803b158015620008e957600080fd5b505afa158015620008fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000924919062001a26565b9050806001600160a01b0316632b68b9c66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200096257600080fd5b505af115801562000977573d6000803e3d6000fd5b50505050505050505050565b6200099081600062000e3a565b50565b7f000000000000000000000000ac3fe07f51c51153e181be892e4e37326eea13da90565b62000990816000620010b9565b6200099081600162000e3a565b600080600054600160a01b900460ff166002811115620009ed57fe5b141562000a1c57507f00000000000000000000000087a60129375d22489bbd287ec0d23129ef9290ef62000445565b7f000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab326001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801562000a7657600080fd5b505afa15801562000a8b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ab1919062001a26565b905090565b6000546001600160a01b031690565b62000990816001620010b9565b6001600160a01b03808216600090815260026020526040902054165b919050565b600054600160a01b900460ff1690565b60006001600054600160a01b900460ff16600281111562000b2057fe5b1462000b405760405162461bcd60e51b815260040162000396906200275f565b62000bba878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152506001925062001220915050565b6001600160a01b038116600090815260026020526040902080546001600160a01b0319163317905590509695505050505050565b62000bfc82826001620013c6565b5050565b62000bfc82826000620013c6565b62000c18620009d1565b6001600160a01b0316336001600160a01b03161462000c4b5760405162461bcd60e51b81526004016200039690620027a7565b8262000c6b5760405162461bcd60e51b8152600401620003969062002813565b62000cda848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805160208088028281018201909352878252909350879250869182918501908490808284376000920191909152506200159192505050565b50505050565b6001600160a01b03821660009081526001602090815260408083206001600160e01b03198516845290915290205460ff165b92915050565b7f000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab3290565b6000806001600054600160a01b900460ff16600281111562000d5a57fe5b1462000d7a5760405162461bcd60e51b815260040162000396906200275f565b62000e288b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c908190840183828082843760009201919091525050604080516020601f8e018190048102820181019092528c815292508c91508b90819084018382808284376000920191909152506200171992505050565b91509150995099975050505050505050565b6001600054600160a01b900460ff16600281111562000e5557fe5b1462000e755760405162461bcd60e51b815260040162000396906200275f565b604051633ef03e7560e11b815282906001600160a01b03821690637de07cea9062000ea5903390600401620024fe565b60206040518083038186803b15801562000ebe57600080fd5b505afa15801562000ed3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ef9919062001d8b565b62000f185760405162461bcd60e51b81526004016200039690620027cb565b604051630fb5b3f960e31b81527f000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab32906000906001600160a01b03831690637dad9fc89062000f6b908890600401620024ee565b60806040518083038186803b15801562000f8457600080fd5b505afa15801562000f99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fbf919062001af0565b50506040516338b3eb1b60e01b81529092506001600160a01b03841691506338b3eb1b9062000ff5908890889060040162002637565b600060405180830381600087803b1580156200101057600080fd5b505af115801562001025573d6000803e3d6000fd5b50506040516382d3a1dd60e01b81526001600160a01b03841692506382d3a1dd91506200105a90889060019060040162002637565b600060405180830381600087803b1580156200107557600080fd5b505af11580156200108a573d6000803e3d6000fd5b505050506001600160a01b0316600090815260026020526040902080546001600160a01b031916905550505050565b6001600054600160a01b900460ff166002811115620010d457fe5b14620010f45760405162461bcd60e51b815260040162000396906200275f565b604051633ef03e7560e11b815282906001600160a01b03821690637de07cea9062001124903390600401620024fe565b60206040518083038186803b1580156200113d57600080fd5b505afa15801562001152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001178919062001d8b565b620011975760405162461bcd60e51b81526004016200039690620027cb565b604051634e4ea46d60e11b81526001600160a01b037f000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab321690639c9d48da90620011e7908690869060040162002637565b600060405180830381600087803b1580156200120257600080fd5b505af115801562001217573d6000803e3d6000fd5b50505050505050565b60006001600160a01b0386166200124b5760405162461bcd60e51b81526004016200039690620027ef565b606063399ae72460e01b87876040516024016200126a92919062002656565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600054915190925082916001600160a01b031690620012bb90620018f6565b620012c8929190620026de565b604051809103906000f080158015620012e5573d6000803e3d6000fd5b509150600085511180620012fa575060008451115b1562001365576040516396aed58760e01b81526001600160a01b038316906396aed5879062001330908890889060040162002702565b600060405180830381600087803b1580156200134b57600080fd5b505af115801562001360573d6000803e3d6000fd5b505050505b821515876001600160a01b0316336001600160a01b03167f0e6310be2c106224ea5db41e7f599982b85c8524b0e7cd0c4fb88e2ac46554b5858a8a8a604051620013b3949392919062002675565b60405180910390a4505b95945050505050565b6001600054600160a01b900460ff166002811115620013e157fe5b14620014015760405162461bcd60e51b815260040162000396906200275f565b6001600160a01b0382811660009081526002602052604090205483911633146200143f5760405162461bcd60e51b8152600401620003969062002783565b604051633ef03e7560e11b815284906001600160a01b03821690637de07cea906200146f903390600401620024fe565b60206040518083038186803b1580156200148857600080fd5b505afa1580156200149d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014c3919062001d8b565b620014e25760405162461bcd60e51b81526004016200039690620027cb565b604051633457e6e760e21b81526001600160a01b037f000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab32169063d15f9b9c906200155690889088907f000000000000000000000000ac3fe07f51c51153e181be892e4e37326eea13da90899060040162002534565b600060405180830381600087803b1580156200157157600080fd5b505af115801562001586573d6000803e3d6000fd5b505050505050505050565b8051825114620015b55760405162461bcd60e51b8152600401620003969062002801565b60005b82518110156200171457620015f6838281518110620015d357fe5b6020026020010151838381518110620015e857fe5b602002602001015162000ce0565b15620016165760405162461bcd60e51b8152600401620003969062002771565b60018060008584815181106200162857fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008484815181106200165f57fe5b60200260200101516001600160e01b0319166001600160e01b031916815260200190815260200160002060006101000a81548160ff021916908315150217905550828181518110620016ad57fe5b60200260200101516001600160a01b03167f355d4742de92efa1dcd9085b88ede27d7cfda96747ea062a59010a992c8af150838381518110620016ec57fe5b6020026020010151604051620017039190620026ce565b60405180910390a2600101620015b8565b505050565b6000806001600160a01b038816620017455760405162461bcd60e51b815260040162000396906200274d565b6200175586868686600062001220565b6040516322a0c08b60e01b81529092506001600160a01b037f000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab3216906322a0c08b90620017cc907f000000000000000000000000ac3fe07f51c51153e181be892e4e37326eea13da908c9087908d9060040162002571565b602060405180830381600087803b158015620017e757600080fd5b505af1158015620017fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001822919062001a26565b6040516382d3a1dd60e01b81529091506001600160a01b038316906382d3a1dd906200185690849060009060040162002637565b600060405180830381600087803b1580156200187157600080fd5b505af115801562001886573d6000803e3d6000fd5b50505050856001600160a01b0316886001600160a01b0316336001600160a01b03167f38d3196918721ec4627522d424d47f608e3f0f7e7a8f8abe5369150f7fc4b2a585858c8b8b8b604051620018e396959493929190620025bd565b60405180910390a4965096945050505050565b6102e1806200298383390190565b803562000d12816200292e565b805162000d12816200292e565b60008083601f8401126200193157600080fd5b50813567ffffffffffffffff8111156200194a57600080fd5b6020830191508360208202830111156200196357600080fd5b9250929050565b805162000d128162002945565b803562000d128162002950565b60008083601f8401126200199757600080fd5b50813567ffffffffffffffff811115620019b057600080fd5b6020830191508360018202830111156200196357600080fd5b803562000d12816200295b565b803562000d128162002969565b803562000d128162002977565b805162000d128162002977565b60006020828403121562001a1057600080fd5b600062001a1e848462001904565b949350505050565b60006020828403121562001a3957600080fd5b600062001a1e848462001911565b6000806040838503121562001a5b57600080fd5b600062001a69858562001904565b925050602062001a7c8582860162001904565b9150509250929050565b6000806000806080858703121562001a9d57600080fd5b600062001aab878762001904565b945050602062001abe8782880162001904565b935050604062001ad18782880162001904565b925050606062001ae48782880162001904565b91505092959194509250565b6000806000806080858703121562001b0757600080fd5b600062001b15878762001911565b945050602062001b288782880162001911565b935050604062001b3b8782880162001911565b925050606062001ae487828801620019f0565b6000806040838503121562001b6257600080fd5b600062001b70858562001904565b925050602062001a7c8582860162001977565b600080600080600080600080600060c08a8c03121562001ba257600080fd5b600062001bb08c8c62001904565b99505060208a013567ffffffffffffffff81111562001bce57600080fd5b62001bdc8c828d0162001984565b9850985050604062001bf18c828d0162001904565b965050606062001c048c828d01620019e3565b95505060808a013567ffffffffffffffff81111562001c2257600080fd5b62001c308c828d0162001984565b945094505060a08a013567ffffffffffffffff81111562001c5057600080fd5b62001c5e8c828d0162001984565b92509250509295985092959850929598565b6000806000806000806080878903121562001c8a57600080fd5b600062001c98898962001904565b965050602062001cab89828a01620019e3565b955050604087013567ffffffffffffffff81111562001cc957600080fd5b62001cd789828a0162001984565b9450945050606087013567ffffffffffffffff81111562001cf757600080fd5b62001d0589828a0162001984565b92509250509295509295509295565b6000806000806040858703121562001d2b57600080fd5b843567ffffffffffffffff81111562001d4357600080fd5b62001d51878288016200191e565b9450945050602085013567ffffffffffffffff81111562001d7157600080fd5b62001d7f878288016200191e565b95989497509550505050565b60006020828403121562001d9e57600080fd5b600062001a1e84846200196a565b60006020828403121562001dbf57600080fd5b600062001a1e848462001977565b600080600080600060a0868803121562001de657600080fd5b600062001df48888620019c9565b955050602062001e078882890162001904565b945050604062001e1a8882890162001904565b935050606062001e2d8882890162001904565b925050608062001e408882890162001904565b9150509295509295909350565b60006020828403121562001e6057600080fd5b600062001a1e8484620019d6565b62001e7981620028c3565b82525050565b62001e79816200288c565b62001e798162002899565b62001e79816200289e565b600062001ead826200287f565b62001eb9818562002883565b935062001ecb818560208601620028ea565b62001ed68162002919565b9093019392505050565b62001e7981620028d0565b600062001efa60328362002883565b7f736574436f6d7074726f6c6c65724c69623a20546869732076616c75652063618152716e206f6e6c7920626520736574206f6e636560701b602082015260400192915050565b600062001f5060278362002883565b7f5f5f6372656174654e657746756e643a205f6f776e65722063616e6e6f7420628152666520656d70747960c81b602082015260400192915050565b600062001f9b60138362002883565b7252656c65617365206973206e6f74204c69766560681b815260200192915050565b600062001fcc602d8362002883565b7f5f5f72656769737465725661756c7443616c6c733a2043616c6c20616c72656181526c191e481c9959da5cdd195c9959609a1b602082015260400192915050565b60006200201d60388362002883565b7f4f6e6c792074686520436f6d7074726f6c6c657250726f78792063726561746f81527f722063616e2063616c6c20746869732066756e6374696f6e0000000000000000602082015260400192915050565b60006200207e604c8362002883565b7f73657452656c656173655374617475733a2043616e206f6e6c7920736574207481527f68652072656c6561736520737461747573207768656e20636f6d7074726f6c6c60208201526b195c931a58881a5cc81cd95d60a21b604082015260600192915050565b6000620020f4602e8362002883565b7f4f6e6c792074686520636f6e7472616374206f776e65722063616e2063616c6c81526d103a3434b990333ab731ba34b7b760911b602082015260400192915050565b60006200214660298362002883565b7f646572656769737465725661756c7443616c6c733a2043616c6c206e6f7420728152681959da5cdd195c995960ba1b602082015260400192915050565b60006200219360338362002883565b7f4f6e6c792061207065726d697373696f6e6564206d69677261746f722063616e8152721031b0b636103a3434b990333ab731ba34b7b760691b602082015260400192915050565b6000620021ea603d8362002883565b7f706f73744d6967726174654f726967696e486f6f6b3a204f6e6c79204469737081527f6174636865722063616e2063616c6c20746869732066756e6374696f6e000000602082015260400192915050565b60006200224b603c8362002883565b7f5f5f6465706c6f79436f6d7074726f6c6c657250726f78793a205f64656e6f6d81527f696e6174696f6e41737365742063616e6e6f7420626520656d70747900000000602082015260400192915050565b6000620022ac60298362002883565b7f5f5f72656769737465725661756c7443616c6c733a20556e6576656e20696e7081526875742061727261797360b81b602082015260400192915050565b6000620022f960248362002883565b7f72656769737465725661756c7443616c6c733a20456d707479205f636f6e74728152636163747360e01b602082015260400192915050565b60006200234160268362002883565b7f646572656769737465725661756c7443616c6c733a20456d707479205f636f6e81526574726163747360d01b602082015260400192915050565b60006200238b60428362002883565b7f73657452656c656173655374617475733a204f6e6c792074686520446973706181527f7463686572206f776e65722063616e2063616c6c20746869732066756e63746960208201526137b760f11b604082015260600192915050565b6000620023f760338362002883565b7f73657452656c656173655374617475733a205f6e657874537461747573206973815272207468652063757272656e742073746174757360681b602082015260400192915050565b60006200244e60298362002883565b7f646572656769737465725661756c7443616c6c733a20556e6576656e20696e7081526875742061727261797360b81b602082015260400192915050565b60006200249b60338362002883565b7f73657452656c656173655374617475733a2043616e6e6f742072657475726e20815272746f205072654c61756e63682073746174757360681b602082015260400192915050565b62001e798162000445565b6020810162000d12828462001e7f565b6020810162000d12828462001e6e565b604081016200251e828562001e7f565b6200252d602083018462001e7f565b9392505050565b6080810162002544828762001e7f565b62002553602083018662001e7f565b62002562604083018562001e7f565b620013bd606083018462001e8a565b6080810162002581828762001e7f565b62002590602083018662001e7f565b6200259f604083018562001e7f565b8181036060830152620025b3818462001ea0565b9695505050505050565b60c08101620025cd828962001e7f565b620025dc602083018862001e7f565b8181036040830152620025f0818762001ea0565b9050620026016060830186620024e3565b818103608083015262002615818562001ea0565b905081810360a08301526200262b818462001ea0565b98975050505050505050565b6040810162002647828562001e7f565b6200252d602083018462001e8a565b6040810162002666828562001e7f565b6200252d6020830184620024e3565b6080810162002685828762001e7f565b620026946020830186620024e3565b8181036040830152620026a8818562001ea0565b90508181036060830152620025b3818462001ea0565b6020810162000d12828462001e8a565b6020810162000d12828462001e95565b60408082528101620026f1818562001ea0565b90506200252d602083018462001e7f565b6040808252810162002715818562001ea0565b9050818103602083015262001a1e818462001ea0565b6020810162000d12828462001ee0565b6020808252810162000d128162001eeb565b6020808252810162000d128162001f41565b6020808252810162000d128162001f8c565b6020808252810162000d128162001fbd565b6020808252810162000d12816200200e565b6020808252810162000d12816200206f565b6020808252810162000d1281620020e5565b6020808252810162000d128162002137565b6020808252810162000d128162002184565b6020808252810162000d1281620021db565b6020808252810162000d12816200223c565b6020808252810162000d12816200229d565b6020808252810162000d1281620022ea565b6020808252810162000d128162002332565b6020808252810162000d12816200237c565b6020808252810162000d1281620023e8565b6020808252810162000d12816200243f565b6020808252810162000d12816200248c565b5190565b90815260200190565b600062000d1282620028b7565b151590565b6001600160e01b03191690565b8062000aee8162002923565b6001600160a01b031690565b600062000d1282620028dd565b600062000d1282620028ab565b600062000d12826200288c565b60005b8381101562002907578181015183820152602001620028ed565b8381111562000cda5750506000910152565b601f01601f191690565b600381106200099057fe5b62002939816200288c565b81146200099057600080fd5b620029398162002899565b62002939816200289e565b600581106200099057600080fd5b600381106200099057600080fd5b62002939816200044556fe608060405234801561001057600080fd5b506040516102e13803806102e18339818101604052604081101561003357600080fd5b810190808051604051939291908464010000000082111561005357600080fd5b90830190602082018581111561006857600080fd5b825164010000000081118282018810171561008257600080fd5b82525081516020918201929091019080838360005b838110156100af578181015183820152602001610097565b50505050905090810190601f1680156100dc5780820380516001836020036101000a031916815260200191505b50604052602001805190602001909291905050508181807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5560006060826001600160a01b0316846040518082805190602001908083835b602083106101535780518252601f199092019160209182019101610134565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146101b3576040519150601f19603f3d011682016040523d82523d6000602084013e6101b8565b606091505b50915091508181906102485760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561020d5781810151838201526020016101f5565b50505050905090810190601f16801561023a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050505060848061025d6000396000f3fe60806040527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc543660008037600080366000846127105a03f43d806000803e818015604957816000f35b816000fdfea2646970667358221220479fe1a45f639b2b28264f0664c5040a754e68dd3840b29a2a20405474a7d2b164736f6c634300060c0033a26469706673582212201fc017016bd33cb57d8f2a34d07045a85f3ad8cc8d28daafac75d8a06cf7e6b764736f6c634300060c0033

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

000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab32000000000000000000000000ac3fe07f51c51153e181be892e4e37326eea13da000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _dispatcher (address): 0xC3DC853dD716bd5754f421ef94fdCbac3902ab32
Arg [1] : _vaultLib (address): 0xAC3fe07F51C51153E181bE892e4e37326EEA13Da

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000c3dc853dd716bd5754f421ef94fdcbac3902ab32
Arg [1] : 000000000000000000000000ac3fe07f51c51153e181be892e4e37326eea13da
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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