ETH Price: $2,925.38 (-9.74%)
Gas: 17 Gwei

Contract

0x21b1FC8A52f179757bf555346130bF27c0C2A17A
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Create New Vault...202197912024-07-02 15:41:472 days ago1719934907IN
0x21b1FC8A...7c0C2A17A
0 ETH0.031849019.34904158
Create New Vault...202197842024-07-02 15:40:232 days ago1719934823IN
0x21b1FC8A...7c0C2A17A
0 ETH0.029679258.64837427
Create New Vault...202197772024-07-02 15:38:592 days ago1719934739IN
0x21b1FC8A...7c0C2A17A
0 ETH0.027719228.19913961
Create New Vault...202197572024-07-02 15:34:592 days ago1719934499IN
0x21b1FC8A...7c0C2A17A
0 ETH0.026997747.95431898
Create New Vault...202077992024-06-30 23:30:114 days ago1719790211IN
0x21b1FC8A...7c0C2A17A
0 ETH0.010319123
Create New Vault...201926272024-06-28 20:38:596 days ago1719607139IN
0x21b1FC8A...7c0C2A17A
0 ETH0.008594211.94789562
Create New Vault...200138172024-06-03 20:56:1131 days ago1717448171IN
0x21b1FC8A...7c0C2A17A
0 ETH0.033629149.87478968
Create New Vault...199735362024-05-29 5:49:2336 days ago1716961763IN
0x21b1FC8A...7c0C2A17A
0 ETH0.065456378.75073144
Create New Vault...199699032024-05-28 17:37:2337 days ago1716917843IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0741353521.06264099
Create New Vault...199699012024-05-28 17:36:5937 days ago1716917819IN
0x21b1FC8A...7c0C2A17A
0 ETH0.07571720.9147924
Create New Vault...199698902024-05-28 17:34:4737 days ago1716917687IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0561662415.90067585
Create New Vault...199698852024-05-28 17:33:4737 days ago1716917627IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0661404418.85851275
Create New Vault...198915602024-05-17 18:45:2348 days ago1715971523IN
0x21b1FC8A...7c0C2A17A
0 ETH0.01468864.31312877
Create New Vault...197379622024-04-26 7:10:4769 days ago1714115447IN
0x21b1FC8A...7c0C2A17A
0 ETH0.02806127.98040372
Create New Vault...197379542024-04-26 7:09:1169 days ago1714115351IN
0x21b1FC8A...7c0C2A17A
0 ETH0.030314637.93971683
Create New Vault...196508982024-04-14 2:47:5982 days ago1713062879IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0710712511.28169843
Create New Vault...196268692024-04-10 17:58:2385 days ago1712771903IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0705684420.90990122
Create New Vault...196268582024-04-10 17:56:1185 days ago1712771771IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0740680820.49717756
Create New Vault...190939942024-01-26 23:17:23160 days ago1706311043IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0451944612.69464182
Create New Vault...187645042023-12-11 17:39:11206 days ago1702316351IN
0x21b1FC8A...7c0C2A17A
0 ETH0.2369938539.44345276
Create New Vault...187565112023-12-10 14:49:35207 days ago1702219775IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0844690625.80050288
Create New Vault...187563742023-12-10 14:22:11207 days ago1702218131IN
0x21b1FC8A...7c0C2A17A
0 ETH0.094450422.89867692
Create New Vault...187563702023-12-10 14:21:23207 days ago1702218083IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0760026622.85182814
Create New Vault...187563632023-12-10 14:19:59207 days ago1702217999IN
0x21b1FC8A...7c0C2A17A
0 ETH0.0758123922.54606862
Create New Vault...187318692023-12-07 3:54:59211 days ago1701921299IN
0x21b1FC8A...7c0C2A17A
0 ETH0.1133817933.8350916
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurveGlobal

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
File 1 of 1 : CurveGlobal.sol
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.15;
pragma experimental ABIEncoderV2;

enum VaultType {
    LEGACY,
    DEFAULT,
    AUTOMATED
}

interface IDetails {
    // get details from curve
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);
}

interface IGaugeController {
    // check if gauge has weight
    function get_gauge_weight(address) external view returns (uint256);
}

interface IVoter {
    // get details from our curve voter
    function strategy() external view returns (address);
}

interface IProxy {
    function approveStrategy(address gauge, address strategy) external;

    function strategies(address gauge) external view returns (address);
}

interface IRegistry {
    function newVault(
        address _token,
        address _governance,
        address _guardian,
        address _rewards,
        string calldata _name,
        string calldata _symbol,
        uint256 _releaseDelta,
        uint256 _type
    ) external returns (address);

    function latestVaultOfType(
        address token,
        uint256 _type
    ) external view returns (address);
}

interface IPoolManager {
    function addPool(address _gauge) external returns (bool);
}

interface IPoolRegistry {
    function poolInfo(
        uint256 _pid
    )
        external
        view
        returns (
            address implementation,
            address stakingAddress,
            address stakingToken,
            address rewardsAddress,
            uint8 isActive
        );

    function poolLength() external view returns (uint256);
}

interface IStakingToken {
    function convexPoolId() external view returns (uint256);
}

interface ICurveGauge {
    function deposit(uint256) external;

    function balanceOf(address) external view returns (uint256);

    function withdraw(uint256) external;

    function claim_rewards() external;

    function reward_tokens(uint256) external view returns (address); //v2

    function rewarded_token() external view returns (address); //v1

    function lp_token() external view returns (address);
}

interface IStrategy {
    function cloneStrategyConvex(
        address _vault,
        address _strategist,
        address _rewards,
        address _keeper,
        address _tradeFactory,
        uint256 _pid,
        uint256 _harvestProfitMinInUsdc,
        uint256 _harvestProfitMaxInUsdc,
        address _booster,
        address _convexToken
    ) external returns (address newStrategy);

    function cloneStrategyCurveBoosted(
        address _vault,
        address _strategist,
        address _rewards,
        address _keeper,
        address _tradeFactory,
        address _proxy,
        address _gauge
    ) external returns (address newStrategy);

    function cloneStrategyConvexFrax(
        address _vault,
        address _strategist,
        address _rewards,
        address _keeper,
        address _tradeFactory,
        uint256 _fraxPid,
        address _stakingAddress,
        uint256 _harvestProfitMinInUsdc,
        uint256 _harvestProfitMaxInUsdc,
        address _booster
    ) external returns (address newStrategy);

    function setVoter(address _curveVoter) external;

    function setVoters(address _curveVoter, address _convexVoter) external;

    function setVoters(
        address _curveVoter,
        address _convexVoter,
        address _fxsVoter
    ) external;

    function setLocalKeepCrvs(
        uint256 _keepCrv,
        uint256 _keepCvx,
        uint256 _keepFxs
    ) external;

    function setLocalKeepCrvs(uint256 _keepCrv, uint256 _keepCvx) external;

    function setLocalKeepCrv(uint256 _keepCrv) external;

    function setHealthCheck(address) external;

    function setBaseFeeOracle(address) external;
}

interface IBooster {
    function gaugeMap(address) external view returns (bool);

    // deposit into convex, receive a tokenized deposit.  parameter to stake immediately (we always do this).
    function deposit(
        uint256 _pid,
        uint256 _amount,
        bool _stake
    ) external returns (bool);

    // burn a tokenized deposit (Convex deposit tokens) to receive curve lp tokens back
    function withdraw(uint256 _pid, uint256 _amount) external returns (bool);

    function poolLength() external view returns (uint256);

    // give us info about a pool based on its pid
    function poolInfo(
        uint256
    ) external view returns (address, address, address, address, address, bool);
}

interface Vault {
    function setGovernance(address) external;

    function setManagement(address) external;

    function managementFee() external view returns (uint256);

    function setManagementFee(uint256) external;

    function performanceFee() external view returns (uint256);

    function setPerformanceFee(uint256) external;

