More Info
Private Name Tags
ContractCreator:
Latest 25 from a total of 229 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Harvest | 44576403 | 596 days ago | IN | 0 FTM | 0.00032332 | ||||
Harvest | 44519222 | 597 days ago | IN | 0 FTM | 0.00041888 | ||||
Harvest | 44441811 | 598 days ago | IN | 0 FTM | 0.00034026 | ||||
Harvest | 44408945 | 599 days ago | IN | 0 FTM | 0.00030841 | ||||
Harvest | 44373903 | 599 days ago | IN | 0 FTM | 0.0003095 | ||||
Harvest | 44340349 | 600 days ago | IN | 0 FTM | 0.00030447 | ||||
Harvest | 44305783 | 600 days ago | IN | 0 FTM | 0.00038088 | ||||
Harvest | 44254992 | 601 days ago | IN | 0 FTM | 0.00034027 | ||||
Harvest | 44205418 | 602 days ago | IN | 0 FTM | 0.00035656 | ||||
Harvest | 44171762 | 602 days ago | IN | 0 FTM | 0.00030447 | ||||
Harvest | 44137074 | 603 days ago | IN | 0 FTM | 0.0003099 | ||||
Harvest | 44101060 | 603 days ago | IN | 0 FTM | 0.00031226 | ||||
Harvest | 44065667 | 604 days ago | IN | 0 FTM | 0.00034445 | ||||
Harvest | 43997131 | 605 days ago | IN | 0 FTM | 0.00034048 | ||||
Harvest | 43972852 | 605 days ago | IN | 0 FTM | 0.00019524 | ||||
Harvest | 43927110 | 606 days ago | IN | 0 FTM | 0.00032135 | ||||
Harvest | 43899560 | 606 days ago | IN | 0 FTM | 0.00028929 | ||||
Harvest | 43858395 | 607 days ago | IN | 0 FTM | 0.0003411 | ||||
Harvest | 43824837 | 607 days ago | IN | 0 FTM | 0.00039573 | ||||
Harvest | 43824785 | 607 days ago | IN | 0 FTM | 0.00039573 | ||||
Harvest | 43791450 | 608 days ago | IN | 0 FTM | 0.00037193 | ||||
Harvest | 43757858 | 608 days ago | IN | 0 FTM | 0.00036312 | ||||
Harvest | 43723895 | 609 days ago | IN | 0 FTM | 0.00030459 | ||||
Harvest | 43689431 | 609 days ago | IN | 0 FTM | 0.00041801 | ||||
Harvest | 43656096 | 610 days ago | IN | 0 FTM | 0.00030722 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
34350796 | 734 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
StrategySpookySwapLP
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; /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/SafeERC20.sol'; import '@openzeppelin/contracts/math/SafeMath.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Pausable.sol'; import '@uniswap/lib/contracts/libraries/TransferHelper.sol'; import '../../../interfaces/PancakeSwap/IMasterChef.sol'; import '../../../interfaces/PancakeSwap/IPancakePair.sol'; import '../../../interfaces/PancakeSwap/IPancakeRouter.sol'; import '../../../interfaces/IWooAccessManager.sol'; import '../../../interfaces/IStrategy.sol'; import '../BaseStrategy.sol'; contract StrategySpookySwapLP is BaseStrategy { using SafeERC20 for IERC20; using SafeMath for uint256; /* ----- State Variables ----- */ uint256 public immutable pid; address[] public rewardToLP0Route; address[] public rewardToLP1Route; address public lpToken0; address public lpToken1; address public constant reward = address(0x841FAD6EAe12c286d1Fd18d1d525DFfA75C7EFFE); // BOO address public constant uniRouter = address(0xF491e7B69E4244ad4002BC14e878a34207E38c29); address public constant masterChef = address(0x2b2929E785374c651a81A63878Ab22742656DcDd); constructor( address initVault, address initAccessManager, uint256 initPid, address[] memory initRewardToLP0Route, address[] memory initRewardToLP1Route ) public BaseStrategy(initVault, initAccessManager) { pid = initPid; rewardToLP0Route = initRewardToLP0Route; rewardToLP1Route = initRewardToLP1Route; if (initRewardToLP0Route.length == 0) { lpToken0 = reward; } else { require(initRewardToLP0Route[0] == reward); lpToken0 = initRewardToLP0Route[initRewardToLP0Route.length - 1]; } if (initRewardToLP1Route.length == 0) { lpToken1 = reward; } else { require(initRewardToLP1Route[0] == reward); lpToken1 = initRewardToLP1Route[initRewardToLP1Route.length - 1]; } require( IPancakePair(want).token0() == lpToken0 || IPancakePair(want).token0() == lpToken1, 'StrategySpookySwapLP: LP_token0_INVALID' ); require( IPancakePair(want).token1() == lpToken0 || IPancakePair(want).token1() == lpToken1, 'StrategySpookySwapLP: LP_token1_INVALID' ); (address lpToken, , , ) = IMasterChef(masterChef).poolInfo(initPid); require(lpToken == want, 'StrategySpookySwapLP: wrong_initPid'); _giveAllowances(); } /* ----- External Functions ----- */ function withdraw(uint256 amount) external override nonReentrant { require(msg.sender == vault, 'StrategySpookySwapLP: NOT_VAULT'); uint256 wantBalance = IERC20(want).balanceOf(address(this)); if (wantBalance < amount) { IMasterChef(masterChef).withdraw(pid, amount.sub(wantBalance)); wantBalance = IERC20(want).balanceOf(address(this)); } // just in case the decimal precision for the very left staking amount uint256 withdrawAmount = amount < wantBalance ? amount : wantBalance; uint256 fee = chargeWithdrawalFee(withdrawAmount); if (withdrawAmount > fee) { TransferHelper.safeTransfer(want, vault, withdrawAmount.sub(fee)); } } function harvest() public override whenNotPaused { require(msg.sender == tx.origin || msg.sender == vault, 'StrategySpookySwapLP: EOA_OR_VAULT'); IMasterChef(masterChef).deposit(pid, 0); uint256 rewardAmount = IERC20(reward).balanceOf(address(this)); if (rewardAmount > 0) { uint256 wantBefore = IERC20(want).balanceOf(address(this)); _addLiquidity(); uint256 wantAfter = IERC20(want).balanceOf(address(this)); uint256 perfAmount = wantAfter.sub(wantBefore); chargePerformanceFee(perfAmount); } deposit(); } function deposit() public override whenNotPaused nonReentrant { uint256 wantBalance = IERC20(want).balanceOf(address(this)); if (wantBalance > 0) { IMasterChef(masterChef).deposit(pid, wantBalance); } } function balanceOfPool() public view override returns (uint256) { (uint256 amount, ) = IMasterChef(masterChef).userInfo(pid, address(this)); return amount; } /* ----- Private Functions ----- */ function _giveAllowances() internal override { TransferHelper.safeApprove(want, masterChef, 0); TransferHelper.safeApprove(want, masterChef, uint256(-1)); TransferHelper.safeApprove(reward, uniRouter, 0); TransferHelper.safeApprove(reward, uniRouter, uint256(-1)); TransferHelper.safeApprove(lpToken0, uniRouter, 0); TransferHelper.safeApprove(lpToken0, uniRouter, uint256(-1)); TransferHelper.safeApprove(lpToken1, uniRouter, 0); TransferHelper.safeApprove(lpToken1, uniRouter, uint256(-1)); } function _removeAllowances() internal override { TransferHelper.safeApprove(want, masterChef, 0); TransferHelper.safeApprove(reward, uniRouter, 0); TransferHelper.safeApprove(lpToken0, uniRouter, 0); TransferHelper.safeApprove(lpToken1, uniRouter, 0); } function _addLiquidity() private { uint256 rewardHalf = IERC20(reward).balanceOf(address(this)).div(2); if (lpToken0 != reward) { IPancakeRouter(uniRouter).swapExactTokensForTokens(rewardHalf, 0, rewardToLP0Route, address(this), now); } if (lpToken1 != reward) { IPancakeRouter(uniRouter).swapExactTokensForTokens(rewardHalf, 0, rewardToLP1Route, address(this), now); } uint256 lp0Balance = IERC20(lpToken0).balanceOf(address(this)); uint256 lp1Balance = IERC20(lpToken1).balanceOf(address(this)); IPancakeRouter(uniRouter).addLiquidity(lpToken0, lpToken1, lp0Balance, lp1Balance, 0, 0, address(this), now); } function retireStrat() external override { require(msg.sender == vault, '!vault'); IMasterChef(masterChef).emergencyWithdraw(pid); uint256 wantBalance = IERC20(want).balanceOf(address(this)); if (wantBalance > 0) { TransferHelper.safeTransfer(want, vault, wantBalance); } } function emergencyExit() external override onlyAdmin { IMasterChef(masterChef).emergencyWithdraw(pid); uint256 wantBalance = IERC20(want).balanceOf(address(this)); if (wantBalance > 0) { TransferHelper.safeTransfer(want, vault, wantBalance); } } }
// 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; 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.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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * 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); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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.0 <0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IMasterChef { function deposit(uint256 pid, uint256 amount) external; function withdraw(uint256 pid, uint256 amount) external; function enterStaking(uint256 amount) external; function leaveStaking(uint256 amount) external; function emergencyWithdraw(uint256 pid) external; function pendingCake(uint256 pid, address user) external view returns (uint256); function poolInfo(uint256 pid) external view returns ( address, uint256, uint256, uint256 ); function userInfo(uint256 pid, address user) external view returns (uint256, uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IPancakePair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IPancakeRouter { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); }
// SPDX-License-Identifier: MIT pragma solidity =0.6.12; pragma experimental ABIEncoderV2; /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// @title Reward manager interface for WooFi Swap. /// @notice this is for swap rebate or potential incentive program interface IWooAccessManager { /* ----- Events ----- */ event FeeAdminUpdated(address indexed feeAdmin, bool flag); event VaultAdminUpdated(address indexed vaultAdmin, bool flag); event RebateAdminUpdated(address indexed rebateAdmin, bool flag); event ZeroFeeVaultUpdated(address indexed vault, bool flag); /* ----- External Functions ----- */ function isFeeAdmin(address feeAdmin) external returns (bool); function isVaultAdmin(address vaultAdmin) external returns (bool); function isRebateAdmin(address rebateAdmin) external returns (bool); function isZeroFeeVault(address vault) external returns (bool); /* ----- Admin Functions ----- */ /// @notice Sets feeAdmin function setFeeAdmin(address feeAdmin, bool flag) external; /// @notice Batch sets feeAdmin function batchSetFeeAdmin(address[] calldata feeAdmins, bool[] calldata flags) external; /// @notice Sets vaultAdmin function setVaultAdmin(address vaultAdmin, bool flag) external; /// @notice Batch sets vaultAdmin function batchSetVaultAdmin(address[] calldata vaultAdmins, bool[] calldata flags) external; /// @notice Sets rebateAdmin function setRebateAdmin(address rebateAdmin, bool flag) external; /// @notice Batch sets rebateAdmin function batchSetRebateAdmin(address[] calldata rebateAdmins, bool[] calldata flags) external; /// @notice Sets zeroFeeVault function setZeroFeeVault(address vault, bool flag) external; /// @notice Batch sets zeroFeeVault function batchSetZeroFeeVault(address[] calldata vaults, bool[] calldata flags) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ interface IStrategy { function vault() external view returns (address); function want() external view returns (address); function beforeDeposit() external; function beforeWithdraw() external; function deposit() external; function withdraw(uint256) external; function balanceOf() external view returns (uint256); function balanceOfWant() external view returns (uint256); function balanceOfPool() external view returns (uint256); function harvest() external; function retireStrat() external; function emergencyExit() external; function paused() external view returns (bool); function inCaseTokensGetStuck(address stuckToken) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/SafeERC20.sol'; import '@openzeppelin/contracts/math/SafeMath.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Pausable.sol'; import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import '@uniswap/lib/contracts/libraries/TransferHelper.sol'; import '../../interfaces/PancakeSwap/IMasterChef.sol'; import '../../interfaces/IWooAccessManager.sol'; import '../../interfaces/IStrategy.sol'; import '../../interfaces/IVault.sol'; /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * Base strategy abstract contract for: * - vault and access manager setup * - fees management * - pause / unpause */ abstract contract BaseStrategy is Ownable, Pausable, IStrategy, ReentrancyGuard { using SafeERC20 for IERC20; using SafeMath for uint256; /* ----- State Variables ----- */ address public override want; address public immutable override vault; // Default them to 'true' to make the system more fair, but cost a bit more gas. bool public harvestOnDeposit = true; bool public harvestOnWithdraw = true; /* ----- Constant Variables ----- */ uint256 public constant FEE_MAX = 10000; uint256 public performanceFee = 300; // 1 in 10000th: 100: 1%, 300: 3% uint256 public withdrawalFee = 0; // 1 in 10000th: 1: 0.01%, 10: 0.1% address public performanceTreasury; address public withdrawalTreasury; IWooAccessManager public accessManager; event PerformanceFeeUpdated(uint256 newFee); event WithdrawalFeeUpdated(uint256 newFee); constructor(address initVault, address initAccessManager) public { require(initVault != address(0), 'BaseStrategy: initVault_ZERO_ADDR'); require(initAccessManager != address(0), 'BaseStrategy: initAccessManager_ZERO_ADDR'); vault = initVault; accessManager = IWooAccessManager(initAccessManager); want = IVault(initVault).want(); } modifier onlyAdmin() { require(owner() == _msgSender() || accessManager.isVaultAdmin(msg.sender), 'BaseStrategy: NOT_ADMIN'); _; } /* ----- Public Functions ----- */ function beforeDeposit() public virtual override { require(msg.sender == address(vault), 'BaseStrategy: NOT_VAULT'); if (harvestOnDeposit) { harvest(); } } function beforeWithdraw() public virtual override { require(msg.sender == address(vault), 'BaseStrategy: NOT_VAULT'); if (harvestOnWithdraw) { harvest(); } } function balanceOf() public view override returns (uint256) { return balanceOfWant().add(balanceOfPool()); } function balanceOfWant() public view override returns (uint256) { return IERC20(want).balanceOf(address(this)); } /* ----- Internal Functions ----- */ function chargePerformanceFee(uint256 amount) internal returns (uint256) { uint256 fee = amount.mul(performanceFee).div(FEE_MAX); if (fee > 0) { TransferHelper.safeTransfer(want, performanceTreasury, fee); } return fee; } function chargeWithdrawalFee(uint256 amount) internal returns (uint256) { uint256 fee = amount.mul(withdrawalFee).div(FEE_MAX); if (fee > 0) { TransferHelper.safeTransfer(want, withdrawalTreasury, fee); } return fee; } /* ----- Abstract Method ----- */ function balanceOfPool() public view virtual override returns (uint256); function deposit() public virtual override; function withdraw(uint256 amount) external virtual override; function harvest() public virtual override; function retireStrat() external virtual override; function emergencyExit() external virtual override; function _giveAllowances() internal virtual; function _removeAllowances() internal virtual; /* ----- Admin Functions ----- */ function setPerformanceFee(uint256 fee) external onlyAdmin { require(fee <= FEE_MAX, 'BaseStrategy: fee_EXCCEEDS_MAX'); performanceFee = fee; emit PerformanceFeeUpdated(fee); } function setWithdrawalFee(uint256 fee) external onlyAdmin { require(fee <= FEE_MAX, 'BaseStrategy: fee_EXCCEEDS_MAX'); require(fee <= 500, 'BaseStrategy: fee_EXCCEEDS_5%'); // less than 5% withdrawalFee = fee; emit WithdrawalFeeUpdated(fee); } function setPerformanceTreasury(address treasury) external onlyAdmin { require(treasury != address(0), 'BaseStrategy: treasury_ZERO_ADDR'); performanceTreasury = treasury; } function setWithdrawalTreasury(address treasury) external onlyAdmin { require(treasury != address(0), 'BaseStrategy: treasury_ZERO_ADDR'); withdrawalTreasury = treasury; } function setHarvestOnDeposit(bool newHarvestOnDeposit) external onlyAdmin { harvestOnDeposit = newHarvestOnDeposit; } function setHarvestOnWithdraw(bool newHarvestOnWithdraw) external onlyAdmin { harvestOnWithdraw = newHarvestOnWithdraw; } function pause() public onlyAdmin { _pause(); _removeAllowances(); } function unpause() external onlyAdmin { _unpause(); _giveAllowances(); deposit(); } function paused() public view override(IStrategy, Pausable) returns (bool) { return Pausable.paused(); } function inCaseTokensGetStuck(address stuckToken) external override onlyAdmin { require(stuckToken != want, 'BaseStrategy: stuckToken_NOT_WANT'); require(stuckToken != address(0), 'BaseStrategy: stuckToken_ZERO_ADDR'); uint256 amount = IERC20(stuckToken).balanceOf(address(this)); if (amount > 0) { TransferHelper.safeTransfer(stuckToken, msg.sender, amount); } } function inCaseNativeTokensGetStuck() external onlyAdmin { // NOTE: vault never needs native tokens to do the yield farming; // This native token balance indicates a user's incorrect transfer. if (address(this).balance > 0) { TransferHelper.safeTransferETH(msg.sender, address(this).balance); } } }
// 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); } /** * @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.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IVault { function want() external view returns (address); function deposit(uint256 amount) external payable; function withdraw(uint256 shares) external; function earn() external; function available() external view returns (uint256); function balance() external view returns (uint256); function getPricePerFullShare() external view returns (uint256); }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initVault","type":"address"},{"internalType":"address","name":"initAccessManager","type":"address"},{"internalType":"uint256","name":"initPid","type":"uint256"},{"internalType":"address[]","name":"initRewardToLP0Route","type":"address[]"},{"internalType":"address[]","name":"initRewardToLP1Route","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"PerformanceFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"WithdrawalFeeUpdated","type":"event"},{"inputs":[],"name":"FEE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accessManager","outputs":[{"internalType":"contract IWooAccessManager","name":"","type":"address"}],"stateMutability":"view","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":"beforeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"beforeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestOnDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestOnWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inCaseNativeTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stuckToken","type":"address"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpToken0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retireStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardToLP0Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardToLP1Route","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"newHarvestOnDeposit","type":"bool"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newHarvestOnWithdraw","type":"bool"}],"name":"setHarvestOnWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasury","type":"address"}],"name":"setPerformanceTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasury","type":"address"}],"name":"setWithdrawalTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","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":[],"name":"withdrawalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040526002805460ff60a81b1960ff60a01b19909116600160a01b1716600160a81b17905561012c60035560006004553480156200003e57600080fd5b5060405162003f8f38038062003f8f833981810160405260a08110156200006457600080fd5b8151602083015160408085015160608601805192519496939591949391820192846401000000008211156200009857600080fd5b908301906020820185811115620000ae57600080fd5b8251866020820283011164010000000082111715620000cc57600080fd5b82525081516020918201928201910280838360005b83811015620000fb578181015183820152602001620000e1565b50505050905001604052602001805160405193929190846401000000008211156200012557600080fd5b9083019060208201858111156200013b57600080fd5b82518660208202830111640100000000821117156200015957600080fd5b82525081516020918201928201910280838360005b83811015620001885781810151838201526020016200016e565b5050505090500160405250505084846000620001a96200086f60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b19169055600180556001600160a01b0382166200024b5760405162461bcd60e51b815260040180806020018281038252602181526020018062003e696021913960400191505060405180910390fd5b6001600160a01b038116620002925760405162461bcd60e51b815260040180806020018281038252602981526020018062003edc6029913960400191505060405180910390fd5b606082901b6001600160601b031916608052600780546001600160a01b0319166001600160a01b038381169190911790915560408051631f1fcd5160e01b8152905191841691631f1fcd5191600480820192602092909190829003018186803b158015620002ff57600080fd5b505afa15801562000314573d6000803e3d6000fd5b505050506040513d60208110156200032b57600080fd5b5051600280546001600160a01b0319166001600160a01b03909216919091179055505060a083905281516200036890600890602085019062000b8c565b5080516200037e90600990602084019062000b8c565b508151620003ad57600a80546001600160a01b03191660008051602062003f6f83398151915217905562000430565b60008051602062003f6f8339815191526001600160a01b031682600081518110620003d457fe5b60200260200101516001600160a01b031614620003f057600080fd5b816001835103815181106200040157fe5b6020026020010151600a60006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80516200045e57600b80546001600160a01b03191660008051602062003f6f833981519152179055620004e1565b60008051602062003f6f8339815191526001600160a01b0316816000815181106200048557fe5b60200260200101516001600160a01b031614620004a157600080fd5b80600182510381518110620004b257fe5b6020026020010151600b60006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b600a5460025460408051630dfe168160e01b815290516001600160a01b039384169390921691630dfe168191600480820192602092909190829003018186803b1580156200052e57600080fd5b505afa15801562000543573d6000803e3d6000fd5b505050506040513d60208110156200055a57600080fd5b50516001600160a01b03161480620005f35750600b5460025460408051630dfe168160e01b815290516001600160a01b039384169390921691630dfe168191600480820192602092909190829003018186803b158015620005ba57600080fd5b505afa158015620005cf573d6000803e3d6000fd5b505050506040513d6020811015620005e657600080fd5b50516001600160a01b0316145b620006305760405162461bcd60e51b815260040180806020018281038252602781526020018062003e8a6027913960400191505060405180910390fd5b600a546002546040805163d21220a760e01b815290516001600160a01b03938416939092169163d21220a791600480820192602092909190829003018186803b1580156200067d57600080fd5b505afa15801562000692573d6000803e3d6000fd5b505050506040513d6020811015620006a957600080fd5b50516001600160a01b03161480620007425750600b546002546040805163d21220a760e01b815290516001600160a01b03938416939092169163d21220a791600480820192602092909190829003018186803b1580156200070957600080fd5b505afa1580156200071e573d6000803e3d6000fd5b505050506040513d60208110156200073557600080fd5b50516001600160a01b0316145b6200077f5760405162461bcd60e51b815260040180806020018281038252602781526020018062003f256027913960400191505060405180910390fd5b6000732b2929e785374c651a81a63878ab22742656dcdd6001600160a01b0316631526fe27856040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b158015620007da57600080fd5b505afa158015620007ef573d6000803e3d6000fd5b505050506040513d60808110156200080657600080fd5b50516002549091506001600160a01b03808316911614620008595760405162461bcd60e51b815260040180806020018281038252602381526020018062003f4c6023913960400191505060405180910390fd5b6200086362000873565b50505050505062000c17565b3390565b600254620008ad906001600160a01b0316732b2929e785374c651a81a63878ab22742656dcdd600062000a2f602090811b620021a817901c565b600254620008e8906001600160a01b0316732b2929e785374c651a81a63878ab22742656dcdd60001962000a2f602090811b620021a817901c565b6200091f60008051602062003f6f83398151915260008051602062003f05833981519152600062000a2f60201b620021a81760201c565b6200095760008051602062003f6f83398151915260008051602062003f0583398151915260001962000a2f60201b620021a81760201c565b600a546200098c906001600160a01b031660008051602062003f05833981519152600062000a2f602090811b620021a817901c565b600a54620009c2906001600160a01b031660008051602062003f0583398151915260001962000a2f602090811b620021a817901c565b600b54620009f7906001600160a01b031660008051602062003f05833981519152600062000a2f602090811b620021a817901c565b600b5462000a2d906001600160a01b031660008051602062003f0583398151915260001962000a2f602090811b620021a817901c565b565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b6020831062000aae5780518252601f19909201916020918201910162000a8d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811462000b12576040519150601f19603f3d011682016040523d82523d6000602084013e62000b17565b606091505b509150915081801562000b4857508051158062000b48575080806020019051602081101562000b4557600080fd5b50515b62000b855760405162461bcd60e51b815260040180806020018281038252602b81526020018062003eb1602b913960400191505060405180910390fd5b5050505050565b82805482825590600052602060002090810192821562000be4579160200282015b8281111562000be457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000bad565b5062000bf292915062000bf6565b5090565b5b8082111562000bf25780546001600160a01b031916815560010162000bf7565b60805160601c60a0516131ef62000c7a600039806107755280610b0e5280610ecf52806111fa5280611d3b5280611fd95250806109ff5280610c405280610d7f5280610e6252806113075280611337528061211a528061217752506131ef6000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806377e7493311610146578063ac1e5025116100c3578063e0333bce11610087578063e0333bce146104a3578063f1068454146104c0578063f2fde38b146104c8578063fb617787146104ee578063fbfa77cf146104f6578063fdcb6068146104fe5761025e565b8063ac1e502514610448578063c1a3d44c14610465578063c2624e1e1461046d578063d0e30db014610475578063def68a9c1461047d5761025e565b80638912cb8b1161010a5780638912cb8b146104205780638bc7e8c4146104285780638da5cb5b14610430578063975dc33a14610438578063a0e47bf6146104405761025e565b806377e74933146103f85780638456cb59146104005780638585741914610408578063877562b61461041057806387788782146104185761025e565b806353a362fb116101df5780635c975abb116101a35780635c975abb1461039e5780635ee167c0146103a657806370897b23146103ae578063715018a6146103cb57806371b48c74146103d3578063722713f7146103f05761025e565b806353a362fb1461034b5780635641ec0314610367578063573fef0a1461036f578063575a86b2146103775780635c5f30011461037f5761025e565b806327c1351e1161022657806327c1351e146102f05780632e1a7d4d146103165780633f4ba83a14610333578063419f77531461033b5780634641257d146103435761025e565b80630e8fbb5a146102635780630f8a36581461028457806311588086146102aa5780631f1fcd51146102c4578063228cb733146102e8575b600080fd5b6102826004803603602081101561027957600080fd5b50351515610506565b005b6102826004803603602081101561029a57600080fd5b50356001600160a01b0316610606565b6102b2610765565b60408051918252519081900360200190f35b6102cc610811565b604080516001600160a01b039092168252519081900360200190f35b6102cc610820565b6102826004803603602081101561030657600080fd5b50356001600160a01b0316610838565b6102826004803603602081101561032c57600080fd5b5035610997565b610282610c78565b610282610d74565b610282610e01565b6103536110f8565b604080519115158252519081900360200190f35b610282611108565b61028261132c565b6102cc6113bd565b6102826004803603602081101561039557600080fd5b503515156113d5565b6103536114d5565b6102cc6114e4565b610282600480360360208110156103c457600080fd5b50356114f3565b610282611667565b6102cc600480360360208110156103e957600080fd5b5035611725565b6102b261174c565b6102cc611767565b610282611776565b610282611868565b6102cc61195a565b6102b2611969565b61035361196f565b6102b261197f565b6102cc611985565b6102cc611994565b6102cc6119a3565b6102826004803603602081101561045e57600080fd5b50356119b5565b6102b2611b80565b6102b2611bfc565b610282611c02565b6102826004803603602081101561049357600080fd5b50356001600160a01b0316611dc4565b6102cc600480360360208110156104b957600080fd5b5035611fca565b6102b2611fd7565b610282600480360360208110156104de57600080fd5b50356001600160a01b0316611ffb565b61028261210f565b6102cc612175565b6102cc612199565b61050e6122fc565b6001600160a01b031661051f611985565b6001600160a01b031614806105a957506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561057c57600080fd5b505af1158015610590573d6000803e3d6000fd5b505050506040513d60208110156105a657600080fd5b50515b6105e8576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b60028054911515600160a01b0260ff60a01b19909216919091179055565b61060e6122fc565b6001600160a01b031661061f611985565b6001600160a01b031614806106a957506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561067c57600080fd5b505af1158015610690573d6000803e3d6000fd5b505050506040513d60208110156106a657600080fd5b50515b6106e8576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b6001600160a01b038116610743576040805162461bcd60e51b815260206004820181905260248201527f4261736553747261746567793a2074726561737572795f5a45524f5f41444452604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b604080516393f1a40b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015230602482015281516000928392732b2929e785374c651a81a63878ab22742656dcdd926393f1a40b92604480840193919291829003018186803b1580156107df57600080fd5b505afa1580156107f3573d6000803e3d6000fd5b505050506040513d604081101561080957600080fd5b505191505090565b6002546001600160a01b031681565b73841fad6eae12c286d1fd18d1d525dffa75c7effe81565b6108406122fc565b6001600160a01b0316610851611985565b6001600160a01b031614806108db57506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b1580156108ae57600080fd5b505af11580156108c2573d6000803e3d6000fd5b505050506040513d60208110156108d857600080fd5b50515b61091a576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b6001600160a01b038116610975576040805162461bcd60e51b815260206004820181905260248201527f4261736553747261746567793a2074726561737572795f5a45524f5f41444452604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156109ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600155336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a71576040805162461bcd60e51b815260206004820152601f60248201527f537472617465677953706f6f6b79537761704c503a204e4f545f5641554c5400604482015290519081900360640190fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610abc57600080fd5b505afa158015610ad0573d6000803e3d6000fd5b505050506040513d6020811015610ae657600080fd5b5051905081811015610c0657732b2929e785374c651a81a63878ab22742656dcdd63441a3e707f0000000000000000000000000000000000000000000000000000000000000000610b378585612300565b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015610b7457600080fd5b505af1158015610b88573d6000803e3d6000fd5b5050600254604080516370a0823160e01b815230600482015290516001600160a01b0390921693506370a082319250602480820192602092909190829003018186803b158015610bd757600080fd5b505afa158015610beb573d6000803e3d6000fd5b505050506040513d6020811015610c0157600080fd5b505190505b6000818310610c155781610c17565b825b90506000610c2482612362565b905080821115610c6e57600254610c6e906001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000610c698585612300565b6123a7565b5050600180555050565b610c806122fc565b6001600160a01b0316610c91611985565b6001600160a01b03161480610d1b57506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b505050506040513d6020811015610d1857600080fd5b50515b610d5a576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b610d626124f4565b610d6a612597565b610d72611c02565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610deb576040805162461bcd60e51b815260206004820152601760248201527610985cd954dd1c985d1959de4e881393d517d590555315604a1b604482015290519081900360640190fd5b600254600160a81b900460ff1615610d7257610d725b610e096114d5565b15610e4e576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b33321480610e845750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610ebf5760405162461bcd60e51b81526004018080602001828103825260228152602001806131986022913960400191505060405180910390fd5b60408051631c57762b60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201526000602482018190529151732b2929e785374c651a81a63878ab22742656dcdd9263e2bbb158926044808201939182900301818387803b158015610f3657600080fd5b505af1158015610f4a573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073841fad6eae12c286d1fd18d1d525dffa75c7effe92506370a0823191602480820192602092909190829003018186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d6020811015610fcd57600080fd5b5051905080156110ed57600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d602081101561104c57600080fd5b505190506110586126e7565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156110a357600080fd5b505afa1580156110b7573d6000803e3d6000fd5b505050506040513d60208110156110cd57600080fd5b5051905060006110dd8284612300565b90506110e881612ca6565b505050505b6110f5611c02565b50565b600254600160a81b900460ff1681565b6111106122fc565b6001600160a01b0316611121611985565b6001600160a01b031614806111ab57506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561117e57600080fd5b505af1158015611192573d6000803e3d6000fd5b505050506040513d60208110156111a857600080fd5b50515b6111ea576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b60408051632989754760e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201529051732b2929e785374c651a81a63878ab22742656dcdd91635312ea8e91602480830192600092919082900301818387803b15801561125c57600080fd5b505af1158015611270573d6000803e3d6000fd5b5050600254604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d60208110156112eb57600080fd5b5051905080156110f5576002546110f5906001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000836123a7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113a3576040805162461bcd60e51b815260206004820152601760248201527610985cd954dd1c985d1959de4e881393d517d590555315604a1b604482015290519081900360640190fd5b600254600160a01b900460ff1615610d7257610d72610e01565b732b2929e785374c651a81a63878ab22742656dcdd81565b6113dd6122fc565b6001600160a01b03166113ee611985565b6001600160a01b0316148061147857506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d602081101561147557600080fd5b50515b6114b7576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b60028054911515600160a81b0260ff60a81b19909216919091179055565b60006114df612ce9565b905090565b600a546001600160a01b031681565b6114fb6122fc565b6001600160a01b031661150c611985565b6001600160a01b0316148061159657506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561156957600080fd5b505af115801561157d573d6000803e3d6000fd5b505050506040513d602081101561159357600080fd5b50515b6115d5576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b61271081111561162c576040805162461bcd60e51b815260206004820152601e60248201527f4261736553747261746567793a206665655f45584343454544535f4d41580000604482015290519081900360640190fd5b60038190556040805182815290517f9b49d0cd76012d9c67241c2f68f836efbaf50ea29901a250040671402d5263f59181900360200190a150565b61166f6122fc565b6001600160a01b0316611680611985565b6001600160a01b0316146116db576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6009818154811061173257fe5b6000918252602090912001546001600160a01b0316905081565b60006114df611759610765565b611761611b80565b90612cf9565b6005546001600160a01b031681565b61177e6122fc565b6001600160a01b031661178f611985565b6001600160a01b0316148061181957506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b1580156117ec57600080fd5b505af1158015611800573d6000803e3d6000fd5b505050506040513d602081101561181657600080fd5b50515b611858576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b611860612d5a565b610d72612de3565b6118706122fc565b6001600160a01b0316611881611985565b6001600160a01b0316148061190b57506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b1580156118de57600080fd5b505af11580156118f2573d6000803e3d6000fd5b505050506040513d602081101561190857600080fd5b50515b61194a576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b4715610d7257610d723347612e89565b600b546001600160a01b031681565b60035481565b600254600160a01b900460ff1681565b60045481565b6000546001600160a01b031690565b6006546001600160a01b031681565b60008051602061314b83398151915281565b6119bd6122fc565b6001600160a01b03166119ce611985565b6001600160a01b03161480611a5857506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b158015611a2b57600080fd5b505af1158015611a3f573d6000803e3d6000fd5b505050506040513d6020811015611a5557600080fd5b50515b611a97576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b612710811115611aee576040805162461bcd60e51b815260206004820152601e60248201527f4261736553747261746567793a206665655f45584343454544535f4d41580000604482015290519081900360640190fd5b6101f4811115611b45576040805162461bcd60e51b815260206004820152601d60248201527f4261736553747261746567793a206665655f45584343454544535f3525000000604482015290519081900360640190fd5b60048190556040805182815290517fe94edcc114da5287ecb30ee8aacf12e6c16b11b8583d7f9e477ab1616e33d53d9181900360200190a150565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611bcb57600080fd5b505afa158015611bdf573d6000803e3d6000fd5b505050506040513d6020811015611bf557600080fd5b5051905090565b61271081565b611c0a6114d5565b15611c4f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60026001541415611ca7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600181905554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611cf757600080fd5b505afa158015611d0b573d6000803e3d6000fd5b505050506040513d6020811015611d2157600080fd5b505190508015611dbd5760408051631c57762b60e31b81527f00000000000000000000000000000000000000000000000000000000000000006004820152602481018390529051732b2929e785374c651a81a63878ab22742656dcdd9163e2bbb15891604480830192600092919082900301818387803b158015611da457600080fd5b505af1158015611db8573d6000803e3d6000fd5b505050505b5060018055565b611dcc6122fc565b6001600160a01b0316611ddd611985565b6001600160a01b03161480611e6757506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b158015611e3a57600080fd5b505af1158015611e4e573d6000803e3d6000fd5b505050506040513d6020811015611e6457600080fd5b50515b611ea6576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b6002546001600160a01b0382811691161415611ef35760405162461bcd60e51b815260040180806020018281038252602181526020018061312a6021913960400191505060405180910390fd5b6001600160a01b038116611f385760405162461bcd60e51b81526004018080602001828103825260228152602001806130dd6022913960400191505060405180910390fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f8757600080fd5b505afa158015611f9b573d6000803e3d6000fd5b505050506040513d6020811015611fb157600080fd5b505190508015611fc657611fc68233836123a7565b5050565b6008818154811061173257fe5b7f000000000000000000000000000000000000000000000000000000000000000081565b6120036122fc565b6001600160a01b0316612014611985565b6001600160a01b03161461206f576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166120b45760405162461bcd60e51b81526004018080602001828103825260268152602001806130426026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ea576040805162461bcd60e51b8152602060048201526006602482015265085d985d5b1d60d21b604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6007546001600160a01b031681565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106122255780518252601f199092019160209182019101612206565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612287576040519150601f19603f3d011682016040523d82523d6000602084013e61228c565b606091505b50915091508180156122ba5750805115806122ba57508080602001905160208110156122b757600080fd5b50515b6122f55760405162461bcd60e51b815260040180806020018281038252602b8152602001806130ff602b913960400191505060405180910390fd5b5050505050565b3390565b600082821115612357576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b60008061238661271061238060045486612f8190919063ffffffff16565b90612fda565b9050801561235c5760025460065461235c916001600160a01b039081169116835b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106124245780518252601f199092019160209182019101612405565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612486576040519150601f19603f3d011682016040523d82523d6000602084013e61248b565b606091505b50915091508180156124b95750805115806124b957508080602001905160208110156124b657600080fd5b50515b6122f55760405162461bcd60e51b815260040180806020018281038252602d81526020018061316b602d913960400191505060405180910390fd5b6124fc6114d5565b612544576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61257a6122fc565b604080516001600160a01b039092168252519081900360200190a1565b6002546125c3906001600160a01b0316732b2929e785374c651a81a63878ab22742656dcdd60006121a8565b6002546125f0906001600160a01b0316732b2929e785374c651a81a63878ab22742656dcdd6000196121a8565b61261e73841fad6eae12c286d1fd18d1d525dffa75c7effe60008051602061314b83398151915260006121a8565b61264d73841fad6eae12c286d1fd18d1d525dffa75c7effe60008051602061314b8339815191526000196121a8565b600a54612673906001600160a01b031660008051602061314b83398151915260006121a8565b600a5461269a906001600160a01b031660008051602061314b8339815191526000196121a8565b600b546126c0906001600160a01b031660008051602061314b83398151915260006121a8565b600b54610d72906001600160a01b031660008051602061314b8339815191526000196121a8565b6000612781600273841fad6eae12c286d1fd18d1d525dffa75c7effe6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d602081101561277957600080fd5b505190612fda565b600a549091506001600160a01b031673841fad6eae12c286d1fd18d1d525dffa75c7effe1461293c5760008051602061314b8339815191526001600160a01b03166338ed1739826000600830426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818154815260200191508054801561284d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161282f575b50509650505050505050600060405180830381600087803b15801561287157600080fd5b505af1158015612885573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156128ae57600080fd5b81019080805160405193929190846401000000008211156128ce57600080fd5b9083019060208201858111156128e357600080fd5b825186602082028301116401000000008211171561290057600080fd5b82525081516020918201928201910280838360005b8381101561292d578181015183820152602001612915565b50505050905001604052505050505b600b546001600160a01b031673841fad6eae12c286d1fd18d1d525dffa75c7effe14612af45760008051602061314b8339815191526001600160a01b03166338ed1739826000600930426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b031681526020018381526020018281038252858181548152602001915080548015612a0557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129e7575b50509650505050505050600060405180830381600087803b158015612a2957600080fd5b505af1158015612a3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612a6657600080fd5b8101908080516040519392919084640100000000821115612a8657600080fd5b908301906020820185811115612a9b57600080fd5b8251866020820283011164010000000082111715612ab857600080fd5b82525081516020918201928201910280838360005b83811015612ae5578181015183820152602001612acd565b50505050905001604052505050505b600a54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612b3f57600080fd5b505afa158015612b53573d6000803e3d6000fd5b505050506040513d6020811015612b6957600080fd5b5051600b54604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b5051600a54600b546040805162e8e33760e81b81526001600160a01b039384166004820152929091166024830152604482018590526064820183905260006084830181905260a483018190523060c48401524260e4840152905192935060008051602061314b8339815191529263e8e3370092610104808201936060939283900390910190829087803b158015612c7c57600080fd5b505af1158015612c90573d6000803e3d6000fd5b505050506040513d60608110156122f557600080fd5b600080612cc461271061238060035486612f8190919063ffffffff16565b9050801561235c5760025460055461235c916001600160a01b039081169116836123a7565b600054600160a01b900460ff1690565b600082820183811015612d53576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b612d626114d5565b15612da7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861257a6122fc565b600254612e0f906001600160a01b0316732b2929e785374c651a81a63878ab22742656dcdd60006121a8565b612e3d73841fad6eae12c286d1fd18d1d525dffa75c7effe60008051602061314b83398151915260006121a8565b600a54612e63906001600160a01b031660008051602061314b83398151915260006121a8565b600b54610d72906001600160a01b031660008051602061314b83398151915260006121a8565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612ed55780518252601f199092019160209182019101612eb6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612f37576040519150601f19603f3d011682016040523d82523d6000602084013e612f3c565b606091505b5050905080612f7c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130686034913960400191505060405180910390fd5b505050565b600082612f905750600061235c565b82820282848281612f9d57fe5b0414612d535760405162461bcd60e51b81526004018080602001828103825260218152602001806130bc6021913960400191505060405180910390fd5b6000808211613030576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161303957fe5b04939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c65644261736553747261746567793a204e4f545f41444d494e000000000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774261736553747261746567793a20737475636b546f6b656e5f5a45524f5f414444525472616e7366657248656c7065723a3a73616665417070726f76653a20617070726f7665206661696c65644261736553747261746567793a20737475636b546f6b656e5f4e4f545f57414e54000000000000000000000000f491e7b69e4244ad4002bc14e878a34207e38c295472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564537472617465677953706f6f6b79537761704c503a20454f415f4f525f5641554c54a2646970667358221220d8d621cff61c5adefc62630fc1b715eeb3244c6fba7f556a334cf0a14e20087364736f6c634300060c00334261736553747261746567793a20696e69745661756c745f5a45524f5f41444452537472617465677953706f6f6b79537761704c503a204c505f746f6b656e305f494e56414c49445472616e7366657248656c7065723a3a73616665417070726f76653a20617070726f7665206661696c65644261736553747261746567793a20696e69744163636573734d616e616765725f5a45524f5f41444452000000000000000000000000f491e7b69e4244ad4002bc14e878a34207e38c29537472617465677953706f6f6b79537761704c503a204c505f746f6b656e315f494e56414c4944537472617465677953706f6f6b79537761704c503a2077726f6e675f696e6974506964000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea88000000000000000000000000d6d6a0828a80e1832cd4c3585aded8971087fcb8000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000000000000000000000000000000000000000000003000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000006626c47c00f1d87902fc13eecfac3ed06d5e8d8a
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025e5760003560e01c806377e7493311610146578063ac1e5025116100c3578063e0333bce11610087578063e0333bce146104a3578063f1068454146104c0578063f2fde38b146104c8578063fb617787146104ee578063fbfa77cf146104f6578063fdcb6068146104fe5761025e565b8063ac1e502514610448578063c1a3d44c14610465578063c2624e1e1461046d578063d0e30db014610475578063def68a9c1461047d5761025e565b80638912cb8b1161010a5780638912cb8b146104205780638bc7e8c4146104285780638da5cb5b14610430578063975dc33a14610438578063a0e47bf6146104405761025e565b806377e74933146103f85780638456cb59146104005780638585741914610408578063877562b61461041057806387788782146104185761025e565b806353a362fb116101df5780635c975abb116101a35780635c975abb1461039e5780635ee167c0146103a657806370897b23146103ae578063715018a6146103cb57806371b48c74146103d3578063722713f7146103f05761025e565b806353a362fb1461034b5780635641ec0314610367578063573fef0a1461036f578063575a86b2146103775780635c5f30011461037f5761025e565b806327c1351e1161022657806327c1351e146102f05780632e1a7d4d146103165780633f4ba83a14610333578063419f77531461033b5780634641257d146103435761025e565b80630e8fbb5a146102635780630f8a36581461028457806311588086146102aa5780631f1fcd51146102c4578063228cb733146102e8575b600080fd5b6102826004803603602081101561027957600080fd5b50351515610506565b005b6102826004803603602081101561029a57600080fd5b50356001600160a01b0316610606565b6102b2610765565b60408051918252519081900360200190f35b6102cc610811565b604080516001600160a01b039092168252519081900360200190f35b6102cc610820565b6102826004803603602081101561030657600080fd5b50356001600160a01b0316610838565b6102826004803603602081101561032c57600080fd5b5035610997565b610282610c78565b610282610d74565b610282610e01565b6103536110f8565b604080519115158252519081900360200190f35b610282611108565b61028261132c565b6102cc6113bd565b6102826004803603602081101561039557600080fd5b503515156113d5565b6103536114d5565b6102cc6114e4565b610282600480360360208110156103c457600080fd5b50356114f3565b610282611667565b6102cc600480360360208110156103e957600080fd5b5035611725565b6102b261174c565b6102cc611767565b610282611776565b610282611868565b6102cc61195a565b6102b2611969565b61035361196f565b6102b261197f565b6102cc611985565b6102cc611994565b6102cc6119a3565b6102826004803603602081101561045e57600080fd5b50356119b5565b6102b2611b80565b6102b2611bfc565b610282611c02565b6102826004803603602081101561049357600080fd5b50356001600160a01b0316611dc4565b6102cc600480360360208110156104b957600080fd5b5035611fca565b6102b2611fd7565b610282600480360360208110156104de57600080fd5b50356001600160a01b0316611ffb565b61028261210f565b6102cc612175565b6102cc612199565b61050e6122fc565b6001600160a01b031661051f611985565b6001600160a01b031614806105a957506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561057c57600080fd5b505af1158015610590573d6000803e3d6000fd5b505050506040513d60208110156105a657600080fd5b50515b6105e8576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b60028054911515600160a01b0260ff60a01b19909216919091179055565b61060e6122fc565b6001600160a01b031661061f611985565b6001600160a01b031614806106a957506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561067c57600080fd5b505af1158015610690573d6000803e3d6000fd5b505050506040513d60208110156106a657600080fd5b50515b6106e8576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b6001600160a01b038116610743576040805162461bcd60e51b815260206004820181905260248201527f4261736553747261746567793a2074726561737572795f5a45524f5f41444452604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b604080516393f1a40b60e01b81527f0000000000000000000000000000000000000000000000000000000000000035600482015230602482015281516000928392732b2929e785374c651a81a63878ab22742656dcdd926393f1a40b92604480840193919291829003018186803b1580156107df57600080fd5b505afa1580156107f3573d6000803e3d6000fd5b505050506040513d604081101561080957600080fd5b505191505090565b6002546001600160a01b031681565b73841fad6eae12c286d1fd18d1d525dffa75c7effe81565b6108406122fc565b6001600160a01b0316610851611985565b6001600160a01b031614806108db57506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b1580156108ae57600080fd5b505af11580156108c2573d6000803e3d6000fd5b505050506040513d60208110156108d857600080fd5b50515b61091a576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b6001600160a01b038116610975576040805162461bcd60e51b815260206004820181905260248201527f4261736553747261746567793a2074726561737572795f5a45524f5f41444452604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156109ef576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600155336001600160a01b037f000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea881614610a71576040805162461bcd60e51b815260206004820152601f60248201527f537472617465677953706f6f6b79537761704c503a204e4f545f5641554c5400604482015290519081900360640190fd5b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610abc57600080fd5b505afa158015610ad0573d6000803e3d6000fd5b505050506040513d6020811015610ae657600080fd5b5051905081811015610c0657732b2929e785374c651a81a63878ab22742656dcdd63441a3e707f0000000000000000000000000000000000000000000000000000000000000035610b378585612300565b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015610b7457600080fd5b505af1158015610b88573d6000803e3d6000fd5b5050600254604080516370a0823160e01b815230600482015290516001600160a01b0390921693506370a082319250602480820192602092909190829003018186803b158015610bd757600080fd5b505afa158015610beb573d6000803e3d6000fd5b505050506040513d6020811015610c0157600080fd5b505190505b6000818310610c155781610c17565b825b90506000610c2482612362565b905080821115610c6e57600254610c6e906001600160a01b03167f000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea88610c698585612300565b6123a7565b5050600180555050565b610c806122fc565b6001600160a01b0316610c91611985565b6001600160a01b03161480610d1b57506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b158015610cee57600080fd5b505af1158015610d02573d6000803e3d6000fd5b505050506040513d6020811015610d1857600080fd5b50515b610d5a576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b610d626124f4565b610d6a612597565b610d72611c02565b565b336001600160a01b037f000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea881614610deb576040805162461bcd60e51b815260206004820152601760248201527610985cd954dd1c985d1959de4e881393d517d590555315604a1b604482015290519081900360640190fd5b600254600160a81b900460ff1615610d7257610d725b610e096114d5565b15610e4e576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b33321480610e845750336001600160a01b037f000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea8816145b610ebf5760405162461bcd60e51b81526004018080602001828103825260228152602001806131986022913960400191505060405180910390fd5b60408051631c57762b60e31b81527f000000000000000000000000000000000000000000000000000000000000003560048201526000602482018190529151732b2929e785374c651a81a63878ab22742656dcdd9263e2bbb158926044808201939182900301818387803b158015610f3657600080fd5b505af1158015610f4a573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073841fad6eae12c286d1fd18d1d525dffa75c7effe92506370a0823191602480820192602092909190829003018186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d6020811015610fcd57600080fd5b5051905080156110ed57600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d602081101561104c57600080fd5b505190506110586126e7565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156110a357600080fd5b505afa1580156110b7573d6000803e3d6000fd5b505050506040513d60208110156110cd57600080fd5b5051905060006110dd8284612300565b90506110e881612ca6565b505050505b6110f5611c02565b50565b600254600160a81b900460ff1681565b6111106122fc565b6001600160a01b0316611121611985565b6001600160a01b031614806111ab57506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561117e57600080fd5b505af1158015611192573d6000803e3d6000fd5b505050506040513d60208110156111a857600080fd5b50515b6111ea576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b60408051632989754760e11b81527f000000000000000000000000000000000000000000000000000000000000003560048201529051732b2929e785374c651a81a63878ab22742656dcdd91635312ea8e91602480830192600092919082900301818387803b15801561125c57600080fd5b505af1158015611270573d6000803e3d6000fd5b5050600254604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d60208110156112eb57600080fd5b5051905080156110f5576002546110f5906001600160a01b03167f000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea88836123a7565b336001600160a01b037f000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea8816146113a3576040805162461bcd60e51b815260206004820152601760248201527610985cd954dd1c985d1959de4e881393d517d590555315604a1b604482015290519081900360640190fd5b600254600160a01b900460ff1615610d7257610d72610e01565b732b2929e785374c651a81a63878ab22742656dcdd81565b6113dd6122fc565b6001600160a01b03166113ee611985565b6001600160a01b0316148061147857506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d602081101561147557600080fd5b50515b6114b7576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b60028054911515600160a81b0260ff60a81b19909216919091179055565b60006114df612ce9565b905090565b600a546001600160a01b031681565b6114fb6122fc565b6001600160a01b031661150c611985565b6001600160a01b0316148061159657506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b15801561156957600080fd5b505af115801561157d573d6000803e3d6000fd5b505050506040513d602081101561159357600080fd5b50515b6115d5576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b61271081111561162c576040805162461bcd60e51b815260206004820152601e60248201527f4261736553747261746567793a206665655f45584343454544535f4d41580000604482015290519081900360640190fd5b60038190556040805182815290517f9b49d0cd76012d9c67241c2f68f836efbaf50ea29901a250040671402d5263f59181900360200190a150565b61166f6122fc565b6001600160a01b0316611680611985565b6001600160a01b0316146116db576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6009818154811061173257fe5b6000918252602090912001546001600160a01b0316905081565b60006114df611759610765565b611761611b80565b90612cf9565b6005546001600160a01b031681565b61177e6122fc565b6001600160a01b031661178f611985565b6001600160a01b0316148061181957506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b1580156117ec57600080fd5b505af1158015611800573d6000803e3d6000fd5b505050506040513d602081101561181657600080fd5b50515b611858576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b611860612d5a565b610d72612de3565b6118706122fc565b6001600160a01b0316611881611985565b6001600160a01b0316148061190b57506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b1580156118de57600080fd5b505af11580156118f2573d6000803e3d6000fd5b505050506040513d602081101561190857600080fd5b50515b61194a576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b4715610d7257610d723347612e89565b600b546001600160a01b031681565b60035481565b600254600160a01b900460ff1681565b60045481565b6000546001600160a01b031690565b6006546001600160a01b031681565b60008051602061314b83398151915281565b6119bd6122fc565b6001600160a01b03166119ce611985565b6001600160a01b03161480611a5857506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b158015611a2b57600080fd5b505af1158015611a3f573d6000803e3d6000fd5b505050506040513d6020811015611a5557600080fd5b50515b611a97576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b612710811115611aee576040805162461bcd60e51b815260206004820152601e60248201527f4261736553747261746567793a206665655f45584343454544535f4d41580000604482015290519081900360640190fd5b6101f4811115611b45576040805162461bcd60e51b815260206004820152601d60248201527f4261736553747261746567793a206665655f45584343454544535f3525000000604482015290519081900360640190fd5b60048190556040805182815290517fe94edcc114da5287ecb30ee8aacf12e6c16b11b8583d7f9e477ab1616e33d53d9181900360200190a150565b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611bcb57600080fd5b505afa158015611bdf573d6000803e3d6000fd5b505050506040513d6020811015611bf557600080fd5b5051905090565b61271081565b611c0a6114d5565b15611c4f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60026001541415611ca7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600181905554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611cf757600080fd5b505afa158015611d0b573d6000803e3d6000fd5b505050506040513d6020811015611d2157600080fd5b505190508015611dbd5760408051631c57762b60e31b81527f00000000000000000000000000000000000000000000000000000000000000356004820152602481018390529051732b2929e785374c651a81a63878ab22742656dcdd9163e2bbb15891604480830192600092919082900301818387803b158015611da457600080fd5b505af1158015611db8573d6000803e3d6000fd5b505050505b5060018055565b611dcc6122fc565b6001600160a01b0316611ddd611985565b6001600160a01b03161480611e6757506007546040805163af5b052b60e01b815233600482015290516001600160a01b039092169163af5b052b916024808201926020929091908290030181600087803b158015611e3a57600080fd5b505af1158015611e4e573d6000803e3d6000fd5b505050506040513d6020811015611e6457600080fd5b50515b611ea6576040805162461bcd60e51b8152602060048201526017602482015260008051602061309c833981519152604482015290519081900360640190fd5b6002546001600160a01b0382811691161415611ef35760405162461bcd60e51b815260040180806020018281038252602181526020018061312a6021913960400191505060405180910390fd5b6001600160a01b038116611f385760405162461bcd60e51b81526004018080602001828103825260228152602001806130dd6022913960400191505060405180910390fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f8757600080fd5b505afa158015611f9b573d6000803e3d6000fd5b505050506040513d6020811015611fb157600080fd5b505190508015611fc657611fc68233836123a7565b5050565b6008818154811061173257fe5b7f000000000000000000000000000000000000000000000000000000000000003581565b6120036122fc565b6001600160a01b0316612014611985565b6001600160a01b03161461206f576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166120b45760405162461bcd60e51b81526004018080602001828103825260268152602001806130426026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b037f000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea8816146111ea576040805162461bcd60e51b8152602060048201526006602482015265085d985d5b1d60d21b604482015290519081900360640190fd5b7f000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea8881565b6007546001600160a01b031681565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106122255780518252601f199092019160209182019101612206565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612287576040519150601f19603f3d011682016040523d82523d6000602084013e61228c565b606091505b50915091508180156122ba5750805115806122ba57508080602001905160208110156122b757600080fd5b50515b6122f55760405162461bcd60e51b815260040180806020018281038252602b8152602001806130ff602b913960400191505060405180910390fd5b5050505050565b3390565b600082821115612357576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b60008061238661271061238060045486612f8190919063ffffffff16565b90612fda565b9050801561235c5760025460065461235c916001600160a01b039081169116835b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106124245780518252601f199092019160209182019101612405565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612486576040519150601f19603f3d011682016040523d82523d6000602084013e61248b565b606091505b50915091508180156124b95750805115806124b957508080602001905160208110156124b657600080fd5b50515b6122f55760405162461bcd60e51b815260040180806020018281038252602d81526020018061316b602d913960400191505060405180910390fd5b6124fc6114d5565b612544576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61257a6122fc565b604080516001600160a01b039092168252519081900360200190a1565b6002546125c3906001600160a01b0316732b2929e785374c651a81a63878ab22742656dcdd60006121a8565b6002546125f0906001600160a01b0316732b2929e785374c651a81a63878ab22742656dcdd6000196121a8565b61261e73841fad6eae12c286d1fd18d1d525dffa75c7effe60008051602061314b83398151915260006121a8565b61264d73841fad6eae12c286d1fd18d1d525dffa75c7effe60008051602061314b8339815191526000196121a8565b600a54612673906001600160a01b031660008051602061314b83398151915260006121a8565b600a5461269a906001600160a01b031660008051602061314b8339815191526000196121a8565b600b546126c0906001600160a01b031660008051602061314b83398151915260006121a8565b600b54610d72906001600160a01b031660008051602061314b8339815191526000196121a8565b6000612781600273841fad6eae12c286d1fd18d1d525dffa75c7effe6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561274f57600080fd5b505afa158015612763573d6000803e3d6000fd5b505050506040513d602081101561277957600080fd5b505190612fda565b600a549091506001600160a01b031673841fad6eae12c286d1fd18d1d525dffa75c7effe1461293c5760008051602061314b8339815191526001600160a01b03166338ed1739826000600830426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818154815260200191508054801561284d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161282f575b50509650505050505050600060405180830381600087803b15801561287157600080fd5b505af1158015612885573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156128ae57600080fd5b81019080805160405193929190846401000000008211156128ce57600080fd5b9083019060208201858111156128e357600080fd5b825186602082028301116401000000008211171561290057600080fd5b82525081516020918201928201910280838360005b8381101561292d578181015183820152602001612915565b50505050905001604052505050505b600b546001600160a01b031673841fad6eae12c286d1fd18d1d525dffa75c7effe14612af45760008051602061314b8339815191526001600160a01b03166338ed1739826000600930426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b031681526020018381526020018281038252858181548152602001915080548015612a0557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129e7575b50509650505050505050600060405180830381600087803b158015612a2957600080fd5b505af1158015612a3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612a6657600080fd5b8101908080516040519392919084640100000000821115612a8657600080fd5b908301906020820185811115612a9b57600080fd5b8251866020820283011164010000000082111715612ab857600080fd5b82525081516020918201928201910280838360005b83811015612ae5578181015183820152602001612acd565b50505050905001604052505050505b600a54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612b3f57600080fd5b505afa158015612b53573d6000803e3d6000fd5b505050506040513d6020811015612b6957600080fd5b5051600b54604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b5051600a54600b546040805162e8e33760e81b81526001600160a01b039384166004820152929091166024830152604482018590526064820183905260006084830181905260a483018190523060c48401524260e4840152905192935060008051602061314b8339815191529263e8e3370092610104808201936060939283900390910190829087803b158015612c7c57600080fd5b505af1158015612c90573d6000803e3d6000fd5b505050506040513d60608110156122f557600080fd5b600080612cc461271061238060035486612f8190919063ffffffff16565b9050801561235c5760025460055461235c916001600160a01b039081169116836123a7565b600054600160a01b900460ff1690565b600082820183811015612d53576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b612d626114d5565b15612da7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861257a6122fc565b600254612e0f906001600160a01b0316732b2929e785374c651a81a63878ab22742656dcdd60006121a8565b612e3d73841fad6eae12c286d1fd18d1d525dffa75c7effe60008051602061314b83398151915260006121a8565b600a54612e63906001600160a01b031660008051602061314b83398151915260006121a8565b600b54610d72906001600160a01b031660008051602061314b83398151915260006121a8565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612ed55780518252601f199092019160209182019101612eb6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612f37576040519150601f19603f3d011682016040523d82523d6000602084013e612f3c565b606091505b5050905080612f7c5760405162461bcd60e51b81526004018080602001828103825260348152602001806130686034913960400191505060405180910390fd5b505050565b600082612f905750600061235c565b82820282848281612f9d57fe5b0414612d535760405162461bcd60e51b81526004018080602001828103825260218152602001806130bc6021913960400191505060405180910390fd5b6000808211613030576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161303957fe5b04939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c65644261736553747261746567793a204e4f545f41444d494e000000000000000000536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774261736553747261746567793a20737475636b546f6b656e5f5a45524f5f414444525472616e7366657248656c7065723a3a73616665417070726f76653a20617070726f7665206661696c65644261736553747261746567793a20737475636b546f6b656e5f4e4f545f57414e54000000000000000000000000f491e7b69e4244ad4002bc14e878a34207e38c295472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564537472617465677953706f6f6b79537761704c503a20454f415f4f525f5641554c54a2646970667358221220d8d621cff61c5adefc62630fc1b715eeb3244c6fba7f556a334cf0a14e20087364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea88000000000000000000000000d6d6a0828a80e1832cd4c3585aded8971087fcb8000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000000000000000000000000000000000000000000003000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000006626c47c00f1d87902fc13eecfac3ed06d5e8d8a
-----Decoded View---------------
Arg [0] : initVault (address): 0xEe8318E9d597Bf9DF6148E86D4e35a8Bc14EEA88
Arg [1] : initAccessManager (address): 0xd6d6A0828a80E1832cD4C3585aDED8971087fCb8
Arg [2] : initPid (uint256): 53
Arg [3] : initRewardToLP0Route (address[]): 0x841FAD6EAe12c286d1Fd18d1d525DFfA75C7EFFE,0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83
Arg [4] : initRewardToLP1Route (address[]): 0x841FAD6EAe12c286d1Fd18d1d525DFfA75C7EFFE,0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83,0x6626c47c00F1D87902fc13EECfaC3ed06D5E8D8a
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000ee8318e9d597bf9df6148e86d4e35a8bc14eea88
Arg [1] : 000000000000000000000000d6d6a0828a80e1832cd4c3585aded8971087fcb8
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe
Arg [7] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 000000000000000000000000841fad6eae12c286d1fd18d1d525dffa75c7effe
Arg [10] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [11] : 0000000000000000000000006626c47c00f1d87902fc13eecfac3ed06d5e8d8a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
FTM | 100.00% | $1.01 | 19.1051 | $19.22 |
[ 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.