S Price: $0.542498 (-10.01%)
    /

    Contract

    0x0ddcB0a765D09D86E526dE7a9839398159274A63

    Overview

    S Balance

    Sonic LogoSonic LogoSonic Logo0 S

    S Value

    $0.00

    Multichain Info

    No addresses found
    Transaction Hash
    Method
    Block
    Age
    From
    To
    Amount

    There are no matching entries

    Please try again later

    Parent Transaction Hash Block Age From To Amount
    View All Internal Transactions
    Loading...
    Loading

    Contract Source Code Verified (Exact Match)

    Contract Name:
    EdgeFactory

    Compiler Version
    v0.8.24+commit.e11b9ed9

    Optimization Enabled:
    Yes with 20000 runs

    Other Settings:
    cancun EvmVersion
    File 1 of 24 : EdgeFactory.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import {EulerRouter} from "euler-price-oracle/EulerRouter.sol";
    import {IEVault} from "evk/EVault/IEVault.sol";
    import {GenericFactory} from "evk/GenericFactory/GenericFactory.sol";
    import {IEulerRouterFactory} from "../EulerRouterFactory/interfaces/IEulerRouterFactory.sol";
    import {IEdgeFactory} from "./interfaces/IEdgeFactory.sol";
    import {EscrowedCollateralPerspective} from "../Perspectives/deployed/EscrowedCollateralPerspective.sol";
    /// @title EdgeFactory
    /// @custom:security-contact security@euler.xyz
    /// @author Objective Labs (https://www.objectivelabs.io/)
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice Factory contract for deploying and configuring Edge markets
    /// @dev Deploys and configures vaults, router, and their collateral relationships
    contract EdgeFactory is IEdgeFactory {
    /// @notice Name of the factory contract
    string public constant name = "Edge Factory";
    /// @notice Minimum delay for a liquidation to happen in seconds
    uint16 internal constant LIQ_COOL_OFF_TIME = 1;
    /// @notice Maximum discount applied during liquidations (15%)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 24 : EulerRouter.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import {IERC4626} from "forge-std/interfaces/IERC4626.sol";
    import {IPriceOracle} from "./interfaces/IPriceOracle.sol";
    import {Errors} from "./lib/Errors.sol";
    import {Governable} from "./lib/Governable.sol";
    /// @title EulerRouter
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice Default Oracle resolver for Euler lending products.
    /// @dev Integration Note: The router supports pricing via `convertToAssets` for trusted `resolvedVaults`.
    /// By ERC4626 spec `convert*` ignores liquidity restrictions, fees, slippage and per-user restrictions.
    /// Therefore the reported price may not be realizable through `redeem` or `withdraw`.
    contract EulerRouter is Governable, IPriceOracle {
    /// @inheritdoc IPriceOracle
    string public constant name = "EulerRouter";
    /// @notice The PriceOracle to call if this router is not configured for base/quote.
    /// @dev If `address(0)` then there is no fallback.
    address public fallbackOracle;
    /// @notice ERC4626 vaults resolved using internal pricing (`convertToAssets`).
    mapping(address vault => address asset) public resolvedVaults;
    /// @notice PriceOracle configured per asset pair.
    /// @dev The keys are lexicographically sorted (asset0 < asset1).
    mapping(address asset0 => mapping(address asset1 => address oracle)) internal oracles;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 3 of 24 : IEVault.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity >=0.8.0;
    import {IVault as IEVCVault} from "ethereum-vault-connector/interfaces/IVault.sol";
    // Full interface of EVault and all it's modules
    /// @title IInitialize
    /// @notice Interface of the initialization module of EVault
    interface IInitialize {
    /// @notice Initialization of the newly deployed proxy contract
    /// @param proxyCreator Account which created the proxy or should be the initial governor
    function initialize(address proxyCreator) external;
    }
    /// @title IERC20
    /// @notice Interface of the EVault's Initialize module
    interface IERC20 {
    /// @notice Vault share token (eToken) name, ie "Euler Vault: DAI"
    /// @return The name of the eToken
    function name() external view returns (string memory);
    /// @notice Vault share token (eToken) symbol, ie "eDAI"
    /// @return The symbol of the eToken
    function symbol() external view returns (string memory);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 4 of 24 : GenericFactory.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import {BeaconProxy} from "./BeaconProxy.sol";
    import {MetaProxyDeployer} from "./MetaProxyDeployer.sol";
    /// @title IComponent
    /// @notice Minimal interface which must be implemented by the contract deployed by the factory
    interface IComponent {
    /// @notice Function replacing the constructor in proxied contracts
    /// @param creator The new contract's creator address
    function initialize(address creator) external;
    }
    /// @title GenericFactory
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice The factory allows permissionless creation of upgradeable or non-upgradeable proxy contracts and serves as a
    /// beacon for the upgradeable ones
    contract GenericFactory is MetaProxyDeployer {
    // Constants
    uint256 internal constant REENTRANCYLOCK__UNLOCKED = 1;
    uint256 internal constant REENTRANCYLOCK__LOCKED = 2;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 24 : IEulerRouterFactory.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity >=0.8.0;
    import {IFactory} from "../../BaseFactory/interfaces/IFactory.sol";
    /// @title IEulerRouterFactory
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice A minimal factory for EulerRouter.
    interface IEulerRouterFactory is IFactory {
    /// @notice Deploys a new EulerRouter.
    /// @param governor The governor of the router.
    /// @return The deployment address.
    function deploy(address governor) external returns (address);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 6 of 24 : IEdgeFactory.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity >=0.8.0;
    /// @title IEdgeFactory
    /// @custom:security-contact security@euler.xyz
    /// @author Objective Labs (https://www.objectivelabs.io/)
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice Factory contract for deploying and configuring Edge markets
    interface IEdgeFactory {
    /// @notice Parameters for deploying a vault
    /// @param asset The underlying asset of the vault
    /// @param irm The address of the interest rate model, ignored if escrow
    /// @param escrow True if the vault is collateral only, false if it is borrowable
    struct VaultParams {
    address asset;
    address irm;
    bool escrow;
    }
    /// @notice Parameters for configuring an oracle adapter in the router
    /// @param base The base token address
    /// @param adapter The oracle adapter address
    struct AdapterParams {
    address base;
    address adapter;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 24 : EscrowedCollateralPerspective.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.24;
    import {GenericFactory} from "evk/GenericFactory/GenericFactory.sol";
    import {IEVault} from "evk/EVault/IEVault.sol";
    import "evk/EVault/shared/Constants.sol";
    import {BasePerspective} from "../implementation/BasePerspective.sol";
    /// @title EscrowedCollateralPerspective
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice A contract that verifies whether a vault has properties of an escrow vault. It allows only one escrow vault
    /// per asset if the vault has no supply cap configured.
    contract EscrowedCollateralPerspective is BasePerspective {
    /// @notice A mapping to look up the vault associated with a given asset.
    mapping(address => address) public singletonLookup;
    /// @notice Creates a new EscrowedCollateralPerspective instance.
    /// @param vaultFactory_ The address of the GenericFactory contract.
    constructor(address vaultFactory_) BasePerspective(vaultFactory_) {}
    /// @inheritdoc BasePerspective
    function name() public pure virtual override returns (string memory) {
    return "Escrowed Collateral Perspective";
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 8 of 24 : IERC4626.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.6.2;
    import "./IERC20.sol";
    /// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in
    /// https://eips.ethereum.org/EIPS/eip-4626
    interface IERC4626 is IERC20 {
    event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);
    event Withdraw(
    address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares
    );
    /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
    /// @dev
    /// - MUST be an ERC-20 token contract.
    /// - MUST NOT revert.
    function asset() external view returns (address assetTokenAddress);
    /// @notice Returns the total amount of the underlying asset that is “managed” by Vault.
    /// @dev
    /// - SHOULD include any compounding that occurs from yield.
    /// - MUST be inclusive of any fees that are charged against assets in the Vault.
    /// - MUST NOT revert.
    function totalAssets() external view returns (uint256 totalManagedAssets);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 24 : IPriceOracle.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity >=0.8.0;
    /// @title IPriceOracle
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice Common PriceOracle interface.
    interface IPriceOracle {
    /// @notice Get the name of the oracle.
    /// @return The name of the oracle.
    function name() external view returns (string memory);
    /// @notice One-sided price: How much quote token you would get for inAmount of base token, assuming no price spread.
    /// @param inAmount The amount of `base` to convert.
    /// @param base The token that is being priced.
    /// @param quote The token that is the unit of account.
    /// @return outAmount The amount of `quote` that is equivalent to `inAmount` of `base`.
    function getQuote(uint256 inAmount, address base, address quote) external view returns (uint256 outAmount);
    /// @notice Two-sided price: How much quote token you would get/spend for selling/buying inAmount of base token.
    /// @param inAmount The amount of `base` to convert.
    /// @param base The token that is being priced.
    /// @param quote The token that is the unit of account.
    /// @return bidOutAmount The amount of `quote` you would get for selling `inAmount` of `base`.
    /// @return askOutAmount The amount of `quote` you would spend for buying `inAmount` of `base`.
    function getQuotes(uint256 inAmount, address base, address quote)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 24 : Errors.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    /// @title Errors
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice Collects common errors in PriceOracles.
    library Errors {
    /// @notice The external feed returned an invalid answer.
    error PriceOracle_InvalidAnswer();
    /// @notice The configuration parameters for the PriceOracle are invalid.
    error PriceOracle_InvalidConfiguration();
    /// @notice The base/quote path is not supported.
    /// @param base The address of the base asset.
    /// @param quote The address of the quote asset.
    error PriceOracle_NotSupported(address base, address quote);
    /// @notice The quote cannot be completed due to overflow.
    error PriceOracle_Overflow();
    /// @notice The price is too stale.
    /// @param staleness The time elapsed since the price was updated.
    /// @param maxStaleness The maximum time elapsed since the last price update.
    error PriceOracle_TooStale(uint256 staleness, uint256 maxStaleness);
    /// @notice The method can only be called by the governor.
    error Governance_CallerNotGovernor();
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 24 : Governable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    import {EVCUtil} from "ethereum-vault-connector/utils/EVCUtil.sol";
    import {Errors} from "./Errors.sol";
    /// @title Governable
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice Contract mixin for governance, compatible with EVC.
    abstract contract Governable is EVCUtil {
    /// @notice The active governor address. If `address(0)` then the role is renounced.
    address public governor;
    /// @notice Set the governor of the contract.
    /// @param oldGovernor The address of the previous governor.
    /// @param newGovernor The address of the newly appointed governor.
    event GovernorSet(address indexed oldGovernor, address indexed newGovernor);
    constructor(address _evc, address _governor) EVCUtil(_evc) {
    _setGovernor(_governor);
    }
    /// @notice Transfer the governor role to another address.
    /// @param newGovernor The address of the next governor.
    /// @dev Can only be called by the current governor.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 24 : IVault.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity >=0.8.0;
    /// @title IVault
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice This interface defines the methods for the Vault for the purpose of integration with the Ethereum Vault
    /// Connector.
    interface IVault {
    /// @notice Disables a controller (this vault) for the authenticated account.
    /// @dev A controller is a vault that has been chosen for an account to have special control over account’s
    /// balances in the enabled collaterals vaults. User calls this function in order for the vault to disable itself
    /// for the account if the conditions are met (i.e. user has repaid debt in full). If the conditions are not met,
    /// the function reverts.
    function disableController() external;
    /// @notice Checks the status of an account.
    /// @dev This function must only deliberately revert if the account status is invalid. If this function reverts due
    /// to any other reason, it may render the account unusable with possibly no way to recover funds.
    /// @param account The address of the account to be checked.
    /// @param collaterals The array of enabled collateral addresses to be considered for the account status check.
    /// @return magicValue Must return the bytes4 magic value 0xb168c58f (which is a selector of this function) when
    /// account status is valid, or revert otherwise.
    function checkAccountStatus(
    address account,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 24 : BeaconProxy.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    /// @title BeaconProxy
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice A proxy contract, forwarding all calls to an implementation contract, fetched from a beacon
    /// @dev The proxy attaches up to 128 bytes of metadata to the delegated call data.
    contract BeaconProxy {
    // ERC-1967 beacon address slot. bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)
    bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
    // Beacon implementation() selector
    bytes32 internal constant IMPLEMENTATION_SELECTOR =
    0x5c60da1b00000000000000000000000000000000000000000000000000000000;
    // Max trailing data length, 4 immutable slots
    uint256 internal constant MAX_TRAILING_DATA_LENGTH = 128;
    address internal immutable beacon;
    uint256 internal immutable metadataLength;
    bytes32 internal immutable metadata0;
    bytes32 internal immutable metadata1;
    bytes32 internal immutable metadata2;
    bytes32 internal immutable metadata3;
    event Genesis();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 14 of 24 : MetaProxyDeployer.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    /// @title MetaProxyDeployer
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice Contract for deploying minimal proxies with metadata, based on EIP-3448.
    /// @dev The metadata of the proxies does not include the data length as defined by EIP-3448, saving gas at a cost of
    /// supporting variable size data.
    contract MetaProxyDeployer {
    error E_DeploymentFailed();
    // Meta proxy bytecode from EIP-3488 https://eips.ethereum.org/EIPS/eip-3448
    bytes constant BYTECODE_HEAD = hex"600b380380600b3d393df3363d3d373d3d3d3d60368038038091363936013d73";
    bytes constant BYTECODE_TAIL = hex"5af43d3d93803e603457fd5bf3";
    /// @dev Creates a proxy for `targetContract` with metadata from `metadata`.
    /// @return addr A non-zero address if successful.
    function deployMetaProxy(address targetContract, bytes memory metadata) internal returns (address addr) {
    bytes memory code = abi.encodePacked(BYTECODE_HEAD, targetContract, BYTECODE_TAIL, metadata);
    assembly ("memory-safe") {
    addr := create(0, add(code, 32), mload(code))
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 15 of 24 : IFactory.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity >=0.8.0;
    /// @title IFactory
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice A minimal factory interface for deploying contracts.
    interface IFactory {
    struct DeploymentInfo {
    /// @notice The sender of the deployment call.
    address deployer;
    /// @notice The timestamp when the contract was deployed.
    uint96 deployedAt;
    }
    /// @notice An instance of a contract was deployed.
    /// @param deployedContract The deployment address of the contract.
    /// @param deployer The sender of the deployment call.
    /// @param deployedAt The deployment timestamp of the contract.
    event ContractDeployed(address indexed deployedContract, address indexed deployer, uint256 deployedAt);
    /// @notice Error thrown when the query is incorrect.
    error Factory_BadQuery();
    /// @notice Contracts deployed by the factory.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 24 : Constants.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    // Implementation internals
    // asset amounts are shifted left by this number of bits for increased precision of debt tracking.
    uint256 constant INTERNAL_DEBT_PRECISION_SHIFT = 31;
    // max amount for Assets and Shares custom types based on a uint112.
    uint256 constant MAX_SANE_AMOUNT = type(uint112).max;
    // max debt amount fits in uint144 (112 + 31 bits).
    // Last 31 bits are zeros to ensure max debt rounded up equals max sane amount.
    uint256 constant MAX_SANE_DEBT_AMOUNT = uint256(MAX_SANE_AMOUNT) << INTERNAL_DEBT_PRECISION_SHIFT;
    // proxy trailing calldata length in bytes.
    // Three addresses, 20 bytes each: vault underlying asset, oracle and unit of account + 4 empty bytes.
    uint256 constant PROXY_METADATA_LENGTH = 64;
    // gregorian calendar
    uint256 constant SECONDS_PER_YEAR = 365.2425 * 86400;
    // max interest rate accepted from IRM. 1,000,000% APY: floor(((1000000 / 100 + 1)**(1/(86400*365.2425)) - 1) * 1e27)
    uint256 constant MAX_ALLOWED_INTEREST_RATE = 291867278914945094175;
    // max valid value of the ConfigAmount custom type, signifying 100%
    uint16 constant CONFIG_SCALE = 1e4;
    // Account status checks special values
    // no account status checks should be scheduled
    address constant CHECKACCOUNT_NONE = address(0);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 17 of 24 : BasePerspective.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.24;
    import {EnumerableSet} from "openzeppelin-contracts/utils/structs/EnumerableSet.sol";
    import {GenericFactory} from "evk/GenericFactory/GenericFactory.sol";
    import {IPerspective} from "./interfaces/IPerspective.sol";
    import {PerspectiveErrors} from "./PerspectiveErrors.sol";
    /// @title BasePerspective
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice A base contract for implementing a perspective.
    abstract contract BasePerspective is IPerspective, PerspectiveErrors {
    using EnumerableSet for EnumerableSet.AddressSet;
    struct Transient {
    uint256 placeholder;
    }
    GenericFactory public immutable vaultFactory;
    EnumerableSet.AddressSet internal verified;
    Transient private transientVerified;
    Transient private transientErrors;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 18 of 24 : IERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.6.2;
    /// @dev Interface of the ERC20 standard as defined in the EIP.
    /// @dev This includes the optional name, symbol, and decimals metadata.
    interface IERC20 {
    /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).
    event Transfer(address indexed from, address indexed to, uint256 value);
    /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`
    /// is the new allowance.
    event Approval(address indexed owner, address indexed spender, uint256 value);
    /// @notice Returns the amount of tokens in existence.
    function totalSupply() external view returns (uint256);
    /// @notice Returns the amount of tokens owned by `account`.
    function balanceOf(address account) external view returns (uint256);
    /// @notice Moves `amount` tokens from the caller's account to `to`.
    function transfer(address to, uint256 amount) external returns (bool);
    /// @notice Returns the remaining number of tokens that `spender` is allowed
    /// to spend on behalf of `owner`
    function allowance(address owner, address spender) external view returns (uint256);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 24 : EVCUtil.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.0;
    import {IEVC} from "../interfaces/IEthereumVaultConnector.sol";
    import {ExecutionContext, EC} from "../ExecutionContext.sol";
    /// @title EVCUtil
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice This contract is an abstract base contract for interacting with the Ethereum Vault Connector (EVC).
    /// It provides utility functions for authenticating the callers in the context of the EVC, a pattern for enforcing the
    /// contracts to be called through the EVC.
    abstract contract EVCUtil {
    using ExecutionContext for EC;
    uint160 internal constant ACCOUNT_ID_OFFSET = 8;
    IEVC internal immutable evc;
    error EVC_InvalidAddress();
    error NotAuthorized();
    error ControllerDisabled();
    constructor(address _evc) {
    if (_evc == address(0)) revert EVC_InvalidAddress();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 24 : EnumerableSet.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v5.1.0) (utils/structs/EnumerableSet.sol)
    // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
    pragma solidity ^0.8.20;
    /**
    * @dev Library for managing
    * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
    * types.
    *
    * Sets have the following properties:
    *
    * - Elements are added, removed, and checked for existence in constant time
    * (O(1)).
    * - Elements are enumerated in O(n). No guarantees are made on the ordering.
    *
    * ```solidity
    * contract Example {
    * // Add the library methods
    * using EnumerableSet for EnumerableSet.AddressSet;
    *
    * // Declare a set state variable
    * EnumerableSet.AddressSet private mySet;
    * }
    * ```
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 24 : IPerspective.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity >=0.8.0;
    /// @title IPerspective
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice A contract that verifies the properties of a vault.
    interface IPerspective {
    /// @notice Emitted when a vault is verified successfully.
    /// @param vault The address of the vault that has been verified.
    event PerspectiveVerified(address indexed vault);
    /// @notice Error thrown when a perspective verification fails.
    /// @param perspective The address of the perspective contract where the error occurred.
    /// @param vault The address of the vault being verified.
    /// @param codes The error codes indicating the reasons for verification failure.
    error PerspectiveError(address perspective, address vault, uint256 codes);
    /// @notice Error thrown when a panic occurs in the perspective contract.
    error PerspectivePanic();
    /// @notice Returns the name of the perspective.
    /// @dev Name should be unique and descriptive.
    /// @return The name of the perspective.
    function name() external view returns (string memory);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 22 of 24 : PerspectiveErrors.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    /// @title PerspectiveErrors
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice A contract that defines the error codes for the perspectives.
    abstract contract PerspectiveErrors {
    uint256 internal constant ERROR__FACTORY = 1 << 0;
    uint256 internal constant ERROR__IMPLEMENTATION = 1 << 1;
    uint256 internal constant ERROR__UPGRADABILITY = 1 << 2;
    uint256 internal constant ERROR__SINGLETON = 1 << 3;
    uint256 internal constant ERROR__NESTING = 1 << 4;
    uint256 internal constant ERROR__ORACLE_INVALID_ROUTER = 1 << 5;
    uint256 internal constant ERROR__ORACLE_GOVERNED_ROUTER = 1 << 6;
    uint256 internal constant ERROR__ORACLE_INVALID_FALLBACK = 1 << 7;
    uint256 internal constant ERROR__ORACLE_INVALID_ROUTER_CONFIG = 1 << 8;
    uint256 internal constant ERROR__ORACLE_INVALID_ADAPTER = 1 << 9;
    uint256 internal constant ERROR__UNIT_OF_ACCOUNT = 1 << 10;
    uint256 internal constant ERROR__CREATOR = 1 << 11;
    uint256 internal constant ERROR__GOVERNOR = 1 << 12;
    uint256 internal constant ERROR__FEE_RECEIVER = 1 << 13;
    uint256 internal constant ERROR__INTEREST_FEE = 1 << 14;
    uint256 internal constant ERROR__INTEREST_RATE_MODEL = 1 << 15;
    uint256 internal constant ERROR__SUPPLY_CAP = 1 << 16;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 23 of 24 : IEthereumVaultConnector.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity >=0.8.0;
    /// @title IEVC
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice This interface defines the methods for the Ethereum Vault Connector.
    interface IEVC {
    /// @notice A struct representing a batch item.
    /// @dev Each batch item represents a single operation to be performed within a checks deferred context.
    struct BatchItem {
    /// @notice The target contract to be called.
    address targetContract;
    /// @notice The account on behalf of which the operation is to be performed. msg.sender must be authorized to
    /// act on behalf of this account. Must be address(0) if the target contract is the EVC itself.
    address onBehalfOfAccount;
    /// @notice The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole
    /// balance of the EVC contract will be forwarded. Must be 0 if the target contract is the EVC itself.
    uint256 value;
    /// @notice The encoded data which is called on the target contract.
    bytes data;
    }
    /// @notice A struct representing the result of a batch item operation.
    /// @dev Used only for simulation purposes.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 24 of 24 : ExecutionContext.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: GPL-2.0-or-later
    pragma solidity ^0.8.0;
    type EC is uint256;
    /// @title ExecutionContext
    /// @custom:security-contact security@euler.xyz
    /// @author Euler Labs (https://www.eulerlabs.com/)
    /// @notice This library provides functions for managing the execution context in the Ethereum Vault Connector.
    /// @dev The execution context is a bit field that stores the following information:
    /// @dev - on behalf of account - an account on behalf of which the currently executed operation is being performed
    /// @dev - checks deferred flag - used to indicate whether checks are deferred
    /// @dev - checks in progress flag - used to indicate that the account/vault status checks are in progress. This flag is
    /// used to prevent re-entrancy.
    /// @dev - control collateral in progress flag - used to indicate that the control collateral is in progress. This flag
    /// is used to prevent re-entrancy.
    /// @dev - operator authenticated flag - used to indicate that the currently executed operation is being performed by
    /// the account operator
    /// @dev - simulation flag - used to indicate that the currently executed batch call is a simulation
    /// @dev - stamp - dummy value for optimization purposes
    library ExecutionContext {
    uint256 internal constant ON_BEHALF_OF_ACCOUNT_MASK =
    0x000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
    uint256 internal constant CHECKS_DEFERRED_MASK = 0x0000000000000000000000FF0000000000000000000000000000000000000000;
    uint256 internal constant CHECKS_IN_PROGRESS_MASK =
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    {
    "remappings": [
    "lib/euler-price-oracle:@openzeppelin/contracts/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/",
    "lib/native-token-transfers/evm:openzeppelin-contracts/contracts/=lib/native-token-transfers/evm/lib/openzeppelin-contracts/contracts/",
    "lib/euler-earn:@openzeppelin/=lib/euler-earn/lib/openzeppelin-contracts/",
    "lib/euler-earn:@openzeppelin-upgradeable/=lib/euler-earn/lib/openzeppelin-contracts-upgradeable/contracts/",
    "lib/euler-earn:ethereum-vault-connector/=lib/euler-earn/lib/ethereum-vault-connector/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "ethereum-vault-connector/=lib/ethereum-vault-connector/src/",
    "evc/=lib/ethereum-vault-connector/src/",
    "evk/=lib/euler-vault-kit/src/",
    "evk-test/=lib/euler-vault-kit/test/",
    "euler-price-oracle/=lib/euler-price-oracle/src/",
    "euler-price-oracle-test/=lib/euler-price-oracle/test/",
    "fee-flow/=lib/fee-flow/src/",
    "reward-streams/=lib/reward-streams/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/contracts/",
    "euler-earn/=lib/euler-earn/src/",
    "native-token-transfers/=lib/native-token-transfers/evm/src/",
    "@openzeppelin-upgradeable/=lib/euler-earn/lib/openzeppelin-contracts-upgradeable/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@pendle/core-v2/=lib/euler-price-oracle/lib/pendle-core-v2-public/contracts/",
    "@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/",
    "@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/",
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    API
    [{"inputs":[{"internalType":"address","name":"_eVaultFactory","type":"address"},{"internalType":"address","name":"_eulerRouterFactory","type":"address"},{"internalType":"address","name":"_escrowedCollateralPerspective","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"E_BadQuery","type":"error"},{"inputs":[],"name":"E_TooFewVaults","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"address[]","name":"vaults","type":"address[]"}],"name":"EdgeDeployed","type":"event"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"irm","type":"address"},{"internalType":"bool","name":"escrow","type":"bool"}],"internalType":"struct IEdgeFactory.VaultParams[]","name":"vaults","type":"tuple[]"},{"components":[{"internalType":"address[]","name":"externalResolvedVaults","type":"address[]"},{"components":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"adapter","type":"address"}],"internalType":"struct IEdgeFactory.AdapterParams[]","name":"adapters","type":"tuple[]"}],"internalType":"struct IEdgeFactory.RouterParams","name":"router","type":"tuple"},{"components":[{"internalType":"uint256","name":"collateralVaultIndex","type":"uint256"},{"internalType":"uint256","name":"controllerVaultIndex","type":"uint256"},{"internalType":"uint16","name":"borrowLTV","type":"uint16"},{"internalType":"uint16","name":"liquidationLTV","type":"uint16"}],"internalType":"struct IEdgeFactory.LTVParams[]","name":"ltv","type":"tuple[]"},{"internalType":"address","name":"unitOfAccount","type":"address"}],"internalType":"struct IEdgeFactory.DeployParams","name":"params","type":"tuple"}],"name":"deploy","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eVaultFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrowedCollateralPerspective","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eulerRouterFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getDeployment","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeploymentsListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getDeploymentsListSlice","outputs":[{"internalType":"address[][]","name":"list","type":"address[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDeployed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

    60e060405234801562000010575f80fd5b5060405162001caf38038062001caf83398101604081905262000033916200006d565b6001600160a01b0392831660805290821660a0521660c052620000b4565b80516001600160a01b038116811462000068575f80fd5b919050565b5f805f6060848603121562000080575f80fd5b6200008b8462000051565b92506200009b6020850162000051565b9150620000ab6040850162000051565b90509250925092565b60805160a05160c051611bad620001025f395f818161017e015281816106ab015261098101525f81816101ca015261033401525f81816101f1015281816107ae0152610aa60152611bad5ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c8063b3a625eb11610072578063bd145e3e11610058578063bd145e3e146101c5578063e1934a07146101ec578063e536913d14610213575f80fd5b8063b3a625eb14610158578063b45f2d3814610179575f80fd5b806306fdde03146100a357806325da1698146100f55780636aebd5831461011557806390184b0214610126575b5f80fd5b6100df6040518060400160405280600c81526020017f4564676520466163746f7279000000000000000000000000000000000000000081525081565b6040516100ec9190611422565b60405180910390f35b61010861010336600461143b565b610233565b6040516100ec91906114a2565b6001546040519081526020016100ec565b6101486101343660046114d8565b5f6020819052908152604090205460ff1681565b60405190151581526020016100ec565b61016b6101663660046114f3565b6102bb565b6040516100ec92919061152a565b6101a07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6101a07f000000000000000000000000000000000000000000000000000000000000000081565b6101a07f000000000000000000000000000000000000000000000000000000000000000081565b610226610221366004611560565b6111c8565b6040516100ec9190611580565b60606001828154811061024857610248611600565b905f5260205f20018054806020026020016040519081016040528092919081815260200182805480156102af57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610284575b50505050509050919050565b5f606060026102ca848061162d565b90501015610304576040517f6435d19f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4c96a3890000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634c96a389906024016020604051808303815f875af115801561038f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b39190611697565b90505f6103c360208601866116b2565b6103cc90611852565b90505f5b8160200151518110156104cc575f826020015182815181106103f4576103f4611600565b602002602001015190508373ffffffffffffffffffffffffffffffffffffffff166306c570c1825f015189606001602081019061043191906114d8565b60208501516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff938416600482015291831660248301529190911660448201526064015f604051808303815f87803b1580156104aa575f80fd5b505af11580156104bc573d5f803e3d5ffd5b50505050508060010190506103d0565b505f5b6104dc60208701876116b2565b6104e69080611917565b90508110156105bf575f6104fd60208801886116b2565b6105079080611917565b8381811061051757610517611600565b905060200201602081019061052c91906114d8565b6040517fd6c0292600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152600160248301529192509085169063d6c02926906044015f604051808303815f87803b15801561059d575f80fd5b505af11580156105af573d5f803e3d5ffd5b50505050508060010190506104cf565b505f6105cb868061162d565b905067ffffffffffffffff8111156105e5576105e56116ee565b60405190808252806020026020018201604052801561060e578160200160208202803683370190505b5090505f5b61061d878061162d565b9050811015610dd0575f610631888061162d565b8381811061064157610641611600565b905060600201803603810190610657919061198f565b90505f8160400151156109e15781516040517f34a7199a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f0000000000000000000000000000000000000000000000000000000000000000909116906334a7199a90602401602060405180830381865afa1580156106f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107169190611697565b905073ffffffffffffffffffffffffffffffffffffffff81166109dc578151604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b1660208201525f60348201819052604882018190528251603c818403018152605c8301938490527f83e85b270000000000000000000000000000000000000000000000000000000090935291927f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16926383e85b27926107f9926001918791016119fd565b6020604051808303815f875af1158015610815573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108399190611697565b6040517fd1a3a3080000000000000000000000000000000000000000000000000000000081525f60048201819052602482015290925073ffffffffffffffffffffffffffffffffffffffff83169063d1a3a308906044015f604051808303815f87803b1580156108a7575f80fd5b505af11580156108b9573d5f803e3d5ffd5b50506040517f82ebd6740000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff851692506382ebd67491506024015f604051808303815f87803b158015610921575f80fd5b505af1158015610933573d5f803e3d5ffd5b50506040517f2e5896e500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152600160248301527f0000000000000000000000000000000000000000000000000000000000000000169250632e5896e591506044015f604051808303815f87803b1580156109c4575f80fd5b505af11580156109d6573d5f803e3d5ffd5b50505050505b610d1e565b81515f90876109f660808d0160608e016114d8565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b8116602083015292841b83166034820152921b166048820152605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f83e85b27000000000000000000000000000000000000000000000000000000008252915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906383e85b2790610ae0905f9060019086906004016119fd565b6020604051808303815f875af1158015610afc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b209190611697565b60208401516040517f8bcd401600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152919350831690638bcd4016906024015f604051808303815f87803b158015610b8e575f80fd5b505af1158015610ba0573d5f803e3d5ffd5b50506040517faf06d3cf0000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff8516925063af06d3cf91506024015f604051808303815f87803b158015610c09575f80fd5b505af1158015610c1b573d5f803e3d5ffd5b50506040517fb4113ba70000000000000000000000000000000000000000000000000000000081526105dc600482015273ffffffffffffffffffffffffffffffffffffffff8516925063b4113ba791506024015f604051808303815f87803b158015610c85575f80fd5b505af1158015610c97573d5f803e3d5ffd5b50506040517fd1a3a3080000000000000000000000000000000000000000000000000000000081525f60048201819052602482015273ffffffffffffffffffffffffffffffffffffffff8516925063d1a3a30891506044015f604051808303815f87803b158015610d06575f80fd5b505af1158015610d18573d5f803e3d5ffd5b50505050505b80848481518110610d3157610d31611600565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517fd6c029260000000000000000000000000000000000000000000000000000000081528282166004820152600160248201529087169063d6c02926906044015f604051808303815f87803b158015610dad575f80fd5b505af1158015610dbf573d5f803e3d5ffd5b505050505050806001019050610613565b505f5b610de06040880188611a3c565b9050811015610f13575f610df76040890189611a3c565b83818110610e0757610e07611600565b905060800201803603810190610e1d9190611ab1565b90505f83826020015181518110610e3657610e36611600565b602002602001015190505f84835f015181518110610e5657610e56611600565b6020908102919091010151604080850151606086015191517f4bca3d5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808516600483015261ffff92831660248301529190921660448301525f606483015291925090831690634bca3d5b906084015f604051808303815f87803b158015610eef575f80fd5b505af1158015610f01573d5f803e3d5ffd5b50505050505050806001019050610dd3565b505f5b81518110156110af57610f29878061162d565b82818110610f3957610f39611600565b9050606002016040016020810190610f519190611b20565b610fee57818181518110610f6757610f67611600565b60209081029190910101516040517f82ebd6740000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff909116906382ebd674906024015f604051808303815f87803b158015610fd7575f80fd5b505af1158015610fe9573d5f803e3d5ffd5b505050505b5f8083838151811061100257611002611600565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f205460ff166110a75760015f8084848151811061104f5761104f611600565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b600101610f16565b506040517fd38bfff40000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff84169063d38bfff4906024015f604051808303815f87803b158015611114575f80fd5b505af1158015611126573d5f803e3d5ffd5b50506001805480820182555f91909152835161116d93507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690910191506020840190611325565b508273ffffffffffffffffffffffffffffffffffffffff167f0a4879b0794dd09b83ac74f0b8970f90a9b5979d00a6342afd6d662f548db7fb826040516111b491906114a2565b60405180910390a291959194509092505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036111f75760015491505b82821080611206575060015482115b1561120f575f80fd5b6112198383611b39565b67ffffffffffffffff811115611231576112316116ee565b60405190808252806020026020018201604052801561126457816020015b606081526020019060019003908161124f5790505b5090505f5b6112738484611b39565b81101561131e576001818154811061128d5761128d611600565b905f5260205f20018054806020026020016040519081016040528092919081815260200182805480156112f457602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116112c9575b505050505082828151811061130b5761130b611600565b6020908102919091010152600101611269565b5092915050565b828054828255905f5260205f2090810192821561139d579160200282015b8281111561139d57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190611343565b506113a99291506113ad565b5090565b5b808211156113a9575f81556001016113ae565b5f81518084525f5b818110156113e5576020818501810151868301820152016113c9565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61143460208301846113c1565b9392505050565b5f6020828403121561144b575f80fd5b5035919050565b5f815180845260208085019450602084015f5b8381101561149757815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611465565b509495945050505050565b602081525f6114346020830184611452565b73ffffffffffffffffffffffffffffffffffffffff811681146114d5575f80fd5b50565b5f602082840312156114e8575f80fd5b8135611434816114b4565b5f60208284031215611503575f80fd5b813567ffffffffffffffff811115611519575f80fd5b820160808185031215611434575f80fd5b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f6115586040830184611452565b949350505050565b5f8060408385031215611571575f80fd5b50508035926020909101359150565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b828110156115f3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526115e1858351611452565b945092850192908501906001016115a7565b5092979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611660575f80fd5b83018035915067ffffffffffffffff82111561167a575f80fd5b6020019150606081023603821315611690575f80fd5b9250929050565b5f602082840312156116a7575f80fd5b8151611434816114b4565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126116e4575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561173e5761173e6116ee565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561178b5761178b6116ee565b604052919050565b5f67ffffffffffffffff8211156117ac576117ac6116ee565b5060051b60200190565b5f82601f8301126117c5575f80fd5b813560206117da6117d583611793565b611744565b82815260069290921b840181019181810190868411156117f8575f80fd5b8286015b848110156118475760408189031215611813575f80fd5b61181b61171b565b8135611826816114b4565b815281850135611835816114b4565b818601528352918301916040016117fc565b509695505050505050565b5f60408236031215611862575f80fd5b61186a61171b565b823567ffffffffffffffff80821115611881575f80fd5b9084019036601f830112611893575f80fd5b813560206118a36117d583611793565b82815260059290921b840181019181810190368411156118c1575f80fd5b948201945b838610156118e85785356118d9816114b4565b825294820194908201906118c6565b865250868101359350828411156118fd575f80fd5b611909368589016117b6565b908501525091949350505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261194a575f80fd5b83018035915067ffffffffffffffff821115611964575f80fd5b6020019150600581901b3603821315611690575f80fd5b8035801515811461198a575f80fd5b919050565b5f6060828403121561199f575f80fd5b6040516060810181811067ffffffffffffffff821117156119c2576119c26116ee565b60405282356119d0816114b4565b815260208301356119e0816114b4565b60208201526119f16040840161197b565b60408201529392505050565b73ffffffffffffffffffffffffffffffffffffffff841681528215156020820152606060408201525f611a3360608301846113c1565b95945050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611a6f575f80fd5b83018035915067ffffffffffffffff821115611a89575f80fd5b6020019150600781901b3603821315611690575f80fd5b803561ffff8116811461198a575f80fd5b5f60808284031215611ac1575f80fd5b6040516080810181811067ffffffffffffffff82111715611ae457611ae46116ee565b80604052508235815260208301356020820152611b0360408401611aa0565b6040820152611b1460608401611aa0565b60608201529392505050565b5f60208284031215611b30575f80fd5b6114348261197b565b81810381811115611b71577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9291505056fea264697066735822122032bd3a7f20ccbc230089a92c0ca32b68d48a7ed658ec7cef56767b265ccc876e64736f6c63430008180033000000000000000000000000f075cc8660b51d0b8a4474e3f47edac5fa034cfb000000000000000000000000c5b9b95a769c24c18c344c2659db61a0adfb736e0000000000000000000000004f51fbd2161fc5e41295b866cb42a08e7ea39a25

    Deployed Bytecode

    0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c8063b3a625eb11610072578063bd145e3e11610058578063bd145e3e146101c5578063e1934a07146101ec578063e536913d14610213575f80fd5b8063b3a625eb14610158578063b45f2d3814610179575f80fd5b806306fdde03146100a357806325da1698146100f55780636aebd5831461011557806390184b0214610126575b5f80fd5b6100df6040518060400160405280600c81526020017f4564676520466163746f7279000000000000000000000000000000000000000081525081565b6040516100ec9190611422565b60405180910390f35b61010861010336600461143b565b610233565b6040516100ec91906114a2565b6001546040519081526020016100ec565b6101486101343660046114d8565b5f6020819052908152604090205460ff1681565b60405190151581526020016100ec565b61016b6101663660046114f3565b6102bb565b6040516100ec92919061152a565b6101a07f0000000000000000000000004f51fbd2161fc5e41295b866cb42a08e7ea39a2581565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ec565b6101a07f000000000000000000000000c5b9b95a769c24c18c344c2659db61a0adfb736e81565b6101a07f000000000000000000000000f075cc8660b51d0b8a4474e3f47edac5fa034cfb81565b610226610221366004611560565b6111c8565b6040516100ec9190611580565b60606001828154811061024857610248611600565b905f5260205f20018054806020026020016040519081016040528092919081815260200182805480156102af57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610284575b50505050509050919050565b5f606060026102ca848061162d565b90501015610304576040517f6435d19f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4c96a3890000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000c5b9b95a769c24c18c344c2659db61a0adfb736e73ffffffffffffffffffffffffffffffffffffffff1690634c96a389906024016020604051808303815f875af115801561038f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b39190611697565b90505f6103c360208601866116b2565b6103cc90611852565b90505f5b8160200151518110156104cc575f826020015182815181106103f4576103f4611600565b602002602001015190508373ffffffffffffffffffffffffffffffffffffffff166306c570c1825f015189606001602081019061043191906114d8565b60208501516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff938416600482015291831660248301529190911660448201526064015f604051808303815f87803b1580156104aa575f80fd5b505af11580156104bc573d5f803e3d5ffd5b50505050508060010190506103d0565b505f5b6104dc60208701876116b2565b6104e69080611917565b90508110156105bf575f6104fd60208801886116b2565b6105079080611917565b8381811061051757610517611600565b905060200201602081019061052c91906114d8565b6040517fd6c0292600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152600160248301529192509085169063d6c02926906044015f604051808303815f87803b15801561059d575f80fd5b505af11580156105af573d5f803e3d5ffd5b50505050508060010190506104cf565b505f6105cb868061162d565b905067ffffffffffffffff8111156105e5576105e56116ee565b60405190808252806020026020018201604052801561060e578160200160208202803683370190505b5090505f5b61061d878061162d565b9050811015610dd0575f610631888061162d565b8381811061064157610641611600565b905060600201803603810190610657919061198f565b90505f8160400151156109e15781516040517f34a7199a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f0000000000000000000000004f51fbd2161fc5e41295b866cb42a08e7ea39a25909116906334a7199a90602401602060405180830381865afa1580156106f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107169190611697565b905073ffffffffffffffffffffffffffffffffffffffff81166109dc578151604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b1660208201525f60348201819052604882018190528251603c818403018152605c8301938490527f83e85b270000000000000000000000000000000000000000000000000000000090935291927f000000000000000000000000f075cc8660b51d0b8a4474e3f47edac5fa034cfb73ffffffffffffffffffffffffffffffffffffffff16926383e85b27926107f9926001918791016119fd565b6020604051808303815f875af1158015610815573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108399190611697565b6040517fd1a3a3080000000000000000000000000000000000000000000000000000000081525f60048201819052602482015290925073ffffffffffffffffffffffffffffffffffffffff83169063d1a3a308906044015f604051808303815f87803b1580156108a7575f80fd5b505af11580156108b9573d5f803e3d5ffd5b50506040517f82ebd6740000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff851692506382ebd67491506024015f604051808303815f87803b158015610921575f80fd5b505af1158015610933573d5f803e3d5ffd5b50506040517f2e5896e500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152600160248301527f0000000000000000000000004f51fbd2161fc5e41295b866cb42a08e7ea39a25169250632e5896e591506044015f604051808303815f87803b1580156109c4575f80fd5b505af11580156109d6573d5f803e3d5ffd5b50505050505b610d1e565b81515f90876109f660808d0160608e016114d8565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b8116602083015292841b83166034820152921b166048820152605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f83e85b27000000000000000000000000000000000000000000000000000000008252915073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f075cc8660b51d0b8a4474e3f47edac5fa034cfb16906383e85b2790610ae0905f9060019086906004016119fd565b6020604051808303815f875af1158015610afc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b209190611697565b60208401516040517f8bcd401600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152919350831690638bcd4016906024015f604051808303815f87803b158015610b8e575f80fd5b505af1158015610ba0573d5f803e3d5ffd5b50506040517faf06d3cf0000000000000000000000000000000000000000000000000000000081526001600482015273ffffffffffffffffffffffffffffffffffffffff8516925063af06d3cf91506024015f604051808303815f87803b158015610c09575f80fd5b505af1158015610c1b573d5f803e3d5ffd5b50506040517fb4113ba70000000000000000000000000000000000000000000000000000000081526105dc600482015273ffffffffffffffffffffffffffffffffffffffff8516925063b4113ba791506024015f604051808303815f87803b158015610c85575f80fd5b505af1158015610c97573d5f803e3d5ffd5b50506040517fd1a3a3080000000000000000000000000000000000000000000000000000000081525f60048201819052602482015273ffffffffffffffffffffffffffffffffffffffff8516925063d1a3a30891506044015f604051808303815f87803b158015610d06575f80fd5b505af1158015610d18573d5f803e3d5ffd5b50505050505b80848481518110610d3157610d31611600565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517fd6c029260000000000000000000000000000000000000000000000000000000081528282166004820152600160248201529087169063d6c02926906044015f604051808303815f87803b158015610dad575f80fd5b505af1158015610dbf573d5f803e3d5ffd5b505050505050806001019050610613565b505f5b610de06040880188611a3c565b9050811015610f13575f610df76040890189611a3c565b83818110610e0757610e07611600565b905060800201803603810190610e1d9190611ab1565b90505f83826020015181518110610e3657610e36611600565b602002602001015190505f84835f015181518110610e5657610e56611600565b6020908102919091010151604080850151606086015191517f4bca3d5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808516600483015261ffff92831660248301529190921660448301525f606483015291925090831690634bca3d5b906084015f604051808303815f87803b158015610eef575f80fd5b505af1158015610f01573d5f803e3d5ffd5b50505050505050806001019050610dd3565b505f5b81518110156110af57610f29878061162d565b82818110610f3957610f39611600565b9050606002016040016020810190610f519190611b20565b610fee57818181518110610f6757610f67611600565b60209081029190910101516040517f82ebd6740000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff909116906382ebd674906024015f604051808303815f87803b158015610fd7575f80fd5b505af1158015610fe9573d5f803e3d5ffd5b505050505b5f8083838151811061100257611002611600565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f205460ff166110a75760015f8084848151811061104f5761104f611600565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b600101610f16565b506040517fd38bfff40000000000000000000000000000000000000000000000000000000081525f600482015273ffffffffffffffffffffffffffffffffffffffff84169063d38bfff4906024015f604051808303815f87803b158015611114575f80fd5b505af1158015611126573d5f803e3d5ffd5b50506001805480820182555f91909152835161116d93507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690910191506020840190611325565b508273ffffffffffffffffffffffffffffffffffffffff167f0a4879b0794dd09b83ac74f0b8970f90a9b5979d00a6342afd6d662f548db7fb826040516111b491906114a2565b60405180910390a291959194509092505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036111f75760015491505b82821080611206575060015482115b1561120f575f80fd5b6112198383611b39565b67ffffffffffffffff811115611231576112316116ee565b60405190808252806020026020018201604052801561126457816020015b606081526020019060019003908161124f5790505b5090505f5b6112738484611b39565b81101561131e576001818154811061128d5761128d611600565b905f5260205f20018054806020026020016040519081016040528092919081815260200182805480156112f457602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116112c9575b505050505082828151811061130b5761130b611600565b6020908102919091010152600101611269565b5092915050565b828054828255905f5260205f2090810192821561139d579160200282015b8281111561139d57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190611343565b506113a99291506113ad565b5090565b5b808211156113a9575f81556001016113ae565b5f81518084525f5b818110156113e5576020818501810151868301820152016113c9565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61143460208301846113c1565b9392505050565b5f6020828403121561144b575f80fd5b5035919050565b5f815180845260208085019450602084015f5b8381101561149757815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611465565b509495945050505050565b602081525f6114346020830184611452565b73ffffffffffffffffffffffffffffffffffffffff811681146114d5575f80fd5b50565b5f602082840312156114e8575f80fd5b8135611434816114b4565b5f60208284031215611503575f80fd5b813567ffffffffffffffff811115611519575f80fd5b820160808185031215611434575f80fd5b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f6115586040830184611452565b949350505050565b5f8060408385031215611571575f80fd5b50508035926020909101359150565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b828110156115f3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526115e1858351611452565b945092850192908501906001016115a7565b5092979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611660575f80fd5b83018035915067ffffffffffffffff82111561167a575f80fd5b6020019150606081023603821315611690575f80fd5b9250929050565b5f602082840312156116a7575f80fd5b8151611434816114b4565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126116e4575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561173e5761173e6116ee565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561178b5761178b6116ee565b604052919050565b5f67ffffffffffffffff8211156117ac576117ac6116ee565b5060051b60200190565b5f82601f8301126117c5575f80fd5b813560206117da6117d583611793565b611744565b82815260069290921b840181019181810190868411156117f8575f80fd5b8286015b848110156118475760408189031215611813575f80fd5b61181b61171b565b8135611826816114b4565b815281850135611835816114b4565b818601528352918301916040016117fc565b509695505050505050565b5f60408236031215611862575f80fd5b61186a61171b565b823567ffffffffffffffff80821115611881575f80fd5b9084019036601f830112611893575f80fd5b813560206118a36117d583611793565b82815260059290921b840181019181810190368411156118c1575f80fd5b948201945b838610156118e85785356118d9816114b4565b825294820194908201906118c6565b865250868101359350828411156118fd575f80fd5b611909368589016117b6565b908501525091949350505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261194a575f80fd5b83018035915067ffffffffffffffff821115611964575f80fd5b6020019150600581901b3603821315611690575f80fd5b8035801515811461198a575f80fd5b919050565b5f6060828403121561199f575f80fd5b6040516060810181811067ffffffffffffffff821117156119c2576119c26116ee565b60405282356119d0816114b4565b815260208301356119e0816114b4565b60208201526119f16040840161197b565b60408201529392505050565b73ffffffffffffffffffffffffffffffffffffffff841681528215156020820152606060408201525f611a3360608301846113c1565b95945050505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611a6f575f80fd5b83018035915067ffffffffffffffff821115611a89575f80fd5b6020019150600781901b3603821315611690575f80fd5b803561ffff8116811461198a575f80fd5b5f60808284031215611ac1575f80fd5b6040516080810181811067ffffffffffffffff82111715611ae457611ae46116ee565b80604052508235815260208301356020820152611b0360408401611aa0565b6040820152611b1460608401611aa0565b60608201529392505050565b5f60208284031215611b30575f80fd5b6114348261197b565b81810381811115611b71577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9291505056fea264697066735822122032bd3a7f20ccbc230089a92c0ca32b68d48a7ed658ec7cef56767b265ccc876e64736f6c63430008180033

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

    000000000000000000000000f075cc8660b51d0b8a4474e3f47edac5fa034cfb000000000000000000000000c5b9b95a769c24c18c344c2659db61a0adfb736e0000000000000000000000004f51fbd2161fc5e41295b866cb42a08e7ea39a25

    -----Decoded View---------------
    Arg [0] : _eVaultFactory (address): 0xF075cC8660B51D0b8a4474e3f47eDAC5fA034cFB
    Arg [1] : _eulerRouterFactory (address): 0xc5b9B95a769C24c18c344c2659db61a0AdFB736E
    Arg [2] : _escrowedCollateralPerspective (address): 0x4f51FbD2161FC5e41295b866cB42A08e7eA39a25

    -----Encoded View---------------
    3 Constructor Arguments found :
    Arg [0] : 000000000000000000000000f075cc8660b51d0b8a4474e3f47edac5fa034cfb
    Arg [1] : 000000000000000000000000c5b9b95a769c24c18c344c2659db61a0adfb736e
    Arg [2] : 0000000000000000000000004f51fbd2161fc5e41295b866cb42a08e7ea39a25


    Block Age Transaction Gas Used Reward
    view all blocks ##produced##

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

    Validator Index Block Age Amount
    View All Withdrawals

    Transaction Hash Block Age Value Eth2 PubKey Valid
    View All Deposits

    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.