Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 115 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Create New Vault... | 20219791 | 2 days ago | IN | 0 ETH | 0.03184901 | ||||
Create New Vault... | 20219784 | 2 days ago | IN | 0 ETH | 0.02967925 | ||||
Create New Vault... | 20219777 | 2 days ago | IN | 0 ETH | 0.02771922 | ||||
Create New Vault... | 20219757 | 2 days ago | IN | 0 ETH | 0.02699774 | ||||
Create New Vault... | 20207799 | 4 days ago | IN | 0 ETH | 0.01031912 | ||||
Create New Vault... | 20192627 | 6 days ago | IN | 0 ETH | 0.00859421 | ||||
Create New Vault... | 20013817 | 31 days ago | IN | 0 ETH | 0.03362914 | ||||
Create New Vault... | 19973536 | 36 days ago | IN | 0 ETH | 0.06545637 | ||||
Create New Vault... | 19969903 | 37 days ago | IN | 0 ETH | 0.07413535 | ||||
Create New Vault... | 19969901 | 37 days ago | IN | 0 ETH | 0.075717 | ||||
Create New Vault... | 19969890 | 37 days ago | IN | 0 ETH | 0.05616624 | ||||
Create New Vault... | 19969885 | 37 days ago | IN | 0 ETH | 0.06614044 | ||||
Create New Vault... | 19891560 | 48 days ago | IN | 0 ETH | 0.0146886 | ||||
Create New Vault... | 19737962 | 69 days ago | IN | 0 ETH | 0.0280612 | ||||
Create New Vault... | 19737954 | 69 days ago | IN | 0 ETH | 0.03031463 | ||||
Create New Vault... | 19650898 | 82 days ago | IN | 0 ETH | 0.07107125 | ||||
Create New Vault... | 19626869 | 85 days ago | IN | 0 ETH | 0.07056844 | ||||
Create New Vault... | 19626858 | 85 days ago | IN | 0 ETH | 0.07406808 | ||||
Create New Vault... | 19093994 | 160 days ago | IN | 0 ETH | 0.04519446 | ||||
Create New Vault... | 18764504 | 206 days ago | IN | 0 ETH | 0.23699385 | ||||
Create New Vault... | 18756511 | 207 days ago | IN | 0 ETH | 0.08446906 | ||||
Create New Vault... | 18756374 | 207 days ago | IN | 0 ETH | 0.0944504 | ||||
Create New Vault... | 18756370 | 207 days ago | IN | 0 ETH | 0.07600266 | ||||
Create New Vault... | 18756363 | 207 days ago | IN | 0 ETH | 0.07581239 | ||||
Create New Vault... | 18731869 | 211 days ago | IN | 0 ETH | 0.11338179 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CurveGlobal
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// 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 ); } }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "CurveGlobal.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.