Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Conversion P... | 11549948 | 1402 days ago | IN | 0 ETH | 0.00583383 | ||||
Set Conversion P... | 11549947 | 1402 days ago | IN | 0 ETH | 0.01909146 | ||||
Set Conversion P... | 11549941 | 1402 days ago | IN | 0 ETH | 0.00583383 | ||||
Set Conversion P... | 11549937 | 1402 days ago | IN | 0 ETH | 0.00583383 | ||||
Set Conversion P... | 11549929 | 1402 days ago | IN | 0 ETH | 0.00583383 | ||||
Set Conversion P... | 11547576 | 1402 days ago | IN | 0 ETH | 0.00370937 | ||||
Set Conversion P... | 11416138 | 1422 days ago | IN | 0 ETH | 0.0068104 | ||||
Set Conversion P... | 11416091 | 1422 days ago | IN | 0 ETH | 0.00225376 | ||||
Set Conversion P... | 11367775 | 1430 days ago | IN | 0 ETH | 0.01741605 | ||||
Set Grain Config | 11367723 | 1430 days ago | IN | 0 ETH | 0.01207636 | ||||
Set Token Pool | 11367720 | 1430 days ago | IN | 0 ETH | 0.00952723 | ||||
0x60806040 | 11342100 | 1434 days ago | IN | 0 ETH | 0.26491525 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FeeRewardForwarder
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-27 */ // 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: @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/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: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol pragma solidity ^0.5.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public { _burn(_msgSender(), amount); } /** * @dev See {ERC20-_burnFrom}. */ function burnFrom(address account, uint256 amount) public { _burnFrom(account, amount); } } // File: contracts/hardworkInterface/IRewardPool.sol pragma solidity 0.5.16; // Unifying the interface with the Synthetix Reward Pool interface IRewardPool { function rewardToken() external view returns (address); function lpToken() external view returns (address); function duration() external view returns (uint256); function periodFinish() external view returns (uint256); function rewardRate() external view returns (uint256); function rewardPerTokenStored() external view returns (uint256); function stake(uint256 amountWei) external; // `balanceOf` would give the amount staked. // As this is 1 to 1, this is also the holder's share function balanceOf(address holder) external view returns (uint256); // total shares & total lpTokens staked function totalSupply() external view returns(uint256); function withdraw(uint256 amountWei) external; function exit() external; // get claimed rewards function earned(address holder) external view returns (uint256); // claim rewards function getReward() external; // notify function notifyRewardAmount(uint256 _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/FeeRewardForwarder.sol pragma solidity 0.5.16; contract FeeRewardForwarder is Governable { using SafeERC20 for IERC20; using SafeMath for uint256; address public farm; address constant public usdc = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); address constant public usdt = address(0xdAC17F958D2ee523a2206206994597C13D831ec7); address constant public dai = address(0x6B175474E89094C44Da98b954EedeAC495271d0F); address constant public wbtc = address(0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599); address constant public renBTC = address(0xEB4C2781e4ebA804CE9a9803C67d0893436bB27D); address constant public sushi = address(0x6B3595068778DD592e39A122f4f5a5cF09C90fE2); address constant public dego = address(0x88EF27e69108B2633F8E1C184CC37940A075cC02); address constant public uni = address(0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984); address constant public comp = address(0xc00e94Cb662C3520282E6f5717214004A7f26888); address constant public crv = address(0xD533a949740bb3306d119CC777fa900bA034cd52); address constant public ycrv = address(0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8); address constant public weth = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); mapping (address => mapping (address => address[])) public uniswapRoutes; // grain // grain is a burnable ERC20 token that is deployed by Harvest // we sell crops to buy back grain and burn it address public grain; uint256 public grainShareNumerator; uint256 public grainShareDenominator; // In case we're not buying back grain immediately, // we liquidate the crops into the grainBackerToken // and send it to an EOA `grainBuybackReserve` bool public grainImmediateBuyback; address public grainBackerToken; address public grainBuybackReserve; // the targeted reward token to convert everything to address public targetToken; address public profitSharingPool; address constant public uniswapRouterV2 = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); event TokenPoolSet(address token, address pool); constructor(address _storage, address _farm, address _grain) public Governable(_storage) { require(_grain != address(0), "_grain not defined"); require(_farm != address(0), "_farm not defined"); grain = _grain; farm = _farm; // preset for the already in use crops uniswapRoutes[weth][farm] = [weth, usdc, farm]; uniswapRoutes[dai][farm] = [dai, weth, usdc, farm]; uniswapRoutes[usdc][farm] = [usdc, farm]; uniswapRoutes[usdt][farm] = [usdt, weth, usdc, farm]; uniswapRoutes[wbtc][farm] = [wbtc, weth, usdc, farm]; uniswapRoutes[renBTC][farm] = [renBTC, weth, usdc, farm]; uniswapRoutes[sushi][farm] = [sushi, weth, usdc, farm]; uniswapRoutes[dego][farm] = [dego, weth, usdc, farm]; uniswapRoutes[crv][farm] = [crv, weth, usdc, farm]; uniswapRoutes[comp][farm] = [comp, weth, usdc, farm]; // Route to grain is always to farm then to grain. // So we will just use the existing route to buy FARM first // then sell partially to grain. uniswapRoutes[grain][farm] = [grain, farm]; uniswapRoutes[farm][grain] = [farm, grain]; // preset for grainBacker (usdc or weth) //weth uniswapRoutes[dai][weth] = [dai, weth]; uniswapRoutes[usdc][weth] = [usdc, weth]; uniswapRoutes[usdt][weth] = [usdt, weth]; uniswapRoutes[wbtc][weth] = [wbtc, weth]; uniswapRoutes[renBTC][weth] = [renBTC, weth]; uniswapRoutes[sushi][weth] = [sushi, weth]; uniswapRoutes[dego][weth] = [dego, weth]; uniswapRoutes[crv][weth] = [crv, weth]; uniswapRoutes[comp][weth] = [comp, weth]; // usdc uniswapRoutes[weth][usdc] = [weth, usdc]; uniswapRoutes[dai][usdc] = [dai, weth, usdc]; uniswapRoutes[usdt][usdc] = [usdt, weth, usdc]; uniswapRoutes[wbtc][usdc] = [wbtc, weth, usdc]; uniswapRoutes[renBTC][usdc] = [renBTC, weth, usdc]; uniswapRoutes[sushi][usdc] = [sushi, weth, usdc]; uniswapRoutes[dego][usdc] = [dego, weth, usdc]; uniswapRoutes[crv][usdc] = [crv, weth, usdc]; uniswapRoutes[comp][usdc] = [comp, weth, usdc]; } /* * Set the pool that will receive the reward token * based on the address of the reward Token */ function setTokenPool(address _pool) public onlyGovernance { // To buy back grain, our `targetToken` needs to be FARM require(farm == IRewardPool(_pool).rewardToken(), "Rewardpool's token is not FARM"); profitSharingPool = _pool; targetToken = farm; emit TokenPoolSet(targetToken, _pool); } /** * Sets the path for swapping tokens to the to address * The to address is not validated to match the targetToken, * so that we could first update the paths, and then, * set the new target */ function setConversionPath(address from, address to, address[] memory _uniswapRoute) public onlyGovernance { require(from == _uniswapRoute[0], "The first token of the Uniswap route must be the from token"); require(to == _uniswapRoute[_uniswapRoute.length - 1], "The last token of the Uniswap route must be the to token"); uniswapRoutes[from][to] = _uniswapRoute; } // Transfers the funds from the msg.sender to the pool // under normal circumstances, msg.sender is the strategy function poolNotifyFixedTarget(address _token, uint256 _amount) external { uint256 remainingAmount = _amount; // Note: targetToken could only be FARM or NULL. // it is only used to check that the rewardPool is set. if (targetToken == address(0)) { return; // a No-op if target pool is not set yet } if (_token == farm) { // this is already the right token // Note: Under current structure, this would be FARM. // This would pass on the grain buy back as it would be the special case // designed for NotifyHelper calls // This is assuming that NO strategy would notify profits in FARM IERC20(_token).safeTransferFrom(msg.sender, profitSharingPool, _amount); IRewardPool(profitSharingPool).notifyRewardAmount(_amount); } else { // If grainImmediateBuyback is set to false, then funds to buy back grain needs to be sent to an address if (grainShareNumerator != 0 && !grainImmediateBuyback) { require(grainBuybackReserve != address(0), "grainBuybackReserve should not be empty"); uint256 balanceToSend = _amount.mul(grainShareNumerator).div(grainShareDenominator); remainingAmount = _amount.sub(balanceToSend); // If the liquidation path is set, liquidate to grainBackerToken and send it over // if not, send the crops immediately // this also covers the case when the _token is the grainBackerToken if(uniswapRoutes[_token][grainBackerToken].length > 1){ IERC20(_token).safeTransferFrom(msg.sender, address(this), balanceToSend); liquidate(_token, grainBackerToken, balanceToSend); // send the grainBackerToken to the reserve IERC20(grainBackerToken).safeTransfer(grainBuybackReserve, IERC20(grainBackerToken).balanceOf(address(this))); } else { IERC20(_token).safeTransferFrom(msg.sender, grainBuybackReserve, balanceToSend); } } // we need to convert _token to FARM if (uniswapRoutes[_token][farm].length > 1) { IERC20(_token).safeTransferFrom(msg.sender, address(this), remainingAmount); uint256 balanceToSwap = IERC20(_token).balanceOf(address(this)); liquidate(_token, farm, balanceToSwap); // if grain buyback is activated, then sell some FARM to buy and burn grain if(grainShareNumerator != 0 && grainImmediateBuyback) { uint256 balanceToBuyback = (IERC20(farm).balanceOf(address(this))).mul(grainShareNumerator).div(grainShareDenominator); liquidate(farm, grain, balanceToBuyback); // burn all the grains in this contract ERC20Burnable(grain).burn(IERC20(grain).balanceOf(address(this))); } // now we can send this token forward uint256 convertedRewardAmount = IERC20(farm).balanceOf(address(this)); IERC20(farm).safeTransfer(profitSharingPool, convertedRewardAmount); IRewardPool(profitSharingPool).notifyRewardAmount(convertedRewardAmount); } else { // else the route does not exist for this token // do not take any fees and revert. // It's better to set the liquidation path then perform it again, // rather then leaving the funds in controller revert("FeeRewardForwarder: liquidation path doesn't exist"); } } } function liquidate(address _from, address _to, uint256 balanceToSwap) internal { if(balanceToSwap > 0){ IERC20(_from).safeApprove(uniswapRouterV2, 0); IERC20(_from).safeApprove(uniswapRouterV2, balanceToSwap); IUniswapV2Router02(uniswapRouterV2).swapExactTokensForTokens( balanceToSwap, 1, // we will accept any amount uniswapRoutes[_from][_to], address(this), block.timestamp ); } } function setGrainBuybackRatio(uint256 _grainShareNumerator, uint256 _grainShareDenominator) public onlyGovernance { require(_grainShareDenominator >= _grainShareNumerator, "numerator cannot be greater than denominator"); require(_grainShareDenominator != 0, "_grainShareDenominator cannot be 0"); grainShareNumerator = _grainShareNumerator; grainShareDenominator = _grainShareDenominator; } function setGrainConfig( uint256 _grainShareNumerator, uint256 _grainShareDenominator, bool _grainImmediateBuyback, address _grainBackerToken, address _grainBuybackReserve ) external onlyGovernance { require(_grainBuybackReserve != address(0), "_grainBuybackReserve is empty"); // grainBackerToken can be address(0), this way the forwarder will send the crops directly // since it cannot find a path. // grainShareNumerator can be 0, this means that no grain is being bought back setGrainBuybackRatio(_grainShareNumerator, _grainShareDenominator); grainImmediateBuyback = _grainImmediateBuyback; grainBackerToken = _grainBackerToken; grainBuybackReserve = _grainBuybackReserve; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_storage","type":"address"},{"internalType":"address","name":"_farm","type":"address"},{"internalType":"address","name":"_grain","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"pool","type":"address"}],"name":"TokenPoolSet","type":"event"},{"constant":true,"inputs":[],"name":"comp","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":"dai","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dego","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"farm","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"grain","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"grainBackerToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"grainBuybackReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"grainImmediateBuyback","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"grainShareDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"grainShareNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"poolNotifyFixedTarget","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"profitSharingPool","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"renBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address[]","name":"_uniswapRoute","type":"address[]"}],"name":"setConversionPath","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_grainShareNumerator","type":"uint256"},{"internalType":"uint256","name":"_grainShareDenominator","type":"uint256"}],"name":"setGrainBuybackRatio","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_grainShareNumerator","type":"uint256"},{"internalType":"uint256","name":"_grainShareDenominator","type":"uint256"},{"internalType":"bool","name":"_grainImmediateBuyback","type":"bool"},{"internalType":"address","name":"_grainBackerToken","type":"address"},{"internalType":"address","name":"_grainBuybackReserve","type":"address"}],"name":"setGrainConfig","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":false,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"setTokenPool","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":"sushi","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"targetToken","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":[],"name":"uniswapRouterV2","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"uniswapRoutes","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"usdt","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wbtc","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":true,"inputs":[],"name":"ycrv","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200325e3803806200325e833981810160405260608110156200003757600080fd5b5080516020820151604090920151909190826001600160a01b038116620000a5576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392831617905581166200010a576040805162461bcd60e51b815260206004820152601260248201527117d9dc985a5b881b9bdd081919599a5b995960721b604482015290519081900360640190fd5b6001600160a01b0382166200015a576040805162461bcd60e51b815260206004820152601160248201527017d9985c9b481b9bdd081919599a5b9959607a1b604482015290519081900360640190fd5b600380546001600160a01b038084166001600160a01b0319928316178355600180548683169316929092179182905560408051606081018252600080516020620030fe8339815191528152600080516020620031be833981519152602080830191909152939092168282018190526000908152600080516020620031fe833981519152909352909120620001f1929091906200110d565b5060408051608081018252736b175474e89094c44da98b954eedeac495271d0f8152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152828401526001546001600160a01b0316606083018190526000908152600080516020620031de833981519152909152919091206200027c9160046200110d565b50604080518082018252600080516020620031be83398151915281526001546001600160a01b0316602080830182905260009182526000805160206200315e833981519152905291909120620002d49160026200110d565b506040805160808101825273dac17f958d2ee523a2206206994597c13d831ec78152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152828401526001546001600160a01b0316606083018190526000908152600080516020620030de833981519152909152919091206200035f9160046200110d565b5060408051608081018252732260fac5e5542a773aa44fbcfedf7c193bc2c5998152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152828401526001546001600160a01b03166060830181905260009081526000805160206200323e83398151915290915291909120620003ea9160046200110d565b506040805160808101825273eb4c2781e4eba804ce9a9803c67d0893436bb27d8152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152828401526001546001600160a01b03166060830181905260009081526000805160206200321e83398151915290915291909120620004759160046200110d565b5060408051608081018252736b3595068778dd592e39a122f4f5a5cf09c90fe28152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152828401526001546001600160a01b03166060830181905260009081526000805160206200317e83398151915290915291909120620005009160046200110d565b50604080516080810182527388ef27e69108b2633f8e1c184cc37940a075cc028152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152828401526001546001600160a01b03166060830181905260009081526000805160206200319e833981519152909152919091206200058b9160046200110d565b506040805160808101825273d533a949740bb3306d119cc777fa900ba034cd528152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152828401526001546001600160a01b03166060830181905260009081526000805160206200313e83398151915290915291909120620006169160046200110d565b506040805160808101825273c00e94cb662c3520282e6f5717214004a7f268888152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152828401526001546001600160a01b03166060830181905260009081526000805160206200311e83398151915290915291909120620006a19160046200110d565b506040805180820182526003546001600160a01b03908116808352600154909116602080840182905260009283526002808252858420928452919052929020620006ee929091906200110d565b506040805180820182526001546001600160a01b039081168083526003549091166020808401829052600092835260028082528584209284529190529290206200073b929091906200110d565b5060408051808201909152736b175474e89094c44da98b954eedeac495271d0f8152600080516020620030fe8339815191526020808301829052600091909152600080516020620031de8339815191529052620007bc907f9c4edeb8df4a00e2743165d747ad9a487886e4059d0373f705c0f4d5a3a4abc19060026200110d565b5060408051808201909152600080516020620031be8339815191528152600080516020620030fe83398151915260208083018290526000919091526000805160206200315e833981519152905262000838907fafa326b64c4892c3ee6de4b00fc63570bf096fe1f5c1ed6996c9dd09d6b6adc19060026200110d565b506040805180820190915273dac17f958d2ee523a2206206994597c13d831ec78152600080516020620030fe8339815191526020808301829052600091909152600080516020620030de8339815191529052620008b9907fa6c75b3434e0b20a9aadf8656f20851d19b17522f093b648185cef556139f45b9060026200110d565b5060408051808201909152732260fac5e5542a773aa44fbcfedf7c193bc2c5998152600080516020620030fe83398151915260208083018290526000919091526000805160206200323e83398151915290526200093a907f55124d6d1b8fbf70edb6c40ad558c14d46417c549f535a0b536bd4d0e7efdfb29060026200110d565b506040805180820190915273eb4c2781e4eba804ce9a9803c67d0893436bb27d8152600080516020620030fe83398151915260208083018290526000919091526000805160206200321e8339815191529052620009bb907f8cf665f3e30c0615acde09127533c3e6b44b93128581f44adfe909fe4880107e9060026200110d565b5060408051808201909152736b3595068778dd592e39a122f4f5a5cf09c90fe28152600080516020620030fe83398151915260208083018290526000919091526000805160206200317e833981519152905262000a3c907f033454e70227265f36e5e888f173435a5077c2f415d09258515b20686bbf5f4f9060026200110d565b50604080518082019091527388ef27e69108b2633f8e1c184cc37940a075cc028152600080516020620030fe83398151915260208083018290526000919091526000805160206200319e833981519152905262000abd907f7d0b3ebfdb9e922096d55116899a952492a200246a64ee4d561117f73d6c7dab9060026200110d565b506040805180820190915273d533a949740bb3306d119cc777fa900ba034cd528152600080516020620030fe83398151915260208083018290526000919091526000805160206200313e833981519152905262000b3e907f6c9a54f73e587f3f64fb1da2bbdf5bf54d5988c24e49c7338e7865d4d9226e4b9060026200110d565b506040805180820190915273c00e94cb662c3520282e6f5717214004a7f268888152600080516020620030fe83398151915260208083018290526000919091526000805160206200311e833981519152905262000bbf907f88ed3bfd5f462d2804afd2d5e7f5227f09ac59b43dae0f27e7f20d1e5b21e51e9060026200110d565b5060408051808201909152600080516020620030fe8339815191528152600080516020620031be8339815191526020808301829052600091909152600080516020620031fe833981519152905262000c3b907f10cbec91f600e7f895b03bc61241c3cc3bb96ded9a260421b1d174032138cc019060026200110d565b5060408051606081018252736b175474e89094c44da98b954eedeac495271d0f8152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152928201839052600092909252600080516020620031de83398151915290915262000cd4907f7832d14fc17d60081ffe5a2f56467a73388f4873958d07fda886bca2775f62519060036200110d565b506040805160608101825273dac17f958d2ee523a2206206994597c13d831ec78152600080516020620030fe833981519152602080830191909152600080516020620031be833981519152928201839052600092909252600080516020620030de83398151915290915262000d6d907f5c1e360ab24554039c61e3db0a9d5500cb92df28ca60dd41b1a9bc5c714301b29060036200110d565b5060408051606081018252732260fac5e5542a773aa44fbcfedf7c193bc2c5998152600080516020620030fe833981519152602080830191909152600080516020620031be8339815191529282018390526000929092526000805160206200323e83398151915290915262000e06907f12640c8a8d3365b5eb0193c2ba3e377a6815d03010e024cc8c34b36671e0a1ae9060036200110d565b506040805160608101825273eb4c2781e4eba804ce9a9803c67d0893436bb27d8152600080516020620030fe833981519152602080830191909152600080516020620031be8339815191529282018390526000929092526000805160206200321e83398151915290915262000e9f907f158f1e7892527a62fe2fb5ea035fd4d6681a9de410e6215b4e23d81f079fb0789060036200110d565b5060408051606081018252736b3595068778dd592e39a122f4f5a5cf09c90fe28152600080516020620030fe833981519152602080830191909152600080516020620031be8339815191529282018390526000929092526000805160206200317e83398151915290915262000f38907f9303177e73a7708a2da31927f672a5e82996eddb45eaa60a184dfa6d9e1827319060036200110d565b50604080516060810182527388ef27e69108b2633f8e1c184cc37940a075cc028152600080516020620030fe833981519152602080830191909152600080516020620031be8339815191529282018390526000929092526000805160206200319e83398151915290915262000fd1907fc9bb06771370797ce7202e872e0f18bdfaec52238cb44ecce6eec334f6eb106e9060036200110d565b506040805160608101825273d533a949740bb3306d119cc777fa900ba034cd528152600080516020620030fe833981519152602080830191909152600080516020620031be8339815191529282018390526000929092526000805160206200313e8339815191529091526200106a907f4d0a415f873f27f971b0960e84df89bb81198302f9e3f15fff526a85c80b90839060036200110d565b506040805160608101825273c00e94cb662c3520282e6f5717214004a7f268888152600080516020620030fe833981519152602080830191909152600080516020620031be8339815191529282018390526000929092526000805160206200311e83398151915290915262001103907f712af161926c939d71f75bc7d60b7d28b38fc638d4bfef16a7559ec379b521c29060036200110d565b50505050620011a1565b82805482825590600052602060002090810192821562001165579160200282015b828111156200116557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200112e565b506200117392915062001177565b5090565b6200119e91905b80821115620011735780546001600160a01b03191681556001016200117e565b90565b611f2d80620011b16000396000f3fe608060405234801561001057600080fd5b50600436106101d55760003560e01c80636a4874a11161010f578063af6bfe4a116100a2578063dc7df0a711610071578063dc7df0a714610453578063ec362d4a14610495578063edc9af951461049d578063f4b9fa75146104a5576101d5565b8063af6bfe4a14610405578063c829335f1461040d578063c926c52e14610415578063cdeb1ccd1461041d576101d5565b80639137c1a7116100de5780639137c1a7146103b5578063975057e7146103db57806398528548146103e35780639ac40564146103fd576101d5565b80636a4874a1146103535780637764b4d21461035b5780637f67b0ff14610381578063841af24414610389576101d5565b806336e9332d1161018757806340c8e2db1161015657806340c8e2db1461027f578063596fa9e31461033b5780635aa6e675146103435780635fbc10311461034b576101d5565b806336e9332d1461025f5780633cdc5389146102675780633e413bee1461026f5780633fc8cef314610277576101d5565b80630a087903146101da57806310445d12146101fe578063109d0af8146102235780631521e7f11461022b57806317e3a3d5146102475780632f48ab7d1461024f578063327107f714610257575b600080fd5b6101e26104ad565b604080516001600160a01b039092168252519081900360200190f35b6102216004803603604081101561021457600080fd5b50803590602001356104c5565b005b6101e2610604565b61023361061c565b604080519115158252519081900360200190f35b6101e2610625565b6101e261063d565b6101e2610655565b6101e2610664565b6101e2610673565b6101e261068b565b6101e26106a3565b6102216004803603606081101561029557600080fd5b6001600160a01b0382358116926020810135909116918101906060810160408201356401000000008111156102c957600080fd5b8201836020820111156102db57600080fd5b803590602001918460208302840111640100000000831117156102fd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506106bb945050505050565b6101e261087a565b6101e2610892565b6101e2610913565b6101e261092b565b6102216004803603602081101561037157600080fd5b50356001600160a01b0316610943565b6101e2610b36565b6102216004803603604081101561039f57600080fd5b506001600160a01b038135169060200135610b45565b610221600480360360208110156103cb57600080fd5b50356001600160a01b03166111b3565b6101e26112e9565b6103eb6112f8565b60408051918252519081900360200190f35b6101e26112fe565b6101e261130d565b6101e2611325565b6103eb611339565b6101e26004803603606081101561043357600080fd5b506001600160a01b0381358116916020810135909116906040013561133f565b610221600480360360a081101561046957600080fd5b5080359060208101359060408101351515906001600160a01b0360608201358116916080013516611381565b6101e26114e8565b6101e26114f7565b6101e261150f565b736b3595068778dd592e39a122f4f5a5cf09c90fe281565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561051057600080fd5b505afa158015610524573d6000803e3d6000fd5b505050506040513d602081101561053a57600080fd5b505161057e576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b818110156105bd5760405162461bcd60e51b815260040180806020018281038252602c815260200180611d85602c913960400191505060405180910390fd5b806105f95760405162461bcd60e51b8152600401808060200182810382526022815260200180611e046022913960400191505060405180910390fd5b600491909155600555565b73c00e94cb662c3520282e6f5717214004a7f2688881565b60065460ff1681565b73df5e0e81dff6faf3a7e52ba697820c5e32d806a881565b73dac17f958d2ee523a2206206994597c13d831ec781565b6008546001600160a01b031681565b6001546001600160a01b031681565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561070657600080fd5b505afa15801561071a573d6000803e3d6000fd5b505050506040513d602081101561073057600080fd5b5051610774576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b8060008151811061078157fe5b60200260200101516001600160a01b0316836001600160a01b0316146107d85760405162461bcd60e51b815260040180806020018281038252603b815260200180611e26603b913960400191505060405180910390fd5b806001825103815181106107e857fe5b60200260200101516001600160a01b0316826001600160a01b03161461083f5760405162461bcd60e51b8152600401808060200182810382526038815260200180611e616038913960400191505060405180910390fd5b6001600160a01b0380841660009081526002602090815260408083209386168352928152919020825161087492840190611cd4565b50505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60008060009054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156108e157600080fd5b505afa1580156108f5573d6000803e3d6000fd5b505050506040513d602081101561090b57600080fd5b505190505b90565b73eb4c2781e4eba804ce9a9803c67d0893436bb27d81565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561098e57600080fd5b505afa1580156109a2573d6000803e3d6000fd5b505050506040513d60208110156109b857600080fd5b50516109fc576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b806001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3557600080fd5b505afa158015610a49573d6000803e3d6000fd5b505050506040513d6020811015610a5f57600080fd5b50516001546001600160a01b03908116911614610ac3576040805162461bcd60e51b815260206004820152601e60248201527f526577617264706f6f6c277320746f6b656e206973206e6f74204641524d0000604482015290519081900360640190fd5b600980546001600160a01b03199081166001600160a01b038481169182179093556001546008805491851691909316179182905560408051929093168252602082015281517f250f0cc7fc2ed10e8df5e112b69b17c584e0a8b07f66ffe24a5d03e1731193ca929181900390910190a150565b6003546001600160a01b031681565b60085481906001600160a01b0316610b5d57506111af565b6001546001600160a01b0384811691161415610bff57600954610b95906001600160a01b03858116913391168563ffffffff61152716565b60095460408051633c6b16ab60e01b81526004810185905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b158015610be257600080fd5b505af1158015610bf6573d6000803e3d6000fd5b505050506111ad565b60045415801590610c13575060065460ff16155b15610dd0576007546001600160a01b0316610c5f5760405162461bcd60e51b8152600401808060200182810382526027815260200180611d5e6027913960400191505060405180910390fd5b6000610c88600554610c7c6004548661158190919063ffffffff16565b9063ffffffff6115e316565b9050610c9a838263ffffffff61162516565b6001600160a01b03808616600090815260026020908152604080832060065461010090049094168352929052205490925060011015610dac57610cee6001600160a01b03851633308463ffffffff61152716565b600654610d0b90859061010090046001600160a01b031683611667565b600754600654604080516370a0823160e01b81523060048201529051610da7936001600160a01b0390811693610100900416916370a08231916024808301926020929190829003018186803b158015610d6357600080fd5b505afa158015610d77573d6000803e3d6000fd5b505050506040513d6020811015610d8d57600080fd5b505160065461010090046001600160a01b03169190611883565b610dce565b600754610dce906001600160a01b03868116913391168463ffffffff61152716565b505b6001600160a01b038084166000908152600260209081526040808320600180549095168452909152902054111561117657610e1c6001600160a01b03841633308463ffffffff61152716565b604080516370a0823160e01b815230600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b158015610e6657600080fd5b505afa158015610e7a573d6000803e3d6000fd5b505050506040513d6020811015610e9057600080fd5b5051600154909150610ead9085906001600160a01b031683611667565b60045415801590610ec0575060065460ff165b1561106d576000610f76600554610c7c600454600160009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f3e57600080fd5b505afa158015610f52573d6000803e3d6000fd5b505050506040513d6020811015610f6857600080fd5b50519063ffffffff61158116565b600154600354919250610f96916001600160a01b03918216911683611667565b600354604080516370a0823160e01b815230600482015290516001600160a01b03909216916342966c689183916370a0823191602480820192602092909190829003018186803b158015610fe957600080fd5b505afa158015610ffd573d6000803e3d6000fd5b505050506040513d602081101561101357600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b50505050505b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156110b857600080fd5b505afa1580156110cc573d6000803e3d6000fd5b505050506040513d60208110156110e257600080fd5b505160095460015491925061110a916001600160a01b0390811691168363ffffffff61188316565b60095460408051633c6b16ab60e01b81526004810184905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b15801561115757600080fd5b505af115801561116b573d6000803e3d6000fd5b5050505050506111ad565b60405162461bcd60e51b8152600401808060200182810382526032815260200180611dd26032913960400191505060405180910390fd5b505b5050565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b1580156111fe57600080fd5b505afa158015611212573d6000803e3d6000fd5b505050506040513d602081101561122857600080fd5b505161126c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0381166112c7576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b60055481565b6007546001600160a01b031681565b7388ef27e69108b2633f8e1c184cc37940a075cc0281565b60065461010090046001600160a01b031681565b60045481565b6002602052826000526040600020602052816000526040600020818154811061136457fe5b6000918252602090912001546001600160a01b0316925083915050565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b1580156113cc57600080fd5b505afa1580156113e0573d6000803e3d6000fd5b505050506040513d60208110156113f657600080fd5b505161143a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b038116611495576040805162461bcd60e51b815260206004820152601d60248201527f5f677261696e4275796261636b5265736572766520697320656d707479000000604482015290519081900360640190fd5b61149f85856104c5565b6006805460ff191693151593909317610100600160a81b0319166101006001600160a01b039384160217909255600780546001600160a01b031916929091169190911790555050565b6009546001600160a01b031681565b731f9840a85d5af5bf1d1762f925bdaddc4201f98481565b736b175474e89094c44da98b954eedeac495271d0f81565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526108749085906118d1565b600082611590575060006115dd565b8282028284828161159d57fe5b04146115da5760405162461bcd60e51b8152600401808060200182810382526021815260200180611db16021913960400191505060405180910390fd5b90505b92915050565b60006115da83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611a89565b60006115da83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b2b565b80156111ad5761169c6001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d600063ffffffff611b8516565b6116ca6001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d8363ffffffff611b8516565b6001600160a01b038381166000908152600260209081526040808320938616835292905281902090516338ed173960e01b8152600481018381526001602483018190523060648401819052426084850181905260a060448601908152865460a48701819052737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978a9791959493919260c4909101908690801561179057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611772575b50509650505050505050600060405180830381600087803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156117f157600080fd5b810190808051604051939291908464010000000082111561181157600080fd5b90830190602082018581111561182657600080fd5b825186602082028301116401000000008211171561184357600080fd5b82525081516020918201928201910280838360005b83811015611870578181015183820152602001611858565b5050505090500160405250505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111ad9084905b6118e3826001600160a01b0316611c98565b611934576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106119725780518252601f199092019160209182019101611953565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146119d4576040519150601f19603f3d011682016040523d82523d6000602084013e6119d9565b606091505b509150915081611a30576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561087457808060200190516020811015611a4c57600080fd5b50516108745760405162461bcd60e51b815260040180806020018281038252602a815260200180611e99602a913960400191505060405180910390fd5b60008183611b155760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ada578181015183820152602001611ac2565b50505050905090810190601f168015611b075780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611b2157fe5b0495945050505050565b60008184841115611b7d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611ada578181015183820152602001611ac2565b505050900390565b801580611c0b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d6020811015611c0757600080fd5b5051155b611c465760405162461bcd60e51b8152600401808060200182810382526036815260200180611ec36036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526111ad9084906118d1565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611ccc57508115155b949350505050565b828054828255906000526020600020908101928215611d29579160200282015b82811115611d2957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cf4565b50611d35929150611d39565b5090565b61091091905b80821115611d355780546001600160a01b0319168155600101611d3f56fe677261696e4275796261636b526573657276652073686f756c64206e6f7420626520656d7074796e756d657261746f722063616e6e6f742062652067726561746572207468616e2064656e6f6d696e61746f72536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466565526577617264466f727761726465723a206c69717569646174696f6e207061746820646f65736e27742065786973745f677261696e536861726544656e6f6d696e61746f722063616e6e6f74206265203054686520666972737420746f6b656e206f662074686520556e697377617020726f757465206d757374206265207468652066726f6d20746f6b656e546865206c61737420746f6b656e206f662074686520556e697377617020726f757465206d7573742062652074686520746f20746f6b656e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582003949719167fd56a8ff23cbbe73523e717eea18a37c571afbba8eae7adbf22df64736f6c63430005100032f4f699a1ef35e64890828cc562d137cceeab28af8455567ef14b6ec385c8e441000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2b1c2a895b81f98ee8aadc4d2e6de299902d38600ad58ce7d06c7d9ac3e628c5e6575c976cf8267b8770893910b28b78a67c443f27c3f9123b96f7fa9e6cb7c39b7598821b71eb990d952f174dec3507a6d48dc93be8e23cae785c98ca310bfbb1f1f62a662cb3c24a227ab64593a72f29feee836ab4c9391310868e59c83371af53764ef467a523836eed4cae6d928d90afd7d5f3775032e3e005725ca6bf557000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48f02f5385b52432c1a270c20c346d380219f286755cbd16bede4ce0fb454a4722de032e96a833a2191f55c5766e34554d9b07734477ea9cb69c40158c1078e793e517c4179bc6ad5c9141169946bd41183f7f21152e443161d43614c8054f40e63459054d09ae8631455b798b2b5d106e17bb4e68a39d2d2a935f5f1b7253988b000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197000000000000000000000000a0246c9032bc3a600820415ae600c6388619a14d0000000000000000000000006589fe1271a0f29346796c6baf0cdf619e25e58e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101d55760003560e01c80636a4874a11161010f578063af6bfe4a116100a2578063dc7df0a711610071578063dc7df0a714610453578063ec362d4a14610495578063edc9af951461049d578063f4b9fa75146104a5576101d5565b8063af6bfe4a14610405578063c829335f1461040d578063c926c52e14610415578063cdeb1ccd1461041d576101d5565b80639137c1a7116100de5780639137c1a7146103b5578063975057e7146103db57806398528548146103e35780639ac40564146103fd576101d5565b80636a4874a1146103535780637764b4d21461035b5780637f67b0ff14610381578063841af24414610389576101d5565b806336e9332d1161018757806340c8e2db1161015657806340c8e2db1461027f578063596fa9e31461033b5780635aa6e675146103435780635fbc10311461034b576101d5565b806336e9332d1461025f5780633cdc5389146102675780633e413bee1461026f5780633fc8cef314610277576101d5565b80630a087903146101da57806310445d12146101fe578063109d0af8146102235780631521e7f11461022b57806317e3a3d5146102475780632f48ab7d1461024f578063327107f714610257575b600080fd5b6101e26104ad565b604080516001600160a01b039092168252519081900360200190f35b6102216004803603604081101561021457600080fd5b50803590602001356104c5565b005b6101e2610604565b61023361061c565b604080519115158252519081900360200190f35b6101e2610625565b6101e261063d565b6101e2610655565b6101e2610664565b6101e2610673565b6101e261068b565b6101e26106a3565b6102216004803603606081101561029557600080fd5b6001600160a01b0382358116926020810135909116918101906060810160408201356401000000008111156102c957600080fd5b8201836020820111156102db57600080fd5b803590602001918460208302840111640100000000831117156102fd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506106bb945050505050565b6101e261087a565b6101e2610892565b6101e2610913565b6101e261092b565b6102216004803603602081101561037157600080fd5b50356001600160a01b0316610943565b6101e2610b36565b6102216004803603604081101561039f57600080fd5b506001600160a01b038135169060200135610b45565b610221600480360360208110156103cb57600080fd5b50356001600160a01b03166111b3565b6101e26112e9565b6103eb6112f8565b60408051918252519081900360200190f35b6101e26112fe565b6101e261130d565b6101e2611325565b6103eb611339565b6101e26004803603606081101561043357600080fd5b506001600160a01b0381358116916020810135909116906040013561133f565b610221600480360360a081101561046957600080fd5b5080359060208101359060408101351515906001600160a01b0360608201358116916080013516611381565b6101e26114e8565b6101e26114f7565b6101e261150f565b736b3595068778dd592e39a122f4f5a5cf09c90fe281565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561051057600080fd5b505afa158015610524573d6000803e3d6000fd5b505050506040513d602081101561053a57600080fd5b505161057e576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b818110156105bd5760405162461bcd60e51b815260040180806020018281038252602c815260200180611d85602c913960400191505060405180910390fd5b806105f95760405162461bcd60e51b8152600401808060200182810382526022815260200180611e046022913960400191505060405180910390fd5b600491909155600555565b73c00e94cb662c3520282e6f5717214004a7f2688881565b60065460ff1681565b73df5e0e81dff6faf3a7e52ba697820c5e32d806a881565b73dac17f958d2ee523a2206206994597c13d831ec781565b6008546001600160a01b031681565b6001546001600160a01b031681565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561070657600080fd5b505afa15801561071a573d6000803e3d6000fd5b505050506040513d602081101561073057600080fd5b5051610774576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b8060008151811061078157fe5b60200260200101516001600160a01b0316836001600160a01b0316146107d85760405162461bcd60e51b815260040180806020018281038252603b815260200180611e26603b913960400191505060405180910390fd5b806001825103815181106107e857fe5b60200260200101516001600160a01b0316826001600160a01b03161461083f5760405162461bcd60e51b8152600401808060200182810382526038815260200180611e616038913960400191505060405180910390fd5b6001600160a01b0380841660009081526002602090815260408083209386168352928152919020825161087492840190611cd4565b50505050565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60008060009054906101000a90046001600160a01b03166001600160a01b0316635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b1580156108e157600080fd5b505afa1580156108f5573d6000803e3d6000fd5b505050506040513d602081101561090b57600080fd5b505190505b90565b73eb4c2781e4eba804ce9a9803c67d0893436bb27d81565b73d533a949740bb3306d119cc777fa900ba034cd5281565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b15801561098e57600080fd5b505afa1580156109a2573d6000803e3d6000fd5b505050506040513d60208110156109b857600080fd5b50516109fc576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b806001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3557600080fd5b505afa158015610a49573d6000803e3d6000fd5b505050506040513d6020811015610a5f57600080fd5b50516001546001600160a01b03908116911614610ac3576040805162461bcd60e51b815260206004820152601e60248201527f526577617264706f6f6c277320746f6b656e206973206e6f74204641524d0000604482015290519081900360640190fd5b600980546001600160a01b03199081166001600160a01b038481169182179093556001546008805491851691909316179182905560408051929093168252602082015281517f250f0cc7fc2ed10e8df5e112b69b17c584e0a8b07f66ffe24a5d03e1731193ca929181900390910190a150565b6003546001600160a01b031681565b60085481906001600160a01b0316610b5d57506111af565b6001546001600160a01b0384811691161415610bff57600954610b95906001600160a01b03858116913391168563ffffffff61152716565b60095460408051633c6b16ab60e01b81526004810185905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b158015610be257600080fd5b505af1158015610bf6573d6000803e3d6000fd5b505050506111ad565b60045415801590610c13575060065460ff16155b15610dd0576007546001600160a01b0316610c5f5760405162461bcd60e51b8152600401808060200182810382526027815260200180611d5e6027913960400191505060405180910390fd5b6000610c88600554610c7c6004548661158190919063ffffffff16565b9063ffffffff6115e316565b9050610c9a838263ffffffff61162516565b6001600160a01b03808616600090815260026020908152604080832060065461010090049094168352929052205490925060011015610dac57610cee6001600160a01b03851633308463ffffffff61152716565b600654610d0b90859061010090046001600160a01b031683611667565b600754600654604080516370a0823160e01b81523060048201529051610da7936001600160a01b0390811693610100900416916370a08231916024808301926020929190829003018186803b158015610d6357600080fd5b505afa158015610d77573d6000803e3d6000fd5b505050506040513d6020811015610d8d57600080fd5b505160065461010090046001600160a01b03169190611883565b610dce565b600754610dce906001600160a01b03868116913391168463ffffffff61152716565b505b6001600160a01b038084166000908152600260209081526040808320600180549095168452909152902054111561117657610e1c6001600160a01b03841633308463ffffffff61152716565b604080516370a0823160e01b815230600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b158015610e6657600080fd5b505afa158015610e7a573d6000803e3d6000fd5b505050506040513d6020811015610e9057600080fd5b5051600154909150610ead9085906001600160a01b031683611667565b60045415801590610ec0575060065460ff165b1561106d576000610f76600554610c7c600454600160009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f3e57600080fd5b505afa158015610f52573d6000803e3d6000fd5b505050506040513d6020811015610f6857600080fd5b50519063ffffffff61158116565b600154600354919250610f96916001600160a01b03918216911683611667565b600354604080516370a0823160e01b815230600482015290516001600160a01b03909216916342966c689183916370a0823191602480820192602092909190829003018186803b158015610fe957600080fd5b505afa158015610ffd573d6000803e3d6000fd5b505050506040513d602081101561101357600080fd5b5051604080516001600160e01b031960e085901b168152600481019290925251602480830192600092919082900301818387803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b50505050505b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156110b857600080fd5b505afa1580156110cc573d6000803e3d6000fd5b505050506040513d60208110156110e257600080fd5b505160095460015491925061110a916001600160a01b0390811691168363ffffffff61188316565b60095460408051633c6b16ab60e01b81526004810184905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b15801561115757600080fd5b505af115801561116b573d6000803e3d6000fd5b5050505050506111ad565b60405162461bcd60e51b8152600401808060200182810382526032815260200180611dd26032913960400191505060405180910390fd5b505b5050565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b1580156111fe57600080fd5b505afa158015611212573d6000803e3d6000fd5b505050506040513d602081101561122857600080fd5b505161126c576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b0381166112c7576040805162461bcd60e51b815260206004820152601e60248201527f6e65772073746f726167652073686f756c646e277420626520656d7074790000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b60055481565b6007546001600160a01b031681565b7388ef27e69108b2633f8e1c184cc37940a075cc0281565b60065461010090046001600160a01b031681565b60045481565b6002602052826000526040600020602052816000526040600020818154811061136457fe5b6000918252602090912001546001600160a01b0316925083915050565b600054604080516337b87c3960e21b815233600482015290516001600160a01b039092169163dee1f0e491602480820192602092909190829003018186803b1580156113cc57600080fd5b505afa1580156113e0573d6000803e3d6000fd5b505050506040513d60208110156113f657600080fd5b505161143a576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420676f7665726e616e636560901b604482015290519081900360640190fd5b6001600160a01b038116611495576040805162461bcd60e51b815260206004820152601d60248201527f5f677261696e4275796261636b5265736572766520697320656d707479000000604482015290519081900360640190fd5b61149f85856104c5565b6006805460ff191693151593909317610100600160a81b0319166101006001600160a01b039384160217909255600780546001600160a01b031916929091169190911790555050565b6009546001600160a01b031681565b731f9840a85d5af5bf1d1762f925bdaddc4201f98481565b736b175474e89094c44da98b954eedeac495271d0f81565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526108749085906118d1565b600082611590575060006115dd565b8282028284828161159d57fe5b04146115da5760405162461bcd60e51b8152600401808060200182810382526021815260200180611db16021913960400191505060405180910390fd5b90505b92915050565b60006115da83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611a89565b60006115da83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b2b565b80156111ad5761169c6001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d600063ffffffff611b8516565b6116ca6001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d8363ffffffff611b8516565b6001600160a01b038381166000908152600260209081526040808320938616835292905281902090516338ed173960e01b8152600481018381526001602483018190523060648401819052426084850181905260a060448601908152865460a48701819052737a250d5630b4cf539739df2c5dacb4c659f2488d976338ed1739978a9791959493919260c4909101908690801561179057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611772575b50509650505050505050600060405180830381600087803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156117f157600080fd5b810190808051604051939291908464010000000082111561181157600080fd5b90830190602082018581111561182657600080fd5b825186602082028301116401000000008211171561184357600080fd5b82525081516020918201928201910280838360005b83811015611870578181015183820152602001611858565b5050505090500160405250505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111ad9084905b6118e3826001600160a01b0316611c98565b611934576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106119725780518252601f199092019160209182019101611953565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146119d4576040519150601f19603f3d011682016040523d82523d6000602084013e6119d9565b606091505b509150915081611a30576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561087457808060200190516020811015611a4c57600080fd5b50516108745760405162461bcd60e51b815260040180806020018281038252602a815260200180611e99602a913960400191505060405180910390fd5b60008183611b155760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ada578181015183820152602001611ac2565b50505050905090810190601f168015611b075780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611b2157fe5b0495945050505050565b60008184841115611b7d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611ada578181015183820152602001611ac2565b505050900390565b801580611c0b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d6020811015611c0757600080fd5b5051155b611c465760405162461bcd60e51b8152600401808060200182810382526036815260200180611ec36036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526111ad9084906118d1565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611ccc57508115155b949350505050565b828054828255906000526020600020908101928215611d29579160200282015b82811115611d2957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cf4565b50611d35929150611d39565b5090565b61091091905b80821115611d355780546001600160a01b0319168155600101611d3f56fe677261696e4275796261636b526573657276652073686f756c64206e6f7420626520656d7074796e756d657261746f722063616e6e6f742062652067726561746572207468616e2064656e6f6d696e61746f72536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77466565526577617264466f727761726465723a206c69717569646174696f6e207061746820646f65736e27742065786973745f677261696e536861726544656e6f6d696e61746f722063616e6e6f74206265203054686520666972737420746f6b656e206f662074686520556e697377617020726f757465206d757374206265207468652066726f6d20746f6b656e546865206c61737420746f6b656e206f662074686520556e697377617020726f757465206d7573742062652074686520746f20746f6b656e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a7231582003949719167fd56a8ff23cbbe73523e717eea18a37c571afbba8eae7adbf22df64736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197000000000000000000000000a0246c9032bc3a600820415ae600c6388619a14d0000000000000000000000006589fe1271a0f29346796c6baf0cdf619e25e58e
-----Decoded View---------------
Arg [0] : _storage (address): 0xc95CbE4ca30055c787CB784BE99D6a8494d0d197
Arg [1] : _farm (address): 0xa0246c9032bC3A600820415aE600c6388619A14D
Arg [2] : _grain (address): 0x6589fe1271A0F29346796C6bAf0cdF619e25e58e
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c95cbe4ca30055c787cb784be99d6a8494d0d197
Arg [1] : 000000000000000000000000a0246c9032bc3a600820415ae600c6388619a14d
Arg [2] : 0000000000000000000000006589fe1271a0f29346796c6baf0cdf619e25e58e
Deployed Bytecode Sourcemap
36893:10435:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36893:10435:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37470:83;;;:::i;:::-;;;;-1:-1:-1;;;;;37470:83:0;;;;;;;;;;;;;;46143:419;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46143:419:0;;;;;;;:::i;:::-;;37731:82;;;:::i;38559:33::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;37906:82;;;:::i;37117:::-;;;:::i;38733:26::-;;;:::i;37004:19::-;;;:::i;37294:82::-;;;:::i;37030:::-;;;:::i;37995:::-;;;:::i;41726:400::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;41726:400:0;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;41726:400:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41726:400:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41726:400:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41726:400:0;;-1:-1:-1;41726:400:0;;-1:-1:-1;;;;;41726:400:0:i;38803:93::-;;;:::i;1462:90::-;;;:::i;37381:84::-;;;:::i;37818:81::-;;;:::i;41189:318::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41189:318:0;-1:-1:-1;;;;;41189:318:0;;:::i;38292:20::-;;;:::i;42251:3409::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42251:3409:0;;;;;;;;:::i;1292:164::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1292:164:0;-1:-1:-1;;;;;1292:164:0;;:::i;1008:20::-;;;:::i;38356:36::-;;;:::i;:::-;;;;;;;;;;;;;;;;38633:34;;;:::i;37558:82::-;;;:::i;38597:31::-;;;:::i;38317:34::-;;;:::i;38084:72::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;38084:72:0;;;;;;;;;;;;;;;;;:::i;46568:755::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;46568:755:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46568:755:0;;;;;;;;;;;;:::i;38764:32::-;;;:::i;37645:81::-;;;:::i;37204:::-;;;:::i;37470:83::-;37510:42;37470:83;:::o;46143:419::-;1223:5;;:30;;;-1:-1:-1;;;1223:30:0;;1242:10;1223:30;;;;;;-1:-1:-1;;;;;1223:5:0;;;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;1223:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1223:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1223:30:0;1215:57;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;;;;46298:20;46272:22;:46;;46264:103;;;;-1:-1:-1;;;46264:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46382:27;46374:74;;;;-1:-1:-1;;;46374:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46461:19;:42;;;;46510:21;:46;46143:419::o;37731:82::-;37770:42;37731:82;:::o;38559:33::-;;;;;;:::o;37906:82::-;37945:42;37906:82;:::o;37117:::-;37156:42;37117:82;:::o;38733:26::-;;;-1:-1:-1;;;;;38733:26:0;;:::o;37004:19::-;;;-1:-1:-1;;;;;37004:19:0;;:::o;37294:82::-;37333:42;37294:82;:::o;37030:::-;37069:42;37030:82;:::o;37995:::-;38034:42;37995:82;:::o;41726:400::-;1223:5;;:30;;;-1:-1:-1;;;1223:30:0;;1242:10;1223:30;;;;;;-1:-1:-1;;;;;1223:5:0;;;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;1223:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1223:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1223:30:0;1215:57;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;;;;41859:13;41873:1;41859:16;;;;;;;;;;;;;;-1:-1:-1;;;;;41851:24:0;:4;-1:-1:-1;;;;;41851:24:0;;41843:103;;;;-1:-1:-1;;;41843:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41967:13;42004:1;41981:13;:20;:24;41967:39;;;;;;;;;;;;;;-1:-1:-1;;;;;41961:45:0;:2;-1:-1:-1;;;;;41961:45:0;;41953:121;;;;-1:-1:-1;;;41953:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42081:19:0;;;;;;;:13;:19;;;;;;;;:23;;;;;;;;;;;:39;;;;;;;;:::i;:::-;;41726:400;;;:::o;38803:93::-;38853:42;38803:93;:::o;1462:90::-;1505:7;1528:5;;;;;;;;;-1:-1:-1;;;;;1528:5:0;-1:-1:-1;;;;;1528:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1528:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1528:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1528:18:0;;-1:-1:-1;1462:90:0;;:::o;37381:84::-;37422:42;37381:84;:::o;37818:81::-;37856:42;37818:81;:::o;41189:318::-;1223:5;;:30;;;-1:-1:-1;;;1223:30:0;;1242:10;1223:30;;;;;;-1:-1:-1;;;;;1223:5:0;;;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;1223:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1223:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1223:30:0;1215:57;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;;;;41345:5;-1:-1:-1;;;;;41333:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41333:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41333:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41333:32:0;41325:4;;-1:-1:-1;;;;;41325:4:0;;;:40;;;41317:83;;;;;-1:-1:-1;;;41317:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41407:17;:25;;-1:-1:-1;;;;;;41407:25:0;;;-1:-1:-1;;;;;41407:25:0;;;;;;;;;-1:-1:-1;41453:4:0;41439:11;:18;;41453:4;;;41439:18;;;;;;;;;41469:32;;;41482:11;;;;41469:32;;;;;;;;;;;;;;;;;;;41189:318;:::o;38292:20::-;;;-1:-1:-1;;;;;38292:20:0;;:::o;42251:3409::-;42491:11;;42357:7;;-1:-1:-1;;;;;42491:11:0;42487:95;;42527:7;;;42487:95;42602:4;;-1:-1:-1;;;;;42592:14:0;;;42602:4;;42592:14;42588:3067;;;42959:17;;42915:71;;-1:-1:-1;;;;;42915:31:0;;;;42947:10;;42959:17;42978:7;42915:71;:31;:71;:::i;:::-;43007:17;;42995:58;;;-1:-1:-1;;;42995:58:0;;;;;;;;;;-1:-1:-1;;;;;43007:17:0;;;;42995:49;;:58;;;;;43007:17;;42995:58;;;;;;;;43007:17;;42995:58;;;5:2:-1;;;;30:1;27;20:12;5:2;42995:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42995:58:0;;;;42588:3067;;;43194:19;;:24;;;;:50;;-1:-1:-1;43223:21:0;;;;43222:22;43194:50;43190:1049;;;43265:19;;-1:-1:-1;;;;;43265:19:0;43257:85;;;;-1:-1:-1;;;43257:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43353:21;43377:59;43414:21;;43377:32;43389:19;;43377:7;:11;;:32;;;;:::i;:::-;:36;:59;:36;:59;:::i;:::-;43353:83;-1:-1:-1;43465:26:0;:7;43353:83;43465:26;:11;:26;:::i;:::-;-1:-1:-1;;;;;43731:21:0;;;;;;;:13;:21;;;;;;;;43753:16;;;;;;;;43731:39;;;;;;:46;43447:44;;-1:-1:-1;43780:1:0;-1:-1:-1;43728:502:0;;;43795:73;-1:-1:-1;;;;;43795:31:0;;43827:10;43847:4;43854:13;43795:73;:31;:73;:::i;:::-;43899:16;;43881:50;;43891:6;;43899:16;;;-1:-1:-1;;;;;43899:16:0;43917:13;43881:9;:50::i;:::-;44037:19;;44065:16;;44058:49;;;-1:-1:-1;;;44058:49:0;;44101:4;44058:49;;;;;;43999:109;;-1:-1:-1;;;;;44037:19:0;;;;;44065:16;;;;44058:34;;:49;;;;;;;;;;;;;;44065:16;44058:49;;;5:2:-1;;;;30:1;27;20:12;5:2;44058:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44058:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44058:49:0;44006:16;;;;;-1:-1:-1;;;;;44006:16:0;;;43999:37;:109::i;:::-;43728:502;;;44183:19;;44139:79;;-1:-1:-1;;;;;44139:31:0;;;;44171:10;;44183:19;44204:13;44139:79;:31;:79;:::i;:::-;43190:1049;;-1:-1:-1;;;;;44297:21:0;;;;;;;:13;:21;;;;;;;;44334:1;44319:4;;;;;44297:27;;;;;;;:34;:38;44293:1355;;;44348:75;-1:-1:-1;;;;;44348:31:0;;44380:10;44400:4;44407:15;44348:75;:31;:75;:::i;:::-;44458:39;;;-1:-1:-1;;;44458:39:0;;44491:4;44458:39;;;;;;44434:21;;-1:-1:-1;;;;;44458:24:0;;;;;:39;;;;;;;;;;;;;;;:24;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;44458:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44458:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44458:39:0;44526:4;;44458:39;;-1:-1:-1;44508:38:0;;44518:6;;-1:-1:-1;;;;;44526:4:0;44458:39;44508:9;:38::i;:::-;44647:19;;:24;;;;:49;;-1:-1:-1;44675:21:0;;;;44647:49;44644:381;;;44711:24;44738:91;44807:21;;44738:64;44782:19;;44746:4;;;;;;;;;-1:-1:-1;;;;;44746:4:0;-1:-1:-1;;;;;44739:22:0;;44770:4;44739:37;;;;;;;;;;;;;-1:-1:-1;;;;;44739:37:0;-1:-1:-1;;;;;44739:37:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44739:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44739:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44739:37:0;;44738:64;:43;:64;:::i;:91::-;44852:4;;44858:5;;44711:118;;-1:-1:-1;44842:40:0;;-1:-1:-1;;;;;44852:4:0;;;;44858:5;44711:118;44842:9;:40::i;:::-;44962:5;;44974:38;;;-1:-1:-1;;;44974:38:0;;45006:4;44974:38;;;;;;-1:-1:-1;;;;;44962:5:0;;;;44948:25;;44962:5;;44974:23;;:38;;;;;;;;;;;;;;;44962:5;44974:38;;;5:2:-1;;;;30:1;27;20:12;5:2;44974:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44974:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44974:38:0;44948:65;;;-1:-1:-1;;;;;;44948:65:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44948:65:0;;;;;;;-1:-1:-1;44948:65:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;44948:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44948:65:0;;;;44644:381;;45123:4;;45116:37;;;-1:-1:-1;;;45116:37:0;;45147:4;45116:37;;;;;;45084:29;;-1:-1:-1;;;;;45123:4:0;;45116:22;;:37;;;;;;;;;;;;;;45123:4;45116:37;;;5:2:-1;;;;30:1;27;20:12;5:2;45116:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45116:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45116:37:0;45190:17;;;45171:4;45116:37;;-1:-1:-1;45164:67:0;;-1:-1:-1;;;;;45171:4:0;;;;45190:17;45116:37;45164:67;:25;:67;:::i;:::-;45254:17;;45242:72;;;-1:-1:-1;;;45242:72:0;;;;;;;;;;-1:-1:-1;;;;;45254:17:0;;;;45242:49;;:72;;;;;45254:17;;45242:72;;;;;;;;45254:17;;45242:72;;;5:2:-1;;;;30:1;27;20:12;5:2;45242:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45242:72:0;;;;44293:1355;;;;;45577:60;;-1:-1:-1;;;45577:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44293:1355;42251:3409;;;;:::o;1292:164::-;1223:5;;:30;;;-1:-1:-1;;;1223:30:0;;1242:10;1223:30;;;;;;-1:-1:-1;;;;;1223:5:0;;;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;1223:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1223:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1223:30:0;1215:57;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1365:20:0;;1357:63;;;;;-1:-1:-1;;;1357:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1427:5;:23;;-1:-1:-1;;;;;;1427:23:0;-1:-1:-1;;;;;1427:23:0;;;;;;;;;;1292:164::o;1008:20::-;;;-1:-1:-1;;;;;1008:20:0;;:::o;38356:36::-;;;;:::o;38633:34::-;;;-1:-1:-1;;;;;38633:34:0;;:::o;37558:82::-;37597:42;37558:82;:::o;38597:31::-;;;;;;-1:-1:-1;;;;;38597:31:0;;:::o;38317:34::-;;;;:::o;38084:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38084:72:0;;-1:-1:-1;38084:72:0;;-1:-1:-1;;38084:72:0:o;46568:755::-;1223:5;;:30;;;-1:-1:-1;;;1223:30:0;;1242:10;1223:30;;;;;;-1:-1:-1;;;;;1223:5:0;;;;:18;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;1223:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1223:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1223:30:0;1215:57;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;-1:-1:-1;;;1215:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46812:34:0;;46804:76;;;;;-1:-1:-1;;;46804:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47104:66;47125:20;47147:22;47104:20;:66::i;:::-;47179:21;:46;;-1:-1:-1;;47179:46:0;;;;;;;;-1:-1:-1;;;;;;47232:36:0;47179:46;-1:-1:-1;;;;;47232:36:0;;;;;;;;47275:19;:42;;-1:-1:-1;;;;;;47275:42:0;;;;;;;;;;;-1:-1:-1;;46568:755:0:o;38764:32::-;;;-1:-1:-1;;;;;38764:32:0;;:::o;37645:81::-;37683:42;37645:81;:::o;37204:::-;37242:42;37204:81;:::o;13867:204::-;13994:68;;;-1:-1:-1;;;;;13994:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13994:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13968:95:0;;13987:5;;13968:18;:95::i;6724:471::-;6782:7;7027:6;7023:47;;-1:-1:-1;7057:1:0;7050:8;;7023:47;7094:5;;;7098:1;7094;:5;:1;7118:5;;;;;:10;7110:56;;;;-1:-1:-1;;;7110:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7186:1;-1:-1:-1;6724:471:0;;;;;:::o;7663:132::-;7721:7;7748:39;7752:1;7755;7748:39;;;;;;;;;;;;;;;;;:3;:39::i;5808:136::-;5866:7;5893:43;5897:1;5900;5893:43;;;;;;;;;;;;;;;;;:3;:43::i;45666:471::-;45755:17;;45752:380;;45782:45;-1:-1:-1;;;;;45782:25:0;;38853:42;45825:1;45782:45;:25;:45;:::i;:::-;45836:57;-1:-1:-1;;;;;45836:25:0;;38853:42;45879:13;45836:57;:25;:57;:::i;:::-;-1:-1:-1;;;;;46040:20:0;;;;;;;:13;:20;;;;;;;;:25;;;;;;;;;;;45904:220;;-1:-1:-1;;;45904:220:0;;;;;;;;45999:1;45904:220;;;;;;46084:4;45904:220;;;;;;46100:15;45904:220;;;;;;;;;;;;;;;;;;;;;38853:42;;45904:60;;45975:13;;46040:25;;46084:4;46100:15;45904:220;;;;;;;46040:25;;45904:220;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45904:220:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45904:220:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45904:220:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45904:220: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;45904:220: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;45904:220:0;;421:4:-1;412:14;;;;45904:220:0;;;;;412:14:-1;45904:220: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;45904:220:0;;;;;;;;;;;;45666:471;;;:::o;13683:176::-;13792:58;;;-1:-1:-1;;;;;13792:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13792:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13766:85:0;;13785:5;;15722:1114;16326:27;16334:5;-1:-1:-1;;;;;16326:25:0;;:27::i;:::-;16318:71;;;;;-1:-1:-1;;;16318:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16463:12;16477:23;16512:5;-1:-1:-1;;;;;16504:19:0;16524:4;16504: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;;;16504: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;;16462:67:0;;;;16548:7;16540:52;;;;;-1:-1:-1;;;16540:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16609:17;;:21;16605:224;;16751:10;16740:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16740:30:0;16732:85;;;;-1:-1:-1;;;16732:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8325:345;8411:7;8513:12;8506:5;8498:28;;;;-1:-1:-1;;;8498: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;8498:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8537:9;8553:1;8549;:5;;;;;;;8325:345;-1:-1:-1;;;;;8325:345:0:o;6281:192::-;6367:7;6403:12;6395:6;;;;6387:29;;;;-1:-1:-1;;;6387:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6387:29:0;-1:-1:-1;;;6439:5:0;;;6281:192::o;14079:621::-;14449:10;;;14448:62;;-1:-1:-1;14465:39:0;;;-1:-1:-1;;;14465:39:0;;14489:4;14465:39;;;;-1:-1:-1;;;;;14465:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;14465:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14465:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14465:39:0;:44;14448:62;14440:152;;;;-1:-1:-1;;;14440:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14629:62;;;-1:-1:-1;;;;;14629:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;14629:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;14603:89:0;;14622:5;;14603:18;:89::i;10712:619::-;10772:4;11240:20;;11083:66;11280:23;;;;;;:42;;-1:-1:-1;11307:15:0;;;11280:42;11272:51;10712:619;-1:-1:-1;;;;10712:619:0:o;36893:10435::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36893:10435:0;-1:-1:-1;;;;;36893:10435:0;;;;;;;;;;;-1:-1:-1;36893:10435:0;;;;;;;-1:-1:-1;36893:10435:0;;;-1:-1:-1;36893:10435:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;36893:10435:0;;;;;;
Swarm Source
bzzr://03949719167fd56a8ff23cbbe73523e717eea18a37c571afbba8eae7adbf22df
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.