Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MIMConvexStrategy
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import '../interfaces/IConvexVault.sol'; import '../interfaces/ICurvePool.sol'; import '../interfaces/IStableSwap2Pool.sol'; import '../interfaces/IStableSwap3Pool.sol'; import './BaseStrategy.sol'; import '../interfaces/ExtendedIERC20.sol'; import '../interfaces/ICVXMinter.sol'; import '../interfaces/IHarvester.sol'; contract MIMConvexStrategy is BaseStrategy { // used for Crv -> weth -> [mim/3crv] -> mimCrv route address public immutable crv; address public immutable cvx; address public immutable mim; address public immutable crv3; uint256 public immutable pid; IConvexVault public immutable convexVault; IConvexRewards public immutable crvRewards; IStableSwap2Pool public immutable stableSwap2Pool; IStableSwap3Pool public immutable stableSwap3Pool; /** * @param _name The strategy name * @param _want The desired token of the strategy * @param _crv The address of CRV * @param _cvx The address of CVX * @param _weth The address of WETH * @param _mim The address of MIM * @param _crv3 The address of 3CRV * @param _stableSwap3Pool The address of the 3CRV pool * @param _pid The pool id of convex * @param _convexVault The address of the convex vault * @param _stableSwap2Pool The address of the stable swap pool * @param _controller The address of the controller * @param _manager The address of the manager * @param _routerArray The address array of routers for swapping tokens */ constructor( string memory _name, address _want, address _crv, address _cvx, address _weth, address _mim, address _crv3, IStableSwap3Pool _stableSwap3Pool, uint256 _pid, IConvexVault _convexVault, IStableSwap2Pool _stableSwap2Pool, address _controller, address _manager, address[] memory _routerArray ) public BaseStrategy(_name, _controller, _manager, _want, _weth, _routerArray) { require(address(_crv) != address(0), '!_crv'); require(address(_cvx) != address(0), '!_cvx'); require(address(_mim) != address(0), '!_mim'); require(address(_crv3) != address(0), '!_crv3'); require(address(_convexVault) != address(0), '!_convexVault'); require(address(_stableSwap2Pool) != address(0), '!_stableSwap2Pool'); require(address(_stableSwap3Pool) != address(0), '!_stableSwap3Pool'); (, , , address _crvRewards, , ) = _convexVault.poolInfo(_pid); crv = _crv; cvx = _cvx; mim = _mim; crv3 = _crv3; pid = _pid; convexVault = _convexVault; crvRewards = IConvexRewards(_crvRewards); stableSwap2Pool = _stableSwap2Pool; stableSwap3Pool = _stableSwap3Pool; // Required to overcome "Stack Too Deep" error _setApprovals( _want, _crv, _cvx, _mim, _crv3, address(_convexVault), address(_stableSwap2Pool), _routerArray ); _setMoreApprovals(address(_stableSwap3Pool), _crvRewards, _routerArray); } function _setMoreApprovals(address _stableSwap3Pool, address _crvRewards, address[] memory _routerArray) internal { IERC20(IStableSwap3Pool(_stableSwap3Pool).coins(0)).safeApprove(_stableSwap3Pool, type(uint256).max); IERC20(IStableSwap3Pool(_stableSwap3Pool).coins(1)).safeApprove(_stableSwap3Pool, type(uint256).max); IERC20(IStableSwap3Pool(_stableSwap3Pool).coins(2)).safeApprove(_stableSwap3Pool, type(uint256).max); uint _routerArrayLength = _routerArray.length; for(uint i=0; i<_routerArrayLength; i++) { address _router = _routerArray[i]; uint rewardsLength = IConvexRewards(_crvRewards).extraRewardsLength(); if (rewardsLength > 0) { for(uint j=0; j<rewardsLength; j++) { IERC20(IConvexRewards(IConvexRewards(_crvRewards).extraRewards(j)).rewardToken()).safeApprove(_router, type(uint256).max); } } } } function _setApprovals( address _want, address _crv, address _cvx, address _mim, address _crv3, address _convexVault, address _stableSwap2Pool, address[] memory _routerArray ) internal { IERC20(_want).safeApprove(address(_convexVault), type(uint256).max); for(uint i=0; i<_routerArray.length; i++) { address _router = _routerArray[i]; IERC20(_crv).safeApprove(address(_router), 0); IERC20(_crv).safeApprove(address(_router), type(uint256).max); IERC20(_cvx).safeApprove(address(_router), 0); IERC20(_cvx).safeApprove(address(_router), type(uint256).max); } IERC20(_mim).safeApprove(address(_stableSwap2Pool), type(uint256).max); IERC20(_crv3).safeApprove(address(_stableSwap2Pool), type(uint256).max); IERC20(_want).safeApprove(address(_stableSwap2Pool), type(uint256).max); } function _deposit() internal override { if (balanceOfWant() > 0) { convexVault.depositAll(pid, true); } } function _claimReward() internal { crvRewards.getReward(address(this), true); } function _addLiquidity(uint256 estimate) internal { uint256[2] memory amounts; amounts[1] = IERC20(crv3).balanceOf(address(this)); stableSwap2Pool.add_liquidity(amounts, estimate); } function _addLiquidity3CRV(uint256 estimate) internal { uint256[3] memory amounts; (address targetCoin, uint256 targetIndex) = getMostPremium(); amounts[targetIndex] = IERC20(targetCoin).balanceOf(address(this)); stableSwap3Pool.add_liquidity(amounts, estimate); } function getMostPremium() public view returns (address, uint256) { uint256 daiBalance = stableSwap3Pool.balances(0); uint256 usdcBalance = (stableSwap3Pool.balances(1)).mul(10**18).div(ExtendedIERC20(stableSwap3Pool.coins(1)).decimals()); uint256 usdtBalance = (stableSwap3Pool.balances(2)).mul(10**12); if (daiBalance <= usdcBalance && daiBalance <= usdtBalance) { return (stableSwap3Pool.coins(0), 0); } if (usdcBalance <= daiBalance && usdcBalance <= usdtBalance) { return (stableSwap3Pool.coins(1), 1); } if (usdtBalance <= daiBalance && usdtBalance <= usdcBalance) { return (stableSwap3Pool.coins(2), 2); } return (stableSwap3Pool.coins(0), 0); // If they're somehow equal, we just want DAI } function _harvest(uint256[] calldata _estimates) internal override { _claimReward(); uint256 _cvxBalance = IERC20(cvx).balanceOf(address(this)); if (_cvxBalance > 0) { _swapTokens(cvx, weth, _cvxBalance, _estimates[0]); } uint256 _extraRewardsLength = crvRewards.extraRewardsLength(); for (uint256 i = 0; i < _extraRewardsLength; i++) { address _rewardToken = IConvexRewards(crvRewards.extraRewards(i)).rewardToken(); uint256 _extraRewardBalance = IERC20(_rewardToken).balanceOf(address(this)); if (_extraRewardBalance > 0) { _swapTokens(_rewardToken, weth, _extraRewardBalance, _estimates[i+1]); } } // RouterIndex 1 sets router to Uniswap to swap WETH->YAXIS uint256 _remainingWeth = _payHarvestFees(crv, _estimates[_extraRewardsLength + 1], _estimates[_extraRewardsLength + 2], 1); if (_remainingWeth > 0) { (address _token, ) = getMostPremium(); // stablecoin we want to convert to _swapTokens(weth, _token, _remainingWeth, _estimates[_extraRewardsLength + 3]); _addLiquidity3CRV(_estimates[_extraRewardsLength + 4]); _addLiquidity(_estimates[_extraRewardsLength + 4]); _deposit(); } } function getEstimates() external view returns (uint256[] memory) { uint rewardsLength = crvRewards.extraRewardsLength(); uint256[] memory _estimates = new uint256[](rewardsLength.add(5)); address[] memory _path = new address[](2); uint256[] memory _amounts; uint256 _notSlippage = ONE_HUNDRED_PERCENT.sub(IHarvester(manager.harvester()).slippage()); uint256 wethAmount; // Estimates for CVX -> WETH _path[0] = cvx; _path[1] = weth; _amounts = router.getAmountsOut( // Calculating CVX minted (crvRewards.earned(address(this))) .mul(ICVXMinter(cvx).totalCliffs().sub(ICVXMinter(cvx).totalSupply().div(ICVXMinter(cvx).reductionPerCliff()))) .div(ICVXMinter(cvx).totalCliffs()), _path ); _estimates[0]= _amounts[1].mul(_notSlippage).div(ONE_HUNDRED_PERCENT); wethAmount += _estimates[0]; // Estimates for extra rewards -> WETH if (rewardsLength > 0) { for (uint256 i = 0; i < rewardsLength; i++) { _path[0] = IConvexRewards(crvRewards.extraRewards(i)).rewardToken(); _path[1] = weth; _amounts = router.getAmountsOut( IConvexRewards(crvRewards.extraRewards(i)).earned(address(this)), _path ); _estimates[i + 1] = _amounts[1].mul(_notSlippage).div(ONE_HUNDRED_PERCENT); wethAmount += _estimates[i + 1]; } } // Estimates for CRV -> WETH _path[0] = crv; _path[1] = weth; _amounts = router.getAmountsOut( crvRewards.earned(address(this)), _path ); _estimates[rewardsLength + 1] = _amounts[1].mul(_notSlippage).div(ONE_HUNDRED_PERCENT); wethAmount += _estimates[rewardsLength + 1]; // Estimates WETH -> YAXIS _path[0] = weth; _path[1] = manager.yaxis(); // Set to UniswapV2 to calculate output for YAXIS _amounts = ISwap(routerArray[1]).getAmountsOut(wethAmount.mul(manager.treasuryFee()).div(ONE_HUNDRED_PERCENT), _path); _estimates[rewardsLength + 2] = _amounts[1].mul(_notSlippage).div(ONE_HUNDRED_PERCENT); // Estimates for WETH -> Stablecoin (address _targetCoin,) = getMostPremium(); _path[0] = weth; _path[1] = _targetCoin; _amounts = router.getAmountsOut( wethAmount - _amounts[0], _path ); _estimates[rewardsLength + 3] = _amounts[1].mul(_notSlippage).div(ONE_HUNDRED_PERCENT); // Estimates for Stablecoin -> 3CRV _estimates[rewardsLength + 4] = (_amounts[1].mul(10**(18-ExtendedIERC20(_targetCoin).decimals())).mul(10**18).div(stableSwap3Pool.get_virtual_price())).mul(_notSlippage).div(ONE_HUNDRED_PERCENT); // Estimates for 3CRV -> MIM-3CRV is the same 3CRV estimate return _estimates; } function _withdrawAll() internal override { crvRewards.withdrawAllAndUnwrap(false); } function _withdraw(uint256 _amount) internal override { crvRewards.withdrawAndUnwrap(_amount, false); } function balanceOfPool() public view override returns (uint256) { return IERC20(address(crvRewards)).balanceOf(address(this)); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IConvexVault { function poolInfo(uint256 pid) external view returns ( address lptoken, address token, address gauge, address crvRewards, address stash, bool shutdown ); function deposit( uint256 pid, uint256 amount, bool stake ) external returns (bool); function depositAll(uint256 pid, bool stake) external returns (bool); function withdraw(uint256 pid, uint256 amount) external returns (bool); function withdrawAll(uint256 pid) external returns (bool); } interface IConvexRewards { function getReward(address _account, bool _claimExtras) external returns (bool); function extraRewardsLength() external view returns (uint256); function extraRewards(uint256 _pid) external view returns (address); function rewardToken() external view returns (address); function earned(address _account) external view returns (uint256); function withdrawAllAndUnwrap(bool claim) external; function withdrawAndUnwrap(uint256 amount, bool claim) external returns(bool); }
// SPDX-License-Identifier: MIT // solhint-disable func-name-mixedcase // solhint-disable var-name-mixedcase pragma solidity 0.6.12; interface ICurvePool { function get_virtual_price() external view returns (uint256); function coins(uint256) external view returns (address); function balances(uint256) external view returns (uint256); function get_dy( int128 i, int128 j, uint256 dx ) external view returns (uint256 dy); function exchange( int128 i, int128 j, uint256 dx, uint256 min_dy ) external; function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_amount ) external; function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external view returns (uint256); }
// SPDX-License-Identifier: MIT // solhint-disable func-name-mixedcase // solhint-disable var-name-mixedcase pragma solidity 0.6.12; interface IStableSwap2Pool { function get_virtual_price() external view returns (uint256); function balances(uint256) external view returns (uint256); function get_dy( int128 i, int128 j, uint256 dx ) external view returns (uint256 dy); function exchange( int128 i, int128 j, uint256 dx, uint256 min_dy ) external; function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external; function remove_liquidity(uint256 _amount, uint256[2] calldata amounts) external; function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_amount ) external; function calc_token_amount(uint256[2] calldata amounts, bool deposit) external view returns (uint256); function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external view returns (uint256); }
// SPDX-License-Identifier: MIT // solhint-disable func-name-mixedcase // solhint-disable var-name-mixedcase pragma solidity 0.6.12; interface IStableSwap3Pool { function get_virtual_price() external view returns (uint); function balances(uint) external view returns (uint); function coins(uint) external view returns (address); function get_dy(int128 i, int128 j, uint dx) external view returns (uint dy); function exchange(int128 i, int128 j, uint dx, uint min_dy) external; function add_liquidity(uint[3] calldata amounts, uint min_mint_amount) external; function remove_liquidity(uint _amount, uint[3] calldata amounts) external; function remove_liquidity_one_coin(uint _token_amount, int128 i, uint min_amount) external; function calc_token_amount(uint[3] calldata amounts, bool deposit) external view returns (uint); function calc_withdraw_one_coin(uint _token_amount, int128 i) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import "../interfaces/IStableSwap3Pool.sol"; import "../interfaces/ISwap.sol"; import "../interfaces/IManager.sol"; import "../interfaces/IStrategy.sol"; import "../interfaces/IController.sol"; /** * @title BaseStrategy * @notice The BaseStrategy is an abstract contract which all * yAxis strategies should inherit functionality from. It gives * specific security properties which make it hard to write an * insecure strategy. * @notice All state-changing functions implemented in the strategy * should be internal, since any public or externally-facing functions * are already handled in the BaseStrategy. * @notice The following functions must be implemented by a strategy: * - function _deposit() internal virtual; * - function _harvest() internal virtual; * - function _withdraw(uint256 _amount) internal virtual; * - function _withdrawAll() internal virtual; * - function balanceOfPool() public view override virtual returns (uint256); */ abstract contract BaseStrategy is IStrategy { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; uint256 public constant ONE_HUNDRED_PERCENT = 10000; address public immutable override want; address public immutable override weth; address public immutable controller; IManager public immutable override manager; string public override name; address[] public routerArray; ISwap public override router; /** * @param _controller The address of the controller * @param _manager The address of the manager * @param _want The desired token of the strategy * @param _weth The address of WETH * @param _routerArray The addresses of routers for swapping tokens */ constructor( string memory _name, address _controller, address _manager, address _want, address _weth, address[] memory _routerArray ) public { name = _name; want = _want; controller = _controller; manager = IManager(_manager); weth = _weth; require(_routerArray.length > 0, "Must input at least one router"); routerArray = _routerArray; router = ISwap(_routerArray[0]); for(uint i = 0; i < _routerArray.length; i++) { IERC20(_weth).safeApprove(address(_routerArray[i]), 0); IERC20(_weth).safeApprove(address(_routerArray[i]), type(uint256).max); } } /** * GOVERNANCE-ONLY FUNCTIONS */ /** * @notice Approves a token address to be spent by an address * @param _token The address of the token * @param _spender The address of the spender * @param _amount The amount to spend */ function approveForSpender( IERC20 _token, address _spender, uint256 _amount ) external { require(msg.sender == manager.governance(), "!governance"); _token.safeApprove(_spender, 0); _token.safeApprove(_spender, _amount); } /** * @notice Sets the address of the ISwap-compatible router * @param _routerArray The addresses of routers * @param _tokenArray The addresses of tokens that need to be approved by the strategy */ function setRouter( address[] calldata _routerArray, address[] calldata _tokenArray ) external { require(msg.sender == manager.governance(), "!governance"); routerArray = _routerArray; router = ISwap(_routerArray[0]); address _router; uint256 _routerLength = _routerArray.length; uint256 _tokenArrayLength = _tokenArray.length; for(uint i = 0; i < _routerLength; i++) { _router = _routerArray[i]; IERC20(weth).safeApprove(_router, 0); IERC20(weth).safeApprove(_router, type(uint256).max); for(uint j = 0; j < _tokenArrayLength; j++) { IERC20(_tokenArray[j]).safeApprove(_router, 0); IERC20(_tokenArray[j]).safeApprove(_router, type(uint256).max); } } } /** * @notice Sets the default ISwap-compatible router * @param _routerIndex Gets the address of the router from routerArray */ function setDefaultRouter( uint256 _routerIndex ) external { require(msg.sender == manager.governance(), "!governance"); router = ISwap(routerArray[_routerIndex]); } /** * CONTROLLER-ONLY FUNCTIONS */ /** * @notice Deposits funds to the strategy's pool */ function deposit() external override onlyController { _deposit(); } /** * @notice Harvest funds in the strategy's pool */ function harvest( uint256[] calldata _estimates ) external override onlyController { _harvest(_estimates); } /** * @notice Sends stuck want tokens in the strategy to the controller */ function skim() external override onlyController { IERC20(want).safeTransfer(controller, balanceOfWant()); } /** * @notice Sends stuck tokens in the strategy to the controller * @param _asset The address of the token to withdraw */ function withdraw( address _asset ) external override onlyController { require(want != _asset, "want"); IERC20 _assetToken = IERC20(_asset); uint256 _balance = _assetToken.balanceOf(address(this)); _assetToken.safeTransfer(controller, _balance); } /** * @notice Initiated from a vault, withdraws funds from the pool * @param _amount The amount of the want token to withdraw */ function withdraw( uint256 _amount ) external override onlyController { uint256 _balance = balanceOfWant(); if (_balance < _amount) { _amount = _withdrawSome(_amount.sub(_balance)); _amount = _amount.add(_balance); } IERC20(want).safeTransfer(controller, _amount); } /** * @notice Withdraws all funds from the strategy */ function withdrawAll() external override onlyController { _withdrawAll(); uint256 _balance = IERC20(want).balanceOf(address(this)); IERC20(want).safeTransfer(controller, _balance); } /** * EXTERNAL VIEW FUNCTIONS */ /** * @notice Returns the strategy's balance of the want token plus the balance of pool */ function balanceOf() external view override returns (uint256) { return balanceOfWant().add(balanceOfPool()); } /** * PUBLIC VIEW FUNCTIONS */ /** * @notice Returns the balance of the pool * @dev Must be implemented by the strategy */ function balanceOfPool() public view virtual override returns (uint256); /** * @notice Returns the balance of the want token on the strategy */ function balanceOfWant() public view override returns (uint256) { return IERC20(want).balanceOf(address(this)); } /** * INTERNAL FUNCTIONS */ function _deposit() internal virtual; function _harvest( uint256[] calldata _estimates ) internal virtual; function _payHarvestFees( address _poolToken, uint256 _estimatedWETH, uint256 _estimatedYAXIS, uint256 _routerIndex ) internal returns (uint256 _wethBal) { uint256 _amount = IERC20(_poolToken).balanceOf(address(this)); _swapTokens(_poolToken, weth, _amount, _estimatedWETH); _wethBal = IERC20(weth).balanceOf(address(this)); if (_wethBal > 0) { // get all the necessary variables in a single call ( address yaxis, address treasury, uint256 treasuryFee ) = manager.getHarvestFeeInfo(); uint256 _fee; // pay the treasury with YAX if (treasuryFee > 0 && treasury != address(0)) { _fee = _wethBal.mul(treasuryFee).div(ONE_HUNDRED_PERCENT); _swapTokensWithRouterIndex(weth, yaxis, _fee, _estimatedYAXIS, _routerIndex); IERC20(yaxis).safeTransfer(treasury, IERC20(yaxis).balanceOf(address(this))); } // return the remaining WETH balance _wethBal = IERC20(weth).balanceOf(address(this)); } } function _swapTokensWithRouterIndex( address _input, address _output, uint256 _amount, uint256 _expected, uint256 _routerIndex ) internal { address[] memory path = new address[](2); path[0] = _input; path[1] = _output; ISwap(routerArray[_routerIndex]).swapExactTokensForTokens( _amount, _expected, path, address(this), // The deadline is a hardcoded value that is far in the future. 1e10 ); } function _swapTokens( address _input, address _output, uint256 _amount, uint256 _expected ) internal { address[] memory path = new address[](2); path[0] = _input; path[1] = _output; router.swapExactTokensForTokens( _amount, _expected, path, address(this), // The deadline is a hardcoded value that is far in the future. 1e10 ); } function _withdraw( uint256 _amount ) internal virtual; function _withdrawAll() internal virtual; function _withdrawSome( uint256 _amount ) internal returns (uint256) { uint256 _before = IERC20(want).balanceOf(address(this)); _withdraw(_amount); uint256 _after = IERC20(want).balanceOf(address(this)); _amount = _after.sub(_before); return _amount; } /** * MODIFIERS */ modifier onlyStrategist() { require(msg.sender == manager.strategist(), "!strategist"); _; } modifier onlyController() { require(msg.sender == controller, "!controller"); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface ExtendedIERC20 { function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface ICVXMinter { function maxSupply() external view returns (uint256); function totalSupply() external view returns (uint256); function totalCliffs() external view returns (uint256); function reductionPerCliff() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "./IManager.sol"; interface IHarvester { function addStrategy(address, address, uint256) external; function manager() external view returns (IManager); function removeStrategy(address, address, uint256) external; function slippage() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; interface ISwap { function swapExactTokensForTokens(uint256, uint256, address[] calldata, address, uint256) external; function getAmountsOut(uint256, address[] calldata) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IManager { function addVault(address) external; function allowedControllers(address) external view returns (bool); function allowedConverters(address) external view returns (bool); function allowedStrategies(address) external view returns (bool); function allowedVaults(address) external view returns (bool); function controllers(address) external view returns (address); function getHarvestFeeInfo() external view returns (address, address, uint256); function getToken(address) external view returns (address); function governance() external view returns (address); function halted() external view returns (bool); function harvester() external view returns (address); function insuranceFee() external view returns (uint256); function insurancePool() external view returns (address); function insurancePoolFee() external view returns (uint256); function pendingStrategist() external view returns (address); function removeVault(address) external; function stakingPool() external view returns (address); function stakingPoolShareFee() external view returns (uint256); function strategist() external view returns (address); function treasury() external view returns (address); function treasuryFee() external view returns (uint256); function withdrawalProtectionFee() external view returns (uint256); function yaxis() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "./IManager.sol"; import "./ISwap.sol"; interface IStrategy { function balanceOf() external view returns (uint256); function balanceOfPool() external view returns (uint256); function balanceOfWant() external view returns (uint256); function deposit() external; function harvest(uint256[] calldata) external; function manager() external view returns (IManager); function name() external view returns (string memory); function router() external view returns (ISwap); function skim() external; function want() external view returns (address); function weth() external view returns (address); function withdraw(address) external; function withdraw(uint256) external; function withdrawAll() external; } interface IStrategyExtended { function getEstimates() external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "./IManager.sol"; interface IController { function balanceOf() external view returns (uint256); function converter(address _vault) external view returns (address); function earn(address _strategy, address _token, uint256 _amount) external; function investEnabled() external view returns (bool); function harvestStrategy(address _strategy, uint256[] calldata _estimates) external; function manager() external view returns (IManager); function strategies() external view returns (uint256); function withdraw(address _token, uint256 _amount) external; function withdrawAll(address _strategy, address _convert) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_want","type":"address"},{"internalType":"address","name":"_crv","type":"address"},{"internalType":"address","name":"_cvx","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_mim","type":"address"},{"internalType":"address","name":"_crv3","type":"address"},{"internalType":"contract IStableSwap3Pool","name":"_stableSwap3Pool","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"contract IConvexVault","name":"_convexVault","type":"address"},{"internalType":"contract IStableSwap2Pool","name":"_stableSwap2Pool","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_manager","type":"address"},{"internalType":"address[]","name":"_routerArray","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ONE_HUNDRED_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approveForSpender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convexVault","outputs":[{"internalType":"contract IConvexVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crv3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crvRewards","outputs":[{"internalType":"contract IConvexRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getEstimates","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMostPremium","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_estimates","type":"uint256[]"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mim","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract ISwap","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"routerArray","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_routerIndex","type":"uint256"}],"name":"setDefaultRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_routerArray","type":"address[]"},{"internalType":"address[]","name":"_tokenArray","type":"address[]"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stableSwap2Pool","outputs":[{"internalType":"contract IStableSwap2Pool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stableSwap3Pool","outputs":[{"internalType":"contract IStableSwap3Pool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6102206040523480156200001257600080fd5b50604051620058453803806200584583398181016040526101c08110156200003957600080fd5b81019080805160405193929190846401000000008211156200005a57600080fd5b9083019060208201858111156200007057600080fd5b82516401000000008111828201881017156200008b57600080fd5b82525081516020918201929091019080838360005b83811015620000ba578181015183820152602001620000a0565b50505050905090810190601f168015620000e85780820380516001836020036101000a031916815260200191505b5060408181526020830151908301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516101408b01516101608c01516101808d01516101a0909d0180519b9f9a9e999d989c979b969a95999498939792969195939492939291846401000000008211156200016657600080fd5b9083019060208201858111156200017c57600080fd5b82518660208202830111640100000000821117156200019a57600080fd5b82525081516020918201928201910280838360005b83811015620001c9578181015183820152602001620001af565b505050509050016040525050508d83838f8d858560009080519060200190620001f492919062000e9b565b506001600160601b0319606084811b821660805286811b821660c05285811b821660e05283901b1660a052805162000273576040805162461bcd60e51b815260206004820152601e60248201527f4d75737420696e707574206174206c65617374206f6e6520726f757465720000604482015290519081900360640190fd5b80516200028890600190602084019062000f20565b50806000815181106200029757fe5b6020026020010151600260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060005b815181101562000350576200030c828281518110620002e357fe5b60200260200101516000856001600160a01b03166200066160201b62002d67179092919060201c565b620003478282815181106200031d57fe5b6020026020010151600019856001600160a01b03166200066160201b62002d67179092919060201c565b600101620002c8565b50505050506001600160a01b038e16151591506200039f9050576040805162461bcd60e51b815260206004820152600560248201526410afb1b93b60d91b604482015290519081900360640190fd5b6001600160a01b038b16620003e3576040805162461bcd60e51b8152602060048201526005602482015264042bec6ecf60db1b604482015290519081900360640190fd5b6001600160a01b03891662000427576040805162461bcd60e51b8152602060048201526005602482015264215f6d696d60d81b604482015290519081900360640190fd5b6001600160a01b0388166200046c576040805162461bcd60e51b8152602060048201526006602482015265215f6372763360d01b604482015290519081900360640190fd5b6001600160a01b038516620004b8576040805162461bcd60e51b815260206004820152600d60248201526c0857d8dbdb9d995e15985d5b1d609a1b604482015290519081900360640190fd5b6001600160a01b03841662000508576040805162461bcd60e51b81526020600482015260116024820152700857dcdd18589b1954ddd85c0c941bdbdb607a1b604482015290519081900360640190fd5b6001600160a01b03871662000558576040805162461bcd60e51b81526020600482015260116024820152700857dcdd18589b1954ddd85c0cd41bdbdb607a1b604482015290519081900360640190fd5b6000856001600160a01b0316631526fe27886040518263ffffffff1660e01b81526004018082815260200191505060c06040518083038186803b1580156200059f57600080fd5b505afa158015620005b4573d6000803e3d6000fd5b505050506040513d60c0811015620005cb57600080fd5b506060908101516001600160601b03198f831b8116610100528e831b8116610120528c831b8116610140528b831b8116610160526101808a905288831b81166101a05281831b81166101c05287831b81166101e052918a901b9091166102005290506200063f8e8e8e8d8d8b8b8962000785565b6200064c888284620008f6565b50505050505050505050505050505062000fbe565b801580620006eb575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015620006bb57600080fd5b505afa158015620006d0573d6000803e3d6000fd5b505050506040513d6020811015620006e757600080fd5b5051155b620007285760405162461bcd60e51b81526004018080602001828103825260368152602001806200580f6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200078091859162000bac16565b505050565b620007ac836000198a6001600160a01b03166200066160201b62002d67179092919060201c565b60005b815181101562000876576000828281518110620007c857fe5b60200260200101519050620007f88160008b6001600160a01b03166200066160201b62002d67179092919060201c565b6200081f816000198b6001600160a01b03166200066160201b62002d67179092919060201c565b620008458160008a6001600160a01b03166200066160201b62002d67179092919060201c565b6200086c816000198a6001600160a01b03166200066160201b62002d67179092919060201c565b50600101620007af565b506200089e82600019876001600160a01b03166200066160201b62002d67179092919060201c565b620008c582600019866001600160a01b03166200066160201b62002d67179092919060201c565b620008ec826000198a6001600160a01b03166200066160201b62002d67179092919060201c565b5050505050505050565b6200098f83600019856001600160a01b031663c661065760006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156200094457600080fd5b505afa15801562000959573d6000803e3d6000fd5b505050506040513d60208110156200097057600080fd5b50516001600160a01b0316919062000661602090811b62002d6717901c565b620009dd83600019856001600160a01b031663c661065760016040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156200094457600080fd5b62000a2b83600019856001600160a01b031663c661065760026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156200094457600080fd5b805160005b8181101562000ba557600083828151811062000a4857fe5b602002602001015190506000856001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b15801562000a8e57600080fd5b505afa15801562000aa3573d6000803e3d6000fd5b505050506040513d602081101562000aba57600080fd5b50519050801562000b9a5760005b8181101562000b985762000b8f83600019896001600160a01b03166340c35446856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801562000b1e57600080fd5b505afa15801562000b33573d6000803e3d6000fd5b505050506040513d602081101562000b4a57600080fd5b50516040805163f7c618c160e01b815290516001600160a01b039092169163f7c618c191600480820192602092909190829003018186803b1580156200094457600080fd5b60010162000ac8565b505b505060010162000a30565b5050505050565b606062000c08826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000c6860201b62002e7a179092919060201c565b805190915015620007805780806020019051602081101562000c2957600080fd5b5051620007805760405162461bcd60e51b815260040180806020018281038252602a815260200180620057e5602a913960400191505060405180910390fd5b606062000c79848460008562000c83565b90505b9392505050565b60608247101562000cc65760405162461bcd60e51b8152600401808060200182810382526026815260200180620057bf6026913960400191505060405180910390fd5b62000cd18562000deb565b62000d23576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831062000d645780518252601f19909201916020918201910162000d43565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462000dc8576040519150601f19603f3d011682016040523d82523d6000602084013e62000dcd565b606091505b50909250905062000de082828662000df1565b979650505050505050565b3b151590565b6060831562000e0257508162000c7c565b82511562000e135782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000e5f57818101518382015260200162000e45565b50505050905090810190601f16801562000e8d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000ede57805160ff191683800117855562000f0e565b8280016001018555821562000f0e579182015b8281111562000f0e57825182559160200191906001019062000ef1565b5062000f1c92915062000f86565b5090565b82805482825590600052602060002090810192821562000f78579160200282015b8281111562000f7857825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000f41565b5062000f1c92915062000f9d565b5b8082111562000f1c576000815560010162000f87565b5b8082111562000f1c5780546001600160a01b031916815560010162000f9e565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c6101605160601c610180516101a05160601c6101c05160601c6101e05160601c6102005160601c6145e0620011df60003980611a66528061211852806121d252806122e8528061233d52806123b9528061246e528061252352806125c352806127ef528061408b525080612d4552806141c952508061063352806106d55280610bf05280610e225280610fb952806112f85280612aea5280613289528061331d52806135ec5280613a1d5280613add5250806128af52806136a0525080612cee52806136695250806128f75280614142525080612ac65250806108d552806109985280610a415280610ace5280610b485280612aa25280613187528061322b52508061124052806128d352806134e05250806107d5528061154b52806116415280611ca35280611fc152806120ef5280612bf65280613daf525080611bbe5280611c235280611ed25280611f96528061266b52806127c3528061281c52806129445280612a785280612b865280612d125250806109235280610f4d528061128e52806114fd528061184f5280611de75280611e2b52806120cb528061324c528061349f528061354c5280613ce85280613d2e5280613e7b5280613f51525080611c545280611c7f5280611f7452806126d752806129b05280612a565280612b10528061302a52806130d052506145e06000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063689538e71161010f578063c1a3d44c116100a2578063f106845411610071578063f106845414610581578063f77c479114610589578063f887ea4014610591578063f975bcce14610599576101e5565b8063c1a3d44c14610533578063d0e30db01461053b578063dd0081c714610543578063ef9e23791461054b576101e5565b8063853828b6116100de578063853828b614610513578063923c1d611461051b5780639f67679e14610523578063b6bff2951461052b576101e5565b8063689538e7146104f35780636a4874a1146104fb5780636dca5abe14610503578063722713f71461050b576101e5565b8063337da0fc1161018757806351cff8d91161015657806351cff8d91461043a5780635a3874ac146104605780635d14b06f146104685780635f349a11146104d6576101e5565b8063337da0fc146103e25780633fc8cef3146103ff578063481c6a751461040757806348677dbe1461040f576101e5565b80631dd19cb4116101c35780631dd19cb4146102d95780631f1fcd51146102e35780632d16c4e3146103075780632e1a7d4d146103c5576101e5565b806306fdde03146101ea5780631158808614610267578063185881ec14610281575b600080fd5b6101f26105a1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561022c578181015183820152602001610214565b50505050905090810190601f1680156102595780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61026f61062f565b60408051918252519081900360200190f35b6102896106cf565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c55781810151838201526020016102ad565b505050509050019250505060405180910390f35b6102e1611bb3565b005b6102eb611c7d565b604080516001600160a01b039092168252519081900360200190f35b6102e16004803603604081101561031d57600080fd5b810190602081018135600160201b81111561033757600080fd5b82018360208201111561034957600080fd5b803590602001918460208302840111600160201b8311171561036a57600080fd5b919390929091602081019035600160201b81111561038757600080fd5b82018360208201111561039957600080fd5b803590602001918460208302840111600160201b831117156103ba57600080fd5b509092509050611ca1565b6102e1600480360360208110156103db57600080fd5b5035611ec7565b6102e1600480360360208110156103f857600080fd5b5035611fbf565b6102eb6120c9565b6102eb6120ed565b610417612111565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6102e16004803603602081101561045057600080fd5b50356001600160a01b0316612660565b6102eb6127ed565b6102e16004803603602081101561047e57600080fd5b810190602081018135600160201b81111561049857600080fd5b8201836020820111156104aa57600080fd5b803590602001918460208302840111600160201b831117156104cb57600080fd5b509092509050612811565b6102eb600480360360208110156104ec57600080fd5b5035612886565b6102eb6128ad565b6102eb6128d1565b6102eb6128f5565b61026f612919565b6102e1612939565b6102eb612aa0565b6102eb612ac4565b6102eb612ae8565b61026f612b0c565b6102e1612b7b565b61026f612bee565b6102e16004803603606081101561056157600080fd5b506001600160a01b03813581169160208101359091169060400135612bf4565b61026f612cec565b6102eb612d10565b6102eb612d34565b6102eb612d43565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106275780601f106105fc57610100808354040283529160200191610627565b820191906000526020600020905b81548152906001019060200180831161060a57829003601f168201915b505050505081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561069e57600080fd5b505afa1580156106b2573d6000803e3d6000fd5b505050506040513d60208110156106c857600080fd5b5051905090565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b15801561072c57600080fd5b505afa158015610740573d6000803e3d6000fd5b505050506040513d602081101561075657600080fd5b505190506060610767826005612e93565b67ffffffffffffffff8111801561077d57600080fd5b506040519080825280602002602001820160405280156107a7578160200160208202803683370190505b50604080516002808252606080830184529394509091602083019080368337019050509050606060006108cf7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634bdaeac16040518163ffffffff1660e01b815260040160206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d602081101561085657600080fd5b505160408051633e032a3b60e01b815290516001600160a01b0390921691633e032a3b91600480820192602092909190829003018186803b15801561089a57600080fd5b505afa1580156108ae573d6000803e3d6000fd5b505050506040513d60208110156108c457600080fd5b505161271090612ef6565b905060007f00000000000000000000000000000000000000000000000000000000000000008460008151811061090157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008460018151811061094f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600260009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f610c6d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631f96e76f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ef57600080fd5b505afa158015610a03573d6000803e3d6000fd5b505050506040513d6020811015610a1957600080fd5b50516040805163553a731160e11b81529051610c6791610bd191610b46916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163aa74e62291600480820192602092909190829003018186803b158015610a8857600080fd5b505afa158015610a9c573d6000803e3d6000fd5b505050506040513d6020811015610ab257600080fd5b5051604080516318160ddd60e01b815290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916318160ddd916004808301926020929190829003018186803b158015610b1457600080fd5b505afa158015610b28573d6000803e3d6000fd5b505050506040513d6020811015610b3e57600080fd5b505190612f38565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631f96e76f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9f57600080fd5b505afa158015610bb3573d6000803e3d6000fd5b505050506040513d6020811015610bc957600080fd5b505190612ef6565b604080516246613160e11b815230600482015290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691628cc262916024808301926020929190829003018186803b158015610c3557600080fd5b505afa158015610c49573d6000803e3d6000fd5b505050506040513d6020811015610c5f57600080fd5b505190612f7a565b90612f38565b866040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610cc3578181015183820152602001610cab565b50505050905001935050505060006040518083038186803b158015610ce757600080fd5b505afa158015610cfb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d2457600080fd5b8101908080516040519392919084600160201b821115610d4357600080fd5b908301906020820185811115610d5857600080fd5b82518660208202830111600160201b82111715610d7457600080fd5b82525081516020918201928201910280838360005b83811015610da1578181015183820152602001610d89565b505050509050016040525050509250610ddd612710610c678486600181518110610dc757fe5b6020026020010151612f7a90919063ffffffff16565b85600081518110610dea57fe5b60200260200101818152505084600081518110610e0357fe5b602090810291909101015101851561123e5760005b8681101561123c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c35446826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610e8457600080fd5b505afa158015610e98573d6000803e3d6000fd5b505050506040513d6020811015610eae57600080fd5b50516040805163f7c618c160e01b815290516001600160a01b039092169163f7c618c191600480820192602092909190829003018186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6020811015610f1c57600080fd5b505185518690600090610f2b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000085600181518110610f7957fe5b6001600160a01b0392831660209182029290920181019190915260025460408051632061aa2360e11b81526004810186905290519184169363d06ca61f937f0000000000000000000000000000000000000000000000000000000000000000909116926340c35446926024808201939291829003018186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b5051604080516246613160e11b815230600482015290516001600160a01b0390921691628cc26291602480820192602092909190829003018186803b15801561107057600080fd5b505afa158015611084573d6000803e3d6000fd5b505050506040513d602081101561109a57600080fd5b5051604080516001600160e01b031960e085901b16815260048101838152602482019283528a5160448301528a518b939192606401906020858101910280838360005b838110156110f55781810151838201526020016110dd565b50505050905001935050505060006040518083038186803b15801561111957600080fd5b505afa15801561112d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561115657600080fd5b8101908080516040519392919084600160201b82111561117557600080fd5b90830190602082018581111561118a57600080fd5b82518660208202830111600160201b821117156111a657600080fd5b82525081516020918201928201910280838360005b838110156111d35781810151838201526020016111bb565b5050505090500160405250505093506111f9612710610c678587600181518110610dc757fe5b86826001018151811061120857fe5b60200260200101818152505085816001018151811061122357fe5b6020026020010151820191508080600101915050610e18565b505b7f00000000000000000000000000000000000000000000000000000000000000008460008151811061126c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000846001815181106112ba57fe5b6001600160a01b03928316602091820292909201810191909152600254604080516246613160e11b815230600482015290519184169363d06ca61f937f000000000000000000000000000000000000000000000000000000000000000090911692628cc262926024808201939291829003018186803b15801561133c57600080fd5b505afa158015611350573d6000803e3d6000fd5b505050506040513d602081101561136657600080fd5b5051604080516001600160e01b031960e085901b16815260048101838152602482019283528951604483015289518a939192606401906020858101910280838360005b838110156113c15781810151838201526020016113a9565b50505050905001935050505060006040518083038186803b1580156113e557600080fd5b505afa1580156113f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561142257600080fd5b8101908080516040519392919084600160201b82111561144157600080fd5b90830190602082018581111561145657600080fd5b82518660208202830111600160201b8211171561147257600080fd5b82525081516020918201928201910280838360005b8381101561149f578181015183820152602001611487565b5050505090500160405250505092506114c5612710610c678486600181518110610dc757fe5b8587600101815181106114d457fe5b6020026020010181815250508486600101815181106114ef57fe5b6020026020010151810190507f00000000000000000000000000000000000000000000000000000000000000008460008151811061152957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633f021b0e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115a257600080fd5b505afa1580156115b6573d6000803e3d6000fd5b505050506040513d60208110156115cc57600080fd5b50518451859060019081106115dd57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001808154811061160a57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f6116cb612710610c677f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cc32d1766040518163ffffffff1660e01b815260040160206040518083038186803b15801561169857600080fd5b505afa1580156116ac573d6000803e3d6000fd5b505050506040513d60208110156116c257600080fd5b50518690612f7a565b866040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611721578181015183820152602001611709565b50505050905001935050505060006040518083038186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561178257600080fd5b8101908080516040519392919084600160201b8211156117a157600080fd5b9083019060208201858111156117b657600080fd5b82518660208202830111600160201b821117156117d257600080fd5b82525081516020918201928201910280838360005b838110156117ff5781810151838201526020016117e7565b505050509050016040525050509250611825612710610c678486600181518110610dc757fe5b85876002018151811061183457fe5b602002602001018181525050600061184a612111565b5090507f00000000000000000000000000000000000000000000000000000000000000008560008151811061187b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505080856001815181106118a957fe5b6001600160a01b039283166020918202929092010152600254855191169063d06ca61f9086906000906118d857fe5b60200260200101518403876040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611938578181015183820152602001611920565b50505050905001935050505060006040518083038186803b15801561195c57600080fd5b505afa158015611970573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561199957600080fd5b8101908080516040519392919084600160201b8211156119b857600080fd5b9083019060208201858111156119cd57600080fd5b82518660208202830111600160201b821117156119e957600080fd5b82525081516020918201928201910280838360005b83811015611a165781810151838201526020016119fe565b505050509050016040525050509350611a3c612710610c678587600181518110610dc757fe5b868860030181518110611a4b57fe5b602002602001018181525050611b8d612710610c6785611b877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015611abd57600080fd5b505afa158015611ad1573d6000803e3d6000fd5b505050506040513d6020811015611ae757600080fd5b50516040805163313ce56760e01b81529051610c6791670de0b6b3a764000091611b87916001600160a01b038c169163313ce56791600480820192602092909190829003018186803b158015611b3c57600080fd5b505afa158015611b50573d6000803e3d6000fd5b505050506040513d6020811015611b6657600080fd5b50518d5160129190910360ff908116600a0a16908e906001908110610dc757fe5b90612f7a565b868860040181518110611b9c57fe5b602090810291909101015250939550505050505090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c1e576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b611c7b7f0000000000000000000000000000000000000000000000000000000000000000611c4a612b0c565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190612fd3565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611cfa57600080fd5b505afa158015611d0e573d6000803e3d6000fd5b505050506040513d6020811015611d2457600080fd5b50516001600160a01b03163314611d70576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b611d7c60018585614445565b5083836000818110611d8a57fe5b6002805460209290920293909301356001600160a01b03166001600160a01b0319909116179091555060008382825b82811015611ebd57878782818110611dcd57fe5b905060200201356001600160a01b03169350611e1e8460007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612d679092919063ffffffff16565b611e546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685600019612d67565b60005b82811015611eb457611e99856000898985818110611e7157fe5b905060200201356001600160a01b03166001600160a01b0316612d679092919063ffffffff16565b611eac85600019898985818110611e7157fe5b600101611e57565b50600101611db9565b5050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611f32576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6000611f3c612b0c565b905081811015611f6757611f58611f538383612ef6565b613025565b9150611f648282612e93565b91505b611fbb6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000084612fd3565b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561201857600080fd5b505afa15801561202c573d6000803e3d6000fd5b505050506040513d602081101561204257600080fd5b50516001600160a01b0316331461208e576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001818154811061209b57fe5b600091825260209091200154600280546001600160a01b0319166001600160a01b0390921691909117905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634903b0d160006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561217b57600080fd5b505afa15801561218f573d6000803e3d6000fd5b505050506040513d60208110156121a557600080fd5b50516040805163c661065760e01b815260016004820152905191925060009161232e916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163c661065791602480820192602092909190829003018186803b15801561221957600080fd5b505afa15801561222d573d6000803e3d6000fd5b505050506040513d602081101561224357600080fd5b50516040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b15801561228757600080fd5b505afa15801561229b573d6000803e3d6000fd5b505050506040513d60208110156122b157600080fd5b505160408051634903b0d160e01b815260016004820152905160ff90921691610c6791670de0b6b3a7640000916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691634903b0d1916024808301926020929190829003018186803b158015610c3557600080fd5b905060006123a064e8d4a510007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634903b0d160026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610c3557600080fd5b90508183111580156123b25750808311155b15612457577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c661065760006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561241c57600080fd5b505afa158015612430573d6000803e3d6000fd5b505050506040513d602081101561244657600080fd5b505194506000935061265c92505050565b8282111580156124675750808211155b1561250c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c661065760016040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156124d157600080fd5b505afa1580156124e5573d6000803e3d6000fd5b505050506040513d60208110156124fb57600080fd5b505194506001935061265c92505050565b82811115801561251c5750818111155b156125c1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c661065760026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561258657600080fd5b505afa15801561259a573d6000803e3d6000fd5b505050506040513d60208110156125b057600080fd5b505194506002935061265c92505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c661065760006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561262657600080fd5b505afa15801561263a573d6000803e3d6000fd5b505050506040513d602081101561265057600080fd5b50519450600093505050505b9091565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146126cb576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b806001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141561273b576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b604080516370a0823160e01b8152306004820152905182916000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561278657600080fd5b505afa15801561279a573d6000803e3d6000fd5b505050506040513d60208110156127b057600080fd5b505190506127e86001600160a01b0383167f000000000000000000000000000000000000000000000000000000000000000083612fd3565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461287c576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b611fbb828261317b565b6001818154811061289357fe5b6000918252602090912001546001600160a01b0316905081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061293461292661062f565b61292e612b0c565b90612e93565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146129a4576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6129ac6135c9565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612a1b57600080fd5b505afa158015612a2f573d6000803e3d6000fd5b505050506040513d6020811015612a4557600080fd5b50519050612a9d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083612fd3565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561069e57600080fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612be6576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b611c7b613649565b61271081565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015612c4d57600080fd5b505afa158015612c61573d6000803e3d6000fd5b505050506040513d6020811015612c7757600080fd5b50516001600160a01b03163314612cc3576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b612cd86001600160a01b038416836000612d67565b6127e86001600160a01b0384168383612d67565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580612ded575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612dbf57600080fd5b505afa158015612dd3573d6000803e3d6000fd5b505050506040513d6020811015612de957600080fd5b5051155b612e285760405162461bcd60e51b81526004018080602001828103825260368152602001806145756036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526127e8908490613712565b6060612e8984846000856137c3565b90505b9392505050565b600082820183811015612eed576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000612eed83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061391f565b6000612eed83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506139b6565b600082612f8957506000612ef0565b82820282848281612f9657fe5b0414612eed5760405162461bcd60e51b815260040180806020018281038252602181526020018061452a6021913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526127e8908490613712565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561309557600080fd5b505afa1580156130a9573d6000803e3d6000fd5b505050506040513d60208110156130bf57600080fd5b505190506130cc83613a1b565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561313b57600080fd5b505afa15801561314f573d6000803e3d6000fd5b505050506040513d602081101561316557600080fd5b505190506131738183612ef6565b949350505050565b613183613ab6565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156131f257600080fd5b505afa158015613206573d6000803e3d6000fd5b505050506040513d602081101561321c57600080fd5b505190508015613285576132857f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000838686600081811061327957fe5b90506020020135613b25565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b1580156132e057600080fd5b505afa1580156132f4573d6000803e3d6000fd5b505050506040513d602081101561330a57600080fd5b5051905060005b818110156134d85760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c35446836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561337f57600080fd5b505afa158015613393573d6000803e3d6000fd5b505050506040513d60208110156133a957600080fd5b50516040805163f7c618c160e01b815290516001600160a01b039092169163f7c618c191600480820192602092909190829003018186803b1580156133ed57600080fd5b505afa158015613401573d6000803e3d6000fd5b505050506040513d602081101561341757600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561346557600080fd5b505afa158015613479573d6000803e3d6000fd5b505050506040513d602081101561348f57600080fd5b5051905080156134ce576134ce827f0000000000000000000000000000000000000000000000000000000000000000838a8a8860010181811061327957fe5b5050600101613311565b5060006135327f000000000000000000000000000000000000000000000000000000000000000086868560010181811061350e57fe5b9050602002013587878660020181811061352457fe5b905060200201356001613c64565b905080156135c2576000613544612111565b50905061357c7f0000000000000000000000000000000000000000000000000000000000000000828489898860030181811061327957fe5b61359a86868560040181811061358e57fe5b90506020020135613fd3565b6135b88686856004018181106135ac57fe5b9050602002013561411a565b6135c0613649565b505b5050505050565b604080516324f81cd160e11b815260006004820181905291516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926349f039a2926024808201939182900301818387803b15801561362f57600080fd5b505af1158015613643573d6000803e3d6000fd5b50505050565b6000613653612b0c565b1115611c7b576040805163303acfe760e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001602482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916360759fce9160448083019260209291908290030181600087803b1580156136e857600080fd5b505af11580156136fc573d6000803e3d6000fd5b505050506040513d6020811015611fbb57600080fd5b6060613767826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e7a9092919063ffffffff16565b8051909150156127e85780806020019051602081101561378657600080fd5b50516127e85760405162461bcd60e51b815260040180806020018281038252602a81526020018061454b602a913960400191505060405180910390fd5b6060824710156138045760405162461bcd60e51b81526004018080602001828103825260268152602001806145046026913960400191505060405180910390fd5b61380d85614261565b61385e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061389d5780518252601f19909201916020918201910161387e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146138ff576040519150601f19603f3d011682016040523d82523d6000602084013e613904565b606091505b5091509150613914828286614267565b979650505050505050565b600081848411156139ae5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561397357818101518382015260200161395b565b50505050905090810190601f1680156139a05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613a055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561397357818101518382015260200161395b565b506000838581613a1157fe5b0495945050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b158015613a8c57600080fd5b505af1158015613aa0573d6000803e3d6000fd5b505050506040513d60208110156127e857600080fd5b60408051637050ccd960e01b81523060048201526001602482015290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691637050ccd99160448083019260209291908290030181600087803b1580156136e857600080fd5b60408051600280825260608083018452926020830190803683370190505090508481600081518110613b5357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110613b8157fe5b6001600160a01b039283166020918202929092018101919091526002546040516338ed173960e01b8152600481018781526024820187905230606483018190526402540be4006084840181905260a060448501908152885160a4860152885195909716966338ed1739968b968b968b96939260c490910191878201910280838360005b83811015613c1c578181015183820152602001613c04565b505050509050019650505050505050600060405180830381600087803b158015613c4557600080fd5b505af1158015613c59573d6000803e3d6000fd5b505050505050505050565b600080856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613cb457600080fd5b505afa158015613cc8573d6000803e3d6000fd5b505050506040513d6020811015613cde57600080fd5b50519050613d0e867f00000000000000000000000000000000000000000000000000000000000000008388613b25565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b158015613d7457600080fd5b505afa158015613d88573d6000803e3d6000fd5b505050506040513d6020811015613d9e57600080fd5b505191508115613fca5760008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663da633d316040518163ffffffff1660e01b815260040160606040518083038186803b158015613e0657600080fd5b505afa158015613e1a573d6000803e3d6000fd5b505050506040513d6060811015613e3057600080fd5b5080516020820151604090920151909450909250905060008115801590613e5f57506001600160a01b03831615155b15613f3157613e74612710610c678885612f7a565b9050613ea37f000000000000000000000000000000000000000000000000000000000000000085838b8b6142cd565b613f3183856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613ef457600080fd5b505afa158015613f08573d6000803e3d6000fd5b505050506040513d6020811015613f1e57600080fd5b50516001600160a01b0387169190612fd3565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b158015613f9757600080fd5b505afa158015613fab573d6000803e3d6000fd5b505050506040513d6020811015613fc157600080fd5b50519550505050505b50949350505050565b613fdb6144a8565b600080613fe6612111565b91509150816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561403757600080fd5b505afa15801561404b573d6000803e3d6000fd5b505050506040513d602081101561406157600080fd5b505183826003811061406f57fe5b6020020152604051634515cef360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634515cef390859087906004018083606080838360005b838110156140db5781810151838201526020016140c3565b5050505090500182815260200192505050600060405180830381600087803b15801561410657600080fd5b505af1158015611ebd573d6000803e3d6000fd5b6141226144c6565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561418857600080fd5b505afa15801561419c573d6000803e3d6000fd5b505050506040513d60208110156141b257600080fd5b5051602082015260408051630b4c7e4d60e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691630b4c7e4d9184918691600401908190849080838360005b8381101561422257818101518382015260200161420a565b5050505090500182815260200192505050600060405180830381600087803b15801561424d57600080fd5b505af11580156135c0573d6000803e3d6000fd5b3b151590565b60608315614276575081612e8c565b8251156142865782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561397357818101518382015260200161395b565b604080516002808252606080830184529260208301908036833701905050905085816000815181106142fb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061432957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001828154811061435657fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166338ed1739858584306402540be4006040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156143fc5781810151838201526020016143e4565b505050509050019650505050505050600060405180830381600087803b15801561442557600080fd5b505af1158015614439573d6000803e3d6000fd5b50505050505050505050565b828054828255906000526020600020908101928215614498579160200282015b828111156144985781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190614465565b506144a49291506144e4565b5090565b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b5b808211156144a45780546001600160a01b03191681556001016144e556fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a264697066735822122057a3f0f8f939a55f9e1dcfc14136e87a4fb0ae6bbb4a67b7db58b57c537faae764736f6c634300060c0033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000000000000000000000000000000000000000000001c00000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd520000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f30000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e490000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c70000000000000000000000000000000000000000000000000000000000000028000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae310000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac60000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001d794178697320436f6e7665782053747261746567793a204d494d4352560000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063689538e71161010f578063c1a3d44c116100a2578063f106845411610071578063f106845414610581578063f77c479114610589578063f887ea4014610591578063f975bcce14610599576101e5565b8063c1a3d44c14610533578063d0e30db01461053b578063dd0081c714610543578063ef9e23791461054b576101e5565b8063853828b6116100de578063853828b614610513578063923c1d611461051b5780639f67679e14610523578063b6bff2951461052b576101e5565b8063689538e7146104f35780636a4874a1146104fb5780636dca5abe14610503578063722713f71461050b576101e5565b8063337da0fc1161018757806351cff8d91161015657806351cff8d91461043a5780635a3874ac146104605780635d14b06f146104685780635f349a11146104d6576101e5565b8063337da0fc146103e25780633fc8cef3146103ff578063481c6a751461040757806348677dbe1461040f576101e5565b80631dd19cb4116101c35780631dd19cb4146102d95780631f1fcd51146102e35780632d16c4e3146103075780632e1a7d4d146103c5576101e5565b806306fdde03146101ea5780631158808614610267578063185881ec14610281575b600080fd5b6101f26105a1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561022c578181015183820152602001610214565b50505050905090810190601f1680156102595780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61026f61062f565b60408051918252519081900360200190f35b6102896106cf565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102c55781810151838201526020016102ad565b505050509050019250505060405180910390f35b6102e1611bb3565b005b6102eb611c7d565b604080516001600160a01b039092168252519081900360200190f35b6102e16004803603604081101561031d57600080fd5b810190602081018135600160201b81111561033757600080fd5b82018360208201111561034957600080fd5b803590602001918460208302840111600160201b8311171561036a57600080fd5b919390929091602081019035600160201b81111561038757600080fd5b82018360208201111561039957600080fd5b803590602001918460208302840111600160201b831117156103ba57600080fd5b509092509050611ca1565b6102e1600480360360208110156103db57600080fd5b5035611ec7565b6102e1600480360360208110156103f857600080fd5b5035611fbf565b6102eb6120c9565b6102eb6120ed565b610417612111565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6102e16004803603602081101561045057600080fd5b50356001600160a01b0316612660565b6102eb6127ed565b6102e16004803603602081101561047e57600080fd5b810190602081018135600160201b81111561049857600080fd5b8201836020820111156104aa57600080fd5b803590602001918460208302840111600160201b831117156104cb57600080fd5b509092509050612811565b6102eb600480360360208110156104ec57600080fd5b5035612886565b6102eb6128ad565b6102eb6128d1565b6102eb6128f5565b61026f612919565b6102e1612939565b6102eb612aa0565b6102eb612ac4565b6102eb612ae8565b61026f612b0c565b6102e1612b7b565b61026f612bee565b6102e16004803603606081101561056157600080fd5b506001600160a01b03813581169160208101359091169060400135612bf4565b61026f612cec565b6102eb612d10565b6102eb612d34565b6102eb612d43565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106275780601f106105fc57610100808354040283529160200191610627565b820191906000526020600020905b81548152906001019060200180831161060a57829003601f168201915b505050505081565b60007f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc47716001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561069e57600080fd5b505afa1580156106b2573d6000803e3d6000fd5b505050506040513d60208110156106c857600080fd5b5051905090565b606060007f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc47716001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b15801561072c57600080fd5b505afa158015610740573d6000803e3d6000fd5b505050506040513d602081101561075657600080fd5b505190506060610767826005612e93565b67ffffffffffffffff8111801561077d57600080fd5b506040519080825280602002602001820160405280156107a7578160200160208202803683370190505b50604080516002808252606080830184529394509091602083019080368337019050509050606060006108cf7f000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d6001600160a01b0316634bdaeac16040518163ffffffff1660e01b815260040160206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d602081101561085657600080fd5b505160408051633e032a3b60e01b815290516001600160a01b0390921691633e032a3b91600480820192602092909190829003018186803b15801561089a57600080fd5b505afa1580156108ae573d6000803e3d6000fd5b505050506040513d60208110156108c457600080fd5b505161271090612ef6565b905060007f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8460008151811061090157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28460018151811061094f57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600260009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f610c6d7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b0316631f96e76f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ef57600080fd5b505afa158015610a03573d6000803e3d6000fd5b505050506040513d6020811015610a1957600080fd5b50516040805163553a731160e11b81529051610c6791610bd191610b46916001600160a01b037f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b169163aa74e62291600480820192602092909190829003018186803b158015610a8857600080fd5b505afa158015610a9c573d6000803e3d6000fd5b505050506040513d6020811015610ab257600080fd5b5051604080516318160ddd60e01b815290516001600160a01b037f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b16916318160ddd916004808301926020929190829003018186803b158015610b1457600080fd5b505afa158015610b28573d6000803e3d6000fd5b505050506040513d6020811015610b3e57600080fd5b505190612f38565b7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b0316631f96e76f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b9f57600080fd5b505afa158015610bb3573d6000803e3d6000fd5b505050506040513d6020811015610bc957600080fd5b505190612ef6565b604080516246613160e11b815230600482015290516001600160a01b037f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc47711691628cc262916024808301926020929190829003018186803b158015610c3557600080fd5b505afa158015610c49573d6000803e3d6000fd5b505050506040513d6020811015610c5f57600080fd5b505190612f7a565b90612f38565b866040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015610cc3578181015183820152602001610cab565b50505050905001935050505060006040518083038186803b158015610ce757600080fd5b505afa158015610cfb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d2457600080fd5b8101908080516040519392919084600160201b821115610d4357600080fd5b908301906020820185811115610d5857600080fd5b82518660208202830111600160201b82111715610d7457600080fd5b82525081516020918201928201910280838360005b83811015610da1578181015183820152602001610d89565b505050509050016040525050509250610ddd612710610c678486600181518110610dc757fe5b6020026020010151612f7a90919063ffffffff16565b85600081518110610dea57fe5b60200260200101818152505084600081518110610e0357fe5b602090810291909101015101851561123e5760005b8681101561123c577f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc47716001600160a01b03166340c35446826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610e8457600080fd5b505afa158015610e98573d6000803e3d6000fd5b505050506040513d6020811015610eae57600080fd5b50516040805163f7c618c160e01b815290516001600160a01b039092169163f7c618c191600480820192602092909190829003018186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6020811015610f1c57600080fd5b505185518690600090610f2b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc285600181518110610f7957fe5b6001600160a01b0392831660209182029290920181019190915260025460408051632061aa2360e11b81526004810186905290519184169363d06ca61f937f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc4771909116926340c35446926024808201939291829003018186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b5051604080516246613160e11b815230600482015290516001600160a01b0390921691628cc26291602480820192602092909190829003018186803b15801561107057600080fd5b505afa158015611084573d6000803e3d6000fd5b505050506040513d602081101561109a57600080fd5b5051604080516001600160e01b031960e085901b16815260048101838152602482019283528a5160448301528a518b939192606401906020858101910280838360005b838110156110f55781810151838201526020016110dd565b50505050905001935050505060006040518083038186803b15801561111957600080fd5b505afa15801561112d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561115657600080fd5b8101908080516040519392919084600160201b82111561117557600080fd5b90830190602082018581111561118a57600080fd5b82518660208202830111600160201b821117156111a657600080fd5b82525081516020918201928201910280838360005b838110156111d35781810151838201526020016111bb565b5050505090500160405250505093506111f9612710610c678587600181518110610dc757fe5b86826001018151811061120857fe5b60200260200101818152505085816001018151811061122357fe5b6020026020010151820191508080600101915050610e18565b505b7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd528460008151811061126c57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2846001815181106112ba57fe5b6001600160a01b03928316602091820292909201810191909152600254604080516246613160e11b815230600482015290519184169363d06ca61f937f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc477190911692628cc262926024808201939291829003018186803b15801561133c57600080fd5b505afa158015611350573d6000803e3d6000fd5b505050506040513d602081101561136657600080fd5b5051604080516001600160e01b031960e085901b16815260048101838152602482019283528951604483015289518a939192606401906020858101910280838360005b838110156113c15781810151838201526020016113a9565b50505050905001935050505060006040518083038186803b1580156113e557600080fd5b505afa1580156113f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561142257600080fd5b8101908080516040519392919084600160201b82111561144157600080fd5b90830190602082018581111561145657600080fd5b82518660208202830111600160201b8211171561147257600080fd5b82525081516020918201928201910280838360005b8381101561149f578181015183820152602001611487565b5050505090500160405250505092506114c5612710610c678486600181518110610dc757fe5b8587600101815181106114d457fe5b6020026020010181815250508486600101815181106114ef57fe5b6020026020010151810190507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28460008151811061152957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d6001600160a01b0316633f021b0e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115a257600080fd5b505afa1580156115b6573d6000803e3d6000fd5b505050506040513d60208110156115cc57600080fd5b50518451859060019081106115dd57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001808154811061160a57fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663d06ca61f6116cb612710610c677f000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d6001600160a01b031663cc32d1766040518163ffffffff1660e01b815260040160206040518083038186803b15801561169857600080fd5b505afa1580156116ac573d6000803e3d6000fd5b505050506040513d60208110156116c257600080fd5b50518690612f7a565b866040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611721578181015183820152602001611709565b50505050905001935050505060006040518083038186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561178257600080fd5b8101908080516040519392919084600160201b8211156117a157600080fd5b9083019060208201858111156117b657600080fd5b82518660208202830111600160201b821117156117d257600080fd5b82525081516020918201928201910280838360005b838110156117ff5781810151838201526020016117e7565b505050509050016040525050509250611825612710610c678486600181518110610dc757fe5b85876002018151811061183457fe5b602002602001018181525050600061184a612111565b5090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28560008151811061187b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505080856001815181106118a957fe5b6001600160a01b039283166020918202929092010152600254855191169063d06ca61f9086906000906118d857fe5b60200260200101518403876040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611938578181015183820152602001611920565b50505050905001935050505060006040518083038186803b15801561195c57600080fd5b505afa158015611970573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561199957600080fd5b8101908080516040519392919084600160201b8211156119b857600080fd5b9083019060208201858111156119cd57600080fd5b82518660208202830111600160201b821117156119e957600080fd5b82525081516020918201928201910280838360005b83811015611a165781810151838201526020016119fe565b505050509050016040525050509350611a3c612710610c678587600181518110610dc757fe5b868860030181518110611a4b57fe5b602002602001018181525050611b8d612710610c6785611b877f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015611abd57600080fd5b505afa158015611ad1573d6000803e3d6000fd5b505050506040513d6020811015611ae757600080fd5b50516040805163313ce56760e01b81529051610c6791670de0b6b3a764000091611b87916001600160a01b038c169163313ce56791600480820192602092909190829003018186803b158015611b3c57600080fd5b505afa158015611b50573d6000803e3d6000fd5b505050506040513d6020811015611b6657600080fd5b50518d5160129190910360ff908116600a0a16908e906001908110610dc757fe5b90612f7a565b868860040181518110611b9c57fe5b602090810291909101015250939550505050505090565b336001600160a01b037f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac601614611c1e576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b611c7b7f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac60611c4a612b0c565b6001600160a01b037f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b169190612fd3565b565b7f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b81565b7f000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d6001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015611cfa57600080fd5b505afa158015611d0e573d6000803e3d6000fd5b505050506040513d6020811015611d2457600080fd5b50516001600160a01b03163314611d70576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b611d7c60018585614445565b5083836000818110611d8a57fe5b6002805460209290920293909301356001600160a01b03166001600160a01b0319909116179091555060008382825b82811015611ebd57878782818110611dcd57fe5b905060200201356001600160a01b03169350611e1e8460007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316612d679092919063ffffffff16565b611e546001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21685600019612d67565b60005b82811015611eb457611e99856000898985818110611e7157fe5b905060200201356001600160a01b03166001600160a01b0316612d679092919063ffffffff16565b611eac85600019898985818110611e7157fe5b600101611e57565b50600101611db9565b5050505050505050565b336001600160a01b037f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac601614611f32576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6000611f3c612b0c565b905081811015611f6757611f58611f538383612ef6565b613025565b9150611f648282612e93565b91505b611fbb6001600160a01b037f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b167f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac6084612fd3565b5050565b7f000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d6001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561201857600080fd5b505afa15801561202c573d6000803e3d6000fd5b505050506040513d602081101561204257600080fd5b50516001600160a01b0316331461208e576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001818154811061209b57fe5b600091825260209091200154600280546001600160a01b0319166001600160a01b0390921691909117905550565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7f000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d81565b60008060007f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b0316634903b0d160006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561217b57600080fd5b505afa15801561218f573d6000803e3d6000fd5b505050506040513d60208110156121a557600080fd5b50516040805163c661065760e01b815260016004820152905191925060009161232e916001600160a01b037f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c7169163c661065791602480820192602092909190829003018186803b15801561221957600080fd5b505afa15801561222d573d6000803e3d6000fd5b505050506040513d602081101561224357600080fd5b50516040805163313ce56760e01b815290516001600160a01b039092169163313ce56791600480820192602092909190829003018186803b15801561228757600080fd5b505afa15801561229b573d6000803e3d6000fd5b505050506040513d60208110156122b157600080fd5b505160408051634903b0d160e01b815260016004820152905160ff90921691610c6791670de0b6b3a7640000916001600160a01b037f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c71691634903b0d1916024808301926020929190829003018186803b158015610c3557600080fd5b905060006123a064e8d4a510007f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b0316634903b0d160026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610c3557600080fd5b90508183111580156123b25750808311155b15612457577f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663c661065760006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561241c57600080fd5b505afa158015612430573d6000803e3d6000fd5b505050506040513d602081101561244657600080fd5b505194506000935061265c92505050565b8282111580156124675750808211155b1561250c577f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663c661065760016040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156124d157600080fd5b505afa1580156124e5573d6000803e3d6000fd5b505050506040513d60208110156124fb57600080fd5b505194506001935061265c92505050565b82811115801561251c5750818111155b156125c1577f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663c661065760026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561258657600080fd5b505afa15801561259a573d6000803e3d6000fd5b505050506040513d60208110156125b057600080fd5b505194506002935061265c92505050565b7f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c76001600160a01b031663c661065760006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561262657600080fd5b505afa15801561263a573d6000803e3d6000fd5b505050506040513d602081101561265057600080fd5b50519450600093505050505b9091565b336001600160a01b037f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac6016146126cb576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b806001600160a01b03167f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b6001600160a01b0316141561273b576040805162461bcd60e51b815260206004808301919091526024820152631dd85b9d60e21b604482015290519081900360640190fd5b604080516370a0823160e01b8152306004820152905182916000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561278657600080fd5b505afa15801561279a573d6000803e3d6000fd5b505050506040513d60208110156127b057600080fd5b505190506127e86001600160a01b0383167f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac6083612fd3565b505050565b7f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c781565b336001600160a01b037f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac60161461287c576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b611fbb828261317b565b6001818154811061289357fe5b6000918252602090912001546001600160a01b0316905081565b7f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae3181565b7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5281565b7f0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e49081565b600061293461292661062f565b61292e612b0c565b90612e93565b905090565b336001600160a01b037f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac6016146129a4576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b6129ac6135c9565b60007f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612a1b57600080fd5b505afa158015612a2f573d6000803e3d6000fd5b505050506040513d6020811015612a4557600080fd5b50519050612a9d6001600160a01b037f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b167f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac6083612fd3565b50565b7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b7f00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f381565b7f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc477181565b60007f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561069e57600080fd5b336001600160a01b037f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac601614612be6576040805162461bcd60e51b815260206004820152600b60248201526a10b1b7b73a3937b63632b960a91b604482015290519081900360640190fd5b611c7b613649565b61271081565b7f000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d6001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b158015612c4d57600080fd5b505afa158015612c61573d6000803e3d6000fd5b505050506040513d6020811015612c7757600080fd5b50516001600160a01b03163314612cc3576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b612cd86001600160a01b038416836000612d67565b6127e86001600160a01b0384168383612d67565b7f000000000000000000000000000000000000000000000000000000000000002881565b7f000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac6081565b6002546001600160a01b031681565b7f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b81565b801580612ded575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612dbf57600080fd5b505afa158015612dd3573d6000803e3d6000fd5b505050506040513d6020811015612de957600080fd5b5051155b612e285760405162461bcd60e51b81526004018080602001828103825260368152602001806145756036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526127e8908490613712565b6060612e8984846000856137c3565b90505b9392505050565b600082820183811015612eed576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000612eed83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061391f565b6000612eed83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506139b6565b600082612f8957506000612ef0565b82820282848281612f9657fe5b0414612eed5760405162461bcd60e51b815260040180806020018281038252602181526020018061452a6021913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526127e8908490613712565b6000807f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561309557600080fd5b505afa1580156130a9573d6000803e3d6000fd5b505050506040513d60208110156130bf57600080fd5b505190506130cc83613a1b565b60007f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561313b57600080fd5b505afa15801561314f573d6000803e3d6000fd5b505050506040513d602081101561316557600080fd5b505190506131738183612ef6565b949350505050565b613183613ab6565b60007f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156131f257600080fd5b505afa158015613206573d6000803e3d6000fd5b505050506040513d602081101561321c57600080fd5b505190508015613285576132857f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2838686600081811061327957fe5b90506020020135613b25565b60007f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc47716001600160a01b031663d55a23f46040518163ffffffff1660e01b815260040160206040518083038186803b1580156132e057600080fd5b505afa1580156132f4573d6000803e3d6000fd5b505050506040513d602081101561330a57600080fd5b5051905060005b818110156134d85760007f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc47716001600160a01b03166340c35446836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561337f57600080fd5b505afa158015613393573d6000803e3d6000fd5b505050506040513d60208110156133a957600080fd5b50516040805163f7c618c160e01b815290516001600160a01b039092169163f7c618c191600480820192602092909190829003018186803b1580156133ed57600080fd5b505afa158015613401573d6000803e3d6000fd5b505050506040513d602081101561341757600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561346557600080fd5b505afa158015613479573d6000803e3d6000fd5b505050506040513d602081101561348f57600080fd5b5051905080156134ce576134ce827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2838a8a8860010181811061327957fe5b5050600101613311565b5060006135327f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5286868560010181811061350e57fe5b9050602002013587878660020181811061352457fe5b905060200201356001613c64565b905080156135c2576000613544612111565b50905061357c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2828489898860030181811061327957fe5b61359a86868560040181811061358e57fe5b90506020020135613fd3565b6135b88686856004018181106135ac57fe5b9050602002013561411a565b6135c0613649565b505b5050505050565b604080516324f81cd160e11b815260006004820181905291516001600160a01b037f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc477116926349f039a2926024808201939182900301818387803b15801561362f57600080fd5b505af1158015613643573d6000803e3d6000fd5b50505050565b6000613653612b0c565b1115611c7b576040805163303acfe760e11b81527f000000000000000000000000000000000000000000000000000000000000002860048201526001602482015290516001600160a01b037f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae3116916360759fce9160448083019260209291908290030181600087803b1580156136e857600080fd5b505af11580156136fc573d6000803e3d6000fd5b505050506040513d6020811015611fbb57600080fd5b6060613767826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e7a9092919063ffffffff16565b8051909150156127e85780806020019051602081101561378657600080fd5b50516127e85760405162461bcd60e51b815260040180806020018281038252602a81526020018061454b602a913960400191505060405180910390fd5b6060824710156138045760405162461bcd60e51b81526004018080602001828103825260268152602001806145046026913960400191505060405180910390fd5b61380d85614261565b61385e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061389d5780518252601f19909201916020918201910161387e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146138ff576040519150601f19603f3d011682016040523d82523d6000602084013e613904565b606091505b5091509150613914828286614267565b979650505050505050565b600081848411156139ae5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561397357818101518382015260200161395b565b50505050905090810190601f1680156139a05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613a055760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561397357818101518382015260200161395b565b506000838581613a1157fe5b0495945050505050565b7f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc47716001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b158015613a8c57600080fd5b505af1158015613aa0573d6000803e3d6000fd5b505050506040513d60208110156127e857600080fd5b60408051637050ccd960e01b81523060048201526001602482015290516001600160a01b037f000000000000000000000000fd5abf66b003881b88567eb9ed9c651f14dc47711691637050ccd99160448083019260209291908290030181600087803b1580156136e857600080fd5b60408051600280825260608083018452926020830190803683370190505090508481600081518110613b5357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110613b8157fe5b6001600160a01b039283166020918202929092018101919091526002546040516338ed173960e01b8152600481018781526024820187905230606483018190526402540be4006084840181905260a060448501908152885160a4860152885195909716966338ed1739968b968b968b96939260c490910191878201910280838360005b83811015613c1c578181015183820152602001613c04565b505050509050019650505050505050600060405180830381600087803b158015613c4557600080fd5b505af1158015613c59573d6000803e3d6000fd5b505050505050505050565b600080856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613cb457600080fd5b505afa158015613cc8573d6000803e3d6000fd5b505050506040513d6020811015613cde57600080fd5b50519050613d0e867f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28388613b25565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a08231916024808301926020929190829003018186803b158015613d7457600080fd5b505afa158015613d88573d6000803e3d6000fd5b505050506040513d6020811015613d9e57600080fd5b505191508115613fca5760008060007f000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d6001600160a01b031663da633d316040518163ffffffff1660e01b815260040160606040518083038186803b158015613e0657600080fd5b505afa158015613e1a573d6000803e3d6000fd5b505050506040513d6060811015613e3057600080fd5b5080516020820151604090920151909450909250905060008115801590613e5f57506001600160a01b03831615155b15613f3157613e74612710610c678885612f7a565b9050613ea37f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc285838b8b6142cd565b613f3183856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613ef457600080fd5b505afa158015613f08573d6000803e3d6000fd5b505050506040513d6020811015613f1e57600080fd5b50516001600160a01b0387169190612fd3565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a08231916024808301926020929190829003018186803b158015613f9757600080fd5b505afa158015613fab573d6000803e3d6000fd5b505050506040513d6020811015613fc157600080fd5b50519550505050505b50949350505050565b613fdb6144a8565b600080613fe6612111565b91509150816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561403757600080fd5b505afa15801561404b573d6000803e3d6000fd5b505050506040513d602081101561406157600080fd5b505183826003811061406f57fe5b6020020152604051634515cef360e01b81526001600160a01b037f000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c71690634515cef390859087906004018083606080838360005b838110156140db5781810151838201526020016140c3565b5050505090500182815260200192505050600060405180830381600087803b15801561410657600080fd5b505af1158015611ebd573d6000803e3d6000fd5b6141226144c6565b604080516370a0823160e01b815230600482015290516001600160a01b037f0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e49016916370a08231916024808301926020929190829003018186803b15801561418857600080fd5b505afa15801561419c573d6000803e3d6000fd5b505050506040513d60208110156141b257600080fd5b5051602082015260408051630b4c7e4d60e01b81527f0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b6001600160a01b031691630b4c7e4d9184918691600401908190849080838360005b8381101561422257818101518382015260200161420a565b5050505090500182815260200192505050600060405180830381600087803b15801561424d57600080fd5b505af11580156135c0573d6000803e3d6000fd5b3b151590565b60608315614276575081612e8c565b8251156142865782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561397357818101518382015260200161395b565b604080516002808252606080830184529260208301908036833701905050905085816000815181106142fb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061432957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001828154811061435657fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166338ed1739858584306402540be4006040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156143fc5781810151838201526020016143e4565b505050509050019650505050505050600060405180830381600087803b15801561442557600080fd5b505af1158015614439573d6000803e3d6000fd5b50505050505050505050565b828054828255906000526020600020908101928215614498579160200282015b828111156144985781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190614465565b506144a49291506144e4565b5090565b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b5b808211156144a45780546001600160a01b03191681556001016144e556fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a264697066735822122057a3f0f8f939a55f9e1dcfc14136e87a4fb0ae6bbb4a67b7db58b57c537faae764736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000001c00000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd520000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f30000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e490000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c70000000000000000000000000000000000000000000000000000000000000028000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae310000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac60000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001d794178697320436f6e7665782053747261746567793a204d494d4352560000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
-----Decoded View---------------
Arg [0] : _name (string): yAxis Convex Strategy: MIMCRV
Arg [1] : _want (address): 0x5a6A4D54456819380173272A5E8E9B9904BdF41B
Arg [2] : _crv (address): 0xD533a949740bb3306d119CC777fa900bA034cd52
Arg [3] : _cvx (address): 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B
Arg [4] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [5] : _mim (address): 0x99D8a9C45b2ecA8864373A26D1459e3Dff1e17F3
Arg [6] : _crv3 (address): 0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490
Arg [7] : _stableSwap3Pool (address): 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7
Arg [8] : _pid (uint256): 40
Arg [9] : _convexVault (address): 0xF403C135812408BFbE8713b5A23a04b3D48AAE31
Arg [10] : _stableSwap2Pool (address): 0x5a6A4D54456819380173272A5E8E9B9904BdF41B
Arg [11] : _controller (address): 0x834ebCE3b3Fb5B9647d9398a1f6F44A2E831aC60
Arg [12] : _manager (address): 0xAB72cC293B63f6477BAf9d514Da735Cf6caADC2d
Arg [13] : _routerArray (address[]): 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F,0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [1] : 0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b
Arg [2] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [3] : 0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b
Arg [4] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [5] : 00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f3
Arg [6] : 0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e490
Arg [7] : 000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c7
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [9] : 000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31
Arg [10] : 0000000000000000000000005a6a4d54456819380173272a5e8e9b9904bdf41b
Arg [11] : 000000000000000000000000834ebce3b3fb5b9647d9398a1f6f44a2e831ac60
Arg [12] : 000000000000000000000000ab72cc293b63f6477baf9d514da735cf6caadc2d
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [14] : 000000000000000000000000000000000000000000000000000000000000001d
Arg [15] : 794178697320436f6e7665782053747261746567793a204d494d435256000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [17] : 000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Arg [18] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.