    function setDepositLimit(uint256) external;

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

contract CurveGlobal {
    event NewAutomatedVault(
        uint256 indexed category,
        address indexed lpToken,
        address gauge,
        address indexed vault,
        address convexStrategy,
        address curveStrategy,
        address convexFraxStrategy
    );

    /* ========== STATE VARIABLES ========== */

    /// @notice This is a list of all vaults deployed by this factory.
    address[] public deployedVaults;

    /// @notice This is specific to the protocol we are deploying automated vaults for.
    /// @dev 0 for curve, 1 for balancer. This is a subcategory within our vault type AUTOMATED on the registry.
    uint256 public constant CATEGORY = 0;

    /// @notice Owner of the factory.
    address public owner;

    // @notice Pending owner of the factory.
    /// @dev Must accept before becoming owner.
    address public pendingOwner;

    /// @notice Address of our Convex token.
    address public constant CVX = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B;

    /// @notice Address of our Convex pool manager.
    /// @dev Used to add new pools to Convex.
    address public convexPoolManager =
        0xD1f9b3de42420A295C33c07aa5C9e04eDC6a4447;

    /// @notice Address of our Convex Frax pool registry.
    /// @dev Used to determine if a Convex pool has a Convex Frax pool.
    address public convexFraxPoolRegistry =
        0x41a5881c17185383e19Df6FA4EC158a6F4851A69;

    /// @notice Yearn's vault registry address.
    IRegistry public registry;

    /// @notice Address of Convex's deposit contract, aka booster.
    IBooster public booster =
        IBooster(0xF403C135812408BFbE8713b5A23a04b3D48AAE31);

    /// @notice Address of Convex's Frax booster.
    IBooster public fraxBooster =
        IBooster(0x569f5B842B5006eC17Be02B8b94510BA8e79FbCa);

    /// @notice Address to use for vault governance.
    address public governance = 0xFEB4acf3df3cDEA7399794D0869ef76A6EfAff52;

    /// @notice Address to use for vault management.
    address public management = 0x16388463d60FFE0661Cf7F1f31a7D658aC790ff7;

    /// @notice Address to use for vault guardian.
    address public guardian = 0x846e211e8ba920B353FB717631C015cf04061Cc9;

    /// @notice Address to use for vault and strategy rewards.
    address public treasury = 0x93A62dA5a14C80f265DAbC077fCEE437B1a0Efde;

    /// @notice Address to use for strategy keepers.
    address public keeper = 0x256e6a486075fbAdbB881516e9b6b507fd082B5D;

    /// @notice Address to use for strategy health check.
    address public healthCheck = 0xDDCea799fF1699e98EDF118e0629A974Df7DF012;

    /// @notice Address to use for strategy trade factory.
    address public tradeFactory = 0xd6a8ae62f4d593DAf72E2D7c9f7bDB89AB069F06;

    /// @notice Address to use for our network's base fee oracle.
    address public baseFeeOracle = 0x1E7eFAbF282614Aa2543EDaA50517ef5a23c868b;

    /// @notice Address of our Convex strategy implementation.
    /// @dev If zero address, then factory will produce vaults with only Curve strategies.
    address public convexStratImplementation;

    /// @notice Address of our Curve strategy implementation.
    /// @dev This cannot be zero address for Curve vaults.
    address public curveStratImplementation;

    /// @notice Address of our Convex Frax strategy implementation.
    /// @dev If zero address, then factory will produce vaults without Convex Frax strategies.
    address public convexFraxStratImplementation;

    /// @notice The percentage of CRV we re-lock for boost (in basis points). Default is 0%.
    uint256 public keepCRV;

    /// @notice The address of our Curve voter. This is where we send any keepCRV.
    address public curveVoter = 0xF147b8125d2ef93FB6965Db97D6746952a133934;

    /// @notice The percentage of CVX we re-lock (in basis points). Default is 0%.
    uint256 public keepCVX;

    /// @notice The address of our Convex voter. This is where we send any keepCVX.
    address public convexVoter;

    /// @notice The percentage of FXS we re-lock for boost (in basis points). Default is 0%.
    uint256 public keepFXS;

    /// @notice The address of our Frax voter. This is where we send any keepFXS.
    address public fraxVoter;

    /// @notice Minimum profit size in USDC that we want to harvest.
    uint256 public harvestProfitMinInUsdc = 7_500 * 1e6;

    /// @notice Maximum profit size in USDC that we want to harvest (ignore gas price once we get here).
    uint256 public harvestProfitMaxInUsdc = 100_000 * 1e6;

    /// @notice Default performance fee for our factory vaults (in basis points).
    uint256 public performanceFee = 1_000;

    /// @notice Default management fee for our factory vaults (in basis points).
    uint256 public managementFee = 0;

    /// @notice Default deposit limit on our factory vaults. Set to a large number.
    uint256 public depositLimit = 10_000_000_000_000 * 1e18;

    /* ========== CONSTRUCTOR ========== */

    constructor(
        address _registry,
        address _convexStratImplementation,
        address _curveStratImplementation,
        address _convexFraxStratImplementation,
        address _owner
    ) {
        registry = IRegistry(_registry);
        convexStratImplementation = _convexStratImplementation;
        curveStratImplementation = _curveStratImplementation;
        convexFraxStratImplementation = _convexFraxStratImplementation;
        owner = _owner;
        pendingOwner = _owner;
    }

    /* ========== STATE VARIABLE SETTERS ========== */

    /// @notice Set the new owner of the factory.
    /// @dev Must be called by current owner.
    ///  New owner will have to accept before transition is complete.
    /// @param newOwner Address of new owner.
    function setOwner(address newOwner) external {
        if (msg.sender != owner) {
            revert();
        }
        pendingOwner = newOwner;
    }

    /// @notice Accept ownership of the factory.
    /// @dev Must be called by pending owner.
    function acceptOwner() external {
        if (msg.sender != pendingOwner) {
            revert();
        }
        owner = pendingOwner;
    }

    /// @notice Set the convex pool manager address for the factory.
    /// @dev Must be called by owner.
    /// @param _convexPoolManager Address of convex pool manager.
    function setConvexPoolManager(address _convexPoolManager) external {
        if (msg.sender != owner) {
            revert();
        }
        convexPoolManager = _convexPoolManager;
    }

    /// @notice Set the convex frax pool registry address for the factory.
    /// @dev Must be called by owner.
    /// @param _convexFraxPoolRegistry Address of convex frax pool registry.
    function setConvexFraxPoolRegistry(
        address _convexFraxPoolRegistry
    ) external {
        if (msg.sender != owner) {
            revert();
        }
        convexFraxPoolRegistry = _convexFraxPoolRegistry;
    }

    /// @notice Set the yearn vault registry address for the factory.
    /// @dev Must be called by owner.
    /// @param _registry Address of yearn vault registry.
    function setRegistry(address _registry) external {
        if (msg.sender != owner) {
            revert();
        }
        registry = IRegistry(_registry);
    }

    /// @notice Set the convex booster address for the factory.
    /// @dev Must be called by owner.
    /// @param _booster Address of convex booster.
    function setBooster(address _booster) external {
        if (msg.sender != owner) {
            revert();
        }
        booster = IBooster(_booster);
    }

    /// @notice Set the convex frax booster address for the factory.
    /// @dev Must be called by owner.
    /// @param _fraxBooster Address of convex frax booster.
    function setFraxBooster(address _fraxBooster) external {
        if (msg.sender != owner) {
            revert();
        }
        fraxBooster = IBooster(_fraxBooster);
    }

    /// @notice Set the vault governance address for the factory.
    /// @dev Must be called by owner.
    /// @param _governance Address of default vault governance.
    function setGovernance(address _governance) external {
        if (msg.sender != owner) {
            revert();
        }
        governance = _governance;
    }

    /// @notice Set the vault management address for the factory.
    /// @dev Must be called by owner.
    /// @param _management Address of default vault management.
    function setManagement(address _management) external {
        if (msg.sender != owner) {
            revert();
        }
        management = _management;
    }

    /// @notice Set the vault guardian address for the factory.
    /// @dev Must be called by owner.
    /// @param _guardian Address of default vault guardian.
    function setGuardian(address _guardian) external {
        if (msg.sender != owner) {
            revert();
        }
        guardian = _guardian;
    }

    /// @notice Set the vault treasury/rewards address for the factory.
    /// @dev Must be called by owner. Vault rewards will flow here.
    /// @param _treasury Address of default vault rewards.
    function setTreasury(address _treasury) external {
        if (msg.sender != owner) {
            revert();
        }
        treasury = _treasury;
    }

    /// @notice Set the vault keeper address for the factory.
    /// @dev Must be called by owner or management.
    /// @param _keeper Address of default vault keeper.
    function setKeeper(address _keeper) external {
        if (!(msg.sender == owner || msg.sender == management)) {
            revert();
        }
        keeper = _keeper;
    }

    /// @notice Set the vault health check address for the factory.
    /// @dev Must be called by owner or management. Health check contracts
    ///  ensure that harvest profits are within expected limits before executing.
    /// @param _health Address of default health check contract.
    function setHealthcheck(address _health) external {
        if (!(msg.sender == owner || msg.sender == management)) {
            revert();
        }
        healthCheck = _health;
    }

    /// @notice Set the strategy trade factory address for the factory.
    /// @dev Must be called by owner.
    /// @param _tradeFactory Address of default trade factory for strategies.
    function setTradeFactory(address _tradeFactory) external {
        if (msg.sender != owner) {
            revert();
        }
        tradeFactory = _tradeFactory;
    }

    /// @notice Set the strategy base fee oracle address for the factory.
    /// @dev Must be called by owner or management. Oracle passes current network base
    ///  fee so strategy can avoid harvesting during periods of network congestion.
    /// @param _baseFeeOracle Address of default base fee oracle for strategies.
    function setBaseFeeOracle(address _baseFeeOracle) external {
        if (!(msg.sender == owner || msg.sender == management)) {
            revert();
        }
        baseFeeOracle = _baseFeeOracle;
    }

    /// @notice Set the vault deposit limit for the factory.
    /// @dev Must be called by owner or management.
    /// @param _depositLimit Default deposit limit for vaults created by factory.
    function setDepositLimit(uint256 _depositLimit) external {
        if (!(msg.sender == owner || msg.sender == management)) {
            revert();
        }
        depositLimit = _depositLimit;
    }

    /// @notice Set the Convex strategy implementation address.
    /// @dev Must be called by owner.
    /// @param _convexStratImplementation Address of latest Convex strategy implementation.
    function setConvexStratImplementation(
        address _convexStratImplementation
    ) external {
        if (msg.sender != owner) {
            revert();
        }
        convexStratImplementation = _convexStratImplementation;
    }

    /// @notice Set the Curve boosted strategy implementation address.
    /// @dev Must be called by owner.
    /// @param _curveStratImplementation Address of latest Curve boosted strategy implementation.
    function setCurveStratImplementation(
        address _curveStratImplementation
    ) external {
        if (msg.sender != owner) {
            revert();
        }
        curveStratImplementation = _curveStratImplementation;
    }

    /// @notice Set the Convex Frax strategy implementation address.
    /// @dev Must be called by owner.
    /// @param _convexFraxStratImplementation Address of latest Convex Frax strategy implementation.
    function setConvexFraxStratImplementation(
        address _convexFraxStratImplementation
    ) external {
        if (msg.sender != owner) {
            revert();
        }
        convexFraxStratImplementation = _convexFraxStratImplementation;
    }

    /// @notice Direct a specified percentage of CRV from every harvest to Yearn's CRV voter.
    /// @dev Must be called by owner.
    /// @param _keepCRV The percentage of CRV from each harvest that we send to our voter (out of 10,000).
    /// @param _curveVoter The address of our Curve voter. This is where we send any keepCRV.
    function setKeepCRV(uint256 _keepCRV, address _curveVoter) external {
        if (msg.sender != owner) {
            revert();
        }
        if (_keepCRV > 10_000) {
            revert();
        }

        // since we use the voter to pull our strategyProxy, can't be zero address
        if (_curveVoter == address(0)) {
            revert();
        }

        keepCRV = _keepCRV;
        curveVoter = _curveVoter;
    }

    /// @notice Direct a specified percentage of CVX from every harvest to Yearn's CVX voter.
    /// @dev Must be called by owner.
    /// @param _keepCVX The percentage of CVX from each harvest that we send to our voter (out of 10,000).
    /// @param _convexVoter The address of our Convex voter. This is where we send any keepCVX.
    function setKeepCVX(uint256 _keepCVX, address _convexVoter) external {
        if (msg.sender != owner) {
            revert();
        }
        if (_keepCVX > 10_000) {
            revert();
        }
        if (_keepCVX > 0) {
            if (_convexVoter == address(0)) {
                revert();
            }
        }

        keepCVX = _keepCVX;
        convexVoter = _convexVoter;
    }

    /// @notice Direct a specified percentage of FXS from every harvest to Yearn's FXS voter.
    /// @dev Must be called by owner.
    /// @param _keepFXS The percentage of FXS from each harvest that we send to our voter (out of 10,000).
    /// @param _fraxVoter The address of our Frax voter. This is where we send any keepFXS.
    function setKeepFXS(uint256 _keepFXS, address _fraxVoter) external {
        if (msg.sender != owner) {
            revert();
        }
        if (_keepFXS > 10_000) {
            revert();
        }
        if (_keepFXS > 0) {
            if (_fraxVoter == address(0)) {
                revert();
            }
        }

        keepFXS = _keepFXS;
        fraxVoter = _fraxVoter;
    }

    /// @notice Set the minimum amount of USDC profit required to harvest.
    /// @dev harvestTrigger will show true once we reach this amount of profit and gas price is acceptable.
    ///  Must be called by owner or management.
    /// @param _harvestProfitMinInUsdc Amount of USDC needed (6 decimals).
    function setHarvestProfitMinInUsdc(
        uint256 _harvestProfitMinInUsdc
    ) external {
        if (!(msg.sender == owner || msg.sender == management)) {
            revert();
        }
        harvestProfitMinInUsdc = _harvestProfitMinInUsdc;
    }

    /// @notice Set the amount of USDC profit that will force a harvest.
    /// @dev harvestTrigger will show true once we reach this amount of profit no matter the gas price.
    ///  Must be called by owner or management.
    /// @param _harvestProfitMaxInUsdc Amount of USDC needed (6 decimals).
    function setHarvestProfitMaxInUsdc(
        uint256 _harvestProfitMaxInUsdc
    ) external {
        if (!(msg.sender == owner || msg.sender == management)) {
            revert();
        }
        harvestProfitMaxInUsdc = _harvestProfitMaxInUsdc;
    }

    /// @notice Set the performance fee (percentage of profit) deducted from each harvest.
    /// @dev Must be called by owner. Fees are collected as minted vault shares.
    ///  Default amount is 10%.
    /// @param _performanceFee The percentage of profit from each harvest that is sent to treasury (out of 10,000).
    function setPerformanceFee(uint256 _performanceFee) external {
        if (msg.sender != owner) {
            revert();
        }
        if (_performanceFee > 5_000) {
            revert();
        }
        performanceFee = _performanceFee;
    }

    /// @notice Set the management fee (as a percentage of TVL) assessed on factory vaults.
    /// @dev Must be called by owner. Fees are collected as minted vault shares on each harvest.
    ///  Default amount is 0%.
    /// @param _managementFee The percentage fee assessed on TVL (out of 10,000).
    function setManagementFee(uint256 _managementFee) external {
        if (msg.sender != owner) {
            revert();
        }
        if (_managementFee > 1_000) {
            revert();
        }
        managementFee = _managementFee;
    }

    /* ========== VIEWS ========== */

    /// @notice View all vault addresses deployed by this factory.
    /// @return Array of all deployed factory vault addresses.
    function allDeployedVaults() external view returns (address[] memory) {
        return deployedVaults;
    }

    /// @notice Number of vaults deployed by this factory.
    /// @return Number of vaults deployed by this factory.
    function numVaults() external view returns (uint256) {
        return deployedVaults.length;
    }

    /// @notice Check whether, for a given gauge address, it is possible to permissionlessly
    ///  create a vault for corresponding LP token.
    /// @param _gauge The gauge address to check.
    /// @return Whether or not vault can be created permissionlessly.
    function canCreateVaultPermissionlessly(
        address _gauge
    ) public view returns (bool) {
        return latestStandardVaultFromGauge(_gauge) == address(0);
    }

    /// @notice Check for the latest vault address for any LEGACY/DEFAULT/AUTOMATED type vaults.
    ///  If no vault of either LEGACY, DEFAULT, or AUTOMATED types exists for this gauge, 0x0 is returned from registry.
    /// @param _gauge The gauge to use to check for any existing vaults.
    /// @return The latest standard vault address for the specified gauge.
    function latestStandardVaultFromGauge(
        address _gauge
    ) public view returns (address) {
        address lptoken = ICurveGauge(_gauge).lp_token();
        address latest;

        // we only care about types 0-2 here, so enforce that
        for (uint256 i; i < 3; ++i) {
            latest = registry.latestVaultOfType(lptoken, i);
            if (latest != address(0)) {
                break;
            }
        }
        return latest;
    }

    /// @notice Check if our strategy proxy has already approved a strategy for a given gauge.
    /// @dev Because this pulls our latest proxy from the voter, be careful if ever updating our curve voter,
    ///  though in reality our curve voter should always stay the same.
    /// @param _gauge The gauge address to check on our strategy proxy.
    /// @return Whether or not gauge already has a curve voter strategy setup.
    function doesStrategyProxyHaveGauge(
        address _gauge
    ) public view returns (bool) {
        address strategyProxy = getProxy();
        return IProxy(strategyProxy).strategies(_gauge) != address(0);
    }

    /// @notice Find the Convex pool id (pid) for a given Curve gauge.
    /// @dev Will return max uint if no pid exists for a gauge.
    /// @param _gauge The gauge address to check.
    /// @return pid The Convex pool id for the specified Curve gauge.
    function getPid(address _gauge) public view returns (uint256 pid) {
        IBooster _booster = booster;
        if (!_booster.gaugeMap(_gauge)) {
            return type(uint256).max;
        }

        for (uint256 i = _booster.poolLength(); i > 0; --i) {
            //we start at the end and work back for most recent
            (, , address gauge, , , ) = _booster.poolInfo(i - 1);

            if (_gauge == gauge) {
                return i - 1;
            }
        }
    }

    /// @notice Check if a Convex pid is also available on Convex Frax.
    /// @dev Try-catch may appear as reverts in some dev envs.
    /// @param _convexPid The Convex pid to check.
    /// @return hasFraxPool Whether or not the given Convex pid also has a Convex Frax pool.
    /// @return convexFraxPid For Convex Frax pools, their assigned Convex Frax pid.
    /// @return stakingAddress For Convex Frax pools, their pool staking address.
    function getFraxInfo(
        uint256 _convexPid
    )
        public
        view
        returns (
            bool hasFraxPool,
            uint256 convexFraxPid,
            address stakingAddress
        )
    {
        IPoolRegistry _convexFraxPoolRegistry = IPoolRegistry(
            convexFraxPoolRegistry
        );
        for (uint256 i = _convexFraxPoolRegistry.poolLength(); i > 0; --i) {
            // we start at the end and work back for most recent
            (
                ,
                address _stakingAddress,
                address stakingToken,
                ,
                uint8 isActive
            ) = _convexFraxPoolRegistry.poolInfo(i - 1);
            if (isActive == 0) {
                // pool isn't active, skip
                continue;
            }

            // check the convex pool pid for this frax pool pid. some staking tokens don't have this view
            try IStakingToken(stakingToken).convexPoolId() returns (
                uint256 currentPoolConvexPid
            ) {
                if (_convexPid == currentPoolConvexPid) {
                    return (true, (i - 1), _stakingAddress);
                }
            } catch {}
        }
    }

    /// @notice Check our current Curve strategy proxy via our Curve voter.
    /// @return proxy Address of our current Curve strategy proxy.
    function getProxy() public view returns (address proxy) {
        proxy = IVoter(curveVoter).strategy();
    }

    /* ========== CORE FUNCTIONS ========== */

    /// @notice Deploy a factory Curve vault for a given Curve gauge.
    /// @dev Permissioned users may set custom name and symbol or deploy if a legacy version already exists.
    ///  Must be called by owner or management.
    /// @param _gauge Address of the Curve gauge to deploy a new vault for.
    /// @param _name Name of the new vault.
    /// @param _symbol Symbol of the new vault token.
    /// @return vault Address of the new vault.
    /// @return convexStrategy Address of the vault's Convex strategy, if created.
    /// @return curveStrategy Address of the vault's Curve boosted strategy.
    /// @return convexFraxStrategy Address of the vault's Convex Frax strategy, if created.
    function createNewVaultsAndStrategiesPermissioned(
        address _gauge,
        string memory _name,
        string memory _symbol
    )
        external
        returns (
            address vault,
            address convexStrategy,
            address curveStrategy,
            address convexFraxStrategy
        )
    {
        if (!(msg.sender == owner || msg.sender == management)) {
            revert();
        }

        return _createNewVaultsAndStrategies(_gauge, true, _name, _symbol);
    }

    /// @notice Deploy a factory Curve vault for a given Curve gauge permissionlessly.
    /// @dev This may be called by anyone. Note that if a vault already exists for the given gauge,
    ///  then this call will revert.
    /// @param _gauge Address of the Curve gauge to deploy a new vault for.
    /// @return vault Address of the new vault.
    /// @return convexStrategy Address of the vault's Convex strategy, if created.
    /// @return curveStrategy Address of the vault's Curve boosted strategy.
    /// @return convexFraxStrategy Address of the vault's Convex Frax strategy, if created.
    function createNewVaultsAndStrategies(
        address _gauge
    )
        external
        returns (
            address vault,
            address convexStrategy,
            address curveStrategy,
            address convexFraxStrategy
        )
    {
        return
            _createNewVaultsAndStrategies(_gauge, false, "default", "default");
    }

    // create a new vault along with strategies to match
    function _createNewVaultsAndStrategies(
        address _gauge,
        bool _permissionedUser,
        string memory _name,
        string memory _symbol
    )
        internal
        returns (
            address vault,
            address convexStrategy,
            address curveStrategy,
            address convexFraxStrategy
        )
    {
        // a curve gauge must have weight for a vault to be deployed
        IGaugeController gaugeController = IGaugeController(
            0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB
        );
        require(
            gaugeController.get_gauge_weight(_gauge) > 0,
            "Gauge must have weight"
        );

        // if a legacy vault already exists, only permissioned users can deploy another
        if (!_permissionedUser) {
            require(
                canCreateVaultPermissionlessly(_gauge),
                "Vault already exists"
            );
        }
        address lptoken = ICurveGauge(_gauge).lp_token();

        // make sure we don't already have a curve strategy setup for this gauge
        require(
            !doesStrategyProxyHaveGauge(_gauge),
            "Voter strategy already exists"
        );

        // get convex pid. if no pid create one
        uint256 pid = getPid(_gauge);
        if (pid == type(uint256).max) {
            //when we add the new pool it will be added to the end of the pools in convexDeposit.
            pid = booster.poolLength();
            //add pool
            require(
                IPoolManager(convexPoolManager).addPool(_gauge),
                "Unable to add pool to Convex"
            );
        }

        if (_permissionedUser) {
            // allow trusted users to input the name and symbol or deploy a factory version of a legacy vault
            vault = _createCustomVault(lptoken, _name, _symbol);
        } else {
            // anyone can create a vault, but it will have an auto-generated name and symbol
            vault = _createStandardVault(lptoken);
        }

        // setup our fees, deposit limit, gov, etc
        _setupVaultParams(vault);

        // setup our strategies as needed
        (convexStrategy, curveStrategy, convexFraxStrategy) = _setupStrategies(
            vault,
            _gauge,
            pid
        );

        emit NewAutomatedVault(
            CATEGORY,
            lptoken,
            _gauge,
            vault,
            convexStrategy,
            curveStrategy,
            convexFraxStrategy
        );
    }

    // permissioned users may pass custom name and symbol inputs
    function _createCustomVault(
        address lptoken,
        string memory _name,
        string memory _symbol
    ) internal returns (address vault) {
        vault = registry.newVault(
            lptoken,
            address(this),
            guardian,
            treasury,
            _name,
            _symbol,
            0,
            uint256(VaultType.AUTOMATED)
        );
    }

    // standard vaults create default name and symbols using on-chain data
    function _createStandardVault(
        address lptoken
    ) internal returns (address vault) {
        vault = registry.newVault(
            lptoken,
            address(this),
            guardian,
            treasury,
            string(
                abi.encodePacked(
                    "Curve ",
                    IDetails(address(lptoken)).symbol(),
                    " Factory yVault"
                )
            ),
            string(
                abi.encodePacked(
                    "yvCurve-",
                    IDetails(address(lptoken)).symbol(),
                    "-f"
                )
            ),
            0,
            uint256(VaultType.AUTOMATED)
        );
    }

    // set vault management, gov, deposit limit, and fees
    function _setupVaultParams(address _vault) internal {
        // record our new vault for posterity
        deployedVaults.push(_vault);

        Vault v = Vault(_vault);
        v.setManagement(management);

        // set governance to ychad who needs to accept before it is finalised. until then governance is this factory
        v.setGovernance(governance);
        v.setDepositLimit(depositLimit);

        if (v.managementFee() != managementFee) {
            v.setManagementFee(managementFee);
        }
        if (v.performanceFee() != performanceFee) {
            v.setPerformanceFee(performanceFee);
        }
    }

    // time to attach our strategies to the vault
    function _setupStrategies(
        address _vault,
        address _gauge,
        uint256 _pid
    )
        internal
        returns (
            address convexStrategy,
            address curveStrategy,
            address convexFraxStrategy
        )
    {
        // check if we can add a convex frax strategy for this pool, ganache can't handle this (use tenderly)
        (
            bool hasFraxPool,
            uint256 fraxPid,
            address stakingAddress
        ) = getFraxInfo(_pid);

        // we have a frax implementation, so we know we at least want convex and curve boosted strategies
        convexStrategy = _addConvexStrategy(_vault, _pid);
        curveStrategy = _addCurveStrategy(_vault, _gauge, hasFraxPool);

        if (hasFraxPool) {
            // we attach a frax strategy here since this is a frax pool
            convexFraxStrategy = _addConvexFraxStrategy(
                _vault,
                fraxPid,
                stakingAddress
            );
        }
    }

    // deploy and attach a new convex strategy using our factory's existing implementation
    function _addConvexStrategy(
        address _vault,
        uint256 _pid
    ) internal returns (address convexStrategy) {
        convexStrategy = IStrategy(convexStratImplementation)
            .cloneStrategyConvex(
                _vault,
                management,
                treasury,
                keeper,
                tradeFactory,
                _pid,
                harvestProfitMinInUsdc,
                harvestProfitMaxInUsdc,
                address(booster),
                CVX
            );

        // set up health check and the base fee oracle for our new strategy
        IStrategy(convexStrategy).setHealthCheck(healthCheck);
        IStrategy(convexStrategy).setBaseFeeOracle(baseFeeOracle);

        // if we're keeping any tokens, then setup our voters
        if (keepCRV > 0 || keepCVX > 0) {
            IStrategy(convexStrategy).setVoters(curveVoter, convexVoter);
            IStrategy(convexStrategy).setLocalKeepCrvs(keepCRV, keepCVX);
        }

        // convex debtRatio can always start at 0
        Vault(_vault).addStrategy(convexStrategy, 0, 0, type(uint256).max, 0);
    }

    // deploy and attach a new curve boosted strategy using our factory's existing implementation
    function _addCurveStrategy(
        address _vault,
        address _gauge,
        bool _hasFraxPool
    ) internal returns (address curveStrategy) {
        // pull our strategyProxy from our voter
        IProxy proxy = IProxy(getProxy());

        // create the curve voter strategy
        curveStrategy = IStrategy(curveStratImplementation)
            .cloneStrategyCurveBoosted(
                _vault,
                management,
                treasury,
                keeper,
                tradeFactory,
                address(proxy),
                _gauge
            );

        // set up health check and the base fee oracle for our new strategy
        IStrategy(curveStrategy).setHealthCheck(healthCheck);
        IStrategy(curveStrategy).setBaseFeeOracle(baseFeeOracle);

        // must set our voter, this is used to deposit
        IStrategy(curveStrategy).setVoter(curveVoter);

        // if we're keeping any tokens, then setup our keepCRV
        if (keepCRV > 0) {
            IStrategy(curveStrategy).setLocalKeepCrv(keepCRV);
        }

        uint256 curveDebtRatio = 10_000;
        if (_hasFraxPool) {
            curveDebtRatio = 2_000;
        }

        Vault(_vault).addStrategy(
            curveStrategy,
            curveDebtRatio,
            0,
            type(uint256).max,
            0
        );

        // approve our new voter strategy on the proxy
        proxy.approveStrategy(_gauge, curveStrategy);
    }

    // deploy and attach a new convex frax strategy using our factory's existing implementation
    function _addConvexFraxStrategy(
        address _vault,
        uint256 _fraxPid,
        address _stakingAddress
    ) internal returns (address convexFraxStrategy) {
        convexFraxStrategy = IStrategy(convexFraxStratImplementation)
            .cloneStrategyConvexFrax(
                _vault,
                management,
                treasury,
                keeper,
                tradeFactory,
                _fraxPid,
                _stakingAddress,
                harvestProfitMinInUsdc,
                harvestProfitMaxInUsdc,
                address(fraxBooster)
            );

        // set up health check and the base fee oracle for our new strategy
        IStrategy(convexFraxStrategy).setHealthCheck(healthCheck);
        IStrategy(convexFraxStrategy).setBaseFeeOracle(baseFeeOracle);

        // if we're keeping any tokens, then setup our voters
        if (keepCRV > 0 || keepCVX > 0 || keepFXS > 0) {
            IStrategy(convexFraxStrategy).setVoters(
                curveVoter,
                convexVoter,
                fraxVoter
            );
            IStrategy(convexFraxStrategy).setLocalKeepCrvs(
                keepCRV,
                keepCVX,
                keepFXS
            );
        }

        // for frax pools, Convex-Frax is the most profitable strategy, but it can be illiquid. default 80%.
        Vault(_vault).addStrategy(
            convexFraxStrategy,
            8_000,
            0,
            type(uint256).max,
            0
        );
    }
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "libraries": {
    "CurveGlobal.sol": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_registry","type":"address"},{"internalType":"address","name":"_convexStratImplementation","type":"address"},{"internalType":"address","name":"_curveStratImplementation","type":"address"},{"internalType":"address","name":"_convexFraxStratImplementation","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"category","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"address","name":"gauge","type":"address"},{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":false,"internalType":"address","name":"convexStrategy","type":"address"},{"indexed":false,"internalType":"address","name":"curveStrategy","type":"address"},{"indexed":false,"internalType":"address","name":"convexFraxStrategy","type":"address"}],"name":"NewAutomatedVault","type":"event"},{"inputs":[],"name":"CATEGORY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CVX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allDeployedVaults","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseFeeOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"booster","outputs":[{"internalType":"contract IBooster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"canCreateVaultPermissionlessly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexFraxPoolRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexFraxStratImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexPoolManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexStratImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexVoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"createNewVaultsAndStrategies","outputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"convexStrategy","type":"address"},{"internalType":"address","name":"curveStrategy","type":"address"},{"internalType":"address","name":"convexFraxStrategy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"createNewVaultsAndStrategiesPermissioned","outputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"convexStrategy","type":"address"},{"internalType":"address","name":"curveStrategy","type":"address"},{"internalType":"address","name":"convexFraxStrategy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"curveStratImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveVoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deployedVaults","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"doesStrategyProxyHaveGauge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fraxBooster","outputs":[{"internalType":"contract IBooster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fraxVoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_convexPid","type":"uint256"}],"name":"getFraxInfo","outputs":[{"internalType":"bool","name":"hasFraxPool","type":"bool"},{"internalType":"uint256","name":"convexFraxPid","type":"uint256"},{"internalType":"address","name":"stakingAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"getPid","outputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProxy","outputs":[{"internalType":"address","name":"proxy","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestProfitMaxInUsdc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestProfitMinInUsdc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"healthCheck","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepCRV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepCVX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepFXS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"latestStandardVaultFromGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"management","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managementFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numVaults","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract IRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_baseFeeOracle","type":"address"}],"name":"setBaseFeeOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_booster","type":"address"}],"name":"setBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_convexFraxPoolRegistry","type":"address"}],"name":"setConvexFraxPoolRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_convexFraxStratImplementation","type":"address"}],"name":"setConvexFraxStratImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_convexPoolManager","type":"address"}],"name":"setConvexPoolManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_convexStratImplementation","type":"address"}],"name":"setConvexStratImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_curveStratImplementation","type":"address"}],"name":"setCurveStratImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositLimit","type":"uint256"}],"name":"setDepositLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fraxBooster","type":"address"}],"name":"setFraxBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_guardian","type":"address"}],"name":"setGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_harvestProfitMaxInUsdc","type":"uint256"}],"name":"setHarvestProfitMaxInUsdc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_harvestProfitMinInUsdc","type":"uint256"}],"name":"setHarvestProfitMinInUsdc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_health","type":"address"}],"name":"setHealthcheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepCRV","type":"uint256"},{"internalType":"address","name":"_curveVoter","type":"address"}],"name":"setKeepCRV","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepCVX","type":"uint256"},{"internalType":"address","name":"_convexVoter","type":"address"}],"name":"setKeepCVX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_keepFXS","type":"uint256"},{"internalType":"address","name":"_fraxVoter","type":"address"}],"name":"setKeepFXS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_management","type":"address"}],"name":"setManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_managementFee","type":"uint256"}],"name":"setManagementFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tradeFactory","type":"address"}],"name":"setTradeFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tradeFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052600380546001600160a01b031990811673d1f9b3de42420a295c33c07aa5c9e04edc6a4447179091556004805482167341a5881c17185383e19df6fa4ec158a6f4851a6917905560068054821673f403c135812408bfbe8713b5a23a04b3d48aae3117905560078054821673569f5b842b5006ec17be02b8b94510ba8e79fbca17905560088054821673feb4acf3df3cdea7399794d0869ef76a6efaff521790556009805482167316388463d60ffe0661cf7f1f31a7d658ac790ff7179055600a8054821673846e211e8ba920b353fb717631c015cf04061cc9179055600b805482167393a62da5a14c80f265dabc077fcee437b1a0efde179055600c8054821673256e6a486075fbadbb881516e9b6b507fd082b5d179055600d8054821673ddcea799ff1699e98edf118e0629a974df7df012179055600e8054821673d6a8ae62f4d593daf72e2d7c9f7bdb89ab069f06179055600f80548216731e7efabf282614aa2543edaa50517ef5a23c868b1790556014805490911673f147b8125d2ef93fb6965db97d6746952a1339341790556401bf08eb0060195564174876e800601a556103e8601b556000601c556c7e37be2022c0914b2680000000601d55348015620001d157600080fd5b50604051620031d2380380620031d2833981016040819052620001f49162000281565b600580546001600160a01b03199081166001600160a01b0397881617909155601080548216958716959095179094556011805485169386169390931790925560128054841691851691909117905560018054831691909316908117909255600280549091169091179055620002f1565b80516001600160a01b03811681146200027c57600080fd5b919050565b600080600080600060a086880312156200029a57600080fd5b620002a58662000264565b9450620002b56020870162000264565b9350620002c56040870162000264565b9250620002d56060870162000264565b9150620002e56080870162000264565b90509295509295909350565b612ed180620003016000396000f3fe608060405234801561001057600080fd5b50600436106103fc5760003560e01c80638da5cb5b11610215578063c6fda94b11610125578063ecf70858116100b8578063f9d09ab911610087578063f9d09ab9146108dc578063fa4e2df9146108ef578063fbb04a63146108f8578063fe2c8eb61461090b578063fe56e2321461091e57600080fd5b8063ecf70858146108a4578063ee2b783c146108ad578063ee88a86e146108c0578063f0f44260146108c957600080fd5b8063e30c3978116100f4578063e30c397814610863578063e5e19b4a14610876578063ea65c31d14610889578063ebbc49651461089c57600080fd5b8063c6fda94b14610817578063cb10e3d91461082a578063d4a22bde1461083d578063e276cca31461085057600080fd5b8063a64430b0116101a8578063aced166111610177578063aced1661146107b8578063b084e97b146107cb578063b252720b146107de578063bdc8144b146107f1578063c6def0761461080457600080fd5b8063a64430b014610776578063a6f7f5d614610789578063a91ee0dc14610792578063ab033ea9146107a557600080fd5b8063a1297a30116101e4578063a1297a301461072a578063a34829c21461073d578063a55282ea14610750578063a5cc39c11461076357600080fd5b80638da5cb5b146106e9578063933a9ce8146106fc5780639c0a5e46146107045780639f450b5a1461071757600080fd5b80635aa6e67511610310578063759cb53b116102a3578063826cddf611610272578063826cddf61461069457806387788782146106a757806388a8d602146106b0578063898ffba8146106c35780638a0dac4a146106d657600080fd5b8063759cb53b146106555780637b103999146106705780637c510eb4146106835780637fef901a1461068b57600080fd5b806366aa035e116102df57806366aa035e146105d65780636ef096521461061c57806370897b231461062f578063748747e61461064257600080fd5b80635aa6e6751461058a57806361d027b31461059d57806365210942146105b057806365d2ebbf146105c357600080fd5b80632eddc1531161039357806343b55f351161036257806343b55f3514610535578063452a9320146105485780634b31217e1461055b578063512b0833146105645780635a826df31461057757600080fd5b80632eddc153146104b15780633499c6e0146104d457806338334985146104e75780633e45ff5a146104fc57600080fd5b80630fa53ec0116103cf5780630fa53ec01461047057806313af4035146104835780631f05719b14610496578063264a6208146104a957600080fd5b8063034dfaf214610401578063090c49221461043157806309b00a68146104485780630ac214df1461045d575b600080fd5b600754610414906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61043a60195481565b604051908152602001610428565b61045b610456366004612912565b610931565b005b61041461046b366004612936565b61096a565b61045b61047e366004612936565b610994565b61045b610491366004612912565b6109c5565b601854610414906001600160a01b031681565b60005461043a565b6104c46104bf366004612912565b6109fe565b6040519015158152602001610428565b61045b6104e2366004612912565b610a1a565b6104ef610a53565b604051610428919061294f565b61050f61050a366004612936565b610ab5565b60408051931515845260208401929092526001600160a01b031690820152606001610428565b61043a610543366004612912565b610c6f565b600a54610414906001600160a01b031681565b61043a60155481565b600354610414906001600160a01b031681565b61045b610585366004612912565b610e22565b600854610414906001600160a01b031681565b600b54610414906001600160a01b031681565b61045b6105be366004612912565b610e5b565b601454610414906001600160a01b031681565b6105e96105e4366004612a61565b610e94565b604080516001600160a01b0395861681529385166020850152918416918301919091529091166060820152608001610428565b61045b61062a366004612ad7565b610ee7565b61045b61063d366004612936565b610f4d565b61045b610650366004612912565b610f78565b610414734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b600554610414906001600160a01b031681565b61043a600081565b61043a60135481565b600f54610414906001600160a01b031681565b61043a601b5481565b600954610414906001600160a01b031681565b61045b6106d1366004612ad7565b610fc6565b61045b6106e4366004612912565b611026565b600154610414906001600160a01b031681565b61041461105f565b6105e9610712366004612912565b6110d2565b61045b610725366004612912565b611132565b61045b610738366004612912565b611180565b61045b61074b366004612ad7565b6111b9565b601054610414906001600160a01b031681565b601154610414906001600160a01b031681565b61045b610784366004612912565b61121f565b61043a601c5481565b61045b6107a0366004612912565b611258565b61045b6107b3366004612912565b611291565b600c54610414906001600160a01b031681565b601654610414906001600160a01b031681565b600d54610414906001600160a01b031681565b61045b6107ff366004612936565b6112ca565b600654610414906001600160a01b031681565b6104c4610825366004612912565b6112fb565b61045b610838366004612912565b611388565b61045b61084b366004612912565b6113c1565b601254610414906001600160a01b031681565b600254610414906001600160a01b031681565b600e54610414906001600160a01b031681565b61045b610897366004612912565b6113fa565b61045b611448565b61043a601d5481565b600454610414906001600160a01b031681565b61043a60175481565b61045b6108d7366004612912565b611483565b6104146108ea366004612912565b6114bc565b61043a601a5481565b61045b610906366004612936565b6115cd565b61045b610919366004612912565b6115fe565b61045b61092c366004612936565b611637565b6001546001600160a01b0316331461094857600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000818154811061097a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6001546001600160a01b03163314806109b757506009546001600160a01b031633145b6109c057600080fd5b601a55565b6001546001600160a01b031633146109dc57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080610a0a836114bc565b6001600160a01b03161492915050565b6001546001600160a01b03163314610a3157600080fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60606000805480602002602001604051908101604052809291908181526020018280548015610aab57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a8d575b5050505050905090565b600480546040805163040f1f6d60e11b81529051600093849384936001600160a01b03909116928492849263081e3eda92818301926020928290030181865afa158015610b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2a9190612b07565b90505b8015610c6557600080806001600160a01b038516631526fe27610b51600187612b36565b6040518263ffffffff1660e01b8152600401610b6f91815260200190565b60a060405180830381865afa158015610b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb09190612b49565b94505093509350508060ff16600003610bcb57505050610c55565b816001600160a01b031663e529ee956040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610c25575060408051601f3d908101601f19168201909252610c2291810190612b07565b60015b15610c5157808a03610c4f576001610c3d8187612b36565b85985098509850505050505050610c68565b505b5050505b610c5e81612bc4565b9050610b2d565b50505b9193909250565b600654604051636586ada960e11b81526001600160a01b0383811660048301526000921690819063cb0d5b5290602401602060405180830381865afa158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce09190612bf0565b610cee575060001992915050565b6000816001600160a01b031663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d529190612b07565b90505b8015610e1b5760006001600160a01b038316631526fe27610d77600185612b36565b6040518263ffffffff1660e01b8152600401610d9591815260200190565b60c060405180830381865afa158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190612c0b565b50505092505050806001600160a01b0316856001600160a01b031603610e0a57610e01600183612b36565b95945050505050565b50610e1481612bc4565b9050610d55565b5050919050565b6001546001600160a01b03163314610e3957600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610e7257600080fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546000908190819081906001600160a01b0316331480610ec057506009546001600160a01b031633145b610ec957600080fd5b610ed68760018888611662565b935093509350935093509350935093565b6001546001600160a01b03163314610efe57600080fd5b612710821115610f0d57600080fd5b8115610f26576001600160a01b038116610f2657600080fd5b601791909155601880546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b03163314610f6457600080fd5b611388811115610f7357600080fd5b601b55565b6001546001600160a01b0316331480610f9b57506009546001600160a01b031633145b610fa457600080fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610fdd57600080fd5b612710821115610fec57600080fd5b6001600160a01b038116610fff57600080fd5b601391909155601480546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b0316331461103d57600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60145460408051635463173b60e11b815290516000926001600160a01b03169163a8c62e769160048083019260209291908290030181865afa1580156110a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cd9190612c8d565b905090565b60008060008061112385600060405180604001604052806007815260200166191959985d5b1d60ca1b81525060405180604001604052806007815260200166191959985d5b1d60ca1b815250611662565b93509350935093509193509193565b6001546001600160a01b031633148061115557506009546001600160a01b031633145b61115e57600080fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461119757600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146111d057600080fd5b6127108211156111df57600080fd5b81156111f8576001600160a01b0381166111f857600080fd5b601591909155601680546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b0316331461123657600080fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461126f57600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146112a857600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806112ed57506009546001600160a01b031633145b6112f657600080fd5b601d55565b60008061130661105f565b6040516339ebf82360e01b81526001600160a01b0385811660048301529192506000918316906339ebf82390602401602060405180830381865afa158015611352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113769190612c8d565b6001600160a01b031614159392505050565b6001546001600160a01b0316331461139f57600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146113d857600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633148061141d57506009546001600160a01b031633145b61142657600080fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b0316331461145f57600080fd5b600254600180546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b0316331461149a57600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600080826001600160a01b03166382c630666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115219190612c8d565b90506000805b60038110156115c5576005546040516309de312f60e41b81526001600160a01b0385811660048301526024820184905290911690639de312f090604401602060405180830381865afa158015611581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a59190612c8d565b91506001600160a01b0382166115c5576115be81612caa565b9050611527565b509392505050565b6001546001600160a01b03163314806115f057506009546001600160a01b031633145b6115f957600080fd5b601955565b6001546001600160a01b0316331461161557600080fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461164e57600080fd5b6103e881111561165d57600080fd5b601c55565b60405163273c8d1d60e11b81526001600160a01b0385166004820152600090819081908190732f50d538606fa9edd2b11e2446beb18c9d5846bb9082908290634e791a3a90602401602060405180830381865afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb9190612b07565b116117365760405162461bcd60e51b815260206004820152601660248201527511d85d59d9481b5d5cdd081a185d99481dd95a59da1d60521b60448201526064015b60405180910390fd5b8761178757611744896109fe565b6117875760405162461bcd60e51b81526020600482015260146024820152735661756c7420616c72656164792065786973747360601b604482015260640161172d565b6000896001600160a01b03166382c630666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb9190612c8d565b90506117f68a6112fb565b156118435760405162461bcd60e51b815260206004820152601d60248201527f566f74657220737472617465677920616c726561647920657869737473000000604482015260640161172d565b600061184e8b610c6f565b9050600019810361198e57600660009054906101000a90046001600160a01b03166001600160a01b031663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d09190612b07565b60035460405163d914cd4b60e01b81526001600160a01b038e8116600483015292935091169063d914cd4b906024016020604051808303816000875af115801561191e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119429190612bf0565b61198e5760405162461bcd60e51b815260206004820152601c60248201527f556e61626c6520746f2061646420706f6f6c20746f20436f6e76657800000000604482015260640161172d565b89156119a65761199f828a8a611a59565b96506119b2565b6119af82611aed565b96505b6119bb87611c94565b6119c6878c83611f87565b809650819750829850505050866001600160a01b0316826001600160a01b031660007f329c6fc38729ecf4742a7570f5e7d1aec463e6412d92c4b37002b4c425fd383b8e8a8a8a604051611a4394939291906001600160a01b03948516815292841660208401529083166040830152909116606082015260800190565b60405180910390a4505050945094509450949050565b600554600a54600b5460405163092ea19b60e11b81526000936001600160a01b039081169363125d433693611aa2938a93309381169216908a908a908a90600290600401612d13565b6020604051808303816000875af1158015611ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae59190612c8d565b949350505050565b600554600a54600b54604080516395d89b4160e01b815290516000946001600160a01b039081169463125d433694889430949284169391821692918616916395d89b41916004808201928c929091908290030181865afa158015611b55573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b7d9190810190612d7c565b604051602001611b8d9190612dea565b604051602081830303815290604052886001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611bda573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c029190810190612d7c565b604051602001611c129190612e31565b60408051808303601f19018152908290526001600160e01b031960e089901b168252611c4b969594939291600090600290600401612d13565b6020604051808303816000875af1158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e9190612c8d565b92915050565b600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b03838116918217909255600954604051636a5115ef60e11b815292166004830152829163d4a22bde90602401600060405180830381600087803b158015611d1c57600080fd5b505af1158015611d30573d6000803e3d6000fd5b505060085460405163ab033ea960e01b81526001600160a01b039182166004820152908416925063ab033ea99150602401600060405180830381600087803b158015611d7b57600080fd5b505af1158015611d8f573d6000803e3d6000fd5b5050601d5460405163bdc8144b60e01b815260048101919091526001600160a01b038416925063bdc8144b9150602401600060405180830381600087803b158015611dd957600080fd5b505af1158015611ded573d6000803e3d6000fd5b50505050601c54816001600160a01b031663a6f7f5d66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e569190612b07565b14611eba57601c54604051637f2b711960e11b815260048101919091526001600160a01b0382169063fe56e23290602401600060405180830381600087803b158015611ea157600080fd5b505af1158015611eb5573d6000803e3d6000fd5b505050505b601b54816001600160a01b031663877887826040518163ffffffff1660e01b8152600401602060405180830381865afa158015611efb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1f9190612b07565b14611f8357601b546040516370897b2360e01b815260048101919091526001600160a01b038216906370897b2390602401600060405180830381600087803b158015611f6a57600080fd5b505af1158015611f7e573d6000803e3d6000fd5b505050505b5050565b600080600080600080611f9987610ab5565b925092509250611fa98988611fd8565b9550611fb68989856122ce565b94508215611fcc57611fc98983836125f1565b93505b50505093509350939050565b601054600954600b54600c54600e54601954601a546006546040516339f1f4e960e11b81526001600160a01b038b81166004830152978816602482015295871660448701529386166064860152918516608485015260a4840187905260c484015260e48301528216610104820152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b61012482015260009291909116906373e3e9d290610144016020604051808303816000875af1158015612092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b69190612c8d565b600d546040516311bc824560e01b81526001600160a01b0391821660048201529192508216906311bc824590602401600060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b5050600f54604051634fa285ad60e11b81526001600160a01b0391821660048201529084169250639f450b5a9150602401600060405180830381600087803b15801561215e57600080fd5b505af1158015612172573d6000803e3d6000fd5b505050506000601354118061218957506000601554115b1561225f57601454601654604051633a1650f160e11b81526001600160a01b03928316600482015290821660248201529082169063742ca1e290604401600060405180830381600087803b1580156121e057600080fd5b505af11580156121f4573d6000803e3d6000fd5b505060135460155460405163fc26ab4760e01b8152600481019290925260248201526001600160a01b038416925063fc26ab479150604401600060405180830381600087803b15801561224657600080fd5b505af115801561225a573d6000803e3d6000fd5b505050505b604051630a5a713760e11b81526001600160a01b038416906314b4e26e906122969084906000908190600019908290600401612e6d565b600060405180830381600087803b1580156122b057600080fd5b505af11580156122c4573d6000803e3d6000fd5b5050505092915050565b6000806122d961105f565b601154600954600b54600c54600e5460405163d053eb7560e01b81526001600160a01b038c811660048301529485166024820152928416604484015290831660648301528216608482015281841660a482015287821660c4820152929350169063d053eb759060e4016020604051808303816000875af1158015612361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123859190612c8d565b600d546040516311bc824560e01b81526001600160a01b0391821660048201529193508316906311bc824590602401600060405180830381600087803b1580156123ce57600080fd5b505af11580156123e2573d6000803e3d6000fd5b5050600f54604051634fa285ad60e11b81526001600160a01b0391821660048201529085169250639f450b5a9150602401600060405180830381600087803b15801561242d57600080fd5b505af1158015612441573d6000803e3d6000fd5b5050601454604051634bc2a65760e01b81526001600160a01b0391821660048201529085169250634bc2a6579150602401600060405180830381600087803b15801561248c57600080fd5b505af11580156124a0573d6000803e3d6000fd5b505050506000601354111561250e57601354604051633949b97760e01b815260048101919091526001600160a01b03831690633949b97790602401600060405180830381600087803b1580156124f557600080fd5b505af1158015612509573d6000803e3d6000fd5b505050505b612710831561251c57506107d05b604051630a5a713760e11b81526001600160a01b038716906314b4e26e906125539086908590600090600019908290600401612e6d565b600060405180830381600087803b15801561256d57600080fd5b505af1158015612581573d6000803e3d6000fd5b505060405163624a224760e11b81526001600160a01b03888116600483015286811660248301528516925063c494448e9150604401600060405180830381600087803b1580156125d057600080fd5b505af11580156125e4573d6000803e3d6000fd5b5050505050509392505050565b601254600954600b54600c54600e54601954601a546007546040516352a2570560e11b81526001600160a01b038c81166004830152978816602482015295871660448701529386166064860152918516608485015260a4840188905286851660c485015260e48401526101048301528216610124820152600092919091169063a544ae0a90610144016020604051808303816000875af1158015612699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bd9190612c8d565b600d546040516311bc824560e01b81526001600160a01b0391821660048201529192508216906311bc824590602401600060405180830381600087803b15801561270657600080fd5b505af115801561271a573d6000803e3d6000fd5b5050600f54604051634fa285ad60e11b81526001600160a01b0391821660048201529084169250639f450b5a9150602401600060405180830381600087803b15801561276557600080fd5b505af1158015612779573d6000803e3d6000fd5b505050506000601354118061279057506000601554115b8061279d57506000601754115b15612888576014546016546018546040516397f72f8f60e01b81526001600160a01b039384166004820152918316602483015282166044820152908216906397f72f8f90606401600060405180830381600087803b1580156127fe57600080fd5b505af1158015612812573d6000803e3d6000fd5b5050601354601554601754604051630b15d52360e31b81526004810193909352602483019190915260448201526001600160a01b03841692506358aea9189150606401600060405180830381600087803b15801561286f57600080fd5b505af1158015612883573d6000803e3d6000fd5b505050505b604051630a5a713760e11b81526001600160a01b038516906314b4e26e906128c1908490611f4090600090600019908290600401612e6d565b600060405180830381600087803b1580156128db57600080fd5b505af11580156128ef573d6000803e3d6000fd5b505050509392505050565b6001600160a01b038116811461290f57600080fd5b50565b60006020828403121561292457600080fd5b813561292f816128fa565b9392505050565b60006020828403121561294857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156129905783516001600160a01b03168352928401929184019160010161296b565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129db576129db61299c565b604052919050565b600067ffffffffffffffff8211156129fd576129fd61299c565b50601f01601f191660200190565b600082601f830112612a1c57600080fd5b8135612a2f612a2a826129e3565b6129b2565b818152846020838601011115612a4457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215612a7657600080fd5b8335612a81816128fa565b9250602084013567ffffffffffffffff80821115612a9e57600080fd5b612aaa87838801612a0b565b93506040860135915080821115612ac057600080fd5b50612acd86828701612a0b565b9150509250925092565b60008060408385031215612aea57600080fd5b823591506020830135612afc816128fa565b809150509250929050565b600060208284031215612b1957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611c8e57611c8e612b20565b600080600080600060a08688031215612b6157600080fd5b8551612b6c816128fa565b6020870151909550612b7d816128fa565b6040870151909450612b8e816128fa565b6060870151909350612b9f816128fa565b608087015190925060ff81168114612bb657600080fd5b809150509295509295909350565b600081612bd357612bd3612b20565b506000190190565b80518015158114612beb57600080fd5b919050565b600060208284031215612c0257600080fd5b61292f82612bdb565b60008060008060008060c08789031215612c2457600080fd5b8651612c2f816128fa565b6020880151909650612c40816128fa565b6040880151909550612c51816128fa565b6060880151909450612c62816128fa565b6080880151909350612c73816128fa565b9150612c8160a08801612bdb565b90509295509295509295565b600060208284031215612c9f57600080fd5b815161292f816128fa565b600060018201612cbc57612cbc612b20565b5060010190565b60005b83811015612cde578181015183820152602001612cc6565b50506000910152565b60008151808452612cff816020860160208601612cc3565b601f01601f19169290920160200192915050565b6001600160a01b038981168252888116602083015287811660408301528616606082015261010060808201819052600090612d5083820188612ce7565b905082810360a0840152612d648187612ce7565b60c0840195909552505060e001529695505050505050565b600060208284031215612d8e57600080fd5b815167ffffffffffffffff811115612da557600080fd5b8201601f81018413612db657600080fd5b8051612dc4612a2a826129e3565b818152856020838501011115612dd957600080fd5b610e01826020830160208601612cc3565b65021bab93b32960d51b815260008251612e0b816006850160208701612cc3565b6e08119858dd1bdc9e481e55985d5b1d608a1b6006939091019283015250601501919050565b67797643757276652d60c01b815260008251612e54816008850160208701612cc3565b6116b360f11b6008939091019283015250600a01919050565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a0019056fea26469706673582212203f5e9a0116a3e32c6798dfc57b6c6e399647c2d16e3fcb8b44cbdd85f59a20ae64736f6c63430008110033000000000000000000000000af1f5e1c19cb68b30aad73846effdf78a58633190000000000000000000000008bbf215c4a8bef276292f8e276782dfe9cf019170000000000000000000000001bc5d99b94763d3658d7d26a762ba5da8ccf0dcc00000000000000000000000078883a75c058557cc74b773c6e96150db4b01aaf000000000000000000000000c6387e937bcef8de3334f80edc623275d42457ff

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103fc5760003560e01c80638da5cb5b11610215578063c6fda94b11610125578063ecf70858116100b8578063f9d09ab911610087578063f9d09ab9146108dc578063fa4e2df9146108ef578063fbb04a63146108f8578063fe2c8eb61461090b578063fe56e2321461091e57600080fd5b8063ecf70858146108a4578063ee2b783c146108ad578063ee88a86e146108c0578063f0f44260146108c957600080fd5b8063e30c3978116100f4578063e30c397814610863578063e5e19b4a14610876578063ea65c31d14610889578063ebbc49651461089c57600080fd5b8063c6fda94b14610817578063cb10e3d91461082a578063d4a22bde1461083d578063e276cca31461085057600080fd5b8063a64430b0116101a8578063aced166111610177578063aced1661146107b8578063b084e97b146107cb578063b252720b146107de578063bdc8144b146107f1578063c6def0761461080457600080fd5b8063a64430b014610776578063a6f7f5d614610789578063a91ee0dc14610792578063ab033ea9146107a557600080fd5b8063a1297a30116101e4578063a1297a301461072a578063a34829c21461073d578063a55282ea14610750578063a5cc39c11461076357600080fd5b80638da5cb5b146106e9578063933a9ce8146106fc5780639c0a5e46146107045780639f450b5a1461071757600080fd5b80635aa6e67511610310578063759cb53b116102a3578063826cddf611610272578063826cddf61461069457806387788782146106a757806388a8d602146106b0578063898ffba8146106c35780638a0dac4a146106d657600080fd5b8063759cb53b146106555780637b103999146106705780637c510eb4146106835780637fef901a1461068b57600080fd5b806366aa035e116102df57806366aa035e146105d65780636ef096521461061c57806370897b231461062f578063748747e61461064257600080fd5b80635aa6e6751461058a57806361d027b31461059d57806365210942146105b057806365d2ebbf146105c357600080fd5b80632eddc1531161039357806343b55f351161036257806343b55f3514610535578063452a9320146105485780634b31217e1461055b578063512b0833146105645780635a826df31461057757600080fd5b80632eddc153146104b15780633499c6e0146104d457806338334985146104e75780633e45ff5a146104fc57600080fd5b80630fa53ec0116103cf5780630fa53ec01461047057806313af4035146104835780631f05719b14610496578063264a6208146104a957600080fd5b8063034dfaf214610401578063090c49221461043157806309b00a68146104485780630ac214df1461045d575b600080fd5b600754610414906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61043a60195481565b604051908152602001610428565b61045b610456366004612912565b610931565b005b61041461046b366004612936565b61096a565b61045b61047e366004612936565b610994565b61045b610491366004612912565b6109c5565b601854610414906001600160a01b031681565b60005461043a565b6104c46104bf366004612912565b6109fe565b6040519015158152602001610428565b61045b6104e2366004612912565b610a1a565b6104ef610a53565b604051610428919061294f565b61050f61050a366004612936565b610ab5565b60408051931515845260208401929092526001600160a01b031690820152606001610428565b61043a610543366004612912565b610c6f565b600a54610414906001600160a01b031681565b61043a60155481565b600354610414906001600160a01b031681565b61045b610585366004612912565b610e22565b600854610414906001600160a01b031681565b600b54610414906001600160a01b031681565b61045b6105be366004612912565b610e5b565b601454610414906001600160a01b031681565b6105e96105e4366004612a61565b610e94565b604080516001600160a01b0395861681529385166020850152918416918301919091529091166060820152608001610428565b61045b61062a366004612ad7565b610ee7565b61045b61063d366004612936565b610f4d565b61045b610650366004612912565b610f78565b610414734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b600554610414906001600160a01b031681565b61043a600081565b61043a60135481565b600f54610414906001600160a01b031681565b61043a601b5481565b600954610414906001600160a01b031681565b61045b6106d1366004612ad7565b610fc6565b61045b6106e4366004612912565b611026565b600154610414906001600160a01b031681565b61041461105f565b6105e9610712366004612912565b6110d2565b61045b610725366004612912565b611132565b61045b610738366004612912565b611180565b61045b61074b366004612ad7565b6111b9565b601054610414906001600160a01b031681565b601154610414906001600160a01b031681565b61045b610784366004612912565b61121f565b61043a601c5481565b61045b6107a0366004612912565b611258565b61045b6107b3366004612912565b611291565b600c54610414906001600160a01b031681565b601654610414906001600160a01b031681565b600d54610414906001600160a01b031681565b61045b6107ff366004612936565b6112ca565b600654610414906001600160a01b031681565b6104c4610825366004612912565b6112fb565b61045b610838366004612912565b611388565b61045b61084b366004612912565b6113c1565b601254610414906001600160a01b031681565b600254610414906001600160a01b031681565b600e54610414906001600160a01b031681565b61045b610897366004612912565b6113fa565b61045b611448565b61043a601d5481565b600454610414906001600160a01b031681565b61043a60175481565b61045b6108d7366004612912565b611483565b6104146108ea366004612912565b6114bc565b61043a601a5481565b61045b610906366004612936565b6115cd565b61045b610919366004612912565b6115fe565b61045b61092c366004612936565b611637565b6001546001600160a01b0316331461094857600080fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000818154811061097a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6001546001600160a01b03163314806109b757506009546001600160a01b031633145b6109c057600080fd5b601a55565b6001546001600160a01b031633146109dc57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080610a0a836114bc565b6001600160a01b03161492915050565b6001546001600160a01b03163314610a3157600080fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60606000805480602002602001604051908101604052809291908181526020018280548015610aab57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a8d575b5050505050905090565b600480546040805163040f1f6d60e11b81529051600093849384936001600160a01b03909116928492849263081e3eda92818301926020928290030181865afa158015610b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2a9190612b07565b90505b8015610c6557600080806001600160a01b038516631526fe27610b51600187612b36565b6040518263ffffffff1660e01b8152600401610b6f91815260200190565b60a060405180830381865afa158015610b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb09190612b49565b94505093509350508060ff16600003610bcb57505050610c55565b816001600160a01b031663e529ee956040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610c25575060408051601f3d908101601f19168201909252610c2291810190612b07565b60015b15610c5157808a03610c4f576001610c3d8187612b36565b85985098509850505050505050610c68565b505b5050505b610c5e81612bc4565b9050610b2d565b50505b9193909250565b600654604051636586ada960e11b81526001600160a01b0383811660048301526000921690819063cb0d5b5290602401602060405180830381865afa158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce09190612bf0565b610cee575060001992915050565b6000816001600160a01b031663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d529190612b07565b90505b8015610e1b5760006001600160a01b038316631526fe27610d77600185612b36565b6040518263ffffffff1660e01b8152600401610d9591815260200190565b60c060405180830381865afa158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190612c0b565b50505092505050806001600160a01b0316856001600160a01b031603610e0a57610e01600183612b36565b95945050505050565b50610e1481612bc4565b9050610d55565b5050919050565b6001546001600160a01b03163314610e3957600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610e7257600080fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546000908190819081906001600160a01b0316331480610ec057506009546001600160a01b031633145b610ec957600080fd5b610ed68760018888611662565b935093509350935093509350935093565b6001546001600160a01b03163314610efe57600080fd5b612710821115610f0d57600080fd5b8115610f26576001600160a01b038116610f2657600080fd5b601791909155601880546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b03163314610f6457600080fd5b611388811115610f7357600080fd5b601b55565b6001546001600160a01b0316331480610f9b57506009546001600160a01b031633145b610fa457600080fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610fdd57600080fd5b612710821115610fec57600080fd5b6001600160a01b038116610fff57600080fd5b601391909155601480546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b0316331461103d57600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60145460408051635463173b60e11b815290516000926001600160a01b03169163a8c62e769160048083019260209291908290030181865afa1580156110a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cd9190612c8d565b905090565b60008060008061112385600060405180604001604052806007815260200166191959985d5b1d60ca1b81525060405180604001604052806007815260200166191959985d5b1d60ca1b815250611662565b93509350935093509193509193565b6001546001600160a01b031633148061115557506009546001600160a01b031633145b61115e57600080fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461119757600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146111d057600080fd5b6127108211156111df57600080fd5b81156111f8576001600160a01b0381166111f857600080fd5b601591909155601680546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b0316331461123657600080fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461126f57600080fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146112a857600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806112ed57506009546001600160a01b031633145b6112f657600080fd5b601d55565b60008061130661105f565b6040516339ebf82360e01b81526001600160a01b0385811660048301529192506000918316906339ebf82390602401602060405180830381865afa158015611352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113769190612c8d565b6001600160a01b031614159392505050565b6001546001600160a01b0316331461139f57600080fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146113d857600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633148061141d57506009546001600160a01b031633145b61142657600080fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b0316331461145f57600080fd5b600254600180546001600160a01b0319166001600160a01b03909216919091179055565b6001546001600160a01b0316331461149a57600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600080826001600160a01b03166382c630666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115219190612c8d565b90506000805b60038110156115c5576005546040516309de312f60e41b81526001600160a01b0385811660048301526024820184905290911690639de312f090604401602060405180830381865afa158015611581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a59190612c8d565b91506001600160a01b0382166115c5576115be81612caa565b9050611527565b509392505050565b6001546001600160a01b03163314806115f057506009546001600160a01b031633145b6115f957600080fd5b601955565b6001546001600160a01b0316331461161557600080fd5b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331461164e57600080fd5b6103e881111561165d57600080fd5b601c55565b60405163273c8d1d60e11b81526001600160a01b0385166004820152600090819081908190732f50d538606fa9edd2b11e2446beb18c9d5846bb9082908290634e791a3a90602401602060405180830381865afa1580156116c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116eb9190612b07565b116117365760405162461bcd60e51b815260206004820152601660248201527511d85d59d9481b5d5cdd081a185d99481dd95a59da1d60521b60448201526064015b60405180910390fd5b8761178757611744896109fe565b6117875760405162461bcd60e51b81526020600482015260146024820152735661756c7420616c72656164792065786973747360601b604482015260640161172d565b6000896001600160a01b03166382c630666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117eb9190612c8d565b90506117f68a6112fb565b156118435760405162461bcd60e51b815260206004820152601d60248201527f566f74657220737472617465677920616c726561647920657869737473000000604482015260640161172d565b600061184e8b610c6f565b9050600019810361198e57600660009054906101000a90046001600160a01b03166001600160a01b031663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d09190612b07565b60035460405163d914cd4b60e01b81526001600160a01b038e8116600483015292935091169063d914cd4b906024016020604051808303816000875af115801561191e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119429190612bf0565b61198e5760405162461bcd60e51b815260206004820152601c60248201527f556e61626c6520746f2061646420706f6f6c20746f20436f6e76657800000000604482015260640161172d565b89156119a65761199f828a8a611a59565b96506119b2565b6119af82611aed565b96505b6119bb87611c94565b6119c6878c83611f87565b809650819750829850505050866001600160a01b0316826001600160a01b031660007f329c6fc38729ecf4742a7570f5e7d1aec463e6412d92c4b37002b4c425fd383b8e8a8a8a604051611a4394939291906001600160a01b03948516815292841660208401529083166040830152909116606082015260800190565b60405180910390a4505050945094509450949050565b600554600a54600b5460405163092ea19b60e11b81526000936001600160a01b039081169363125d433693611aa2938a93309381169216908a908a908a90600290600401612d13565b6020604051808303816000875af1158015611ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae59190612c8d565b949350505050565b600554600a54600b54604080516395d89b4160e01b815290516000946001600160a01b039081169463125d433694889430949284169391821692918616916395d89b41916004808201928c929091908290030181865afa158015611b55573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b7d9190810190612d7c565b604051602001611b8d9190612dea565b604051602081830303815290604052886001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611bda573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c029190810190612d7c565b604051602001611c129190612e31565b60408051808303601f19018152908290526001600160e01b031960e089901b168252611c4b969594939291600090600290600401612d13565b6020604051808303816000875af1158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e9190612c8d565b92915050565b600080546001810182559080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b03838116918217909255600954604051636a5115ef60e11b815292166004830152829163d4a22bde90602401600060405180830381600087803b158015611d1c57600080fd5b505af1158015611d30573d6000803e3d6000fd5b505060085460405163ab033ea960e01b81526001600160a01b039182166004820152908416925063ab033ea99150602401600060405180830381600087803b158015611d7b57600080fd5b505af1158015611d8f573d6000803e3d6000fd5b5050601d5460405163bdc8144b60e01b815260048101919091526001600160a01b038416925063bdc8144b9150602401600060405180830381600087803b158015611dd957600080fd5b505af1158015611ded573d6000803e3d6000fd5b50505050601c54816001600160a01b031663a6f7f5d66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e569190612b07565b14611eba57601c54604051637f2b711960e11b815260048101919091526001600160a01b0382169063fe56e23290602401600060405180830381600087803b158015611ea157600080fd5b505af1158015611eb5573d6000803e3d6000fd5b505050505b601b54816001600160a01b031663877887826040518163ffffffff1660e01b8152600401602060405180830381865afa158015611efb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1f9190612b07565b14611f8357601b546040516370897b2360e01b815260048101919091526001600160a01b038216906370897b2390602401600060405180830381600087803b158015611f6a57600080fd5b505af1158015611f7e573d6000803e3d6000fd5b505050505b5050565b600080600080600080611f9987610ab5565b925092509250611fa98988611fd8565b9550611fb68989856122ce565b94508215611fcc57611fc98983836125f1565b93505b50505093509350939050565b601054600954600b54600c54600e54601954601a546006546040516339f1f4e960e11b81526001600160a01b038b81166004830152978816602482015295871660448701529386166064860152918516608485015260a4840187905260c484015260e48301528216610104820152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b61012482015260009291909116906373e3e9d290610144016020604051808303816000875af1158015612092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b69190612c8d565b600d546040516311bc824560e01b81526001600160a01b0391821660048201529192508216906311bc824590602401600060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b5050600f54604051634fa285ad60e11b81526001600160a01b0391821660048201529084169250639f450b5a9150602401600060405180830381600087803b15801561215e57600080fd5b505af1158015612172573d6000803e3d6000fd5b505050506000601354118061218957506000601554115b1561225f57601454601654604051633a1650f160e11b81526001600160a01b03928316600482015290821660248201529082169063742ca1e290604401600060405180830381600087803b1580156121e057600080fd5b505af11580156121f4573d6000803e3d6000fd5b505060135460155460405163fc26ab4760e01b8152600481019290925260248201526001600160a01b038416925063fc26ab479150604401600060405180830381600087803b15801561224657600080fd5b505af115801561225a573d6000803e3d6000fd5b505050505b604051630a5a713760e11b81526001600160a01b038416906314b4e26e906122969084906000908190600019908290600401612e6d565b600060405180830381600087803b1580156122b057600080fd5b505af11580156122c4573d6000803e3d6000fd5b5050505092915050565b6000806122d961105f565b601154600954600b54600c54600e5460405163d053eb7560e01b81526001600160a01b038c811660048301529485166024820152928416604484015290831660648301528216608482015281841660a482015287821660c4820152929350169063d053eb759060e4016020604051808303816000875af1158015612361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123859190612c8d565b600d546040516311bc824560e01b81526001600160a01b0391821660048201529193508316906311bc824590602401600060405180830381600087803b1580156123ce57600080fd5b505af11580156123e2573d6000803e3d6000fd5b5050600f54604051634fa285ad60e11b81526001600160a01b0391821660048201529085169250639f450b5a9150602401600060405180830381600087803b15801561242d57600080fd5b505af1158015612441573d6000803e3d6000fd5b5050601454604051634bc2a65760e01b81526001600160a01b0391821660048201529085169250634bc2a6579150602401600060405180830381600087803b15801561248c57600080fd5b505af11580156124a0573d6000803e3d6000fd5b505050506000601354111561250e57601354604051633949b97760e01b815260048101919091526001600160a01b03831690633949b97790602401600060405180830381600087803b1580156124f557600080fd5b505af1158015612509573d6000803e3d6000fd5b505050505b612710831561251c57506107d05b604051630a5a713760e11b81526001600160a01b038716906314b4e26e906125539086908590600090600019908290600401612e6d565b600060405180830381600087803b15801561256d57600080fd5b505af1158015612581573d6000803e3d6000fd5b505060405163624a224760e11b81526001600160a01b03888116600483015286811660248301528516925063c494448e9150604401600060405180830381600087803b1580156125d057600080fd5b505af11580156125e4573d6000803e3d6000fd5b5050505050509392505050565b601254600954600b54600c54600e54601954601a546007546040516352a2570560e11b81526001600160a01b038c81166004830152978816602482015295871660448701529386166064860152918516608485015260a4840188905286851660c485015260e48401526101048301528216610124820152600092919091169063a544ae0a90610144016020604051808303816000875af1158015612699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bd9190612c8d565b600d546040516311bc824560e01b81526001600160a01b0391821660048201529192508216906311bc824590602401600060405180830381600087803b15801561270657600080fd5b505af115801561271a573d6000803e3d6000fd5b5050600f54604051634fa285ad60e11b81526001600160a01b0391821660048201529084169250639f450b5a9150602401600060405180830381600087803b15801561276557600080fd5b505af1158015612779573d6000803e3d6000fd5b505050506000601354118061279057506000601554115b8061279d57506000601754115b15612888576014546016546018546040516397f72f8f60e01b81526001600160a01b039384166004820152918316602483015282166044820152908216906397f72f8f90606401600060405180830381600087803b1580156127fe57600080fd5b505af1158015612812573d6000803e3d6000fd5b5050601354601554601754604051630b15d52360e31b81526004810193909352602483019190915260448201526001600160a01b03841692506358aea9189150606401600060405180830381600087803b15801561286f57600080fd5b505af1158015612883573d6000803e3d6000fd5b505050505b604051630a5a713760e11b81526001600160a01b038516906314b4e26e906128c1908490611f4090600090600019908290600401612e6d565b600060405180830381600087803b1580156128db57600080fd5b505af11580156128ef573d6000803e3d6000fd5b505050509392505050565b6001600160a01b038116811461290f57600080fd5b50565b60006020828403121561292457600080fd5b813561292f816128fa565b9392505050565b60006020828403121561294857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156129905783516001600160a01b03168352928401929184019160010161296b565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129db576129db61299c565b604052919050565b600067ffffffffffffffff8211156129fd576129fd61299c565b50601f01601f191660200190565b600082601f830112612a1c57600080fd5b8135612a2f612a2a826129e3565b6129b2565b818152846020838601011115612a4457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215612a7657600080fd5b8335612a81816128fa565b9250602084013567ffffffffffffffff80821115612a9e57600080fd5b612aaa87838801612a0b565b93506040860135915080821115612ac057600080fd5b50612acd86828701612a0b565b9150509250925092565b60008060408385031215612aea57600080fd5b823591506020830135612afc816128fa565b809150509250929050565b600060208284031215612b1957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115611c8e57611c8e612b20565b600080600080600060a08688031215612b6157600080fd5b8551612b6c816128fa565b6020870151909550612b7d816128fa565b6040870151909450612b8e816128fa565b6060870151909350612b9f816128fa565b608087015190925060ff81168114612bb657600080fd5b809150509295509295909350565b600081612bd357612bd3612b20565b506000190190565b80518015158114612beb57600080fd5b919050565b600060208284031215612c0257600080fd5b61292f82612bdb565b60008060008060008060c08789031215612c2457600080fd5b8651612c2f816128fa565b6020880151909650612c40816128fa565b6040880151909550612c51816128fa565b6060880151909450612c62816128fa565b6080880151909350612c73816128fa565b9150612c8160a08801612bdb565b90509295509295509295565b600060208284031215612c9f57600080fd5b815161292f816128fa565b600060018201612cbc57612cbc612b20565b5060010190565b60005b83811015612cde578181015183820152602001612cc6565b50506000910152565b60008151808452612cff816020860160208601612cc3565b601f01601f19169290920160200192915050565b6001600160a01b038981168252888116602083015287811660408301528616606082015261010060808201819052600090612d5083820188612ce7565b905082810360a0840152612d648187612ce7565b60c0840195909552505060e001529695505050505050565b600060208284031215612d8e57600080fd5b815167ffffffffffffffff811115612da557600080fd5b8201601f81018413612db657600080fd5b8051612dc4612a2a826129e3565b818152856020838501011115612dd957600080fd5b610e01826020830160208601612cc3565b65021bab93b32960d51b815260008251612e0b816006850160208701612cc3565b6e08119858dd1bdc9e481e55985d5b1d608a1b6006939091019283015250601501919050565b67797643757276652d60c01b815260008251612e54816008850160208701612cc3565b6116b360f11b6008939091019283015250600a01919050565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a0019056fea26469706673582212203f5e9a0116a3e32c6798dfc57b6c6e399647c2d16e3fcb8b44cbdd85f59a20ae64736f6c63430008110033

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

