Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
20344433 | 195 days ago | 0.30725199 ETH | ||||
20344433 | 195 days ago | 0.30725199 ETH | ||||
20279507 | 204 days ago | 0.24640191 ETH | ||||
20279507 | 204 days ago | 0.24640191 ETH | ||||
20249350 | 208 days ago | 0.13589259 ETH | ||||
20249350 | 208 days ago | 0.13589259 ETH | ||||
20230982 | 211 days ago | 0.12464216 ETH | ||||
20230982 | 211 days ago | 0.12464216 ETH | ||||
20214930 | 213 days ago | 0.18610591 ETH | ||||
20214930 | 213 days ago | 0.18610591 ETH | ||||
20192608 | 216 days ago | 0.17412521 ETH | ||||
20192608 | 216 days ago | 0.17412521 ETH | ||||
20171739 | 219 days ago | 0.21607421 ETH | ||||
20171739 | 219 days ago | 0.21607421 ETH | ||||
20144845 | 223 days ago | 0.19766708 ETH | ||||
20144845 | 223 days ago | 0.19766708 ETH | ||||
20123661 | 226 days ago | 0.32267712 ETH | ||||
20123661 | 226 days ago | 0.32267712 ETH | ||||
20093185 | 230 days ago | 0.26317849 ETH | ||||
20093185 | 230 days ago | 0.26317849 ETH | ||||
20043899 | 237 days ago | 0.25349443 ETH | ||||
20043899 | 237 days ago | 0.25349443 ETH | ||||
20000547 | 243 days ago | 0.16021083 ETH | ||||
20000547 | 243 days ago | 0.16021083 ETH | ||||
19978716 | 246 days ago | 0.28049428 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
stkCvxFxsHarvester
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "SafeERC20.sol"; import "IVaultRewardHandler.sol"; import "ICurvePool.sol"; import "ICurveTriCrypto.sol"; import "ICurveV2Pool.sol"; import "ICvxCrvDeposit.sol"; import "ICurveFactoryPool.sol"; import "StrategyBase.sol"; contract stkCvxFxsHarvester is stkCvxFxsStrategyBase { using SafeERC20 for IERC20; address public owner; address public immutable strategy; uint256 public allowedSlippage = 9700; uint256 public constant DECIMALS = 10000; address public pendingOwner; bool public useOracle = true; bool public forceLock; constructor(address _strategy) { strategy = _strategy; owner = msg.sender; } /// @notice Set approvals for the contracts used when swapping & staking function setApprovals() external { IERC20(CVX_TOKEN).safeApprove(CURVE_CVX_ETH_POOL, 0); IERC20(CVX_TOKEN).safeApprove(CURVE_CVX_ETH_POOL, type(uint256).max); IERC20(FXS_TOKEN).safeApprove(CURVE_CVXFXS_FXS_POOL, 0); IERC20(FXS_TOKEN).safeApprove(CURVE_CVXFXS_FXS_POOL, type(uint256).max); IERC20(FXS_TOKEN).safeApprove(FXS_DEPOSIT, 0); IERC20(FXS_TOKEN).safeApprove(FXS_DEPOSIT, type(uint256).max); IERC20(FRAX_TOKEN).safeApprove(CURVE_FRAX_USDC_POOL, 0); IERC20(FRAX_TOKEN).safeApprove(CURVE_FRAX_USDC_POOL, type(uint256).max); IERC20(USDC_TOKEN).safeApprove(CURVE_FRAX_USDC_POOL, 0); IERC20(USDC_TOKEN).safeApprove(CURVE_FRAX_USDC_POOL, type(uint256).max); IERC20(USDC_TOKEN).safeApprove(UNIV3_ROUTER, 0); IERC20(USDC_TOKEN).safeApprove(UNIV3_ROUTER, type(uint256).max); IERC20(FRAX_TOKEN).safeApprove(UNIV3_ROUTER, 0); IERC20(FRAX_TOKEN).safeApprove(UNIV3_ROUTER, type(uint256).max); IERC20(FRAX_TOKEN).safeApprove(UNISWAP_ROUTER, 0); IERC20(FRAX_TOKEN).safeApprove(UNISWAP_ROUTER, type(uint256).max); } /// @notice Change the default swap option for eth -> fxs /// @param _newOption - the new option to use function setSwapOption(SwapOption _newOption) external onlyOwner { SwapOption _oldOption = swapOption; swapOption = _newOption; emit OptionChanged(_oldOption, swapOption); } /// @notice Turns oracle on or off for swap function switchOracle() external onlyOwner { useOracle = !useOracle; } /// @notice Sets the contract's future owner /// @param _po - pending owner's address function setPendingOwner(address _po) external onlyOwner { pendingOwner = _po; } /// @notice Allows a pending owner to accept ownership function acceptOwnership() external { require(pendingOwner == msg.sender, "only new owner"); owner = pendingOwner; pendingOwner = address(0); } /// @notice switch the forceLock option to force harvester to lock /// @dev the harvester will lock even if there is a discount if forceLock is true function setForceLock() external onlyOwner { forceLock = !forceLock; } /// @notice Rescue tokens wrongly sent to the contracts or claimed extra /// rewards that the contract is not equipped to handle /// @dev Unhandled rewards can be redirected to new harvester contract function rescueToken(address _token, address _to) external onlyOwner { /// Only allow to rescue non-supported tokens require(_token != FXS_TOKEN && _token != CVX_TOKEN, "not allowed"); IERC20 _t = IERC20(_token); uint256 _balance = _t.balanceOf(address(this)); _t.safeTransfer(_to, _balance); } /// @notice Sets the range of acceptable slippage & price impact function setSlippage(uint256 _slippage) external onlyOwner { allowedSlippage = _slippage; } /// @notice Compute a min amount of ETH based on pool oracle for cvx /// @param _amount - amount to swap /// @return min acceptable amount of ETH function _calcMinAmountOutCvxEth(uint256 _amount) internal returns (uint256) { uint256 _cvxEthPrice = cvxEthSwap.price_oracle(); uint256 _amountEthPrice = (_amount * _cvxEthPrice) / 1e18; return ((_amountEthPrice * allowedSlippage) / DECIMALS); } function processRewards() external onlyStrategy returns (uint256 _harvested) { uint256 _cvxBalance = IERC20(CVX_TOKEN).balanceOf(address(this)); if (_cvxBalance > 0) { _cvxToEth( _cvxBalance, useOracle ? _calcMinAmountOutCvxEth(_cvxBalance) : 0 ); } uint256 _ethBalance = address(this).balance; _harvested = 0; if (_ethBalance > 0) { _swapEthForFxs(_ethBalance, swapOption); } uint256 _fxsBalance = IERC20(FXS_TOKEN).balanceOf(address(this)); if (_fxsBalance > 0) { uint256 _oraclePrice = cvxFxsFxsSwap.price_oracle(); // check if there is a premium on cvxFXS or if we want to lock if (_oraclePrice > 1 ether || forceLock) { // lock and deposit as cvxFxs cvxFxsDeposit.deposit(_fxsBalance, true); _harvested = _fxsBalance; } // If not swap on Curve else { uint256 _minCvxFxsAmountOut = 0; if (useOracle) { _minCvxFxsAmountOut = (_fxsBalance * _oraclePrice) / 1e18; _minCvxFxsAmountOut = ((_minCvxFxsAmountOut * allowedSlippage) / DECIMALS); } _harvested = cvxFxsFxsSwap.exchange_underlying( 0, 1, _fxsBalance, _minCvxFxsAmountOut ); } IERC20(CVXFXS_TOKEN).safeTransfer(msg.sender, _harvested); } return _harvested; } modifier onlyOwner() { require((msg.sender == owner), "owner only"); _; } modifier onlyStrategy() { require((msg.sender == strategy), "strategy only"); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "IERC20.sol"; import "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 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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.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.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); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(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.8.9; interface IVaultRewardHandler { function sell(uint256 _amount) external; function setPendingOwner(address _po) external; function applyPendingOwner() external; function rescueToken(address _token, address _to) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface ICurvePool { 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); function exchange( int128 i, int128 j, uint256 dx, uint256 min_dy ) external returns (uint256); function get_dy( int128 i, int128 j, uint256 dx ) external view returns (uint256); function get_virtual_price() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface ICurveTriCrypto { function exchange( uint256 i, uint256 j, uint256 dx, uint256 min_dy, bool use_eth ) external payable; function get_dy( uint256 i, uint256 j, uint256 dx ) external view returns (uint256); function price_oracle(uint256 k) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface ICurveV2Pool { function get_dy( uint256 i, uint256 j, uint256 dx ) external view returns (uint256); function calc_token_amount(uint256[2] calldata amounts) external view returns (uint256); function exchange_underlying( uint256 i, uint256 j, uint256 dx, uint256 min_dy ) external payable returns (uint256); function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external returns (uint256); function lp_price() external view returns (uint256); function exchange( uint256 i, uint256 j, uint256 dx, uint256 min_dy ) external payable returns (uint256); function exchange( uint256 i, uint256 j, uint256 dx, uint256 min_dy, bool use_eth ) external payable returns (uint256); function exchange( uint256 i, uint256 j, uint256 dx, uint256 min_dy, bool use_eth, address receiver ) external payable returns (uint256); function price_oracle() external view returns (uint256); function remove_liquidity_one_coin( uint256 token_amount, uint256 i, uint256 min_amount, bool use_eth, address receiver ) external returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface ICvxCrvDeposit { function deposit(uint256, bool) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface ICurveFactoryPool { function get_dy( int128 i, int128 j, uint256 dx ) external view returns (uint256); function get_balances() external view returns (uint256[2] memory); function add_liquidity( uint256[2] memory _amounts, uint256 _min_mint_amount, address _receiver ) external returns (uint256); function exchange( int128 i, int128 j, uint256 _dx, uint256 _min_dy, address _receiver ) external returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "ICurveV2Pool.sol"; import "ICurvePool.sol"; import "ICurveFactoryPool.sol"; import "IBasicRewards.sol"; import "IWETH.sol"; import "IUniV3Router.sol"; import "IUniV2Router.sol"; import "ICvxFxsDeposit.sol"; contract stkCvxFxsStrategyBase { address public constant FXS_DEPOSIT = 0x8f55d7c21bDFf1A51AFAa60f3De7590222A3181e; address public constant CURVE_CRV_ETH_POOL = 0x8301AE4fc9c624d1D396cbDAa1ed877821D7C511; address public constant CURVE_CVX_ETH_POOL = 0xB576491F1E6e5E62f1d8F26062Ee822B40B0E0d4; address public constant CURVE_FXS_ETH_POOL = 0x941Eb6F616114e4Ecaa85377945EA306002612FE; address public constant CURVE_CVXFXS_FXS_POOL = 0xd658A338613198204DCa1143Ac3F01A722b5d94A; address public constant CURVE_FRAX_USDC_POOL = 0xDcEF968d416a41Cdac0ED8702fAC8128A64241A2; address public constant UNISWAP_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address public constant UNIV3_ROUTER = 0xE592427A0AEce92De3Edee1F18E0157C05861564; address public constant CRV_TOKEN = 0xD533a949740bb3306d119CC777fa900bA034cd52; address public constant CVXFXS_TOKEN = 0xFEEf77d3f69374f66429C91d732A244f074bdf74; address public constant FXS_TOKEN = 0x3432B6A60D23Ca0dFCa7761B7ab56459D9C964D0; address public constant CVX_TOKEN = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B; address public constant WETH_TOKEN = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public constant CURVE_CVXFXS_FXS_LP_TOKEN = 0xF3A43307DcAFa93275993862Aae628fCB50dC768; address public constant USDT_TOKEN = 0xdAC17F958D2ee523a2206206994597C13D831ec7; address public constant USDC_TOKEN = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address public constant FRAX_TOKEN = 0x853d955aCEf822Db058eb8505911ED77F175b99e; uint256 public constant CRVETH_ETH_INDEX = 0; uint256 public constant CRVETH_CRV_INDEX = 1; uint256 public constant CVXETH_ETH_INDEX = 0; uint256 public constant CVXETH_CVX_INDEX = 1; // The swap strategy to use when going eth -> fxs enum SwapOption { Curve, Uniswap, Unistables, UniCurve1 } SwapOption public swapOption = SwapOption.UniCurve1; event OptionChanged(SwapOption oldOption, SwapOption newOption); ICvxFxsDeposit cvxFxsDeposit = ICvxFxsDeposit(FXS_DEPOSIT); ICurveV2Pool cvxEthSwap = ICurveV2Pool(CURVE_CVX_ETH_POOL); ICurveV2Pool crvEthSwap = ICurveV2Pool(CURVE_CRV_ETH_POOL); ICurveV2Pool fxsEthSwap = ICurveV2Pool(CURVE_FXS_ETH_POOL); ICurveV2Pool cvxFxsFxsSwap = ICurveV2Pool(CURVE_CVXFXS_FXS_POOL); ICurvePool fraxUsdcSwap = ICurvePool(CURVE_FRAX_USDC_POOL); /// @notice Swap CRV for native ETH on Curve /// @param amount - amount to swap /// @return amount of ETH obtained after the swap function _swapCrvToEth(uint256 amount) internal returns (uint256) { return _crvToEth(amount, 0); } /// @notice Swap CRV for native ETH on Curve /// @param amount - amount to swap /// @param minAmountOut - minimum expected amount of output tokens /// @return amount of ETH obtained after the swap function _swapCrvToEth(uint256 amount, uint256 minAmountOut) internal returns (uint256) { return _crvToEth(amount, minAmountOut); } /// @notice Swap CRV for native ETH on Curve /// @param amount - amount to swap /// @param minAmountOut - minimum expected amount of output tokens /// @return amount of ETH obtained after the swap function _crvToEth(uint256 amount, uint256 minAmountOut) internal returns (uint256) { return crvEthSwap.exchange_underlying{value: 0}( CRVETH_CRV_INDEX, CRVETH_ETH_INDEX, amount, minAmountOut ); } /// @notice Swap native ETH for CRV on Curve /// @param amount - amount to swap /// @return amount of CRV obtained after the swap function _swapEthToCrv(uint256 amount) internal returns (uint256) { return _ethToCrv(amount, 0); } /// @notice Swap native ETH for CRV on Curve /// @param amount - amount to swap /// @param minAmountOut - minimum expected amount of output tokens /// @return amount of CRV obtained after the swap function _swapEthToCrv(uint256 amount, uint256 minAmountOut) internal returns (uint256) { return _ethToCrv(amount, minAmountOut); } /// @notice Swap native ETH for CRV on Curve /// @param amount - amount to swap /// @param minAmountOut - minimum expected amount of output tokens /// @return amount of CRV obtained after the swap function _ethToCrv(uint256 amount, uint256 minAmountOut) internal returns (uint256) { return crvEthSwap.exchange_underlying{value: amount}( CRVETH_ETH_INDEX, CRVETH_CRV_INDEX, amount, minAmountOut ); } /// @notice Swap native ETH for CVX on Curve /// @param amount - amount to swap /// @return amount of CVX obtained after the swap function _swapEthToCvx(uint256 amount) internal returns (uint256) { return _ethToCvx(amount, 0); } /// @notice Swap native ETH for CVX on Curve /// @param amount - amount to swap /// @param minAmountOut - minimum expected amount of output tokens /// @return amount of CVX obtained after the swap function _swapEthToCvx(uint256 amount, uint256 minAmountOut) internal returns (uint256) { return _ethToCvx(amount, minAmountOut); } /// @notice Swap CVX for native ETH on Curve /// @param amount - amount to swap /// @return amount of ETH obtained after the swap function _swapCvxToEth(uint256 amount) internal returns (uint256) { return _cvxToEth(amount, 0); } /// @notice Swap CVX for native ETH on Curve /// @param amount - amount to swap /// @param minAmountOut - minimum expected amount of output tokens /// @return amount of ETH obtained after the swap function _swapCvxToEth(uint256 amount, uint256 minAmountOut) internal returns (uint256) { return _cvxToEth(amount, minAmountOut); } /// @notice Swap native ETH for CVX on Curve /// @param amount - amount to swap /// @param minAmountOut - minimum expected amount of output tokens /// @return amount of CVX obtained after the swap function _ethToCvx(uint256 amount, uint256 minAmountOut) internal returns (uint256) { return cvxEthSwap.exchange_underlying{value: amount}( CVXETH_ETH_INDEX, CVXETH_CVX_INDEX, amount, minAmountOut ); } /// @notice Swap native CVX for ETH on Curve /// @param amount - amount to swap /// @param minAmountOut - minimum expected amount of output tokens /// @return amount of ETH obtained after the swap function _cvxToEth(uint256 amount, uint256 minAmountOut) internal returns (uint256) { return cvxEthSwap.exchange_underlying{value: 0}( 1, 0, amount, minAmountOut ); } /// @notice Swap native ETH for FXS via different routes /// @param _ethAmount - amount to swap /// @param _option - the option to use when swapping /// @return amount of FXS obtained after the swap function _swapEthForFxs(uint256 _ethAmount, SwapOption _option) internal returns (uint256) { return _swapEthFxs(_ethAmount, _option, true); } /// @notice Swap FXS for native ETH via different routes /// @param _fxsAmount - amount to swap /// @param _option - the option to use when swapping /// @return amount of ETH obtained after the swap function _swapFxsForEth(uint256 _fxsAmount, SwapOption _option) internal returns (uint256) { return _swapEthFxs(_fxsAmount, _option, false); } /// @notice Swap ETH<->FXS on Curve /// @param _amount - amount to swap /// @param _ethToFxs - whether to swap from eth to fxs or the inverse /// @return amount of token obtained after the swap function _curveEthFxsSwap(uint256 _amount, bool _ethToFxs) internal returns (uint256) { return fxsEthSwap.exchange_underlying{value: _ethToFxs ? _amount : 0}( _ethToFxs ? 0 : 1, _ethToFxs ? 1 : 0, _amount, 0 ); } /// @notice Swap ETH<->FXS on UniV3 FXSETH pool /// @param _amount - amount to swap /// @param _ethToFxs - whether to swap from eth to fxs or the inverse /// @return amount of token obtained after the swap function _uniV3EthFxsSwap(uint256 _amount, bool _ethToFxs) internal returns (uint256) { IUniV3Router.ExactInputSingleParams memory _params = IUniV3Router .ExactInputSingleParams( _ethToFxs ? WETH_TOKEN : FXS_TOKEN, _ethToFxs ? FXS_TOKEN : WETH_TOKEN, 10000, address(this), block.timestamp + 1, _amount, 1, 0 ); uint256 _receivedAmount = IUniV3Router(UNIV3_ROUTER).exactInputSingle{ value: _ethToFxs ? _amount : 0 }(_params); if (!_ethToFxs) { IWETH(WETH_TOKEN).withdraw(_receivedAmount); } return _receivedAmount; } /// @notice Swap ETH->FXS on UniV3 via stable pair /// @param _amount - amount to swap /// @return amount of token obtained after the swap function _uniStableEthToFxsSwap(uint256 _amount) internal returns (uint256) { uint24 fee = 500; IUniV3Router.ExactInputParams memory _params = IUniV3Router .ExactInputParams( abi.encodePacked(WETH_TOKEN, fee, USDC_TOKEN, fee, FRAX_TOKEN), address(this), block.timestamp + 1, _amount, 0 ); uint256 _fraxAmount = IUniV3Router(UNIV3_ROUTER).exactInput{ value: _amount }(_params); address[] memory _path = new address[](2); _path[0] = FRAX_TOKEN; _path[1] = FXS_TOKEN; uint256[] memory amounts = IUniV2Router(UNISWAP_ROUTER) .swapExactTokensForTokens( _fraxAmount, 1, _path, address(this), block.timestamp + 1 ); return amounts[1]; } /// @notice Swap FXS->ETH on UniV3 via stable pair /// @param _amount - amount to swap /// @return amount of token obtained after the swap function _uniStableFxsToEthSwap(uint256 _amount) internal returns (uint256) { address[] memory _path = new address[](2); _path[0] = FXS_TOKEN; _path[1] = FRAX_TOKEN; uint256[] memory amounts = IUniV2Router(UNISWAP_ROUTER) .swapExactTokensForTokens( _amount, 1, _path, address(this), block.timestamp + 1 ); uint256 _fraxAmount = amounts[1]; uint24 fee = 500; IUniV3Router.ExactInputParams memory _params = IUniV3Router .ExactInputParams( abi.encodePacked(FRAX_TOKEN, fee, USDC_TOKEN, fee, WETH_TOKEN), address(this), block.timestamp + 1, _fraxAmount, 0 ); uint256 _ethAmount = IUniV3Router(UNIV3_ROUTER).exactInput{value: 0}( _params ); IWETH(WETH_TOKEN).withdraw(_ethAmount); return _ethAmount; } /// @notice Swap FXS->ETH on a mix of UniV2, UniV3 & Curve /// @param _amount - amount to swap /// @return amount of token obtained after the swap function _uniCurve1FxsToEthSwap(uint256 _amount) internal returns (uint256) { address[] memory _path = new address[](2); _path[0] = FXS_TOKEN; _path[1] = FRAX_TOKEN; uint256[] memory amounts = IUniV2Router(UNISWAP_ROUTER) .swapExactTokensForTokens( _amount, 1, _path, address(this), block.timestamp + 1 ); uint256 _fraxAmount = amounts[1]; // Swap FRAX for USDC on Curve uint256 _usdcAmount = fraxUsdcSwap.exchange(0, 1, _fraxAmount, 0); // USDC to ETH on UniV3 uint24 fee = 500; IUniV3Router.ExactInputParams memory _params = IUniV3Router .ExactInputParams( abi.encodePacked(USDC_TOKEN, fee, WETH_TOKEN), address(this), block.timestamp + 1, _usdcAmount, 0 ); uint256 _ethAmount = IUniV3Router(UNIV3_ROUTER).exactInput{value: 0}( _params ); IWETH(WETH_TOKEN).withdraw(_ethAmount); return _ethAmount; } /// @notice Swap ETH->FXS on a mix of UniV2, UniV3 & Curve /// @param _amount - amount to swap /// @return amount of token obtained after the swap function _uniCurve1EthToFxsSwap(uint256 _amount) internal returns (uint256) { uint24 fee = 500; IUniV3Router.ExactInputParams memory _params = IUniV3Router .ExactInputParams( abi.encodePacked(WETH_TOKEN, fee, USDC_TOKEN), address(this), block.timestamp + 1, _amount, 0 ); uint256 _usdcAmount = IUniV3Router(UNIV3_ROUTER).exactInput{ value: _amount }(_params); // Swap USDC for FRAX on Curve uint256 _fraxAmount = fraxUsdcSwap.exchange(1, 0, _usdcAmount, 0); address[] memory _path = new address[](2); _path[0] = FRAX_TOKEN; _path[1] = FXS_TOKEN; uint256[] memory amounts = IUniV2Router(UNISWAP_ROUTER) .swapExactTokensForTokens( _fraxAmount, 1, _path, address(this), block.timestamp + 1 ); return amounts[1]; } /// @notice Swap native ETH for FXS via different routes /// @param _amount - amount to swap /// @param _option - the option to use when swapping /// @param _ethToFxs - whether to swap from eth to fxs or the inverse /// @return amount of token obtained after the swap function _swapEthFxs( uint256 _amount, SwapOption _option, bool _ethToFxs ) internal returns (uint256) { if (_option == SwapOption.Curve) { return _curveEthFxsSwap(_amount, _ethToFxs); } else if (_option == SwapOption.Uniswap) { return _uniV3EthFxsSwap(_amount, _ethToFxs); } else if (_option == SwapOption.UniCurve1) { return _ethToFxs ? _uniCurve1EthToFxsSwap(_amount) : _uniCurve1FxsToEthSwap(_amount); } else { return _ethToFxs ? _uniStableEthToFxsSwap(_amount) : _uniStableFxsToEthSwap(_amount); } } receive() external payable {} }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.9; interface IBasicRewards { function stakeFor(address, uint256) external returns (bool); function balanceOf(address) external view returns (uint256); function earned(address) external view returns (uint256); function withdrawAll(bool) external returns (bool); function withdraw(uint256, bool) external returns (bool); function withdrawAndUnwrap(uint256 amount, bool claim) external returns (bool); function getReward() external returns (bool); function stake(uint256) external returns (bool); function extraRewards(uint256) external view returns (address); function exit() external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IUniV3Router { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IUniV2Router { function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function getAmountsOut(uint256 amountIn, address[] memory path) external view returns (uint256[] memory amounts); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface ICvxFxsDeposit { function deposit(uint256, bool) external; }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "Harvester.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum stkCvxFxsStrategyBase.SwapOption","name":"oldOption","type":"uint8"},{"indexed":false,"internalType":"enum stkCvxFxsStrategyBase.SwapOption","name":"newOption","type":"uint8"}],"name":"OptionChanged","type":"event"},{"inputs":[],"name":"CRVETH_CRV_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CRVETH_ETH_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CRV_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_CRV_ETH_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_CVXFXS_FXS_LP_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_CVXFXS_FXS_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_CVX_ETH_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_FRAX_USDC_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURVE_FXS_ETH_POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CVXETH_CVX_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CVXETH_ETH_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CVXFXS_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CVX_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRAX_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FXS_DEPOSIT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FXS_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIV3_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowedSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processRewards","outputs":[{"internalType":"uint256","name":"_harvested","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setForceLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_po","type":"address"}],"name":"setPendingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"setSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum stkCvxFxsStrategyBase.SwapOption","name":"_newOption","type":"uint8"}],"name":"setSwapOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapOption","outputs":[{"internalType":"enum stkCvxFxsStrategyBase.SwapOption","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useOracle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0604052600080546001600160a81b031916748f55d7c21bdff1a51afaa60f3de7590222a3181e03179055600180546001600160a01b031990811673b576491f1e6e5e62f1d8f26062ee822b40b0e0d417909155600280548216738301ae4fc9c624d1d396cbdaa1ed877821d7c51117905560038054821673941eb6f616114e4ecaa85377945ea306002612fe17905560048054821673d658a338613198204dca1143ac3f01a722b5d94a1790556005805490911673dcef968d416a41cdac0ed8702fac8128a64241a21790556125e46007556008805460ff60a01b1916600160a01b179055348015620000f357600080fd5b5060405162002d0538038062002d0583398101604081905262000116916200013a565b6001600160a01b0316608052600680546001600160a01b031916331790556200016c565b6000602082840312156200014d57600080fd5b81516001600160a01b03811681146200016557600080fd5b9392505050565b608051612b766200018f6000396000818161058f0152610da60152612b766000f3fe6080604052600436106102295760003560e01c806379ba509711610123578063c3883d8d116100ab578063e6484ea61161006f578063e6484ea61461067d578063f0fa55a9146106a5578063f1d5253e146106c5578063f9fc0d07146106ed578063fa5692741461070257600080fd5b8063c3883d8d146105d8578063c42069ec14610600578063d7d6b75c14610620578063d826492014610635578063e30c39781461065d57600080fd5b8063961deefe116100f2578063961deefe1461052d5780639f0b5fe414610555578063a8c62e761461057d578063ab6e25cd146102a2578063b741e504146105b157600080fd5b806379ba5097146104c35780638757b15b146104d85780638da5cb5b146104ed5780638e2c439b1461050d57600080fd5b8063571715b7116101b15780636acabc2e116101755780636acabc2e146103b65780636d4099e4146104435780636d4908c4146104655780637449afdd1461048657806377b330c91461049b57600080fd5b8063571715b71461038e57806360c3a38c146103b6578063657428a3146103cb5780636611d121146103f35780636a1dfd861461041b57600080fd5b80632e0f2625116101f85780632e0f2625146102e757806337d277d4146102fd578063431f244514610325578063448787241461033b5780634707d0001461036c57600080fd5b80630960b7fa146102355780631090a74c1461027a5780631857b308146102a25780631ebb2139146102c557600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061025d734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561028657600080fd5b5061025d73dcef968d416a41cdac0ed8702fac8128a64241a281565b3480156102ae57600080fd5b506102b7600081565b604051908152602001610271565b3480156102d157600080fd5b5061025d600080516020612b2183398151915281565b3480156102f357600080fd5b506102b761271081565b34801561030957600080fd5b5061025d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561033157600080fd5b506102b760075481565b34801561034757600080fd5b5060085461035c90600160a01b900460ff1681565b6040519015158152602001610271565b34801561037857600080fd5b5061038c610387366004612682565b61072a565b005b34801561039a57600080fd5b5061025d73e592427a0aece92de3edee1f18e0157c0586156481565b3480156103c257600080fd5b506102b7600181565b3480156103d757600080fd5b5061025d73d533a949740bb3306d119cc777fa900ba034cd5281565b3480156103ff57600080fd5b5061025d73941eb6f616114e4ecaa85377945ea306002612fe81565b34801561042757600080fd5b5061025d73f3a43307dcafa93275993862aae628fcb50dc76881565b34801561044f57600080fd5b5061025d600080516020612b0183398151915281565b34801561047157600080fd5b5060085461035c90600160a81b900460ff1681565b34801561049257600080fd5b5061038c610873565b3480156104a757600080fd5b5061025d73dac17f958d2ee523a2206206994597c13d831ec781565b3480156104cf57600080fd5b5061038c6108be565b3480156104e457600080fd5b5061038c610930565b3480156104f957600080fd5b5060065461025d906001600160a01b031681565b34801561051957600080fd5b5061038c6105283660046126b5565b610c3e565b34801561053957600080fd5b5061025d73b576491f1e6e5e62f1d8f26062ee822b40b0e0d481565b34801561056157600080fd5b5061025d73feef77d3f69374f66429c91d732a244f074bdf7481565b34801561058957600080fd5b5061025d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105bd57600080fd5b506000546105cb9060ff1681565b604051610271919061270e565b3480156105e457600080fd5b5061025d73d658a338613198204dca1143ac3f01a722b5d94a81565b34801561060c57600080fd5b5061038c61061b36600461271c565b610cd3565b34801561062c57600080fd5b5061038c610d1f565b34801561064157600080fd5b5061025d737a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561066957600080fd5b5060085461025d906001600160a01b031681565b34801561068957600080fd5b5061025d738f55d7c21bdff1a51afaa60f3de7590222a3181e81565b3480156106b157600080fd5b5061038c6106c0366004612737565b610d6a565b3480156106d157600080fd5b5061025d738301ae4fc9c624d1d396cbdaa1ed877821d7c51181565b3480156106f957600080fd5b506102b7610d99565b34801561070e57600080fd5b5061025d73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6006546001600160a01b0316331461075d5760405162461bcd60e51b815260040161075490612750565b60405180910390fd5b6001600160a01b038216600080516020612b01833981519152148015906107a157506001600160a01b038216734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b14155b6107db5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610754565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561081f57600080fd5b505afa158015610833573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108579190612774565b905061086d6001600160a01b0383168483611193565b50505050565b6006546001600160a01b0316331461089d5760405162461bcd60e51b815260040161075490612750565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6008546001600160a01b031633146109095760405162461bcd60e51b815260206004820152600e60248201526d37b7363c903732bb9037bbb732b960911b6044820152606401610754565b60088054600680546001600160a01b03199081166001600160a01b03841617909155169055565b610964734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73b576491f1e6e5e62f1d8f26062ee822b40b0e0d460006111fb565b610999734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73b576491f1e6e5e62f1d8f26062ee822b40b0e0d46000196111fb565b6109c7600080516020612b0183398151915273d658a338613198204dca1143ac3f01a722b5d94a60006111fb565b6109f6600080516020612b0183398151915273d658a338613198204dca1143ac3f01a722b5d94a6000196111fb565b610a24600080516020612b01833981519152738f55d7c21bdff1a51afaa60f3de7590222a3181e60006111fb565b610a53600080516020612b01833981519152738f55d7c21bdff1a51afaa60f3de7590222a3181e6000196111fb565b610a81600080516020612b2183398151915273dcef968d416a41cdac0ed8702fac8128a64241a260006111fb565b610ab0600080516020612b2183398151915273dcef968d416a41cdac0ed8702fac8128a64241a26000196111fb565b610ae473a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873dcef968d416a41cdac0ed8702fac8128a64241a260006111fb565b610b1973a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873dcef968d416a41cdac0ed8702fac8128a64241a26000196111fb565b610b4d73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873e592427a0aece92de3edee1f18e0157c0586156460006111fb565b610b8273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873e592427a0aece92de3edee1f18e0157c058615646000196111fb565b610bb0600080516020612b2183398151915273e592427a0aece92de3edee1f18e0157c0586156460006111fb565b610bdf600080516020612b2183398151915273e592427a0aece92de3edee1f18e0157c058615646000196111fb565b610c0d600080516020612b21833981519152737a250d5630b4cf539739df2c5dacb4c659f2488d60006111fb565b610c3c600080516020612b21833981519152737a250d5630b4cf539739df2c5dacb4c659f2488d6000196111fb565b565b6006546001600160a01b03163314610c685760405162461bcd60e51b815260040161075490612750565b6000805460ff811691839160ff19166001836003811115610c8b57610c8b6126d6565b02179055506000546040517fd5e9f1e4666d61af9e28c7bf8af3e4be37fd85f7c8a3689ac58c1b081dc1416391610cc791849160ff169061278d565b60405180910390a15050565b6006546001600160a01b03163314610cfd5760405162461bcd60e51b815260040161075490612750565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610d495760405162461bcd60e51b815260040161075490612750565b6008805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6006546001600160a01b03163314610d945760405162461bcd60e51b815260040161075490612750565b600755565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e035760405162461bcd60e51b815260206004820152600d60248201526c7374726174656779206f6e6c7960981b6044820152606401610754565b6040516370a0823160e01b8152306004820152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a082319060240160206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190612774565b90508015610ebe57600854610ebc908290600160a01b900460ff16610eae5760006113ee565b610eb78361131f565b6113ee565b505b60009150478015610edc57600054610eda90829060ff16611492565b505b6040516370a0823160e01b8152306004820152600090600080516020612b01833981519152906370a082319060240160206040518083038186803b158015610f2357600080fd5b505afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190612774565b9050801561118d576000600460009054906101000a90046001600160a01b03166001600160a01b03166386fc88d36040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb357600080fd5b505afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190612774565b9050670de0b6b3a764000081118061100c5750600854600160a81b900460ff165b1561108257600054604051639a40832160e01b815260048101849052600160248201526101009091046001600160a01b031690639a40832190604401600060405180830381600087803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b5050505081945061116c565b600854600090600160a01b900460ff16156110d457670de0b6b3a76400006110aa83856127be565b6110b491906127dd565b9050612710600754826110c791906127be565b6110d191906127dd565b90505b600480546040516365b2489b60e01b81526000928101929092526001602483015260448201859052606482018390526001600160a01b0316906365b2489b90608401602060405180830381600087803b15801561113057600080fd5b505af1158015611144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111689190612774565b9550505b61118b73feef77d3f69374f66429c91d732a244f074bdf743387611193565b505b50505090565b6040516001600160a01b0383166024820152604481018290526111f690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114a0565b505050565b8015806112845750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561124a57600080fd5b505afa15801561125e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112829190612774565b155b6112ef5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610754565b6040516001600160a01b0383166024820152604481018290526111f690849063095ea7b360e01b906064016111bf565b600080600160009054906101000a90046001600160a01b03166001600160a01b03166386fc88d36040518163ffffffff1660e01b815260040160206040518083038186803b15801561137057600080fd5b505afa158015611384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a89190612774565b90506000670de0b6b3a76400006113bf83866127be565b6113c991906127dd565b9050612710600754826113dc91906127be565b6113e691906127dd565b949350505050565b600180546040516365b2489b60e01b815260048101929092526000602483018190526044830185905260648301849052916001600160a01b03909116906365b2489b9083906084015b6020604051808303818588803b15801561145057600080fd5b505af1158015611464573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114899190612774565b90505b92915050565b600061148983836001611572565b60006114f5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116169092919063ffffffff16565b8051909150156111f6578080602001905181019061151391906127ff565b6111f65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610754565b600080836003811115611587576115876126d6565b141561159e576115978483611625565b905061160f565b60018360038111156115b2576115b26126d6565b14156115c25761159784836116a0565b60038360038111156115d6576115d66126d6565b14156115f857816115ef576115ea846118c7565b611597565b61159784611c52565b81611606576115ea84611f6f565b61159784612271565b9392505050565b60606113e68484600085612505565b6003546000906001600160a01b03166365b2489b83611645576000611647565b845b84611653576001611656565b60005b85611662576000611665565b60015b6040516001600160e01b031960e086901b16815260ff9283166004820152911660248201526044810187905260006064820152608401611437565b600080604051806101000160405280846116c857600080516020612b018339815191526116de565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b6001600160a01b031681526020018461170b5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261171b565b600080516020612b018339815191525b6001600160a01b031681526127106020820152306040820152606001611742426001612821565b815260208101869052600160408201526000606090910181905290915073e592427a0aece92de3edee1f18e0157c0586156463414bf38985611785576000611787565b865b6040805160e084811b6001600160e01b031916825287516001600160a01b0390811660048401526020890151811660248401529288015162ffffff1660448301526060880151831660648301526080880151608483015260a088015160a483015260c088015160c483015287015190911660e4820152610104016020604051808303818588803b15801561181a57600080fd5b505af115801561182e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118539190612774565b9050836113e657604051632e1a7d4d60e01b81526004810182905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b1580156118a757600080fd5b505af11580156118bb573d6000803e3d6000fd5b50505050949350505050565b60408051600280825260608201835260009283929190602083019080368337019050509050600080516020612b018339815191528160008151811061190e5761190e61284f565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020612b21833981519152816001815181106119505761195061284f565b6001600160a01b03909216602092830291909101909101526000737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed173985600185306119934284612821565b6040518663ffffffff1660e01b81526004016119b3959493929190612865565b600060405180830381600087803b1580156119cd57600080fd5b505af11580156119e1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a0991908101906128d6565b9050600081600181518110611a2057611a2061284f565b6020908102919091010151600554604051630f7c084960e21b81526000600482018190526001602483015260448201849052606482018190529293506001600160a01b0390911690633df0212490608401602060405180830381600087803b158015611a8b57600080fd5b505af1158015611a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac39190612774565b6040805160a081019091529091506101f49060009080611b1073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260c08501612994565b60408051601f1981840301815291815290825230602083015201611b35426001612821565b815260200184815260200160008152509050600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663c04b8d596000846040518363ffffffff1660e01b8152600401611b8b9190612a27565b6020604051808303818588803b158015611ba457600080fd5b505af1158015611bb8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611bdd9190612774565b604051632e1a7d4d60e01b81526004810182905290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b158015611c2d57600080fd5b505af1158015611c41573d6000803e3d6000fd5b50929b9a5050505050505050505050565b6040805160a081019091526000906101f490829080611c9e73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28573a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860c08501612994565b60408051601f1981840301815291815290825230602083015201611cc3426001612821565b815260200185815260200160008152509050600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663c04b8d5986846040518363ffffffff1660e01b8152600401611d189190612a27565b6020604051808303818588803b158015611d3157600080fd5b505af1158015611d45573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d6a9190612774565b600554604051630f7c084960e21b81526001600482015260006024820181905260448201849052606482018190529293506001600160a01b0390911690633df0212490608401602060405180830381600087803b158015611dca57600080fd5b505af1158015611dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e029190612774565b6040805160028082526060820183529293506000929091602083019080368337019050509050600080516020612b2183398151915281600081518110611e4a57611e4a61284f565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020612b0183398151915281600181518110611e8c57611e8c61284f565b6001600160a01b03909216602092830291909101909101526000737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed17398460018530611ecf4284612821565b6040518663ffffffff1660e01b8152600401611eef959493929190612865565b600060405180830381600087803b158015611f0957600080fd5b505af1158015611f1d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f4591908101906128d6565b905080600181518110611f5a57611f5a61284f565b60200260200101519650505050505050919050565b60408051600280825260608201835260009283929190602083019080368337019050509050600080516020612b0183398151915281600081518110611fb657611fb661284f565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020612b2183398151915281600181518110611ff857611ff861284f565b6001600160a01b03909216602092830291909101909101526000737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed1739856001853061203b4284612821565b6040518663ffffffff1660e01b815260040161205b959493929190612865565b600060405180830381600087803b15801561207557600080fd5b505af1158015612089573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120b191908101906128d6565b90506000816001815181106120c8576120c861284f565b60209081029190910101516040805160a081019091529091506101f49060009080612130600080516020612b218339815191528573a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260c08701612a7f565b60408051601f1981840301815291815290825230602083015201612155426001612821565b815260200184815260200160008152509050600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663c04b8d596000846040518363ffffffff1660e01b81526004016121ab9190612a27565b6020604051808303818588803b1580156121c457600080fd5b505af11580156121d8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121fd9190612774565b604051632e1a7d4d60e01b81526004810182905290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b15801561224d57600080fd5b505af1158015612261573d6000803e3d6000fd5b50929a9950505050505050505050565b6040805160a081019091526000906101f4908290806122cd73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28573a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881600080516020612b2183398151915260c08701612a7f565b60408051601f19818403018152918152908252306020830152016122f2426001612821565b815260200185815260200160008152509050600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663c04b8d5986846040518363ffffffff1660e01b81526004016123479190612a27565b6020604051808303818588803b15801561236057600080fd5b505af1158015612374573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123999190612774565b6040805160028082526060820183529293506000929091602083019080368337019050509050600080516020612b21833981519152816000815181106123e1576123e161284f565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020612b01833981519152816001815181106124235761242361284f565b6001600160a01b03909216602092830291909101909101526000737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed173984600185306124664284612821565b6040518663ffffffff1660e01b8152600401612486959493929190612865565b600060405180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124dc91908101906128d6565b9050806001815181106124f1576124f161284f565b602002602001015195505050505050919050565b6060824710156125665760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610754565b843b6125b45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610754565b600080866001600160a01b031685876040516125d09190612ad1565b60006040518083038185875af1925050503d806000811461260d576040519150601f19603f3d011682016040523d82523d6000602084013e612612565b606091505b509150915061262282828661262d565b979650505050505050565b6060831561263c57508161160f565b82511561264c5782518084602001fd5b8160405162461bcd60e51b81526004016107549190612aed565b80356001600160a01b038116811461267d57600080fd5b919050565b6000806040838503121561269557600080fd5b61269e83612666565b91506126ac60208401612666565b90509250929050565b6000602082840312156126c757600080fd5b81356004811061160f57600080fd5b634e487b7160e01b600052602160045260246000fd5b6004811061270a57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161148c82846126ec565b60006020828403121561272e57600080fd5b61148982612666565b60006020828403121561274957600080fd5b5035919050565b6020808252600a90820152696f776e6572206f6e6c7960b01b604082015260600190565b60006020828403121561278657600080fd5b5051919050565b6040810161279b82856126ec565b61160f60208301846126ec565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156127d8576127d86127a8565b500290565b6000826127fa57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561281157600080fd5b8151801515811461160f57600080fd5b60008219821115612834576128346127a8565b500190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128b55784516001600160a01b031683529383019391830191600101612890565b50506001600160a01b03969096166060850152505050608001529392505050565b600060208083850312156128e957600080fd5b825167ffffffffffffffff8082111561290157600080fd5b818501915085601f83011261291557600080fd5b81518181111561292757612927612839565b8060051b604051601f19603f8301168101818110858211171561294c5761294c612839565b60405291825284820192508381018501918883111561296a57600080fd5b938501935b828510156129885784518452938501939285019261296f565b98975050505050505050565b606093841b6bffffffffffffffffffffffff19908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b60005b838110156129ea5781810151838201526020016129d2565b8381111561086d5750506000910152565b60008151808452612a138160208601602086016129cf565b601f01601f19169290920160200192915050565b602081526000825160a06020840152612a4360c08401826129fb565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b6bffffffffffffffffffffffff19606096871b811682526001600160e81b031960e896871b8116601484015294871b811660178301529290941b909216602b840152921b909116602e82015260420190565b60008251612ae38184602087016129cf565b9190910192915050565b60208152600061148960208301846129fb56fe0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0000000000000000000000000853d955acef822db058eb8505911ed77f175b99ea26469706673582212201dce5f56c5d68f69559eda03a9e74aff29c942c8ff980087915c6b629c5e277d64736f6c63430008090033000000000000000000000000110a888f88b65a2c34a6922f518128eda4fb70de
Deployed Bytecode
0x6080604052600436106102295760003560e01c806379ba509711610123578063c3883d8d116100ab578063e6484ea61161006f578063e6484ea61461067d578063f0fa55a9146106a5578063f1d5253e146106c5578063f9fc0d07146106ed578063fa5692741461070257600080fd5b8063c3883d8d146105d8578063c42069ec14610600578063d7d6b75c14610620578063d826492014610635578063e30c39781461065d57600080fd5b8063961deefe116100f2578063961deefe1461052d5780639f0b5fe414610555578063a8c62e761461057d578063ab6e25cd146102a2578063b741e504146105b157600080fd5b806379ba5097146104c35780638757b15b146104d85780638da5cb5b146104ed5780638e2c439b1461050d57600080fd5b8063571715b7116101b15780636acabc2e116101755780636acabc2e146103b65780636d4099e4146104435780636d4908c4146104655780637449afdd1461048657806377b330c91461049b57600080fd5b8063571715b71461038e57806360c3a38c146103b6578063657428a3146103cb5780636611d121146103f35780636a1dfd861461041b57600080fd5b80632e0f2625116101f85780632e0f2625146102e757806337d277d4146102fd578063431f244514610325578063448787241461033b5780634707d0001461036c57600080fd5b80630960b7fa146102355780631090a74c1461027a5780631857b308146102a25780631ebb2139146102c557600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061025d734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561028657600080fd5b5061025d73dcef968d416a41cdac0ed8702fac8128a64241a281565b3480156102ae57600080fd5b506102b7600081565b604051908152602001610271565b3480156102d157600080fd5b5061025d600080516020612b2183398151915281565b3480156102f357600080fd5b506102b761271081565b34801561030957600080fd5b5061025d73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561033157600080fd5b506102b760075481565b34801561034757600080fd5b5060085461035c90600160a01b900460ff1681565b6040519015158152602001610271565b34801561037857600080fd5b5061038c610387366004612682565b61072a565b005b34801561039a57600080fd5b5061025d73e592427a0aece92de3edee1f18e0157c0586156481565b3480156103c257600080fd5b506102b7600181565b3480156103d757600080fd5b5061025d73d533a949740bb3306d119cc777fa900ba034cd5281565b3480156103ff57600080fd5b5061025d73941eb6f616114e4ecaa85377945ea306002612fe81565b34801561042757600080fd5b5061025d73f3a43307dcafa93275993862aae628fcb50dc76881565b34801561044f57600080fd5b5061025d600080516020612b0183398151915281565b34801561047157600080fd5b5060085461035c90600160a81b900460ff1681565b34801561049257600080fd5b5061038c610873565b3480156104a757600080fd5b5061025d73dac17f958d2ee523a2206206994597c13d831ec781565b3480156104cf57600080fd5b5061038c6108be565b3480156104e457600080fd5b5061038c610930565b3480156104f957600080fd5b5060065461025d906001600160a01b031681565b34801561051957600080fd5b5061038c6105283660046126b5565b610c3e565b34801561053957600080fd5b5061025d73b576491f1e6e5e62f1d8f26062ee822b40b0e0d481565b34801561056157600080fd5b5061025d73feef77d3f69374f66429c91d732a244f074bdf7481565b34801561058957600080fd5b5061025d7f000000000000000000000000110a888f88b65a2c34a6922f518128eda4fb70de81565b3480156105bd57600080fd5b506000546105cb9060ff1681565b604051610271919061270e565b3480156105e457600080fd5b5061025d73d658a338613198204dca1143ac3f01a722b5d94a81565b34801561060c57600080fd5b5061038c61061b36600461271c565b610cd3565b34801561062c57600080fd5b5061038c610d1f565b34801561064157600080fd5b5061025d737a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561066957600080fd5b5060085461025d906001600160a01b031681565b34801561068957600080fd5b5061025d738f55d7c21bdff1a51afaa60f3de7590222a3181e81565b3480156106b157600080fd5b5061038c6106c0366004612737565b610d6a565b3480156106d157600080fd5b5061025d738301ae4fc9c624d1d396cbdaa1ed877821d7c51181565b3480156106f957600080fd5b506102b7610d99565b34801561070e57600080fd5b5061025d73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6006546001600160a01b0316331461075d5760405162461bcd60e51b815260040161075490612750565b60405180910390fd5b6001600160a01b038216600080516020612b01833981519152148015906107a157506001600160a01b038216734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b14155b6107db5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610754565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561081f57600080fd5b505afa158015610833573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108579190612774565b905061086d6001600160a01b0383168483611193565b50505050565b6006546001600160a01b0316331461089d5760405162461bcd60e51b815260040161075490612750565b6008805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6008546001600160a01b031633146109095760405162461bcd60e51b815260206004820152600e60248201526d37b7363c903732bb9037bbb732b960911b6044820152606401610754565b60088054600680546001600160a01b03199081166001600160a01b03841617909155169055565b610964734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73b576491f1e6e5e62f1d8f26062ee822b40b0e0d460006111fb565b610999734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73b576491f1e6e5e62f1d8f26062ee822b40b0e0d46000196111fb565b6109c7600080516020612b0183398151915273d658a338613198204dca1143ac3f01a722b5d94a60006111fb565b6109f6600080516020612b0183398151915273d658a338613198204dca1143ac3f01a722b5d94a6000196111fb565b610a24600080516020612b01833981519152738f55d7c21bdff1a51afaa60f3de7590222a3181e60006111fb565b610a53600080516020612b01833981519152738f55d7c21bdff1a51afaa60f3de7590222a3181e6000196111fb565b610a81600080516020612b2183398151915273dcef968d416a41cdac0ed8702fac8128a64241a260006111fb565b610ab0600080516020612b2183398151915273dcef968d416a41cdac0ed8702fac8128a64241a26000196111fb565b610ae473a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873dcef968d416a41cdac0ed8702fac8128a64241a260006111fb565b610b1973a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873dcef968d416a41cdac0ed8702fac8128a64241a26000196111fb565b610b4d73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873e592427a0aece92de3edee1f18e0157c0586156460006111fb565b610b8273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873e592427a0aece92de3edee1f18e0157c058615646000196111fb565b610bb0600080516020612b2183398151915273e592427a0aece92de3edee1f18e0157c0586156460006111fb565b610bdf600080516020612b2183398151915273e592427a0aece92de3edee1f18e0157c058615646000196111fb565b610c0d600080516020612b21833981519152737a250d5630b4cf539739df2c5dacb4c659f2488d60006111fb565b610c3c600080516020612b21833981519152737a250d5630b4cf539739df2c5dacb4c659f2488d6000196111fb565b565b6006546001600160a01b03163314610c685760405162461bcd60e51b815260040161075490612750565b6000805460ff811691839160ff19166001836003811115610c8b57610c8b6126d6565b02179055506000546040517fd5e9f1e4666d61af9e28c7bf8af3e4be37fd85f7c8a3689ac58c1b081dc1416391610cc791849160ff169061278d565b60405180910390a15050565b6006546001600160a01b03163314610cfd5760405162461bcd60e51b815260040161075490612750565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610d495760405162461bcd60e51b815260040161075490612750565b6008805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6006546001600160a01b03163314610d945760405162461bcd60e51b815260040161075490612750565b600755565b6000336001600160a01b037f000000000000000000000000110a888f88b65a2c34a6922f518128eda4fb70de1614610e035760405162461bcd60e51b815260206004820152600d60248201526c7374726174656779206f6e6c7960981b6044820152606401610754565b6040516370a0823160e01b8152306004820152600090734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b906370a082319060240160206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190612774565b90508015610ebe57600854610ebc908290600160a01b900460ff16610eae5760006113ee565b610eb78361131f565b6113ee565b505b60009150478015610edc57600054610eda90829060ff16611492565b505b6040516370a0823160e01b8152306004820152600090600080516020612b01833981519152906370a082319060240160206040518083038186803b158015610f2357600080fd5b505afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190612774565b9050801561118d576000600460009054906101000a90046001600160a01b03166001600160a01b03166386fc88d36040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb357600080fd5b505afa158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610feb9190612774565b9050670de0b6b3a764000081118061100c5750600854600160a81b900460ff165b1561108257600054604051639a40832160e01b815260048101849052600160248201526101009091046001600160a01b031690639a40832190604401600060405180830381600087803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b5050505081945061116c565b600854600090600160a01b900460ff16156110d457670de0b6b3a76400006110aa83856127be565b6110b491906127dd565b9050612710600754826110c791906127be565b6110d191906127dd565b90505b600480546040516365b2489b60e01b81526000928101929092526001602483015260448201859052606482018390526001600160a01b0316906365b2489b90608401602060405180830381600087803b15801561113057600080fd5b505af1158015611144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111689190612774565b9550505b61118b73feef77d3f69374f66429c91d732a244f074bdf743387611193565b505b50505090565b6040516001600160a01b0383166024820152604481018290526111f690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526114a0565b505050565b8015806112845750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561124a57600080fd5b505afa15801561125e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112829190612774565b155b6112ef5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610754565b6040516001600160a01b0383166024820152604481018290526111f690849063095ea7b360e01b906064016111bf565b600080600160009054906101000a90046001600160a01b03166001600160a01b03166386fc88d36040518163ffffffff1660e01b815260040160206040518083038186803b15801561137057600080fd5b505afa158015611384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a89190612774565b90506000670de0b6b3a76400006113bf83866127be565b6113c991906127dd565b9050612710600754826113dc91906127be565b6113e691906127dd565b949350505050565b600180546040516365b2489b60e01b815260048101929092526000602483018190526044830185905260648301849052916001600160a01b03909116906365b2489b9083906084015b6020604051808303818588803b15801561145057600080fd5b505af1158015611464573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114899190612774565b90505b92915050565b600061148983836001611572565b60006114f5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116169092919063ffffffff16565b8051909150156111f6578080602001905181019061151391906127ff565b6111f65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610754565b600080836003811115611587576115876126d6565b141561159e576115978483611625565b905061160f565b60018360038111156115b2576115b26126d6565b14156115c25761159784836116a0565b60038360038111156115d6576115d66126d6565b14156115f857816115ef576115ea846118c7565b611597565b61159784611c52565b81611606576115ea84611f6f565b61159784612271565b9392505050565b60606113e68484600085612505565b6003546000906001600160a01b03166365b2489b83611645576000611647565b845b84611653576001611656565b60005b85611662576000611665565b60015b6040516001600160e01b031960e086901b16815260ff9283166004820152911660248201526044810187905260006064820152608401611437565b600080604051806101000160405280846116c857600080516020612b018339815191526116de565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25b6001600160a01b031681526020018461170b5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261171b565b600080516020612b018339815191525b6001600160a01b031681526127106020820152306040820152606001611742426001612821565b815260208101869052600160408201526000606090910181905290915073e592427a0aece92de3edee1f18e0157c0586156463414bf38985611785576000611787565b865b6040805160e084811b6001600160e01b031916825287516001600160a01b0390811660048401526020890151811660248401529288015162ffffff1660448301526060880151831660648301526080880151608483015260a088015160a483015260c088015160c483015287015190911660e4820152610104016020604051808303818588803b15801561181a57600080fd5b505af115801561182e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118539190612774565b9050836113e657604051632e1a7d4d60e01b81526004810182905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b1580156118a757600080fd5b505af11580156118bb573d6000803e3d6000fd5b50505050949350505050565b60408051600280825260608201835260009283929190602083019080368337019050509050600080516020612b018339815191528160008151811061190e5761190e61284f565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020612b21833981519152816001815181106119505761195061284f565b6001600160a01b03909216602092830291909101909101526000737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed173985600185306119934284612821565b6040518663ffffffff1660e01b81526004016119b3959493929190612865565b600060405180830381600087803b1580156119cd57600080fd5b505af11580156119e1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a0991908101906128d6565b9050600081600181518110611a2057611a2061284f565b6020908102919091010151600554604051630f7c084960e21b81526000600482018190526001602483015260448201849052606482018190529293506001600160a01b0390911690633df0212490608401602060405180830381600087803b158015611a8b57600080fd5b505af1158015611a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac39190612774565b6040805160a081019091529091506101f49060009080611b1073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260c08501612994565b60408051601f1981840301815291815290825230602083015201611b35426001612821565b815260200184815260200160008152509050600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663c04b8d596000846040518363ffffffff1660e01b8152600401611b8b9190612a27565b6020604051808303818588803b158015611ba457600080fd5b505af1158015611bb8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611bdd9190612774565b604051632e1a7d4d60e01b81526004810182905290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b158015611c2d57600080fd5b505af1158015611c41573d6000803e3d6000fd5b50929b9a5050505050505050505050565b6040805160a081019091526000906101f490829080611c9e73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28573a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860c08501612994565b60408051601f1981840301815291815290825230602083015201611cc3426001612821565b815260200185815260200160008152509050600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663c04b8d5986846040518363ffffffff1660e01b8152600401611d189190612a27565b6020604051808303818588803b158015611d3157600080fd5b505af1158015611d45573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d6a9190612774565b600554604051630f7c084960e21b81526001600482015260006024820181905260448201849052606482018190529293506001600160a01b0390911690633df0212490608401602060405180830381600087803b158015611dca57600080fd5b505af1158015611dde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e029190612774565b6040805160028082526060820183529293506000929091602083019080368337019050509050600080516020612b2183398151915281600081518110611e4a57611e4a61284f565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020612b0183398151915281600181518110611e8c57611e8c61284f565b6001600160a01b03909216602092830291909101909101526000737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed17398460018530611ecf4284612821565b6040518663ffffffff1660e01b8152600401611eef959493929190612865565b600060405180830381600087803b158015611f0957600080fd5b505af1158015611f1d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f4591908101906128d6565b905080600181518110611f5a57611f5a61284f565b60200260200101519650505050505050919050565b60408051600280825260608201835260009283929190602083019080368337019050509050600080516020612b0183398151915281600081518110611fb657611fb661284f565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020612b2183398151915281600181518110611ff857611ff861284f565b6001600160a01b03909216602092830291909101909101526000737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed1739856001853061203b4284612821565b6040518663ffffffff1660e01b815260040161205b959493929190612865565b600060405180830381600087803b15801561207557600080fd5b505af1158015612089573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120b191908101906128d6565b90506000816001815181106120c8576120c861284f565b60209081029190910101516040805160a081019091529091506101f49060009080612130600080516020612b218339815191528573a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260c08701612a7f565b60408051601f1981840301815291815290825230602083015201612155426001612821565b815260200184815260200160008152509050600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663c04b8d596000846040518363ffffffff1660e01b81526004016121ab9190612a27565b6020604051808303818588803b1580156121c457600080fd5b505af11580156121d8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121fd9190612774565b604051632e1a7d4d60e01b81526004810182905290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d90602401600060405180830381600087803b15801561224d57600080fd5b505af1158015612261573d6000803e3d6000fd5b50929a9950505050505050505050565b6040805160a081019091526000906101f4908290806122cd73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28573a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881600080516020612b2183398151915260c08701612a7f565b60408051601f19818403018152918152908252306020830152016122f2426001612821565b815260200185815260200160008152509050600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663c04b8d5986846040518363ffffffff1660e01b81526004016123479190612a27565b6020604051808303818588803b15801561236057600080fd5b505af1158015612374573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906123999190612774565b6040805160028082526060820183529293506000929091602083019080368337019050509050600080516020612b21833981519152816000815181106123e1576123e161284f565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020612b01833981519152816001815181106124235761242361284f565b6001600160a01b03909216602092830291909101909101526000737a250d5630b4cf539739df2c5dacb4c659f2488d6338ed173984600185306124664284612821565b6040518663ffffffff1660e01b8152600401612486959493929190612865565b600060405180830381600087803b1580156124a057600080fd5b505af11580156124b4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124dc91908101906128d6565b9050806001815181106124f1576124f161284f565b602002602001015195505050505050919050565b6060824710156125665760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610754565b843b6125b45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610754565b600080866001600160a01b031685876040516125d09190612ad1565b60006040518083038185875af1925050503d806000811461260d576040519150601f19603f3d011682016040523d82523d6000602084013e612612565b606091505b509150915061262282828661262d565b979650505050505050565b6060831561263c57508161160f565b82511561264c5782518084602001fd5b8160405162461bcd60e51b81526004016107549190612aed565b80356001600160a01b038116811461267d57600080fd5b919050565b6000806040838503121561269557600080fd5b61269e83612666565b91506126ac60208401612666565b90509250929050565b6000602082840312156126c757600080fd5b81356004811061160f57600080fd5b634e487b7160e01b600052602160045260246000fd5b6004811061270a57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161148c82846126ec565b60006020828403121561272e57600080fd5b61148982612666565b60006020828403121561274957600080fd5b5035919050565b6020808252600a90820152696f776e6572206f6e6c7960b01b604082015260600190565b60006020828403121561278657600080fd5b5051919050565b6040810161279b82856126ec565b61160f60208301846126ec565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156127d8576127d86127a8565b500290565b6000826127fa57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561281157600080fd5b8151801515811461160f57600080fd5b60008219821115612834576128346127a8565b500190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128b55784516001600160a01b031683529383019391830191600101612890565b50506001600160a01b03969096166060850152505050608001529392505050565b600060208083850312156128e957600080fd5b825167ffffffffffffffff8082111561290157600080fd5b818501915085601f83011261291557600080fd5b81518181111561292757612927612839565b8060051b604051601f19603f8301168101818110858211171561294c5761294c612839565b60405291825284820192508381018501918883111561296a57600080fd5b938501935b828510156129885784518452938501939285019261296f565b98975050505050505050565b606093841b6bffffffffffffffffffffffff19908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b60005b838110156129ea5781810151838201526020016129d2565b8381111561086d5750506000910152565b60008151808452612a138160208601602086016129cf565b601f01601f19169290920160200192915050565b602081526000825160a06020840152612a4360c08401826129fb565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b6bffffffffffffffffffffffff19606096871b811682526001600160e81b031960e896871b8116601484015294871b811660178301529290941b909216602b840152921b909116602e82015260420190565b60008251612ae38184602087016129cf565b9190910192915050565b60208152600061148960208301846129fb56fe0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0000000000000000000000000853d955acef822db058eb8505911ed77f175b99ea26469706673582212201dce5f56c5d68f69559eda03a9e74aff29c942c8ff980087915c6b629c5e277d64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000110a888f88b65a2c34a6922f518128eda4fb70de
-----Decoded View---------------
Arg [0] : _strategy (address): 0x110A888f88b65a2c34a6922f518128eDa4FB70de
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000110a888f88b65a2c34a6922f518128eda4fb70de
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.