Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CRVStrategyUSDNMainnet
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-18 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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); } // File: @openzeppelin/contracts/math/Math.sol pragma solidity ^0.5.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @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 ERC20;` 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)); } 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. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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"); } } } // File: contracts/strategies/curve/interfaces/Gauge.sol pragma solidity 0.5.16; interface Gauge { function deposit(uint) external; function balanceOf(address) external view returns (uint); function withdraw(uint) external; function user_checkpoint(address) external; } interface VotingEscrow { function create_lock(uint256 v, uint256 time) external; function increase_amount(uint256 _value) external; function increase_unlock_time(uint256 _unlock_time) external; function withdraw() external; } interface Mintr { function mint(address) external; } // File: contracts/strategies/curve/interfaces/ICurveBUSDDeposit.sol pragma solidity 0.5.16; interface ICurveBUSDDeposit { function get_virtual_price() external view returns (uint); function add_liquidity( uint256[4] calldata amounts, uint256 min_mint_amount ) external; } // File: contracts/uniswap/interfaces/IUniswapV2Router01.sol pragma solidity >=0.5.0; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: contracts/uniswap/interfaces/IUniswapV2Router02.sol pragma solidity >=0.5.0; interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: contracts/hardworkInterface/IStrategy.sol pragma solidity 0.5.16; interface IStrategy { function unsalvagableTokens(address tokens) external view returns (bool); function governance() external view returns (address); function controller() external view returns (address); function underlying() external view returns (address); function vault() external view returns (address); function withdrawAllToVault() external; function withdrawToVault(uint256 amount) external; function investedUnderlyingBalance() external view returns (uint256); // itsNotMuch() // should only be called by controller function salvage(address recipient, address token, uint256 amount) external; function doHardWork() external; function depositArbCheck() external view returns(bool); } // File: contracts/hardworkInterface/IVault.sol pragma solidity 0.5.16; interface IVault { function underlyingBalanceInVault() external view returns (uint256); function underlyingBalanceWithInvestment() external view returns (uint256); // function store() external view returns (address); function governance() external view returns (address); function controller() external view returns (address); function underlying() external view returns (address); function strategy() external view returns (address); function setStrategy(address _strategy) external; function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external; function deposit(uint256 amountWei) external; function depositFor(uint256 amountWei, address holder) external; function withdrawAll() external; function withdraw(uint256 numberOfShares) external; function getPricePerFullShare() external view returns (uint256); function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256); // hard work should be callable only by the controller (by the hard worker) or by governance function doHardWork() external; function rebalance() external; } // File: contracts/Storage.sol pragma solidity 0.5.16; contract Storage { address public governance; address public controller; constructor() public { governance = msg.sender; } modifier onlyGovernance() { require(isGovernance(msg.sender), "Not governance"); _; } function setGovernance(address _governance) public onlyGovernance { require(_governance != address(0), "new governance shouldn't be empty"); governance = _governance; } function setController(address _controller) public onlyGovernance { require(_controller != address(0), "new controller shouldn't be empty"); controller = _controller; } function isGovernance(address account) public view returns (bool) { return account == governance; } function isController(address account) public view returns (bool) { return account == controller; } } // File: contracts/Governable.sol pragma solidity 0.5.16; contract Governable { Storage public store; constructor(address _store) public { require(_store != address(0), "new storage shouldn't be empty"); store = Storage(_store); } modifier onlyGovernance() { require(store.isGovernance(msg.sender), "Not governance"); _; } function setStorage(address _store) public onlyGovernance { require(_store != address(0), "new storage shouldn't be empty"); store = Storage(_store); } function governance() public view returns (address) { return store.governance(); } } // File: contracts/Controllable.sol pragma solidity 0.5.16; contract Controllable is Governable { constructor(address _storage) Governable(_storage) public { } modifier onlyController() { require(store.isController(msg.sender), "Not a controller"); _; } modifier onlyControllerOrGovernance(){ require((store.isController(msg.sender) || store.isGovernance(msg.sender)), "The caller must be controller or governance"); _; } function controller() public view returns (address) { return store.controller(); } } // File: contracts/hardworkInterface/IController.sol pragma solidity 0.5.16; interface IController { // [Grey list] // An EOA can safely interact with the system no matter what. // If you're using Metamask, you're using an EOA. // Only smart contracts may be affected by this grey list. // // This contract will not be able to ban any EOA from the system // even if an EOA is being added to the greyList, he/she will still be able // to interact with the whole system as if nothing happened. // Only smart contracts will be affected by being added to the greyList. // This grey list is only used in Vault.sol, see the code there for reference function greyList(address _target) external view returns(bool); function addVaultAndStrategy(address _vault, address _strategy) external; function doHardWork(address _vault) external; function hasVault(address _vault) external returns(bool); function salvage(address _token, uint256 amount) external; function salvageStrategy(address _strategy, address _token, uint256 amount) external; function notifyFee(address _underlying, uint256 fee) external; function profitSharingNumerator() external view returns (uint256); function profitSharingDenominator() external view returns (uint256); } // File: contracts/strategies/RewardTokenProfitNotifier.sol pragma solidity 0.5.16; contract RewardTokenProfitNotifier is Controllable { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 public profitSharingNumerator; uint256 public profitSharingDenominator; address public rewardToken; constructor( address _storage, address _rewardToken ) public Controllable(_storage){ rewardToken = _rewardToken; // persist in the state for immutability of the fee profitSharingNumerator = 30; //IController(controller()).profitSharingNumerator(); profitSharingDenominator = 100; //IController(controller()).profitSharingDenominator(); require(profitSharingNumerator < profitSharingDenominator, "invalid profit share"); } event ProfitLogInReward(uint256 profitAmount, uint256 feeAmount, uint256 timestamp); function notifyProfitInRewardToken(uint256 _rewardBalance) internal { if( _rewardBalance > 0 ){ uint256 feeAmount = _rewardBalance.mul(profitSharingNumerator).div(profitSharingDenominator); emit ProfitLogInReward(_rewardBalance, feeAmount, block.timestamp); IERC20(rewardToken).safeApprove(controller(), 0); IERC20(rewardToken).safeApprove(controller(), feeAmount); IController(controller()).notifyFee( rewardToken, feeAmount ); } else { emit ProfitLogInReward(0, 0, block.timestamp); } } } // File: contracts/strategies/curve/CRVStrategyUSDN.sol pragma solidity 0.5.16; /** * This strategy is for the mixToken vault, i.e., the underlying token is mixToken. It is not to accept * stable coins. It will farm the CRV crop. For liquidation, it swaps CRV into DAI and uses DAI * to produce mixToken. */ contract CRVStrategyUSDN is IStrategy, RewardTokenProfitNotifier { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; event Liquidating(uint256 amount); event ProfitsNotCollected(); // crvUSDN address public underlying; address public pool; address public mintr; address public crv; address public curve; address public weth; address public dai; address public curveDepositUSDN; address public uni; // these tokens cannot be claimed by the governance mapping(address => bool) public unsalvagableTokens; // our vault holding the underlying token (usdnCRV) address public vault; uint256 maxUint = uint256(~0); address[] public uniswap_CRV2DAI; // a flag for disabling selling for simplified emergency exit bool public sell = true; // minimum CRV amount to be liquidation uint256 public sellFloor = 1e18; modifier restricted() { require(msg.sender == vault || msg.sender == controller() || msg.sender == governance(), "The sender has to be the controller, governance, or vault"); _; } constructor( address _storage, address _vault, address _underlying, address _gauge, address _mintr, address _crv, address _curve, address _weth, address _dai, address _curveDepositUSDN, address _uniswap ) RewardTokenProfitNotifier(_storage, _crv) public { require(IVault(_vault).underlying() == _underlying, "vault does not support usdnCRV"); vault = _vault; underlying = _underlying; pool = _gauge; mintr = _mintr; crv = _crv; curve = _curve; weth = _weth; dai = _dai; curveDepositUSDN = _curveDepositUSDN; uni = _uniswap; uniswap_CRV2DAI = [crv, weth, dai]; // set these tokens to be not salvageable unsalvagableTokens[underlying] = true; unsalvagableTokens[crv] = true; } function depositArbCheck() public view returns(bool) { return true; } /** * Salvages a token. We should not be able to salvage CRV and underlying. */ function salvage(address recipient, address token, uint256 amount) public onlyGovernance { // To make sure that governance cannot come in and take away the coins require(!unsalvagableTokens[token], "token is defined as not salvageable"); IERC20(token).safeTransfer(recipient, amount); } /** * Withdraws underlying from the investment pool that mints crops. */ function withdrawUnderlyingFromPool(uint256 amount) internal { Gauge(pool).withdraw( Math.min(Gauge(pool).balanceOf(address(this)), amount) ); } /** * Withdraws the underlying tokens to the pool in the specified amount. */ function withdrawToVault(uint256 amountUnderlying) external restricted { withdrawUnderlyingFromPool(amountUnderlying); if (IERC20(underlying).balanceOf(address(this)) < amountUnderlying) { claimAndLiquidateCrv(); } uint256 toTransfer = Math.min(IERC20(underlying).balanceOf(address(this)), amountUnderlying); IERC20(underlying).safeTransfer(vault, toTransfer); } /** * Withdraws all the underlying tokens to the pool. */ function withdrawAllToVault() external restricted { claimAndLiquidateCrv(); withdrawUnderlyingFromPool(maxUint); uint256 balance = IERC20(underlying).balanceOf(address(this)); IERC20(underlying).safeTransfer(vault, balance); } /** * Invests all the underlying into the pool that mints crops (CRV) */ function investAllUnderlying() public restricted { uint256 underlyingBalance = IERC20(underlying).balanceOf(address(this)); if (underlyingBalance > 0) { IERC20(underlying).safeApprove(pool, 0); IERC20(underlying).safeApprove(pool, underlyingBalance); Gauge(pool).deposit(underlyingBalance); } } /** * Claims the CRV crop, converts it to DAI on Uniswap, and then uses DAI to mint underlying using the * Curve protocol. */ function claimAndLiquidateCrv() internal { if (!sell) { // Profits can be disabled for possible simplified and rapid exit emit ProfitsNotCollected(); return; } Mintr(mintr).mint(pool); uint256 rewardBalance = IERC20(crv).balanceOf(address(this)); if (rewardBalance < sellFloor) { // Profits can be disabled for possible simplified and rapid exit emit ProfitsNotCollected(); return; } notifyProfitInRewardToken(rewardBalance); uint256 crvBalance = IERC20(crv).balanceOf(address(this)); if (crvBalance > 0) { emit Liquidating(crvBalance); IERC20(crv).safeApprove(uni, 0); IERC20(crv).safeApprove(uni, crvBalance); // we can accept 1 as the minimum because this will be called only by a trusted worker IUniswapV2Router02(uni).swapExactTokensForTokens( crvBalance, 1, uniswap_CRV2DAI, address(this), block.timestamp ); if(IERC20(dai).balanceOf(address(this)) > 0) { usdnCRVFromDai(); } } } /** * Claims and liquidates CRV into underlying, and then invests all underlying. */ function doHardWork() public restricted { claimAndLiquidateCrv(); investAllUnderlying(); } /** * Investing all underlying. */ function investedUnderlyingBalance() public view returns (uint256) { return Gauge(pool).balanceOf(address(this)).add( IERC20(underlying).balanceOf(address(this)) ); } /** * Converts all DAI to underlying using the CRV protocol. */ function usdnCRVFromDai() internal { uint256 daiBalance = IERC20(dai).balanceOf(address(this)); if (daiBalance > 0) { IERC20(dai).safeApprove(curveDepositUSDN, 0); IERC20(dai).safeApprove(curveDepositUSDN, daiBalance); // we can accept 0 as minimum, this will be called only by trusted roles uint256 minimum = 0; ICurveBUSDDeposit(curveDepositUSDN).add_liquidity([0, daiBalance, 0, 0], minimum); // now we have usdnCRV } } /** * Can completely disable claiming CRV rewards and selling. Good for emergency withdraw in the * simplest possible way. */ function setSell(bool s) public onlyGovernance { sell = s; } /** * Sets the minimum amount of CRV needed to trigger a sale. */ function setSellFloor(uint256 floor) public onlyGovernance { sellFloor = floor; } } // File: contracts/strategies/curve/CRVStrategyUSDNMainnet.sol pragma solidity 0.5.16; /** * This strategy is for the crvUSDN vault, i.e., the underlying token is crvUSDN. It is not to accept * stable coins. It will farm the CRV crop. For liquidation, it swaps CRV into DAI and uses DAI * to produce crvUSDN. */ contract CRVStrategyUSDNMainnet is CRVStrategyUSDN { constructor( address _storage, address _vault ) CRVStrategyUSDN ( _storage, _vault, address(0x4f3E8F405CF5aFC05D68142F3783bDfE13811522), // crvUSDN underlying address(0xF98450B5602fa59CC66e1379DFfB6FDDc724CfC4), // _gauge address(0xd061D61a4d941c39E5453435B6345Dc261C2fcE0), // _mintr address(0xD533a949740bb3306d119CC777fa900bA034cd52), // _crv address(0x0f9cb53Ebe405d49A0bbdBD291A65Ff571bC83e1), // _curve address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2), // _weth address(0x6B175474E89094C44Da98b954EedeAC495271d0F), // _dai address(0x094d12e5b541784701FD8d65F11fc0598FBC6332), // depositUSDN address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D) // _uniswap ) public { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_storage","type":"address"},{"internalType":"address","name":"_vault","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Liquidating","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profitAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ProfitLogInReward","type":"event"},{"anonymous":false,"inputs":[],"name":"ProfitsNotCollected","type":"event"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"curve","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"curveDepositUSDN","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"depositArbCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"doHardWork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"investAllUnderlying","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"investedUnderlyingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"profitSharingDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"profitSharingNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"salvage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"sellFloor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"s","type":"bool"}],"name":"setSell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"floor","type":"uint256"}],"name":"setSellFloor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_store","type":"address"}],"name":"setStorage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"store","outputs":[{"internalType":"contract Storage","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uni","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uniswap_CRV2DAI","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unsalvagableTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAllToVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amountUnderlying","type":"uint256"}],"name":"withdrawToVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600019600f556011805460ff19166001179055670de0b6b3a76400006012553480156200003057600080fd5b506040516200227938038062002279833981810160405260408110156200005657600080fd5b5080516020909101518181734f3e8f405cf5afc05d68142f3783bdfe1381152273f98450b5602fa59cc66e1379dffb6fddc724cfc473d061d61a4d941c39e5453435b6345dc261c2fce073d533a949740bb3306d119cc777fa900ba034cd52730f9cb53ebe405d49a0bbdbd291a65ff571bc83e173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2736b175474e89094c44da98b954eedeac495271d0f73094d12e5b541784701fd8d65f11fc0598fbc6332737a250d5630b4cf539739df2c5dacb4c659f2488d8a8681806001600160a01b0381166200017e576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600080546001600160a01b03199081166001600160a01b03938416179091556003805490911691841691909117905550601e60015560646002555050886001600160a01b03168a6001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015620001fe57600080fd5b505afa15801562000213573d6000803e3d6000fd5b505050506040513d60208110156200022a57600080fd5b50516001600160a01b03161462000288576040805162461bcd60e51b815260206004820152601e60248201527f7661756c7420646f6573206e6f7420737570706f7274207573646e4352560000604482015290519081900360640190fd5b600e80546001600160a01b03199081166001600160a01b038d8116919091179092556004805482168c84161790556005805482168b84161790556006805482168a841617905560078054821689841617908190556008805483168985161790556009805483168885161790819055600a805484168886161790819055600b80548516888716179055600c805490941686861617909355604080516060810182529285168352908416602083015291909216908201526200034d906010906003620003a0565b50506004546001600160a01b039081166000908152600d60205260408082208054600160ff19918216811790925560075490941683529120805490921617905550620004349a5050505050505050505050565b828054828255906000526020600020908101928215620003f8579160200282015b82811115620003f857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003c1565b50620004069291506200040a565b5090565b6200043191905b80821115620004065780546001600160a01b031916815560010162000411565b90565b611e3580620004446000396000f3fe608060405234801561001057600080fd5b50600436106101ba5760003560e01c8063975057e7116100f4578063ce8c42e8116100a2578063f4b9fa7511610071578063f4b9fa7514610393578063f77c47911461039b578063f7c618c1146103a3578063fbfa77cf146103ab576101ba565b8063ce8c42e814610349578063d1e61dcb14610366578063edc9af951461036e578063f1af3af414610376576101ba565b8063975057e7146102e5578063a1dab23e146102ed578063b076a53a146102f5578063b60f151a14610314578063ba09591e1461031c578063bfd131f114610339578063c2a2a07b14610341576101ba565b80634fa5d8541161016c5780636f307dc31161013b5780636f307dc3146102a75780637165485d146102af5780637f0dc9c5146102b75780639137c1a7146102bf576101ba565b80634fa5d8541461026957806350185946146102715780635aa6e675146102975780636a4874a11461029f576101ba565b8063026a0dd0146101bf5780631113ef52146101d957806316f0115b146102115780633fc8cef314610235578063457100741461023d57806345d01e4a146102595780634a8cfa6914610261575b600080fd5b6101c76103b3565b60408051918252519081900360200190f35b61020f600480360360608110156101ef57600080fd5b506001600160a01b038135811691602081013590911690604001356103b9565b005b6102196104e9565b604080516001600160a01b039092168252519081900360200190f35b6102196104f8565b610245610507565b604080519115158252519081900360200190f35b6101c7610510565b61020f610616565b61020f6107d8565b6102456004803603602081101561028757600080fd5b50356001600160a01b0316610879565b61021961088e565b61021961090e565b61021961091d565b61021961092c565b61021961093b565b61020f600480360360208110156102d557600080fd5b50356001600160a01b031661094a565b610219610a80565b6101c7610a8f565b61020f6004803603602081101561030b57600080fd5b50351515610a95565b6101c7610b61565b61020f6004803603602081101561033257600080fd5b5035610b67565b61020f610c25565b610245610d68565b61020f6004803603602081101561035f57600080fd5b5035610d6d565b610219610f3b565b610219610f4a565b6102196004803603602081101561038c57600080fd5b5035610f59565b610219610f80565b610219610f8f565b610219610fde565b610219610fed565b60025481565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561040457600080fd5b505afa158015610418573d6000803e3d6000fd5b505050506040513d602081101561042e57600080fd5b5051610472576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0382166000908152600d602052604090205460ff16156104ca5760405162461bcd60e51b8152600401808060200182810382526023815260200180611d5d6023913960400191505060405180910390fd5b6104e46001600160a01b038316848363ffffffff610ffc16565b505050565b6005546001600160a01b031681565b6009546001600160a01b031681565b60115460ff1681565b60048054604080516370a0823160e01b8152309381019390935251600092610611926001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d602081101561058c57600080fd5b5051600554604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156105d957600080fd5b505afa1580156105ed573d6000803e3d6000fd5b505050506040513d602081101561060357600080fd5b50519063ffffffff61104e16565b905090565b600e546001600160a01b03163314806106475750610632610f8f565b6001600160a01b0316336001600160a01b0316145b8061066a575061065561088e565b6001600160a01b0316336001600160a01b0316145b6106a55760405162461bcd60e51b8152600401808060200182810382526039815260200180611d246039913960400191505060405180910390fd5b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b1580156106f457600080fd5b505afa158015610708573d6000803e3d6000fd5b505050506040513d602081101561071e57600080fd5b5051905080156107d55760055460045461074c916001600160a01b039182169116600063ffffffff6110b116565b60055460045461076f916001600160a01b0391821691168363ffffffff6110b116565b6005546040805163b6b55f2560e01b81526004810184905290516001600160a01b039092169163b6b55f259160248082019260009290919082900301818387803b1580156107bc57600080fd5b505af11580156107d0573d6000803e3d6000fd5b505050505b50565b600e546001600160a01b031633148061080957506107f4610f8f565b6001600160a01b0316336001600160a01b0316145b8061082c575061081761088e565b6001600160a01b0316336001600160a01b0316145b6108675760405162461bcd60e51b8152600401808060200182810382526039815260200180611d246039913960400191505060405180910390fd5b61086f6111c4565b610877610616565b565b600d6020526000908152604090205460ff1681565b60008060009054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156108dd57600080fd5b505afa1580156108f1573d6000803e3d6000fd5b505050506040513d602081101561090757600080fd5b5051905090565b6007546001600160a01b031681565b6004546001600160a01b031681565b6008546001600160a01b031681565b600b546001600160a01b031681565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561099557600080fd5b505afa1580156109a9573d6000803e3d6000fd5b505050506040513d60208110156109bf57600080fd5b5051610a03576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b038116610a5e576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b60125481565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b158015610ae057600080fd5b505afa158015610af4573d6000803e3d6000fd5b505050506040513d6020811015610b0a57600080fd5b5051610b4e576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6011805460ff1916911515919091179055565b60015481565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b158015610bb257600080fd5b505afa158015610bc6573d6000803e3d6000fd5b505050506040513d6020811015610bdc57600080fd5b5051610c20576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b601255565b600e546001600160a01b0316331480610c565750610c41610f8f565b6001600160a01b0316336001600160a01b0316145b80610c795750610c6461088e565b6001600160a01b0316336001600160a01b0316145b610cb45760405162461bcd60e51b8152600401808060200182810382526039815260200180611d246039913960400191505060405180910390fd5b610cbc6111c4565b610cc7600f5461162b565b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b158015610d1657600080fd5b505afa158015610d2a573d6000803e3d6000fd5b505050506040513d6020811015610d4057600080fd5b5051600e546004549192506107d5916001600160a01b0390811691168363ffffffff610ffc16565b600190565b600e546001600160a01b0316331480610d9e5750610d89610f8f565b6001600160a01b0316336001600160a01b0316145b80610dc15750610dac61088e565b6001600160a01b0316336001600160a01b0316145b610dfc5760405162461bcd60e51b8152600401808060200182810382526039815260200180611d246039913960400191505060405180910390fd5b610e058161162b565b60048054604080516370a0823160e01b815230938101939093525183926001600160a01b03909216916370a08231916024808301926020929190829003018186803b158015610e5357600080fd5b505afa158015610e67573d6000803e3d6000fd5b505050506040513d6020811015610e7d57600080fd5b50511015610e8d57610e8d6111c4565b60048054604080516370a0823160e01b8152309381019390935251600092610f11926001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015610edf57600080fd5b505afa158015610ef3573d6000803e3d6000fd5b505050506040513d6020811015610f0957600080fd5b5051836116e9565b600e54600454919250610f37916001600160a01b0390811691168363ffffffff610ffc16565b5050565b6006546001600160a01b031681565b600c546001600160a01b031681565b60108181548110610f6657fe5b6000918252602090912001546001600160a01b0316905081565b600a546001600160a01b031681565b60008060009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156108dd57600080fd5b6003546001600160a01b031681565b600e546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526104e49084906116ff565b6000828201838110156110a8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b801580611137575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561110957600080fd5b505afa15801561111d573d6000803e3d6000fd5b505050506040513d602081101561113357600080fd5b5051155b6111725760405162461bcd60e51b8152600401808060200182810382526036815260200180611dcb6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526104e49084906116ff565b60115460ff166111fc576040517f444bcec8acce9dc46755761662d6262a490b9f61cca73243c5131d98df078ce390600090a1610877565b600654600554604080516335313c2160e11b81526001600160a01b03928316600482015290519190921691636a62784291602480830192600092919082900301818387803b15801561124d57600080fd5b505af1158015611261573d6000803e3d6000fd5b5050600754604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b1580156112b257600080fd5b505afa1580156112c6573d6000803e3d6000fd5b505050506040513d60208110156112dc57600080fd5b505160125490915081101561131a576040517f444bcec8acce9dc46755761662d6262a490b9f61cca73243c5131d98df078ce390600090a150610877565b611323816118bd565b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561136e57600080fd5b505afa158015611382573d6000803e3d6000fd5b505050506040513d602081101561139857600080fd5b505190508015610f37576040805182815290517f875c79c14f0ec82c9ae01b82cfab0d1c5c4079f1500682832fb877a7dec614fb9181900360200190a1600c546007546113f9916001600160a01b039182169116600063ffffffff6110b116565b600c5460075461141c916001600160a01b0391821691168363ffffffff6110b116565b600c546040516338ed173960e01b8152600481018381526001602483018190523060648401819052426084850181905260a0604486019081526010805460a488018190526001600160a01b03909816976338ed1739978a97929594939160c490910190869080156114b657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611498575b50509650505050505050600060405180830381600087803b1580156114da57600080fd5b505af11580156114ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561151757600080fd5b810190808051604051939291908464010000000082111561153757600080fd5b90830190602082018581111561154c57600080fd5b825186602082028301116401000000008211171561156957600080fd5b82525081516020918201928201910280838360005b8381101561159657818101518382015260200161157e565b50505050919091016040818152600a546370a0823160e01b83523060048401529051600097506001600160a01b0390911695506370a08231945060248083019450602093509091829003018186803b1580156115f157600080fd5b505afa158015611605573d6000803e3d6000fd5b505050506040513d602081101561161b57600080fd5b50511115610f3757610f37611a36565b600554604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d916116b39184916370a08231916024808301926020929190829003018186803b15801561168157600080fd5b505afa158015611695573d6000803e3d6000fd5b505050506040513d60208110156116ab57600080fd5b5051846116e9565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156107bc57600080fd5b60008183106116f857816110a8565b5090919050565b611711826001600160a01b0316611baf565b611762576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106117a05780518252601f199092019160209182019101611781565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611802576040519150601f19603f3d011682016040523d82523d6000602084013e611807565b606091505b50915091508161185e576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156118b75780806020019051602081101561187a57600080fd5b50516118b75760405162461bcd60e51b815260040180806020018281038252602a815260200180611da1602a913960400191505060405180910390fd5b50505050565b80156119f45760006118ec6002546118e060015485611beb90919063ffffffff16565b9063ffffffff611c4416565b6040805184815260208101839052428183015290519192507f33fd2845a0f10293482de360244dd4ad31ddbb4b8c4a1ded3875cf8ebfba184b919081900360600190a161195461193a610f8f565b6003546001600160a01b031690600063ffffffff6110b116565b61197861195f610f8f565b6003546001600160a01b0316908363ffffffff6110b116565b611980610f8f565b60035460408051631ee0d7e560e31b81526001600160a01b039283166004820152602481018590529051929091169163f706bf289160448082019260009290919082900301818387803b1580156119d657600080fd5b505af11580156119ea573d6000803e3d6000fd5b50505050506107d5565b6040805160008082526020820152428183015290517f33fd2845a0f10293482de360244dd4ad31ddbb4b8c4a1ded3875cf8ebfba184b9181900360600190a150565b600a54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a8157600080fd5b505afa158015611a95573d6000803e3d6000fd5b505050506040513d6020811015611aab57600080fd5b5051905080156107d557600b54600a54611ad9916001600160a01b039182169116600063ffffffff6110b116565b600b54600a54611afc916001600160a01b0391821691168363ffffffff6110b116565b600b54604080516080808201835260008083526020830186905282840181905260608301819052925162a6cbcd60e21b815292936001600160a01b03169263029b2f34929185916004019081908490808383875b83811015611b68578181015183820152602001611b50565b5050505090500182815260200192505050600060405180830381600087803b158015611b9357600080fd5b505af1158015611ba7573d6000803e3d6000fd5b505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611be357508115155b949350505050565b600082611bfa575060006110ab565b82820282848281611c0757fe5b04146110a85760405162461bcd60e51b8152600401808060200182810382526021815260200180611d806021913960400191505060405180910390fd5b60006110a883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183611d0d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611cd2578181015183820152602001611cba565b50505050905090810190601f168015611cff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611d1957fe5b049594505050505056fe5468652073656e6465722068617320746f2062652074686520636f6e74726f6c6c65722c20676f7665726e616e63652c206f72207661756c74746f6b656e20697320646566696e6564206173206e6f742073616c7661676561626c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582026a0a5f2e00c5879c57a11035d6ad48aa904fa08455c99312ad248617ab018dc64736f6c63430005100032000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197000000000000000000000000683e683fbe6cf9b635539712c999f3b3edcb8664
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ba5760003560e01c8063975057e7116100f4578063ce8c42e8116100a2578063f4b9fa7511610071578063f4b9fa7514610393578063f77c47911461039b578063f7c618c1146103a3578063fbfa77cf146103ab576101ba565b8063ce8c42e814610349578063d1e61dcb14610366578063edc9af951461036e578063f1af3af414610376576101ba565b8063975057e7146102e5578063a1dab23e146102ed578063b076a53a146102f5578063b60f151a14610314578063ba09591e1461031c578063bfd131f114610339578063c2a2a07b14610341576101ba565b80634fa5d8541161016c5780636f307dc31161013b5780636f307dc3146102a75780637165485d146102af5780637f0dc9c5146102b75780639137c1a7146102bf576101ba565b80634fa5d8541461026957806350185946146102715780635aa6e675146102975780636a4874a11461029f576101ba565b8063026a0dd0146101bf5780631113ef52146101d957806316f0115b146102115780633fc8cef314610235578063457100741461023d57806345d01e4a146102595780634a8cfa6914610261575b600080fd5b6101c76103b3565b60408051918252519081900360200190f35b61020f600480360360608110156101ef57600080fd5b506001600160a01b038135811691602081013590911690604001356103b9565b005b6102196104e9565b604080516001600160a01b039092168252519081900360200190f35b6102196104f8565b610245610507565b604080519115158252519081900360200190f35b6101c7610510565b61020f610616565b61020f6107d8565b6102456004803603602081101561028757600080fd5b50356001600160a01b0316610879565b61021961088e565b61021961090e565b61021961091d565b61021961092c565b61021961093b565b61020f600480360360208110156102d557600080fd5b50356001600160a01b031661094a565b610219610a80565b6101c7610a8f565b61020f6004803603602081101561030b57600080fd5b50351515610a95565b6101c7610b61565b61020f6004803603602081101561033257600080fd5b5035610b67565b61020f610c25565b610245610d68565b61020f6004803603602081101561035f57600080fd5b5035610d6d565b610219610f3b565b610219610f4a565b6102196004803603602081101561038c57600080fd5b5035610f59565b610219610f80565b610219610f8f565b610219610fde565b610219610fed565b60025481565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561040457600080fd5b505afa158015610418573d6000803e3d6000fd5b505050506040513d602081101561042e57600080fd5b5051610472576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0382166000908152600d602052604090205460ff16156104ca5760405162461bcd60e51b8152600401808060200182810382526023815260200180611d5d6023913960400191505060405180910390fd5b6104e46001600160a01b038316848363ffffffff610ffc16565b505050565b6005546001600160a01b031681565b6009546001600160a01b031681565b60115460ff1681565b60048054604080516370a0823160e01b8152309381019390935251600092610611926001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561056257600080fd5b505afa158015610576573d6000803e3d6000fd5b505050506040513d602081101561058c57600080fd5b5051600554604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156105d957600080fd5b505afa1580156105ed573d6000803e3d6000fd5b505050506040513d602081101561060357600080fd5b50519063ffffffff61104e16565b905090565b600e546001600160a01b03163314806106475750610632610f8f565b6001600160a01b0316336001600160a01b0316145b8061066a575061065561088e565b6001600160a01b0316336001600160a01b0316145b6106a55760405162461bcd60e51b8152600401808060200182810382526039815260200180611d246039913960400191505060405180910390fd5b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b1580156106f457600080fd5b505afa158015610708573d6000803e3d6000fd5b505050506040513d602081101561071e57600080fd5b5051905080156107d55760055460045461074c916001600160a01b039182169116600063ffffffff6110b116565b60055460045461076f916001600160a01b0391821691168363ffffffff6110b116565b6005546040805163b6b55f2560e01b81526004810184905290516001600160a01b039092169163b6b55f259160248082019260009290919082900301818387803b1580156107bc57600080fd5b505af11580156107d0573d6000803e3d6000fd5b505050505b50565b600e546001600160a01b031633148061080957506107f4610f8f565b6001600160a01b0316336001600160a01b0316145b8061082c575061081761088e565b6001600160a01b0316336001600160a01b0316145b6108675760405162461bcd60e51b8152600401808060200182810382526039815260200180611d246039913960400191505060405180910390fd5b61086f6111c4565b610877610616565b565b600d6020526000908152604090205460ff1681565b60008060009054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156108dd57600080fd5b505afa1580156108f1573d6000803e3d6000fd5b505050506040513d602081101561090757600080fd5b5051905090565b6007546001600160a01b031681565b6004546001600160a01b031681565b6008546001600160a01b031681565b600b546001600160a01b031681565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561099557600080fd5b505afa1580156109a9573d6000803e3d6000fd5b505050506040513d60208110156109bf57600080fd5b5051610a03576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b038116610a5e576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b60125481565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b158015610ae057600080fd5b505afa158015610af4573d6000803e3d6000fd5b505050506040513d6020811015610b0a57600080fd5b5051610b4e576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6011805460ff1916911515919091179055565b60015481565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b158015610bb257600080fd5b505afa158015610bc6573d6000803e3d6000fd5b505050506040513d6020811015610bdc57600080fd5b5051610c20576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b601255565b600e546001600160a01b0316331480610c565750610c41610f8f565b6001600160a01b0316336001600160a01b0316145b80610c795750610c6461088e565b6001600160a01b0316336001600160a01b0316145b610cb45760405162461bcd60e51b8152600401808060200182810382526039815260200180611d246039913960400191505060405180910390fd5b610cbc6111c4565b610cc7600f5461162b565b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b158015610d1657600080fd5b505afa158015610d2a573d6000803e3d6000fd5b505050506040513d6020811015610d4057600080fd5b5051600e546004549192506107d5916001600160a01b0390811691168363ffffffff610ffc16565b600190565b600e546001600160a01b0316331480610d9e5750610d89610f8f565b6001600160a01b0316336001600160a01b0316145b80610dc15750610dac61088e565b6001600160a01b0316336001600160a01b0316145b610dfc5760405162461bcd60e51b8152600401808060200182810382526039815260200180611d246039913960400191505060405180910390fd5b610e058161162b565b60048054604080516370a0823160e01b815230938101939093525183926001600160a01b03909216916370a08231916024808301926020929190829003018186803b158015610e5357600080fd5b505afa158015610e67573d6000803e3d6000fd5b505050506040513d6020811015610e7d57600080fd5b50511015610e8d57610e8d6111c4565b60048054604080516370a0823160e01b8152309381019390935251600092610f11926001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015610edf57600080fd5b505afa158015610ef3573d6000803e3d6000fd5b505050506040513d6020811015610f0957600080fd5b5051836116e9565b600e54600454919250610f37916001600160a01b0390811691168363ffffffff610ffc16565b5050565b6006546001600160a01b031681565b600c546001600160a01b031681565b60108181548110610f6657fe5b6000918252602090912001546001600160a01b0316905081565b600a546001600160a01b031681565b60008060009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156108dd57600080fd5b6003546001600160a01b031681565b600e546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526104e49084906116ff565b6000828201838110156110a8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b801580611137575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561110957600080fd5b505afa15801561111d573d6000803e3d6000fd5b505050506040513d602081101561113357600080fd5b5051155b6111725760405162461bcd60e51b8152600401808060200182810382526036815260200180611dcb6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526104e49084906116ff565b60115460ff166111fc576040517f444bcec8acce9dc46755761662d6262a490b9f61cca73243c5131d98df078ce390600090a1610877565b600654600554604080516335313c2160e11b81526001600160a01b03928316600482015290519190921691636a62784291602480830192600092919082900301818387803b15801561124d57600080fd5b505af1158015611261573d6000803e3d6000fd5b5050600754604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b1580156112b257600080fd5b505afa1580156112c6573d6000803e3d6000fd5b505050506040513d60208110156112dc57600080fd5b505160125490915081101561131a576040517f444bcec8acce9dc46755761662d6262a490b9f61cca73243c5131d98df078ce390600090a150610877565b611323816118bd565b600754604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561136e57600080fd5b505afa158015611382573d6000803e3d6000fd5b505050506040513d602081101561139857600080fd5b505190508015610f37576040805182815290517f875c79c14f0ec82c9ae01b82cfab0d1c5c4079f1500682832fb877a7dec614fb9181900360200190a1600c546007546113f9916001600160a01b039182169116600063ffffffff6110b116565b600c5460075461141c916001600160a01b0391821691168363ffffffff6110b116565b600c546040516338ed173960e01b8152600481018381526001602483018190523060648401819052426084850181905260a0604486019081526010805460a488018190526001600160a01b03909816976338ed1739978a97929594939160c490910190869080156114b657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611498575b50509650505050505050600060405180830381600087803b1580156114da57600080fd5b505af11580156114ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561151757600080fd5b810190808051604051939291908464010000000082111561153757600080fd5b90830190602082018581111561154c57600080fd5b825186602082028301116401000000008211171561156957600080fd5b82525081516020918201928201910280838360005b8381101561159657818101518382015260200161157e565b50505050919091016040818152600a546370a0823160e01b83523060048401529051600097506001600160a01b0390911695506370a08231945060248083019450602093509091829003018186803b1580156115f157600080fd5b505afa158015611605573d6000803e3d6000fd5b505050506040513d602081101561161b57600080fd5b50511115610f3757610f37611a36565b600554604080516370a0823160e01b815230600482015290516001600160a01b0390921691632e1a7d4d916116b39184916370a08231916024808301926020929190829003018186803b15801561168157600080fd5b505afa158015611695573d6000803e3d6000fd5b505050506040513d60208110156116ab57600080fd5b5051846116e9565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156107bc57600080fd5b60008183106116f857816110a8565b5090919050565b611711826001600160a01b0316611baf565b611762576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106117a05780518252601f199092019160209182019101611781565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611802576040519150601f19603f3d011682016040523d82523d6000602084013e611807565b606091505b50915091508161185e576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156118b75780806020019051602081101561187a57600080fd5b50516118b75760405162461bcd60e51b815260040180806020018281038252602a815260200180611da1602a913960400191505060405180910390fd5b50505050565b80156119f45760006118ec6002546118e060015485611beb90919063ffffffff16565b9063ffffffff611c4416565b6040805184815260208101839052428183015290519192507f33fd2845a0f10293482de360244dd4ad31ddbb4b8c4a1ded3875cf8ebfba184b919081900360600190a161195461193a610f8f565b6003546001600160a01b031690600063ffffffff6110b116565b61197861195f610f8f565b6003546001600160a01b0316908363ffffffff6110b116565b611980610f8f565b60035460408051631ee0d7e560e31b81526001600160a01b039283166004820152602481018590529051929091169163f706bf289160448082019260009290919082900301818387803b1580156119d657600080fd5b505af11580156119ea573d6000803e3d6000fd5b50505050506107d5565b6040805160008082526020820152428183015290517f33fd2845a0f10293482de360244dd4ad31ddbb4b8c4a1ded3875cf8ebfba184b9181900360600190a150565b600a54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611a8157600080fd5b505afa158015611a95573d6000803e3d6000fd5b505050506040513d6020811015611aab57600080fd5b5051905080156107d557600b54600a54611ad9916001600160a01b039182169116600063ffffffff6110b116565b600b54600a54611afc916001600160a01b0391821691168363ffffffff6110b116565b600b54604080516080808201835260008083526020830186905282840181905260608301819052925162a6cbcd60e21b815292936001600160a01b03169263029b2f34929185916004019081908490808383875b83811015611b68578181015183820152602001611b50565b5050505090500182815260200192505050600060405180830381600087803b158015611b9357600080fd5b505af1158015611ba7573d6000803e3d6000fd5b505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611be357508115155b949350505050565b600082611bfa575060006110ab565b82820282848281611c0757fe5b04146110a85760405162461bcd60e51b8152600401808060200182810382526021815260200180611d806021913960400191505060405180910390fd5b60006110a883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183611d0d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611cd2578181015183820152602001611cba565b50505050905090810190601f168015611cff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611d1957fe5b049594505050505056fe5468652073656e6465722068617320746f2062652074686520636f6e74726f6c6c65722c20676f7665726e616e63652c206f72207661756c74746f6b656e20697320646566696e6564206173206e6f742073616c7661676561626c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582026a0a5f2e00c5879c57a11035d6ad48aa904fa08455c99312ad248617ab018dc64736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197000000000000000000000000683e683fbe6cf9b635539712c999f3b3edcb8664
-----Decoded View---------------
Arg [0] : _storage (address): 0xc95CbE4ca30055c787CB784BE99D6a8494d0d197
Arg [1] : _vault (address): 0x683E683fBE6Cf9b635539712c999f3B3EdCB8664
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197
Arg [1] : 000000000000000000000000683e683fbe6cf9b635539712c999f3b3edcb8664
Deployed Bytecode Sourcemap
39948:811:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39948:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31524:39;;;:::i;:::-;;;;;;;;;;;;;;;;35229:304;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;35229:304:0;;;;;;;;;;;;;;;;;:::i;:::-;;33376:19;;;:::i;:::-;;;;-1:-1:-1;;;;;33376:19:0;;;;;;;;;;;;;;33475;;;:::i;33917:23::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;38481:186;;;:::i;36685:333::-;;;:::i;38328:103::-;;;:::i;33640:50::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33640:50:0;-1:-1:-1;;;;;33640:50:0;;:::i;29240:90::-;;;:::i;33425:18::-;;;:::i;33346:25::-;;;:::i;33450:20::-;;;:::i;33522:31::-;;;:::i;29070:164::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29070:164:0;-1:-1:-1;;;;;29070:164:0;;:::i;28786:20::-;;;:::i;33988:31::-;;;:::i;39374:68::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39374:68:0;;;;:::i;31482:37::-;;;:::i;39523:89::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39523:89:0;;:::i;36348:249::-;;;:::i;35057:77::-;;;:::i;35878:397::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35878:397:0;;:::i;33400:20::-;;;:::i;33560:18::-;;;:::i;33813:32::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33813:32:0;;:::i;33499:18::-;;;:::i;29823:90::-;;;:::i;31568:26::-;;;:::i;33752:20::-;;;:::i;31524:39::-;;;;:::o;35229:304::-;29001:5;;:30;;;-1:-1:-1;;;29001:30:0;;29020:10;29001:30;;;;;;-1:-1:-1;;;;;29001:5:0;;;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;29001:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29001:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29001:30:0;28993:57;;;;;-1:-1:-1;;;28993:57:0;;;;;;;;;;;;-1:-1:-1;;;28993:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35410:25:0;;;;;;:18;:25;;;;;;;;35409:26;35401:74;;;;-1:-1:-1;;;35401:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35482:45;-1:-1:-1;;;;;35482:26:0;;35509:9;35520:6;35482:45;:26;:45;:::i;:::-;35229:304;;;:::o;33376:19::-;;;-1:-1:-1;;;;;33376:19:0;;:::o;33475:::-;;;-1:-1:-1;;;;;33475:19:0;;:::o;33917:23::-;;;;;;:::o;38481:186::-;38618:10;;;38611:43;;;-1:-1:-1;;;38611:43:0;;38648:4;38611:43;;;;;;;;38539:7;;38562:99;;-1:-1:-1;;;;;38618:10:0;;38611:28;;:43;;;;;;;;;;;;;;;38618:10;38611:43;;;5:2:-1;;;;30:1;27;20:12;5:2;38611:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38611:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38611:43:0;38568:4;;38562:36;;;-1:-1:-1;;;38562:36:0;;38592:4;38562:36;;;;;;-1:-1:-1;;;;;38568:4:0;;;;38562:21;;:36;;;;;38611:43;;38562:36;;;;;;;;38568:4;38562:36;;;5:2:-1;;;;30:1;27;20:12;5:2;38562:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38562:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38562:36:0;;:99;:40;:99;:::i;:::-;38555:106;;38481:186;:::o;36685:333::-;34077:5;;-1:-1:-1;;;;;34077:5:0;34063:10;:19;;:49;;;34100:12;:10;:12::i;:::-;-1:-1:-1;;;;;34086:26:0;:10;-1:-1:-1;;;;;34086:26:0;;34063:49;:86;;;;34137:12;:10;:12::i;:::-;-1:-1:-1;;;;;34123:26:0;:10;-1:-1:-1;;;;;34123:26:0;;34063:86;34055:163;;;;-1:-1:-1;;;34055:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36776:10;;;36769:43;;;-1:-1:-1;;;36769:43:0;;36806:4;36769:43;;;;;;;;36741:25;;-1:-1:-1;;;;;36776:10:0;;;;36769:28;;:43;;;;;;;;;;;;;;36776:10;36769:43;;;5:2:-1;;;;30:1;27;20:12;5:2;36769:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36769:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36769:43:0;;-1:-1:-1;36823:21:0;;36819:194;;36886:4;;36862:10;;36855:39;;-1:-1:-1;;;;;36862:10:0;;;;36886:4;;36855:39;:30;:39;:::i;:::-;36934:4;;36910:10;;36903:55;;-1:-1:-1;;;;;36910:10:0;;;;36934:4;36940:17;36903:55;:30;:55;:::i;:::-;36973:4;;36967:38;;;-1:-1:-1;;;36967:38:0;;;;;;;;;;-1:-1:-1;;;;;36973:4:0;;;;36967:19;;:38;;;;;36973:4;;36967:38;;;;;;;;36973:4;;36967:38;;;5:2:-1;;;;30:1;27;20:12;5:2;36967:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36967:38:0;;;;36819:194;34225:1;36685:333::o;38328:103::-;34077:5;;-1:-1:-1;;;;;34077:5:0;34063:10;:19;;:49;;;34100:12;:10;:12::i;:::-;-1:-1:-1;;;;;34086:26:0;:10;-1:-1:-1;;;;;34086:26:0;;34063:49;:86;;;;34137:12;:10;:12::i;:::-;-1:-1:-1;;;;;34123:26:0;:10;-1:-1:-1;;;;;34123:26:0;;34063:86;34055:163;;;;-1:-1:-1;;;34055:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38375:22;:20;:22::i;:::-;38404:21;:19;:21::i;:::-;38328:103::o;33640:50::-;;;;;;;;;;;;;;;:::o;29240:90::-;29283:7;29306:5;;;;;;;;;-1:-1:-1;;;;;29306:5:0;-1:-1:-1;;;;;29306:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29306:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29306:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29306:18:0;;-1:-1:-1;29240:90:0;:::o;33425:18::-;;;-1:-1:-1;;;;;33425:18:0;;:::o;33346:25::-;;;-1:-1:-1;;;;;33346:25:0;;:::o;33450:20::-;;;-1:-1:-1;;;;;33450:20:0;;:::o;33522:31::-;;;-1:-1:-1;;;;;33522:31:0;;:::o;29070:164::-;29001:5;;:30;;;-1:-1:-1;;;29001:30:0;;29020:10;29001:30;;;;;;-1:-1:-1;;;;;29001:5:0;;;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;29001:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29001:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29001:30:0;28993:57;;;;;-1:-1:-1;;;28993:57:0;;;;;;;;;;;;-1:-1:-1;;;28993:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29143:20:0;;29135:63;;;;;-1:-1:-1;;;29135:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29205:5;:23;;-1:-1:-1;;;;;;29205:23:0;-1:-1:-1;;;;;29205:23:0;;;;;;;;;;29070:164::o;28786:20::-;;;-1:-1:-1;;;;;28786:20:0;;:::o;33988:31::-;;;;:::o;39374:68::-;29001:5;;:30;;;-1:-1:-1;;;29001:30:0;;29020:10;29001:30;;;;;;-1:-1:-1;;;;;29001:5:0;;;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;29001:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29001:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29001:30:0;28993:57;;;;;-1:-1:-1;;;28993:57:0;;;;;;;;;;;;-1:-1:-1;;;28993:57:0;;;;;;;;;;;;;;;39428:4;:8;;-1:-1:-1;;39428:8:0;;;;;;;;;;39374:68::o;31482:37::-;;;;:::o;39523:89::-;29001:5;;:30;;;-1:-1:-1;;;29001:30:0;;29020:10;29001:30;;;;;;-1:-1:-1;;;;;29001:5:0;;;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;29001:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29001:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29001:30:0;28993:57;;;;;-1:-1:-1;;;28993:57:0;;;;;;;;;;;;-1:-1:-1;;;28993:57:0;;;;;;;;;;;;;;;39589:9;:17;39523:89::o;36348:249::-;34077:5;;-1:-1:-1;;;;;34077:5:0;34063:10;:19;;:49;;;34100:12;:10;:12::i;:::-;-1:-1:-1;;;;;34086:26:0;:10;-1:-1:-1;;;;;34086:26:0;;34063:49;:86;;;;34137:12;:10;:12::i;:::-;-1:-1:-1;;;;;34123:26:0;:10;-1:-1:-1;;;;;34123:26:0;;34063:86;34055:163;;;;-1:-1:-1;;;34055:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36405:22;:20;:22::i;:::-;36434:35;36461:7;;36434:26;:35::i;:::-;36501:10;;;36494:43;;;-1:-1:-1;;;36494:43:0;;36531:4;36494:43;;;;;;;;36476:15;;-1:-1:-1;;;;;36501:10:0;;;;36494:28;;:43;;;;;;;;;;;;;;36501:10;36494:43;;;5:2:-1;;;;30:1;27;20:12;5:2;36494:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36494:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36494:43:0;36576:5;;36551:10;;36494:43;;-1:-1:-1;36544:47:0;;-1:-1:-1;;;;;36551:10:0;;;;36576:5;36494:43;36544:47;:31;:47;:::i;35057:77::-;35124:4;35057:77;:::o;35878:397::-;34077:5;;-1:-1:-1;;;;;34077:5:0;34063:10;:19;;:49;;;34100:12;:10;:12::i;:::-;-1:-1:-1;;;;;34086:26:0;:10;-1:-1:-1;;;;;34086:26:0;;34063:49;:86;;;;34137:12;:10;:12::i;:::-;-1:-1:-1;;;;;34123:26:0;:10;-1:-1:-1;;;;;34123:26:0;;34063:86;34055:163;;;;-1:-1:-1;;;34055:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35956:44;35983:16;35956:26;:44::i;:::-;36018:10;;;36011:43;;;-1:-1:-1;;;36011:43:0;;36048:4;36011:43;;;;;;;;36057:16;;-1:-1:-1;;;;;36018:10:0;;;;36011:28;;:43;;;;;;;;;;;;;;36018:10;36011:43;;;5:2:-1;;;;30:1;27;20:12;5:2;36011:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36011:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36011:43:0;:62;36007:107;;;36084:22;:20;:22::i;:::-;36157:10;;;36150:43;;;-1:-1:-1;;;36150:43:0;;36187:4;36150:43;;;;;;;;36120:18;;36141:71;;-1:-1:-1;;;;;36157:10:0;;36150:28;;:43;;;;;;;;;;;;;;;36157:10;36150:43;;;5:2:-1;;;;30:1;27;20:12;5:2;36150:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36150:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36150:43:0;36195:16;36141:8;:71::i;:::-;36251:5;;36226:10;;36120:92;;-1:-1:-1;36219:50:0;;-1:-1:-1;;;;;36226:10:0;;;;36251:5;36120:92;36219:50;:31;:50;:::i;:::-;34225:1;35878:397;:::o;33400:20::-;;;-1:-1:-1;;;;;33400:20:0;;:::o;33560:18::-;;;-1:-1:-1;;;;;33560:18:0;;:::o;33813:32::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33813:32:0;;-1:-1:-1;33813:32:0;:::o;33499:18::-;;;-1:-1:-1;;;;;33499:18:0;;:::o;29823:90::-;29866:7;29889:5;;;;;;;;;-1:-1:-1;;;;;29889:5:0;-1:-1:-1;;;;;29889:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;31568:26:0;;;-1:-1:-1;;;;;31568:26:0;;:::o;33752:20::-;;;-1:-1:-1;;;;;33752:20:0;;:::o;12973:176::-;13082:58;;;-1:-1:-1;;;;;13082:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13082:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13056:85:0;;13075:5;;13056:18;:85::i;4642:181::-;4700:7;4732:5;;;4756:6;;;;4748:46;;;;;-1:-1:-1;;;4748:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4814:1;-1:-1:-1;4642:181:0;;;;;:::o;13369:621::-;13739:10;;;13738:62;;-1:-1:-1;13755:39:0;;;-1:-1:-1;;;13755:39:0;;13779:4;13755:39;;;;-1:-1:-1;;;;;13755:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;13755:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13755:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13755:39:0;:44;13738:62;13730:152;;;;-1:-1:-1;;;13730:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13919:62;;;-1:-1:-1;;;;;13919:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13919:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13893:89:0;;13912:5;;13893:18;:89::i;37162:1066::-;37215:4;;;;37210:142;;37308:21;;;;;;;37338:7;;37210:142;37364:5;;37376:4;;37358:23;;;-1:-1:-1;;;37358:23:0;;-1:-1:-1;;;;;37376:4:0;;;37358:23;;;;;;37364:5;;;;;37358:17;;:23;;;;;37364:5;;37358:23;;;;;;;37364:5;;37358:23;;;5:2:-1;;;;30:1;27;20:12;5:2;37358:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;37421:3:0;;37414:36;;;-1:-1:-1;;;37414:36:0;;37444:4;37414:36;;;;;;37390:21;;-1:-1:-1;;;;;;37421:3:0;;;;-1:-1:-1;37414:21:0;;:36;;;;;;;;;;;;;;37421:3;37414:36;;;5:2:-1;;;;30:1;27;20:12;5:2;37414:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37414:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37414:36:0;37477:9;;37414:36;;-1:-1:-1;37461:25:0;;37457:162;;;37575:21;;;;;;;37605:7;;;37457:162;37627:40;37653:13;37627:25;:40::i;:::-;37702:3;;37695:36;;;-1:-1:-1;;;37695:36:0;;37725:4;37695:36;;;;;;37674:18;;-1:-1:-1;;;;;37702:3:0;;37695:21;;:36;;;;;;;;;;;;;;37702:3;37695:36;;;5:2:-1;;;;30:1;27;20:12;5:2;37695:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37695:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37695:36:0;;-1:-1:-1;37748:14:0;;37744:479;;37778:23;;;;;;;;;;;;;;;;;37834:3;;37817;;37810:31;;-1:-1:-1;;;;;37817:3:0;;;;37834;;37810:31;:23;:31;:::i;:::-;37874:3;;37857;;37850:40;;-1:-1:-1;;;;;37857:3:0;;;;37874;37879:10;37850:40;:23;:40;:::i;:::-;38012:3;;37993:130;;-1:-1:-1;;;37993:130:0;;;;;;;;38012:3;37993:130;;;;;;38092:4;37993:130;;;;;;38099:15;37993:130;;;;;;;;;;;;;38067:15;37993:130;;;;;;;;-1:-1:-1;;;;;38012:3:0;;;;37993:48;;38052:10;;38067:15;;38092:4;38099:15;37993:130;;;;;;38067:15;;37993:130;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37993:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37993:130:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37993:130:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;37993:130:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;37993:130:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;37993:130:0;;421:4:-1;412:14;;;;37993:130:0;;;;;412:14:-1;37993:130:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;;;37993:130:0;;;;;;;;38144:3;;-1:-1:-1;;;38137:36:0;;38167:4;38137:36;;;;;;38176:1;;-1:-1:-1;;;;;;38144:3:0;;;;-1:-1:-1;38137:21:0;;-1:-1:-1;38137:36:0;;;;;-1:-1:-1;38137:36:0;;-1:-1:-1;38137:36:0;;;;;;;38144:3;38137:36;;;5:2:-1;;;;30:1;27;20:12;5:2;38137:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38137:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38137:36:0;:40;38134:82;;;38190:16;:14;:16::i;35621:164::-;35695:4;;35727:36;;;-1:-1:-1;;;35727:36:0;;35757:4;35727:36;;;;;;-1:-1:-1;;;;;35695:4:0;;;;35689:20;;35718:54;;35695:4;;35727:21;;:36;;;;;;;;;;;;;;35695:4;35727:36;;;5:2:-1;;;;30:1;27;20:12;5:2;35727:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35727:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35727:36:0;35765:6;35718:8;:54::i;:::-;35689:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;3304:106:0;3362:7;3393:1;3389;:5;:13;;3401:1;3389:13;;;-1:-1:-1;3397:1:0;;3382:20;-1:-1:-1;3304:106:0:o;15012:1114::-;15616:27;15624:5;-1:-1:-1;;;;;15616:25:0;;:27::i;:::-;15608:71;;;;;-1:-1:-1;;;15608:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15753:12;15767:23;15802:5;-1:-1:-1;;;;;15794:19:0;15814:4;15794:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15794:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;15752:67:0;;;;15838:7;15830:52;;;;;-1:-1:-1;;;15830:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15899:17;;:21;15895:224;;16041:10;16030:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16030:30:0;16022:85;;;;-1:-1:-1;;;16022:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15012:1114;;;;:::o;32159:581::-;32238:18;;32234:501;;32267:17;32287:72;32334:24;;32287:42;32306:22;;32287:14;:18;;:42;;;;:::i;:::-;:46;:72;:46;:72;:::i;:::-;32373:61;;;;;;;;;;;;32418:15;32373:61;;;;;;32267:92;;-1:-1:-1;32373:61:0;;;;;;;;;;32443:48;32475:12;:10;:12::i;:::-;32450:11;;-1:-1:-1;;;;;32450:11:0;;32489:1;32443:48;:31;:48;:::i;:::-;32500:56;32532:12;:10;:12::i;:::-;32507:11;;-1:-1:-1;;;;;32507:11:0;;32546:9;32500:56;:31;:56;:::i;:::-;32585:12;:10;:12::i;:::-;32619:11;;32573:86;;;-1:-1:-1;;;32573:86:0;;-1:-1:-1;;;;;32619:11:0;;;32573:86;;;;;;;;;;;;:35;;;;;;;:86;;;;;32619:11;;32573:86;;;;;;;;32619:11;32573:35;:86;;;5:2:-1;;;;30:1;27;20:12;5:2;32573:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32573:86:0;;;;32234:501;;;;32687:40;;;32705:1;32687:40;;;;;;;32711:15;32687:40;;;;;;;;;;;;;;;32159:581;:::o;38746:484::-;38816:3;;38809:36;;;-1:-1:-1;;;38809:36:0;;38839:4;38809:36;;;;;;38788:18;;-1:-1:-1;;;;;38816:3:0;;38809:21;;:36;;;;;;;;;;;;;;38816:3;38809:36;;;5:2:-1;;;;30:1;27;20:12;5:2;38809:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38809:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38809:36:0;;-1:-1:-1;38856:14:0;;38852:373;;38905:16;;38888:3;;38881:44;;-1:-1:-1;;;;;38888:3:0;;;;38905:16;;38881:44;:23;:44;:::i;:::-;38958:16;;38941:3;;38934:53;;-1:-1:-1;;;;;38941:3:0;;;;38958:16;38976:10;38934:53;:23;:53;:::i;:::-;39124:16;;39106:81;;;;;;;;;39078:15;39106:81;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39106:81:0;;39078:15;;-1:-1:-1;;;;;39124:16:0;;39106:49;;:81;39078:15;;39106:81;;;;;;;;;;39078:15;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39106:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39106:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39106:81:0;;;;38852:373;38746:484;:::o;10002:619::-;10062:4;10530:20;;10373:66;10570:23;;;;;;:42;;-1:-1:-1;10597:15:0;;;10570:42;10562:51;10002:619;-1:-1:-1;;;;10002:619:0:o;6014:471::-;6072:7;6317:6;6313:47;;-1:-1:-1;6347:1:0;6340:8;;6313:47;6384:5;;;6388:1;6384;:5;:1;6408:5;;;;;:10;6400:56;;;;-1:-1:-1;;;6400:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6953:132;7011:7;7038:39;7042:1;7045;7038:39;;;;;;;;;;;;;;;;;7701:7;7803:12;7796:5;7788:28;;;;-1:-1:-1;;;7788:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7788:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7827:9;7843:1;7839;:5;;;;;;;7615:345;-1:-1:-1;;;;;7615:345:0:o
Swarm Source
bzzr://26a0a5f2e00c5879c57a11035d6ad48aa904fa08455c99312ad248617ab018dc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.