000000000000000000000000af1f5e1c19cb68b30aad73846effdf78a58633190000000000000000000000008bbf215c4a8bef276292f8e276782dfe9cf019170000000000000000000000001bc5d99b94763d3658d7d26a762ba5da8ccf0dcc00000000000000000000000078883a75c058557cc74b773c6e96150db4b01aaf000000000000000000000000c6387e937bcef8de3334f80edc623275d42457ff

-----Decoded View---------------
Arg [0] : _registry (address): 0xaF1f5e1c19cB68B30aAD73846eFfDf78a5863319
Arg [1] : _convexStratImplementation (address): 0x8bbf215c4a8bEf276292f8e276782Dfe9Cf01917
Arg [2] : _curveStratImplementation (address): 0x1bC5D99b94763D3658d7d26a762BA5Da8ccF0DCc
Arg [3] : _convexFraxStratImplementation (address): 0x78883A75c058557Cc74b773c6E96150DB4B01aAf
Arg [4] : _owner (address): 0xC6387E937Bcef8De3334f80EDC623275d42457ff

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000af1f5e1c19cb68b30aad73846effdf78a5863319
Arg [1] : 0000000000000000000000008bbf215c4a8bef276292f8e276782dfe9cf01917
Arg [2] : 0000000000000000000000001bc5d99b94763d3658d7d26a762ba5da8ccf0dcc
Arg [3] : 00000000000000000000000078883a75c058557cc74b773c6e96150db4b01aaf
Arg [4] : 000000000000000000000000c6387e937bcef8de3334f80edc623275d42457ff


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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