Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 147 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Get Reward | 20468146 | 41 days ago | IN | 0 ETH | 0.00047644 | ||||
Get Reward | 18914969 | 259 days ago | IN | 0 ETH | 0.00211752 | ||||
Get Reward | 18654060 | 295 days ago | IN | 0 ETH | 0.00216838 | ||||
Get Reward | 18355010 | 337 days ago | IN | 0 ETH | 0.00065839 | ||||
Get Reward | 17812728 | 413 days ago | IN | 0 ETH | 0.00199599 | ||||
Get Reward | 17261318 | 490 days ago | IN | 0 ETH | 0.0048539 | ||||
Get Reward | 16969035 | 532 days ago | IN | 0 ETH | 0.00333336 | ||||
Get Reward | 16711931 | 568 days ago | IN | 0 ETH | 0.00507445 | ||||
Get Reward | 16697092 | 570 days ago | IN | 0 ETH | 0.00621367 | ||||
Get Reward | 16468780 | 602 days ago | IN | 0 ETH | 0.0019731 | ||||
Get Reward | 16216100 | 637 days ago | IN | 0 ETH | 0.0013569 | ||||
Get Reward | 16065195 | 658 days ago | IN | 0 ETH | 0.00145899 | ||||
Get Reward | 16015782 | 665 days ago | IN | 0 ETH | 0.0015203 | ||||
Get Reward | 15951217 | 674 days ago | IN | 0 ETH | 0.00167906 | ||||
Get Reward | 15842266 | 689 days ago | IN | 0 ETH | 0.00193637 | ||||
Get Reward | 15451066 | 746 days ago | IN | 0 ETH | 0.00129745 | ||||
Get Reward | 15393046 | 755 days ago | IN | 0 ETH | 0.00141077 | ||||
Get Reward | 15371384 | 759 days ago | IN | 0 ETH | 0.00275281 | ||||
Get Reward | 15340572 | 764 days ago | IN | 0 ETH | 0.00198064 | ||||
Get Reward | 15330938 | 765 days ago | IN | 0 ETH | 0.00080266 | ||||
Get Reward | 15209202 | 784 days ago | IN | 0 ETH | 0.00112859 | ||||
Get Reward | 15087236 | 803 days ago | IN | 0 ETH | 0.001638 | ||||
Get Reward | 15061615 | 807 days ago | IN | 0 ETH | 0.00120666 | ||||
Get Reward | 15001782 | 818 days ago | IN | 0 ETH | 0.00284285 | ||||
Get Reward | 14867163 | 841 days ago | IN | 0 ETH | 0.00217836 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ConvexRewarder
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-02 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUtil { /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } } contract ReentrancyGuard { uint256 private _guardCounter; constructor () internal { _guardCounter = 1; } modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } } interface ICurveGauge { function deposit(uint256) external; function balanceOf(address) external view returns (uint256); function withdraw(uint256) external; function claim_rewards() external; function reward_tokens(uint256) external view returns(address);//v2 function rewarded_token() external view returns(address);//v1 } interface ICurveVoteEscrow { function create_lock(uint256, uint256) external; function increase_amount(uint256) external; function increase_unlock_time(uint256) external; function withdraw() external; function smart_wallet_checker() external view returns (address); } interface IWalletChecker { function check(address) external view returns (bool); } interface IVoting{ function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory); function vote_for_gauge_weights(address,uint256) external; } interface IMinter{ function mint(address) external; } interface IRegistry{ function get_registry() external view returns(address); function get_address(uint256 _id) external view returns(address); function gauge_controller() external view returns(address); function get_lp_token(address) external view returns(address); function get_gauges(address) external view returns(address[10] memory,uint128[10] memory); } interface IStaker{ function deposit(address, address) external; function withdraw(address) external; function withdraw(address, address, uint256) external; function withdrawAll(address, address) external; function createLock(uint256, uint256) external; function increaseAmount(uint256) external; function increaseTime(uint256) external; function release() external; function claimCrv(address) external returns (uint256); function claimRewards(address) external; function claimFees(address,address) external; function setStashAccess(address, bool) external; function vote(uint256,address,bool) external; function voteGaugeWeight(address,uint256) external; function balanceOfPool(address) external view returns (uint256); function operator() external view returns (address); function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory); } interface IRewards{ function stake(address, uint256) external; function stakeFor(address, uint256) external; function withdraw(address, uint256) external; function exit(address) external; function getReward(address) external; function queueNewRewards(uint256) external; function notifyRewardAmount(uint256) external; function addExtraReward(address) external; function stakingToken() external view returns (address); function rewardToken() external view returns(address); function earned(address account) external view returns (uint256); } interface IStash{ function stashRewards() external returns (bool); function processStash() external returns (bool); function claimRewards() external returns (bool); } interface IFeeDistro{ function claim() external; function token() external view returns(address); } interface ITokenMinter{ function mint(address,uint256) external; function burn(address,uint256) external; } interface IDeposit{ function isShutdown() external view returns(bool); function balanceOf(address _account) external view returns(uint256); function totalSupply() external view returns(uint256); function poolInfo(uint256) external view returns(address,address,address,address,address, bool); function rewardClaimed(uint256,address,uint256) external; function withdrawTo(uint256,uint256,address) external; function claimRewards(uint256,address) external returns(bool); function rewardArbitrator() external returns(address); function setGaugeRedirect(uint256 _pid) external returns(bool); } interface ICrvDeposit{ function deposit(uint256, bool) external; function lockIncentive() external view returns(uint256); } interface IRewardFactory{ function setAccess(address,bool) external; function CreateCrvRewards(uint256,address) external returns(address); function CreateTokenRewards(address,address,address) external returns(address); function activeRewardCount(address) external view returns(uint256); function addActiveReward(address,uint256) external returns(bool); function removeActiveReward(address,uint256) external returns(bool); } interface IStashFactory{ function CreateStash(uint256,address,address,uint256) external returns(address); } interface ITokenFactory{ function CreateDepositToken(address) external returns(address); } interface IPools{ function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool); function shutdownPool(uint256 _pid) external returns(bool); function poolInfo(uint256) external view returns(address,address,address,address,address,bool); function poolLength() external view returns (uint256); function gaugeMap(address) external view returns(bool); function setPoolManager(address _poolM) external; } interface IVestedEscrow{ function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool); } // File: @openzeppelin\contracts\token\ERC20\IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: node_modules\@openzeppelin\contracts\math\SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: node_modules\@openzeppelin\contracts\utils\Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin\contracts\token\ERC20\SafeERC20.sol pragma solidity >=0.6.0 <0.8.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 IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts\interfaces\ISushiRewarder.sol pragma solidity 0.6.12; interface ISushiRewarder { using SafeERC20 for IERC20; function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external; function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external view returns (IERC20[] memory, uint256[] memory); } // File: contracts\ConvexRewarder.sol pragma solidity 0.6.12; /** *Submitted for verification at Etherscan.io on 2020-07-17 */ /* ____ __ __ __ _ / __/__ __ ___ / /_ / / ___ / /_ (_)__ __ _\ \ / // // _ \/ __// _ \/ -_)/ __// / \ \ / /___/ \_, //_//_/\__//_//_/\__/ \__//_/ /_\_\ /___/ * Docs: https://docs.synthetix.io/ * * * MIT License * =========== * * Copyright (c) 2020 Synthetix * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */ interface IMasterChefV2 { function lpToken(uint i) external view returns (IERC20); } interface IConvexChef{ function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256); function claim(uint256 _pid, address _account) external; function deposit(uint256 _pid, uint256 _amount) external; } contract ConvexRewarder is ISushiRewarder{ using SafeERC20 for IERC20; using SafeMath for uint256; IERC20 public immutable rewardToken; IERC20 public immutable stakingToken; uint256 public constant duration = 5 days; address public immutable rewardManager; address public immutable sushiMasterChef; address public immutable convexMasterChef; uint256 public immutable chefPid; uint256 public periodFinish = 0; uint256 public rewardRate = 0; uint256 public lastUpdateTime; uint256 public rewardPerTokenStored; uint256 public currentRewards = 0; uint256 private _totalSupply; uint256 public sushiPid; uint256 public previousRewardDebt = 0; bool public isInit = false; mapping(address => uint256) private _balances; mapping(address => uint256) private _sushiBalances; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; address[] public extraRewards; event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); constructor( address stakingToken_, address rewardToken_, address rewardManager_, address sushiMasterChef_, address convexMasterChef_, uint256 chefPid_ ) public { stakingToken = IERC20(stakingToken_); rewardToken = IERC20(rewardToken_); rewardManager = rewardManager_; sushiMasterChef = sushiMasterChef_; convexMasterChef = convexMasterChef_; chefPid = chefPid_; } //stake a dummy token into convex chef to start earning rewards //initiate a week's worth of awards function init(IERC20 dummyToken) external { require(!isInit,"already init"); isInit = true; uint256 balance = dummyToken.balanceOf(msg.sender); require(balance != 0, "Balance must exceed 0"); dummyToken.safeTransferFrom(msg.sender, address(this), balance); dummyToken.approve(convexMasterChef, balance); IConvexChef(convexMasterChef).deposit(chefPid, balance); initRewards(); } //claim from convex master chef and add to rewards function harvestFromMasterChef() public { IConvexChef(convexMasterChef).claim(chefPid, address(this)); notifyRewardAmount(); } function totalSupply() public view returns (uint256) { return _totalSupply; } function balanceOf(address account) public view returns (uint256) { return _balances[account].add(_sushiBalances[account]); } function localBalanceOf(address account) public view returns (uint256) { return _balances[account]; } function sushiBalanceOf(address account) public view returns (uint256) { return _sushiBalances[account]; } function extraRewardsLength() external view returns (uint256) { return extraRewards.length; } function addExtraReward(address _reward) external { require(msg.sender == rewardManager, "!authorized"); require(_reward != address(0),"!reward setting"); extraRewards.push(_reward); } function clearExtraRewards() external{ require(msg.sender == rewardManager, "!authorized"); delete extraRewards; } modifier updateReward(address account) { rewardPerTokenStored = rewardPerToken(); lastUpdateTime = lastTimeRewardApplicable(); if (account != address(0)) { rewards[account] = earned(account); userRewardPerTokenPaid[account] = rewardPerTokenStored; } _; } function lastTimeRewardApplicable() public view returns (uint256) { return MathUtil.min(block.timestamp, periodFinish); } function rewardPerToken() public view returns (uint256) { uint256 supply = totalSupply(); if (supply == 0) { return rewardPerTokenStored; } return rewardPerTokenStored.add( lastTimeRewardApplicable() .sub(lastUpdateTime) .mul(rewardRate) .mul(1e18) .div(supply) ); } function earned(address account) public view returns (uint256) { return _balances[account].add(_sushiBalances[account]) .mul(rewardPerToken().sub(userRewardPerTokenPaid[account])) .div(1e18) .add(rewards[account]); } function stake(uint256 _amount) public updateReward(msg.sender) { require(_amount > 0, 'RewardPool : Cannot stake 0'); //check if new rewards should be pulled from convex chef checkHarvest(); //also stake to linked rewards uint256 length = extraRewards.length; for(uint i=0; i < length; i++){ IRewards(extraRewards[i]).stake(msg.sender, _amount); } //add supply _totalSupply = _totalSupply.add(_amount); //add to sender balance sheet _balances[msg.sender] = _balances[msg.sender].add(_amount); //take tokens from sender stakingToken.safeTransferFrom(msg.sender, address(this), _amount); emit Staked(msg.sender, _amount); } function stakeAll() external{ uint256 balance = stakingToken.balanceOf(msg.sender); stake(balance); } function stakeFor(address _for, uint256 _amount) public updateReward(_for) { require(_amount > 0, 'RewardPool : Cannot stake 0'); //check if new rewards should be pulled from convex chef checkHarvest(); //also stake to linked rewards uint256 length = extraRewards.length; for(uint i=0; i < length; i++){ IRewards(extraRewards[i]).stake(_for, _amount); } //add supply _totalSupply = _totalSupply.add(_amount); //add to _for's balance sheet _balances[_for] = _balances[_for].add(_amount); //take tokens from sender stakingToken.safeTransferFrom(msg.sender, address(this), _amount); emit Staked(msg.sender, _amount); } function withdraw(uint256 _amount, bool claim) public updateReward(msg.sender) { require(_amount > 0, 'RewardPool : Cannot withdraw 0'); //also withdraw from linked rewards uint256 length = extraRewards.length; for(uint i=0; i < length; i++){ IRewards(extraRewards[i]).withdraw(msg.sender, _amount); } _totalSupply = _totalSupply.sub(_amount); _balances[msg.sender] = _balances[msg.sender].sub(_amount); stakingToken.safeTransfer(msg.sender, _amount); emit Withdrawn(msg.sender, _amount); if(claim){ getReward(msg.sender,true); } } function withdrawAll(bool claim) external{ withdraw(_balances[msg.sender],claim); } function getReward(address _account, bool _claimExtras) public updateReward(_account){ uint256 reward = earned(_account); if (reward > 0) { rewards[_account] = 0; rewardToken.safeTransfer(_account, reward); emit RewardPaid(_account, reward); } //also get rewards from linked rewards if(_claimExtras){ uint256 length = extraRewards.length; for(uint i=0; i < length; i++){ IRewards(extraRewards[i]).getReward(_account); } } //check if new rewards should be pulled from convex chef checkHarvest(); } function getReward() external{ getReward(msg.sender,true); } function checkHarvest() internal{ //if getting close to the end of the period //claim and extend if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days) ) { harvestFromMasterChef(); } } //initialize the period of rewards //since the reward rate should be same as speed as rewards coming in from the chef // it will never catch up unless there is a seed // (or if it mines for a week with 0 distribution) function initRewards() internal updateReward(address(0)){ uint256 reward = rewardToken.balanceOf(address(this)); if (block.timestamp >= periodFinish) { rewardRate = reward.div(duration); } else { uint256 remaining = periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardRate); reward = reward.add(leftover); rewardRate = reward.div(duration); } currentRewards = reward; lastUpdateTime = block.timestamp; periodFinish = block.timestamp.add(duration); emit RewardAdded(reward); } function notifyRewardAmount() internal updateReward(address(0)) { if(!isInit){ //return smoothly if not init yet. //allow stakers to join but dont start distribution return; } //convex chef allows anyone to claim, so we have to look at reward debt difference //so that we know how much we have claimed since previous notifyRewardAmount() (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this)); uint256 reward = rewardDebt.sub(previousRewardDebt); previousRewardDebt = rewardDebt; if(reward == 0) return; if (block.timestamp >= periodFinish) { rewardRate = reward.div(duration); } else { uint256 remaining = periodFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardRate); reward = reward.add(leftover); rewardRate = reward.div(duration); } currentRewards = reward; lastUpdateTime = block.timestamp; periodFinish = block.timestamp.add(duration); emit RewardAdded(reward); } function onSushiReward( uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount ) override external updateReward(user) { require(msg.sender == sushiMasterChef); // On the first call, validate that the pid correctly maps to our stakingToken // Sushi MasterChef does not allow modifying a pid after it has been set, so we can trust // this to be safe in the future. If we did not validate the pid going forward, there // could be an attack vector by setting this contract as rewardContract on a 2nd pid uint256 _sushiPid = sushiPid; if (_sushiPid == 0) { require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken); sushiPid = pid; } else { require(pid == _sushiPid); } if (sushiAmount > 0) { // if sushiAmount > 0 the call is claiming sushi and should also claim other rewards //sushi allows claiming for user and transferring to recipient, but we do not. //just claim to original account getReward(user,true); } uint256 userBalance = _sushiBalances[user]; if (newLpAmount > userBalance) { // reported balance in sushi > internal accounting, user has deposited uint256 amount = newLpAmount.sub(userBalance); uint256 length = extraRewards.length; for(uint i=0; i < length; i++){ IRewards(extraRewards[i]).stake(user, amount); } _totalSupply = _totalSupply.add(amount); _sushiBalances[user] = newLpAmount; } else if (newLpAmount < userBalance) { // reported balance in sushi < internal accounting, user has withdrawn uint256 amount = userBalance.sub(newLpAmount); uint256 length = extraRewards.length; for(uint i=0; i < length; i++){ IRewards(extraRewards[i]).withdraw(msg.sender, amount); } _totalSupply = _totalSupply.sub(amount); _sushiBalances[user] = newLpAmount; } } function pendingTokens( uint256 pid, address user, uint256 sushiAmount ) override external view returns (IERC20[] memory, uint256[] memory) { //extra rewards length uint256 length = extraRewards.length; //combine base and extras IERC20[] memory rewardTokens = new IERC20[](1+length); rewardTokens[0] = rewardToken; for(uint i=0; i < length; i++){ rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken()); } uint256[] memory earnedAmounts = new uint256[](1+length); earnedAmounts[0] = earned(user); for(uint i=0; i < length; i++){ earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user); } return (rewardTokens,earnedAmounts); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"stakingToken_","type":"address"},{"internalType":"address","name":"rewardToken_","type":"address"},{"internalType":"address","name":"rewardManager_","type":"address"},{"internalType":"address","name":"sushiMasterChef_","type":"address"},{"internalType":"address","name":"convexMasterChef_","type":"address"},{"internalType":"uint256","name":"chefPid_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"_reward","type":"address"}],"name":"addExtraReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chefPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearExtraRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"convexMasterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"extraRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extraRewardsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_claimExtras","type":"bool"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestFromMasterChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"dummyToken","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"localBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"sushiAmount","type":"uint256"},{"internalType":"uint256","name":"newLpAmount","type":"uint256"}],"name":"onSushiReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"sushiAmount","type":"uint256"}],"name":"pendingTokens","outputs":[{"internalType":"contract IERC20[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousRewardDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"sushiBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiMasterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"claim","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"claim","type":"bool"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040526000808055600181905560048190556007556008805460ff1916905534801561002d57600080fd5b50604051612733380380612733833981810160405260c081101561005057600080fd5b5080516020820151604083015160608085015160808087015160a0978801516001600160601b031997851b881690985294831b8616905291811b841660c05290811b831660e0521b16610100526101205260805160601c60a05160601c60c05160601c60e05160601c6101005160601c610120516125e0610153600039806109865280610e9c528061166a52806120995250806108e452806109bd5280610ed25280611bc452806120d25250806112d752806118985250806106f052806107725280610f44525080610bec5280610dd85280611224528061130b52806115c0528061181c5250806110ec528061197f5280611bee5280611e4852506125e06000f3fe608060405234801561001057600080fd5b506004361061023c5760003560e01c806372f702f31161013b578063c8f33c91116100b8578063d63b3c491161007c578063d63b3c4914610567578063df136d6514610632578063e0d689251461063a578063ebe2b12b14610642578063f7c618c11461064a5761023c565b8063c8f33c9114610521578063c9bbd04a14610529578063cd3daf9d14610531578063d4d4ffb014610539578063d55a23f41461055f5761023c565b80638dcb4061116100ff5780638dcb4061146104d0578063901a7d53146104d857806391817d74146104e0578063a694fc3a146104e8578063b145a5b8146105055761023c565b806372f702f3146104505780637b0a47ee1461045857806380faa57d146104605780638b876347146104685780638bf637421461048e5761023c565b80632ee40908116101c95780634f70b15a1161018d5780634f70b15a146103a85780635e43c47b146103b05780636762805c146103d65780637050ccd9146103fc57806370a082311461042a5761023c565b80632ee409081461032a57806338d07436146103565780633d18b9121461037b57806340c354461461038357806346c65276146103a05761023c565b80630fb5a6b4116102105780630fb5a6b4146102cd57806317f5afb5146102d557806318160ddd146102dd57806319ab453c146102e55780631c1c6fe51461030b5761023c565b80628cc262146102415780630569d388146102795780630700037d146102835780630f4ef8a6146102a9575b600080fd5b6102676004803603602081101561025757600080fd5b50356001600160a01b0316610652565b60408051918252519081900360200190f35b6102816106e5565b005b6102676004803603602081101561029957600080fd5b50356001600160a01b031661075e565b6102b1610770565b604080516001600160a01b039092168252519081900360200190f35b610267610794565b61026761079b565b6102676107a1565b610281600480360360208110156102fb57600080fd5b50356001600160a01b03166107a8565b6102816004803603602081101561032157600080fd5b50351515610a28565b6102816004803603604081101561034057600080fd5b506001600160a01b038135169060200135610a45565b6102816004803603604081101561036c57600080fd5b50803590602001351515610c50565b610281610e54565b6102b16004803603602081101561039957600080fd5b5035610e5f565b610267610e86565b610281610e8c565b610281600480360360208110156103c657600080fd5b50356001600160a01b0316610f39565b610267600480360360208110156103ec57600080fd5b50356001600160a01b0316611043565b6102816004803603604081101561041257600080fd5b506001600160a01b038135169060200135151561105e565b6102676004803603602081101561044057600080fd5b50356001600160a01b03166111f5565b6102b1611222565b610267611246565b61026761124c565b6102676004803603602081101561047e57600080fd5b50356001600160a01b031661125f565b610281600480360360a08110156104a457600080fd5b508035906001600160a01b03602082013581169160408101359091169060608101359060800135611271565b6102816115bc565b610267611662565b610267611668565b610281600480360360208110156104fe57600080fd5b503561168c565b61050d611887565b604080519115158252519081900360200190f35b610267611890565b6102b1611896565b6102676118ba565b6102676004803603602081101561054f57600080fd5b50356001600160a01b031661190c565b610267611927565b6105996004803603606081101561057d57600080fd5b508035906001600160a01b03602082013516906040013561192d565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156105dd5781810151838201526020016105c5565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561061c578181015183820152602001610604565b5050505090500194505050505060405180910390f35b610267611bbc565b6102b1611bc2565b610267611be6565b6102b1611bec565b6001600160a01b0381166000908152600c6020908152604080832054600b9092528220546106df91906106d990670de0b6b3a7640000906106d39061069f906106996118ba565b90611c10565b6001600160a01b0388166000908152600a60209081526040808320546009909252909120546106cd91611c6d565b90611cce565b90611d27565b90611c6d565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610750576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b61075c600d6000612507565b565b600c6020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6206978081565b60065481565b6005545b90565b60085460ff16156107ef576040805162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481a5b9a5d60a21b604482015290519081900360640190fd5b6008805460ff19166001179055604080516370a0823160e01b815233600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561084657600080fd5b505afa15801561085a573d6000803e3d6000fd5b505050506040513d602081101561087057600080fd5b50519050806108be576040805162461bcd60e51b8152602060048201526015602482015274042616c616e6365206d75737420657863656564203605c1b604482015290519081900360640190fd5b6108d36001600160a01b038316333084611d8e565b816001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561094a57600080fd5b505af115801561095e573d6000803e3d6000fd5b505050506040513d602081101561097457600080fd5b505060408051631c57762b60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201526024810183905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e2bbb15891604480830192600092919082900301818387803b158015610a0457600080fd5b505af1158015610a18573d6000803e3d6000fd5b50505050610a24611de8565b5050565b33600090815260096020526040902054610a429082610c50565b50565b81610a4e6118ba565b600355610a5961124c565b6002556001600160a01b03811615610aa057610a7481610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008211610af5576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b610afd611f9a565b600d5460005b81811015610b9557600d8181548110610b1857fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038981166004830152602482018990529151919092169263adc9772e926044808201939182900301818387803b158015610b7157600080fd5b505af1158015610b85573d6000803e3d6000fd5b505060019092019150610b039050565b50600554610ba39084611c6d565b6005556001600160a01b038416600090815260096020526040902054610bc99084611c6d565b6001600160a01b03808616600090815260096020526040902091909155610c14907f000000000000000000000000000000000000000000000000000000000000000016333086611d8e565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a250505050565b33610c596118ba565b600355610c6461124c565b6002556001600160a01b03811615610cab57610c7f81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008311610d00576040805162461bcd60e51b815260206004820152601e60248201527f526577617264506f6f6c203a2043616e6e6f7420776974686472617720300000604482015290519081900360640190fd5b600d5460005b81811015610d9457600d8181548110610d1b57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b505060019092019150610d069050565b50600554610da29085611c10565b60055533600090815260096020526040902054610dbf9085611c10565b33600081815260096020526040902091909155610e07907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169086611fc7565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a28215610e4e57610e4e33600161105e565b50505050565b61075c33600161105e565b600d8181548110610e6c57fe5b6000918252602090912001546001600160a01b0316905081565b60075481565b60408051636eeaf0d960e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015230602482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ddd5e1b291604480830192600092919082900301818387803b158015610f1957600080fd5b505af1158015610f2d573d6000803e3d6000fd5b5050505061075c61201e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fa4576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038116610ff1576040805162461bcd60e51b815260206004820152600f60248201526e217265776172642073657474696e6760881b604482015290519081900360640190fd5b600d80546001810182556000919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526009602052604090205490565b816110676118ba565b60035561107261124c565b6002556001600160a01b038116156110b95761108d81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60006110c484610652565b90508015611153576001600160a01b038085166000908152600c6020526040812055611113907f0000000000000000000000000000000000000000000000000000000000000000168583611fc7565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b82156111ed57600d5460005b818110156111ea57600d818154811061117457fe5b600091825260208220015460408051630c00007b60e41b81526001600160a01b038a811660048301529151919092169263c00007b0926024808201939182900301818387803b1580156111c657600080fd5b505af11580156111da573d6000803e3d6000fd5b50506001909201915061115f9050565b50505b610e4e611f9a565b6001600160a01b0381166000908152600a602090815260408083205460099092528220546106df91611c6d565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b600061125a42600054612223565b905090565b600b6020526000908152604090205481565b8361127a6118ba565b60035561128561124c565b6002556001600160a01b038116156112cc576112a081610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461130157600080fd5b600654806113c0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316336001600160a01b03166378ed5d1f896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d60208110156113a157600080fd5b50516001600160a01b0316146113b657600080fd5b60068790556113cc565b8087146113cc57600080fd5b83156113dd576113dd86600161105e565b6001600160a01b0386166000908152600a6020526040902054808411156114d857600061140a8583611c10565b600d5490915060005b818110156114a557600d818154811061142857fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038e81166004830152602482018890529151919092169263adc9772e926044808201939182900301818387803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b5050600190920191506114139050565b506005546114b39083611c6d565b60055550506001600160a01b0387166000908152600a602052604090208490556115b2565b808410156115b25760006114ec8286611c10565b600d5490915060005b8181101561158357600d818154811061150a57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810187905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b15801561155f57600080fd5b505af1158015611573573d6000803e3d6000fd5b5050600190920191506114f59050565b506005546115919083611c10565b60055550506001600160a01b0387166000908152600a602052604090208490555b5050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561162b57600080fd5b505afa15801561163f573d6000803e3d6000fd5b505050506040513d602081101561165557600080fd5b50519050610a428161168c565b60045481565b7f000000000000000000000000000000000000000000000000000000000000000081565b336116956118ba565b6003556116a061124c565b6002556001600160a01b038116156116e7576116bb81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b6000821161173c576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b611744611f9a565b600d5460005b818110156117d857600d818154811061175f57fe5b6000918252602082200154604080516356e4bb9760e11b81523360048201526024810188905290516001600160a01b039092169263adc9772e9260448084019382900301818387803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b50506001909201915061174a9050565b506005546117e69084611c6d565b600555336000908152600960205260409020546118039084611c6d565b3360008181526009602052604090209190915561184c907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316903086611d8e565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2505050565b60085460ff1681565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806118c56107a1565b9050806118d65750506003546107a5565b6119066118fd826106d3670de0b6b3a76400006106cd6001546106cd60025461069961124c565b60035490611c6d565b91505090565b6001600160a01b03166000908152600a602052604090205490565b600d5490565b600d546060908190816001820167ffffffffffffffff8111801561195057600080fd5b5060405190808252806020026020018201604052801561197a578160200160208202803683370190505b5090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106119ab57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b82811015611a8957600d81815481106119e357fe5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b50518251839060018401908110611a6957fe5b6001600160a01b03909216602092830291909101909101526001016119ce565b5060608260010167ffffffffffffffff81118015611aa657600080fd5b50604051908082528060200260200182016040528015611ad0578160200160208202803683370190505b509050611adc87610652565b81600081518110611ae957fe5b60200260200101818152505060005b83811015611bae57600d8181548110611b0d57fe5b60009182526020918290200154604080516246613160e11b81526001600160a01b038c8116600483015291519190921692628cc2629260248082019391829003018186803b158015611b5e57600080fd5b505afa158015611b72573d6000803e3d6000fd5b505050506040513d6020811015611b8857600080fd5b50518251839060018401908110611b9b57fe5b6020908102919091010152600101611af8565b509097909650945050505050565b60035481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600082821115611c67576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611cc7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082611cdd575060006106df565b82820282848281611cea57fe5b0414611cc75760405162461bcd60e51b81526004018080602001828103825260218152602001806125606021913960400191505060405180910390fd5b6000808211611d7d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611d8657fe5b049392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e4e908590612239565b6000611df26118ba565b600355611dfd61124c565b6002556001600160a01b03811615611e4457611e1881610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611eb357600080fd5b505afa158015611ec7573d6000803e3d6000fd5b505050506040513d6020811015611edd57600080fd5b50516000549091504210611f0057611ef88162069780611d27565b600155611f48565b60008054611f0e9042611c10565b90506000611f2760015483611cce90919063ffffffff16565b9050611f338382611c6d565b9250611f428362069780611d27565b60015550505b6004819055426002819055611f609062069780611c6d565b6000556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b60008054118015611fba5750600054611fb69062015180611c10565b4210155b1561075c5761075c610e8c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612019908490612239565b505050565b60006120286118ba565b60035561203361124c565b6002556001600160a01b0381161561207a5761204e81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60085460ff1661208957610a42565b604080516393f1a40b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015230602482015281516000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926393f1a40b9260448083019392829003018186803b15801561211457600080fd5b505afa158015612128573d6000803e3d6000fd5b505050506040513d604081101561213e57600080fd5b5060200151600754909150600090612157908390611c10565b600783905590508061216a575050610a42565b6000544210612188576121808162069780611d27565b6001556121d0565b600080546121969042611c10565b905060006121af60015483611cce90919063ffffffff16565b90506121bb8382611c6d565b92506121ca8362069780611d27565b60015550505b60048190554260028190556121e89062069780611c6d565b6000556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b60008183106122325781611cc7565b5090919050565b606061228e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122ea9092919063ffffffff16565b805190915015612019578080602001905160208110156122ad57600080fd5b50516120195760405162461bcd60e51b815260040180806020018281038252602a815260200180612581602a913960400191505060405180910390fd5b60606122f98484600085612301565b949350505050565b6060824710156123425760405162461bcd60e51b815260040180806020018281038252602681526020018061253a6026913960400191505060405180910390fd5b61234b8561245d565b61239c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106123db5780518252601f1990920191602091820191016123bc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461243d576040519150601f19603f3d011682016040523d82523d6000602084013e612442565b606091505b5091509150612452828286612463565b979650505050505050565b3b151590565b60608315612472575081611cc7565b8251156124825782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124cc5781810151838201526020016124b4565b50505050905090810190601f1680156124f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080546000825590600052602060002090810190610a4291905b808211156125355760008155600101612521565b509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220beb8207404e64fbcaafb05d7f7891010c32fb260f88665f14e3262e011aef2d164736f6c634300060c003300000000000000000000000033f6ddaea2a8a54062e021873bcaee006cdf40070000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b000000000000000000000000a3c5a1e09150b75ff251c1a7815a07182c3de2fb000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d0000000000000000000000005f465e9fcffc217c5849906216581a657cd606050000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023c5760003560e01c806372f702f31161013b578063c8f33c91116100b8578063d63b3c491161007c578063d63b3c4914610567578063df136d6514610632578063e0d689251461063a578063ebe2b12b14610642578063f7c618c11461064a5761023c565b8063c8f33c9114610521578063c9bbd04a14610529578063cd3daf9d14610531578063d4d4ffb014610539578063d55a23f41461055f5761023c565b80638dcb4061116100ff5780638dcb4061146104d0578063901a7d53146104d857806391817d74146104e0578063a694fc3a146104e8578063b145a5b8146105055761023c565b806372f702f3146104505780637b0a47ee1461045857806380faa57d146104605780638b876347146104685780638bf637421461048e5761023c565b80632ee40908116101c95780634f70b15a1161018d5780634f70b15a146103a85780635e43c47b146103b05780636762805c146103d65780637050ccd9146103fc57806370a082311461042a5761023c565b80632ee409081461032a57806338d07436146103565780633d18b9121461037b57806340c354461461038357806346c65276146103a05761023c565b80630fb5a6b4116102105780630fb5a6b4146102cd57806317f5afb5146102d557806318160ddd146102dd57806319ab453c146102e55780631c1c6fe51461030b5761023c565b80628cc262146102415780630569d388146102795780630700037d146102835780630f4ef8a6146102a9575b600080fd5b6102676004803603602081101561025757600080fd5b50356001600160a01b0316610652565b60408051918252519081900360200190f35b6102816106e5565b005b6102676004803603602081101561029957600080fd5b50356001600160a01b031661075e565b6102b1610770565b604080516001600160a01b039092168252519081900360200190f35b610267610794565b61026761079b565b6102676107a1565b610281600480360360208110156102fb57600080fd5b50356001600160a01b03166107a8565b6102816004803603602081101561032157600080fd5b50351515610a28565b6102816004803603604081101561034057600080fd5b506001600160a01b038135169060200135610a45565b6102816004803603604081101561036c57600080fd5b50803590602001351515610c50565b610281610e54565b6102b16004803603602081101561039957600080fd5b5035610e5f565b610267610e86565b610281610e8c565b610281600480360360208110156103c657600080fd5b50356001600160a01b0316610f39565b610267600480360360208110156103ec57600080fd5b50356001600160a01b0316611043565b6102816004803603604081101561041257600080fd5b506001600160a01b038135169060200135151561105e565b6102676004803603602081101561044057600080fd5b50356001600160a01b03166111f5565b6102b1611222565b610267611246565b61026761124c565b6102676004803603602081101561047e57600080fd5b50356001600160a01b031661125f565b610281600480360360a08110156104a457600080fd5b508035906001600160a01b03602082013581169160408101359091169060608101359060800135611271565b6102816115bc565b610267611662565b610267611668565b610281600480360360208110156104fe57600080fd5b503561168c565b61050d611887565b604080519115158252519081900360200190f35b610267611890565b6102b1611896565b6102676118ba565b6102676004803603602081101561054f57600080fd5b50356001600160a01b031661190c565b610267611927565b6105996004803603606081101561057d57600080fd5b508035906001600160a01b03602082013516906040013561192d565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156105dd5781810151838201526020016105c5565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561061c578181015183820152602001610604565b5050505090500194505050505060405180910390f35b610267611bbc565b6102b1611bc2565b610267611be6565b6102b1611bec565b6001600160a01b0381166000908152600c6020908152604080832054600b9092528220546106df91906106d990670de0b6b3a7640000906106d39061069f906106996118ba565b90611c10565b6001600160a01b0388166000908152600a60209081526040808320546009909252909120546106cd91611c6d565b90611cce565b90611d27565b90611c6d565b92915050565b336001600160a01b037f000000000000000000000000a3c5a1e09150b75ff251c1a7815a07182c3de2fb1614610750576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b61075c600d6000612507565b565b600c6020526000908152604090205481565b7f000000000000000000000000a3c5a1e09150b75ff251c1a7815a07182c3de2fb81565b6206978081565b60065481565b6005545b90565b60085460ff16156107ef576040805162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481a5b9a5d60a21b604482015290519081900360640190fd5b6008805460ff19166001179055604080516370a0823160e01b815233600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561084657600080fd5b505afa15801561085a573d6000803e3d6000fd5b505050506040513d602081101561087057600080fd5b50519050806108be576040805162461bcd60e51b8152602060048201526015602482015274042616c616e6365206d75737420657863656564203605c1b604482015290519081900360640190fd5b6108d36001600160a01b038316333084611d8e565b816001600160a01b031663095ea7b37f0000000000000000000000005f465e9fcffc217c5849906216581a657cd60605836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561094a57600080fd5b505af115801561095e573d6000803e3d6000fd5b505050506040513d602081101561097457600080fd5b505060408051631c57762b60e31b81527f000000000000000000000000000000000000000000000000000000000000000360048201526024810183905290516001600160a01b037f0000000000000000000000005f465e9fcffc217c5849906216581a657cd60605169163e2bbb15891604480830192600092919082900301818387803b158015610a0457600080fd5b505af1158015610a18573d6000803e3d6000fd5b50505050610a24611de8565b5050565b33600090815260096020526040902054610a429082610c50565b50565b81610a4e6118ba565b600355610a5961124c565b6002556001600160a01b03811615610aa057610a7481610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008211610af5576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b610afd611f9a565b600d5460005b81811015610b9557600d8181548110610b1857fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038981166004830152602482018990529151919092169263adc9772e926044808201939182900301818387803b158015610b7157600080fd5b505af1158015610b85573d6000803e3d6000fd5b505060019092019150610b039050565b50600554610ba39084611c6d565b6005556001600160a01b038416600090815260096020526040902054610bc99084611c6d565b6001600160a01b03808616600090815260096020526040902091909155610c14907f00000000000000000000000033f6ddaea2a8a54062e021873bcaee006cdf400716333086611d8e565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a250505050565b33610c596118ba565b600355610c6461124c565b6002556001600160a01b03811615610cab57610c7f81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008311610d00576040805162461bcd60e51b815260206004820152601e60248201527f526577617264506f6f6c203a2043616e6e6f7420776974686472617720300000604482015290519081900360640190fd5b600d5460005b81811015610d9457600d8181548110610d1b57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b505060019092019150610d069050565b50600554610da29085611c10565b60055533600090815260096020526040902054610dbf9085611c10565b33600081815260096020526040902091909155610e07907f00000000000000000000000033f6ddaea2a8a54062e021873bcaee006cdf40076001600160a01b03169086611fc7565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a28215610e4e57610e4e33600161105e565b50505050565b61075c33600161105e565b600d8181548110610e6c57fe5b6000918252602090912001546001600160a01b0316905081565b60075481565b60408051636eeaf0d960e11b81527f0000000000000000000000000000000000000000000000000000000000000003600482015230602482015290516001600160a01b037f0000000000000000000000005f465e9fcffc217c5849906216581a657cd60605169163ddd5e1b291604480830192600092919082900301818387803b158015610f1957600080fd5b505af1158015610f2d573d6000803e3d6000fd5b5050505061075c61201e565b336001600160a01b037f000000000000000000000000a3c5a1e09150b75ff251c1a7815a07182c3de2fb1614610fa4576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038116610ff1576040805162461bcd60e51b815260206004820152600f60248201526e217265776172642073657474696e6760881b604482015290519081900360640190fd5b600d80546001810182556000919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526009602052604090205490565b816110676118ba565b60035561107261124c565b6002556001600160a01b038116156110b95761108d81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60006110c484610652565b90508015611153576001600160a01b038085166000908152600c6020526040812055611113907f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b168583611fc7565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b82156111ed57600d5460005b818110156111ea57600d818154811061117457fe5b600091825260208220015460408051630c00007b60e41b81526001600160a01b038a811660048301529151919092169263c00007b0926024808201939182900301818387803b1580156111c657600080fd5b505af11580156111da573d6000803e3d6000fd5b50506001909201915061115f9050565b50505b610e4e611f9a565b6001600160a01b0381166000908152600a602090815260408083205460099092528220546106df91611c6d565b7f00000000000000000000000033f6ddaea2a8a54062e021873bcaee006cdf400781565b60015481565b600061125a42600054612223565b905090565b600b6020526000908152604090205481565b8361127a6118ba565b60035561128561124c565b6002556001600160a01b038116156112cc576112a081610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b336001600160a01b037f000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d161461130157600080fd5b600654806113c0577f00000000000000000000000033f6ddaea2a8a54062e021873bcaee006cdf40076001600160a01b0316336001600160a01b03166378ed5d1f896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d60208110156113a157600080fd5b50516001600160a01b0316146113b657600080fd5b60068790556113cc565b8087146113cc57600080fd5b83156113dd576113dd86600161105e565b6001600160a01b0386166000908152600a6020526040902054808411156114d857600061140a8583611c10565b600d5490915060005b818110156114a557600d818154811061142857fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038e81166004830152602482018890529151919092169263adc9772e926044808201939182900301818387803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b5050600190920191506114139050565b506005546114b39083611c6d565b60055550506001600160a01b0387166000908152600a602052604090208490556115b2565b808410156115b25760006114ec8286611c10565b600d5490915060005b8181101561158357600d818154811061150a57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810187905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b15801561155f57600080fd5b505af1158015611573573d6000803e3d6000fd5b5050600190920191506114f59050565b506005546115919083611c10565b60055550506001600160a01b0387166000908152600a602052604090208490555b5050505050505050565b60007f00000000000000000000000033f6ddaea2a8a54062e021873bcaee006cdf40076001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561162b57600080fd5b505afa15801561163f573d6000803e3d6000fd5b505050506040513d602081101561165557600080fd5b50519050610a428161168c565b60045481565b7f000000000000000000000000000000000000000000000000000000000000000381565b336116956118ba565b6003556116a061124c565b6002556001600160a01b038116156116e7576116bb81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b6000821161173c576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b611744611f9a565b600d5460005b818110156117d857600d818154811061175f57fe5b6000918252602082200154604080516356e4bb9760e11b81523360048201526024810188905290516001600160a01b039092169263adc9772e9260448084019382900301818387803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b50506001909201915061174a9050565b506005546117e69084611c6d565b600555336000908152600960205260409020546118039084611c6d565b3360008181526009602052604090209190915561184c907f00000000000000000000000033f6ddaea2a8a54062e021873bcaee006cdf40076001600160a01b0316903086611d8e565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2505050565b60085460ff1681565b60025481565b7f000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d81565b6000806118c56107a1565b9050806118d65750506003546107a5565b6119066118fd826106d3670de0b6b3a76400006106cd6001546106cd60025461069961124c565b60035490611c6d565b91505090565b6001600160a01b03166000908152600a602052604090205490565b600d5490565b600d546060908190816001820167ffffffffffffffff8111801561195057600080fd5b5060405190808252806020026020018201604052801561197a578160200160208202803683370190505b5090507f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b816000815181106119ab57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b82811015611a8957600d81815481106119e357fe5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b50518251839060018401908110611a6957fe5b6001600160a01b03909216602092830291909101909101526001016119ce565b5060608260010167ffffffffffffffff81118015611aa657600080fd5b50604051908082528060200260200182016040528015611ad0578160200160208202803683370190505b509050611adc87610652565b81600081518110611ae957fe5b60200260200101818152505060005b83811015611bae57600d8181548110611b0d57fe5b60009182526020918290200154604080516246613160e11b81526001600160a01b038c8116600483015291519190921692628cc2629260248082019391829003018186803b158015611b5e57600080fd5b505afa158015611b72573d6000803e3d6000fd5b505050506040513d6020811015611b8857600080fd5b50518251839060018401908110611b9b57fe5b6020908102919091010152600101611af8565b509097909650945050505050565b60035481565b7f0000000000000000000000005f465e9fcffc217c5849906216581a657cd6060581565b60005481565b7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b600082821115611c67576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611cc7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082611cdd575060006106df565b82820282848281611cea57fe5b0414611cc75760405162461bcd60e51b81526004018080602001828103825260218152602001806125606021913960400191505060405180910390fd5b6000808211611d7d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611d8657fe5b049392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e4e908590612239565b6000611df26118ba565b600355611dfd61124c565b6002556001600160a01b03811615611e4457611e1881610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60007f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611eb357600080fd5b505afa158015611ec7573d6000803e3d6000fd5b505050506040513d6020811015611edd57600080fd5b50516000549091504210611f0057611ef88162069780611d27565b600155611f48565b60008054611f0e9042611c10565b90506000611f2760015483611cce90919063ffffffff16565b9050611f338382611c6d565b9250611f428362069780611d27565b60015550505b6004819055426002819055611f609062069780611c6d565b6000556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b60008054118015611fba5750600054611fb69062015180611c10565b4210155b1561075c5761075c610e8c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612019908490612239565b505050565b60006120286118ba565b60035561203361124c565b6002556001600160a01b0381161561207a5761204e81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60085460ff1661208957610a42565b604080516393f1a40b60e01b81527f0000000000000000000000000000000000000000000000000000000000000003600482015230602482015281516000926001600160a01b037f0000000000000000000000005f465e9fcffc217c5849906216581a657cd6060516926393f1a40b9260448083019392829003018186803b15801561211457600080fd5b505afa158015612128573d6000803e3d6000fd5b505050506040513d604081101561213e57600080fd5b5060200151600754909150600090612157908390611c10565b600783905590508061216a575050610a42565b6000544210612188576121808162069780611d27565b6001556121d0565b600080546121969042611c10565b905060006121af60015483611cce90919063ffffffff16565b90506121bb8382611c6d565b92506121ca8362069780611d27565b60015550505b60048190554260028190556121e89062069780611c6d565b6000556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b60008183106122325781611cc7565b5090919050565b606061228e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122ea9092919063ffffffff16565b805190915015612019578080602001905160208110156122ad57600080fd5b50516120195760405162461bcd60e51b815260040180806020018281038252602a815260200180612581602a913960400191505060405180910390fd5b60606122f98484600085612301565b949350505050565b6060824710156123425760405162461bcd60e51b815260040180806020018281038252602681526020018061253a6026913960400191505060405180910390fd5b61234b8561245d565b61239c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106123db5780518252601f1990920191602091820191016123bc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461243d576040519150601f19603f3d011682016040523d82523d6000602084013e612442565b606091505b5091509150612452828286612463565b979650505050505050565b3b151590565b60608315612472575081611cc7565b8251156124825782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124cc5781810151838201526020016124b4565b50505050905090810190601f1680156124f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080546000825590600052602060002090810190610a4291905b808211156125355760008155600101612521565b509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220beb8207404e64fbcaafb05d7f7891010c32fb260f88665f14e3262e011aef2d164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000033f6ddaea2a8a54062e021873bcaee006cdf40070000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b000000000000000000000000a3c5a1e09150b75ff251c1a7815a07182c3de2fb000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d0000000000000000000000005f465e9fcffc217c5849906216581a657cd606050000000000000000000000000000000000000000000000000000000000000003
-----Decoded View---------------
Arg [0] : stakingToken_ (address): 0x33F6DDAEa2a8a54062E021873bCaEE006CdF4007
Arg [1] : rewardToken_ (address): 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B
Arg [2] : rewardManager_ (address): 0xa3C5A1e09150B75ff251c1a7815A07182c3de2FB
Arg [3] : sushiMasterChef_ (address): 0xEF0881eC094552b2e128Cf945EF17a6752B4Ec5d
Arg [4] : convexMasterChef_ (address): 0x5F465e9fcfFc217c5849906216581a657cd60605
Arg [5] : chefPid_ (uint256): 3
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000033f6ddaea2a8a54062e021873bcaee006cdf4007
Arg [1] : 0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b
Arg [2] : 000000000000000000000000a3c5a1e09150b75ff251c1a7815a07182c3de2fb
Arg [3] : 000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d
Arg [4] : 0000000000000000000000005f465e9fcffc217c5849906216581a657cd60605
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode Sourcemap
30565:13522:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35007:294;;;;;;;;;;;;;;;;-1:-1:-1;35007:294:0;-1:-1:-1;;;;;35007:294:0;;:::i;:::-;;;;;;;;;;;;;;;;33926:137;;;:::i;:::-;;31506:42;;;;;;;;;;;;;;;;-1:-1:-1;31506:42:0;-1:-1:-1;;;;;31506:42:0;;:::i;30816:38::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30816:38:0;;;;;;;;;;;;;;30766:41;;;:::i;31224:23::-;;;:::i;33090:91::-;;;:::i;32415:454::-;;;;;;;;;;;;;;;;-1:-1:-1;32415:454:0;-1:-1:-1;;;;;32415:454:0;;:::i;37743:97::-;;;;;;;;;;;;;;;;-1:-1:-1;37743:97:0;;;;:::i;36246:791::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36246:791:0;;;;;;;;:::i;37045:690::-;;;;;;;;;;;;;;;;-1:-1:-1;37045:690:0;;;;;;;;;:::i;38530:74::-;;;:::i;31557:29::-;;;;;;;;;;;;;;;;-1:-1:-1;31557:29:0;;:::i;31254:37::-;;;:::i;32933:149::-;;;:::i;33702:218::-;;;;;;;;;;;;;;;;-1:-1:-1;33702:218:0;-1:-1:-1;;;;;33702:218:0;;:::i;33336:115::-;;;;;;;;;;;;;;;;-1:-1:-1;33336:115:0;-1:-1:-1;;;;;33336:115:0;;:::i;37848:674::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37848:674:0;;;;;;;;;;:::i;33189:139::-;;;;;;;;;;;;;;;;-1:-1:-1;33189:139:0;-1:-1:-1;;;;;33189:139:0;;:::i;30723:36::-;;;:::i;31035:29::-;;;:::i;34409:135::-;;;:::i;31442:57::-;;;;;;;;;;;;;;;;-1:-1:-1;31442:57:0;-1:-1:-1;;;;;31442:57:0;;:::i;40972:2249::-;;;;;;;;;;;;;;;;-1:-1:-1;40972:2249:0;;;-1:-1:-1;;;;;40972:2249:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;36114:124::-;;;:::i;31149:33::-;;;:::i;30956:32::-;;;:::i;35309:797::-;;;;;;;;;;;;;;;;-1:-1:-1;35309:797:0;;:::i;31298:26::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;31071:29;;;:::i;30861:40::-;;;:::i;34552:447::-;;;:::i;33459:120::-;;;;;;;;;;;;;;;;-1:-1:-1;33459:120:0;-1:-1:-1;;;;;33459:120:0;;:::i;33587:107::-;;;:::i;43229:855::-;;;;;;;;;;;;;;;;-1:-1:-1;43229:855:0;;;-1:-1:-1;;;;;43229:855:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31107:35;;;:::i;30908:41::-;;;:::i;30997:31::-;;;:::i;30681:35::-;;;:::i;35007:294::-;-1:-1:-1;;;;;35276:16:0;;35061:7;35276:16;;;:7;:16;;;;;;;;;35192:22;:31;;;;;;35101:192;;35276:16;35101:152;;35248:4;;35101:124;;35171:53;;:16;:14;:16::i;:::-;:20;;:53::i;:::-;-1:-1:-1;;;;;35124:23:0;;;;;;:14;:23;;;;;;;;;35101:9;:18;;;;;;;:47;;:22;:47::i;:::-;:69;;:124::i;:::-;:146;;:152::i;:::-;:174;;:192::i;:::-;35081:212;35007:294;-1:-1:-1;;35007:294:0:o;33926:137::-;33982:10;-1:-1:-1;;;;;33996:13:0;33982:27;;33974:51;;;;;-1:-1:-1;;;33974:51:0;;;;;;;;;;;;-1:-1:-1;;;33974:51:0;;;;;;;;;;;;;;;34036:19;34043:12;;34036:19;:::i;:::-;33926:137::o;31506:42::-;;;;;;;;;;;;;:::o;30816:38::-;;;:::o;30766:41::-;30801:6;30766:41;:::o;31224:23::-;;;;:::o;33090:91::-;33161:12;;33090:91;;:::o;32415:454::-;32477:6;;;;32476:7;32468:31;;;;;-1:-1:-1;;;32468:31:0;;;;;;;;;;;;-1:-1:-1;;;32468:31:0;;;;;;;;;;;;;;;32510:6;:13;;-1:-1:-1;;32510:13:0;32519:4;32510:13;;;32552:32;;;-1:-1:-1;;;32552:32:0;;32573:10;32552:32;;;;;;32510:6;;-1:-1:-1;;;;;32552:20:0;;;;;:32;;;;;;;;;;;;;;;:20;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32552:32:0;;-1:-1:-1;32603:12:0;32595:46;;;;;-1:-1:-1;;;32595:46:0;;;;;;;;;;;;-1:-1:-1;;;32595:46:0;;;;;;;;;;;;;;;32652:63;-1:-1:-1;;;;;32652:27:0;;32680:10;32700:4;32707:7;32652:27;:63::i;:::-;32726:10;-1:-1:-1;;;;;32726:18:0;;32745:16;32763:7;32726:45;;;;;;;;;;;;;-1:-1:-1;;;;;32726:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32782:55:0;;;-1:-1:-1;;;32782:55:0;;32820:7;32782:55;;;;;;;;;;;;-1:-1:-1;;;;;32794:16:0;32782:37;;;;:55;;;;;-1:-1:-1;;32782:55:0;;;;;;;-1:-1:-1;32782:37:0;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32848:13;:11;:13::i;:::-;32415:454;;:::o;37743:97::-;37814:10;37804:21;;;;:9;:21;;;;;;37795:37;;37826:5;37795:8;:37::i;:::-;37743:97;:::o;36246:791::-;36333:4;34144:16;:14;:16::i;:::-;34121:20;:39;34188:26;:24;:26::i;:::-;34171:14;:43;-1:-1:-1;;;;;34229:21:0;;;34225:157;;34286:15;34293:7;34286:6;:15::i;:::-;-1:-1:-1;;;;;34267:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34350:20;;34316:22;:31;;;;;;:54;34225:157;36373:1:::1;36363:7;:11;36355:51;;;::::0;;-1:-1:-1;;;36355:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36485:14;:12;:14::i;:::-;36569:12;:19:::0;36552:14:::1;36599:103;36617:6;36613:1;:10;36599:103;;;36653:12;36666:1;36653:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;36644:46:::1;::::0;;-1:-1:-1;;;36644:46:0;;-1:-1:-1;;;;;36644:46:0;;::::1;;::::0;::::1;::::0;;;;;;;;;36653:15;;;::::1;::::0;36644:31:::1;::::0;:46;;;;;;;;;;;36653:15;;36644:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36625:3:0::1;::::0;;::::1;::::0;-1:-1:-1;36599:103:0::1;::::0;-1:-1:-1;36599:103:0::1;;-1:-1:-1::0;36752:12:0::1;::::0;:25:::1;::::0;36769:7;36752:16:::1;:25::i;:::-;36737:12;:40:::0;-1:-1:-1;;;;;36845:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:28:::1;::::0;36865:7;36845:19:::1;:28::i;:::-;-1:-1:-1::0;;;;;36827:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;:46;;;;36919:65:::1;::::0;:12:::1;:29;36949:10;36969:4;36976:7:::0;36919:29:::1;:65::i;:::-;37002:27;::::0;;;;;;;37009:10:::1;::::0;37002:27:::1;::::0;;;;;::::1;::::0;;::::1;34392:1;36246:791:::0;;;:::o;37045:690::-;37130:10;34144:16;:14;:16::i;:::-;34121:20;:39;34188:26;:24;:26::i;:::-;34171:14;:43;-1:-1:-1;;;;;34229:21:0;;;34225:157;;34286:15;34293:7;34286:6;:15::i;:::-;-1:-1:-1;;;;;34267:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34350:20;;34316:22;:31;;;;;;:54;34225:157;37176:1:::1;37166:7;:11;37158:54;;;::::0;;-1:-1:-1;;;37158:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37287:12;:19:::0;37270:14:::1;37317:112;37335:6;37331:1;:10;37317:112;;;37371:12;37384:1;37371:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;37362:55:::1;::::0;;-1:-1:-1;;;37362:55:0;;37397:10:::1;37362:55;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;37371:15:0;;::::1;::::0;37362:34:::1;::::0;:55;;;;;;;;;;37371:15;;37362:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37343:3:0::1;::::0;;::::1;::::0;-1:-1:-1;37317:112:0::1;::::0;-1:-1:-1;37317:112:0::1;;-1:-1:-1::0;37456:12:0::1;::::0;:25:::1;::::0;37473:7;37456:16:::1;:25::i;:::-;37441:12;:40:::0;37526:10:::1;37516:21;::::0;;;:9:::1;:21;::::0;;;;;:34:::1;::::0;37542:7;37516:25:::1;:34::i;:::-;37502:10;37492:21;::::0;;;:9:::1;:21;::::0;;;;:58;;;;37561:46:::1;::::0;:12:::1;-1:-1:-1::0;;;;;37561:25:0::1;::::0;37599:7;37561:25:::1;:46::i;:::-;37623:30;::::0;;;;;;;37633:10:::1;::::0;37623:30:::1;::::0;;;;;::::1;::::0;;::::1;37669:5;37666:62;;;37690:26;37700:10;37711:4;37690:9;:26::i;:::-;34392:1;37045:690:::0;;;:::o;38530:74::-;38570:26;38580:10;38591:4;38570:9;:26::i;31557:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31557:29:0;;-1:-1:-1;31557:29:0;:::o;31254:37::-;;;;:::o;32933:149::-;32984:59;;;-1:-1:-1;;;32984:59:0;;33020:7;32984:59;;;;33037:4;32984:59;;;;;;-1:-1:-1;;;;;32996:16:0;32984:35;;;;:59;;;;;-1:-1:-1;;32984:59:0;;;;;;;-1:-1:-1;32984:35:0;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33054:20;:18;:20::i;33702:218::-;33771:10;-1:-1:-1;;;;;33785:13:0;33771:27;;33763:51;;;;;-1:-1:-1;;;33763:51:0;;;;;;;;;;;;-1:-1:-1;;;33763:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33833:21:0;;33825:48;;;;;-1:-1:-1;;;33825:48:0;;;;;;;;;;;;-1:-1:-1;;;33825:48:0;;;;;;;;;;;;;;;33886:12;:26;;;;;;;-1:-1:-1;33886:26:0;;;;;;;;-1:-1:-1;;;;;;33886:26:0;-1:-1:-1;;;;;33886:26:0;;;;;;;;;;33702:218::o;33336:115::-;-1:-1:-1;;;;;33425:18:0;33398:7;33425:18;;;:9;:18;;;;;;;33336:115::o;37848:674::-;37924:8;34144:16;:14;:16::i;:::-;34121:20;:39;34188:26;:24;:26::i;:::-;34171:14;:43;-1:-1:-1;;;;;34229:21:0;;;34225:157;;34286:15;34293:7;34286:6;:15::i;:::-;-1:-1:-1;;;;;34267:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34350:20;;34316:22;:31;;;;;;:54;34225:157;37946:14:::1;37963:16;37970:8;37963:6;:16::i;:::-;37946:33:::0;-1:-1:-1;37994:10:0;;37990:169:::1;;-1:-1:-1::0;;;;;38021:17:0;;::::1;38041:1;38021:17:::0;;;:7:::1;:17;::::0;;;;:21;38057:42:::1;::::0;:11:::1;:24;38029:8:::0;38092:6;38057:24:::1;:42::i;:::-;38119:28;::::0;;;;;;;-1:-1:-1;;;;;38119:28:0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;37990:169;38222:12;38219:203;;;38267:12;:19:::0;38250:14:::1;38301:110;38319:6;38315:1;:10;38301:110;;;38359:12;38372:1;38359:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;38350:45:::1;::::0;;-1:-1:-1;;;38350:45:0;;-1:-1:-1;;;;;38350:45:0;;::::1;;::::0;::::1;::::0;;;38359:15;;;::::1;::::0;38350:35:::1;::::0;:45;;;;;;;;;;;38359:15;;38350:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38327:3:0::1;::::0;;::::1;::::0;-1:-1:-1;38301:110:0::1;::::0;-1:-1:-1;38301:110:0::1;;;38219:203;;38500:14;:12;:14::i;33189:139::-:0;-1:-1:-1;;;;;33296:23:0;;33246:7;33296:23;;;:14;:23;;;;;;;;;33273:9;:18;;;;;;:47;;:22;:47::i;30723:36::-;;;:::o;31035:29::-;;;;:::o;34409:135::-;34466:7;34493:43;34506:15;34523:12;;34493;:43::i;:::-;34486:50;;34409:135;:::o;31442:57::-;;;;;;;;;;;;;:::o;40972:2249::-;41193:4;34144:16;:14;:16::i;:::-;34121:20;:39;34188:26;:24;:26::i;:::-;34171:14;:43;-1:-1:-1;;;;;34229:21:0;;;34225:157;;34286:15;34293:7;34286:6;:15::i;:::-;-1:-1:-1;;;;;34267:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34350:20;;34316:22;:31;;;;;;:54;34225:157;41223:10:::1;-1:-1:-1::0;;;;;41237:15:0::1;41223:29;;41215:38;;;::::0;::::1;;41668:8;::::0;41691:14;41687:197:::1;;41772:12;-1:-1:-1::0;;;;;41730:54:0::1;41744:10;-1:-1:-1::0;;;;;41730:33:0::1;;41764:3;41730:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41730:38:0;-1:-1:-1;;;;;41730:54:0::1;;41722:63;;;::::0;::::1;;41800:8;:14:::0;;;41687:197:::1;;;41862:9;41855:3;:16;41847:25;;;::::0;::::1;;41900:15:::0;;41896:306:::1;;42170:20;42180:4;42185;42170:9;:20::i;:::-;-1:-1:-1::0;;;;;42236:20:0;::::1;42214:19;42236:20:::0;;;:14:::1;:20;::::0;;;;;42271:25;;::::1;42267:947;;;42397:14;42414:28;:11:::0;42430;42414:15:::1;:28::i;:::-;42474:12;:19:::0;42397:45;;-1:-1:-1;42457:14:0::1;42508:110;42526:6;42522:1;:10;42508:110;;;42566:12;42579:1;42566:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;42557:45:::1;::::0;;-1:-1:-1;;;42557:45:0;;-1:-1:-1;;;;;42557:45:0;;::::1;;::::0;::::1;::::0;;;;;;;;;42566:15;;;::::1;::::0;42557:31:::1;::::0;:45;;;;;;;;;;;42566:15;;42557:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42534:3:0::1;::::0;;::::1;::::0;-1:-1:-1;42508:110:0::1;::::0;-1:-1:-1;42508:110:0::1;;-1:-1:-1::0;42647:12:0::1;::::0;:24:::1;::::0;42664:6;42647:16:::1;:24::i;:::-;42632:12;:39:::0;-1:-1:-1;;;;;;;42686:20:0;::::1;;::::0;;;:14:::1;:20;::::0;;;;:34;;;42267:947:::1;;;42758:11;42744;:25;42740:474;;;42870:14;42887:28;:11:::0;42903;42887:15:::1;:28::i;:::-;42947:12;:19:::0;42870:45;;-1:-1:-1;42930:14:0::1;42981:119;42999:6;42995:1;:10;42981:119;;;43039:12;43052:1;43039:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;43030:54:::1;::::0;;-1:-1:-1;;;43030:54:0;;43065:10:::1;43030:54;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;43039:15:0;;::::1;::::0;43030:34:::1;::::0;:54;;;;;;;;;;43039:15;;43030:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;43007:3:0::1;::::0;;::::1;::::0;-1:-1:-1;42981:119:0::1;::::0;-1:-1:-1;42981:119:0::1;;-1:-1:-1::0;43129:12:0::1;::::0;:24:::1;::::0;43146:6;43129:16:::1;:24::i;:::-;43114:12;:39:::0;-1:-1:-1;;;;;;;43168:20:0;::::1;;::::0;;;:14:::1;:20;::::0;;;;:34;;;42740:474:::1;34392:1;;40972:2249:::0;;;;;;:::o;36114:124::-;36153:15;36171:12;-1:-1:-1;;;;;36171:22:0;;36194:10;36171:34;;;;;;;;;;;;;-1:-1:-1;;;;;36171:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36171:34:0;;-1:-1:-1;36216:14:0;36171:34;36216:5;:14::i;31149:33::-;;;;:::o;30956:32::-;;;:::o;35309:797::-;35379:10;34144:16;:14;:16::i;:::-;34121:20;:39;34188:26;:24;:26::i;:::-;34171:14;:43;-1:-1:-1;;;;;34229:21:0;;;34225:157;;34286:15;34293:7;34286:6;:15::i;:::-;-1:-1:-1;;;;;34267:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34350:20;;34316:22;:31;;;;;;:54;34225:157;35425:1:::1;35415:7;:11;35407:51;;;::::0;;-1:-1:-1;;;35407:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35537:14;:12;:14::i;:::-;35621:12;:19:::0;35604:14:::1;35651:109;35669:6;35665:1;:10;35651:109;;;35705:12;35718:1;35705:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;35696:52:::1;::::0;;-1:-1:-1;;;35696:52:0;;35728:10:::1;35696:52;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;35705:15:0;;::::1;::::0;35696:31:::1;::::0;:52;;;;;;;;;;35705:15;;35696:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35677:3:0::1;::::0;;::::1;::::0;-1:-1:-1;35651:109:0::1;::::0;-1:-1:-1;35651:109:0::1;;-1:-1:-1::0;35809:12:0::1;::::0;:25:::1;::::0;35826:7;35809:16:::1;:25::i;:::-;35794:12;:40:::0;35918:10:::1;35908:21;::::0;;;:9:::1;:21;::::0;;;;;:34:::1;::::0;35934:7;35908:25:::1;:34::i;:::-;35894:10;35884:21;::::0;;;:9:::1;:21;::::0;;;;:58;;;;35988:65:::1;::::0;:12:::1;-1:-1:-1::0;;;;;35988:29:0::1;::::0;36038:4:::1;36045:7:::0;35988:29:::1;:65::i;:::-;36071:27;::::0;;;;;;;36078:10:::1;::::0;36071:27:::1;::::0;;;;;::::1;::::0;;::::1;34392:1;35309:797:::0;;:::o;31298:26::-;;;;;;:::o;31071:29::-;;;;:::o;30861:40::-;;;:::o;34552:447::-;34599:7;34619:14;34636:13;:11;:13::i;:::-;34619:30;-1:-1:-1;34664:11:0;34660:71;;-1:-1:-1;;34699:20:0;;34692:27;;34660:71;34761:230;34804:172;34969:6;34804:138;34937:4;34804:106;34899:10;;34804:68;34857:14;;34804:26;:24;:26::i;:172::-;34761:20;;;:24;:230::i;:::-;34741:250;;;34552:447;:::o;33459:120::-;-1:-1:-1;;;;;33548:23:0;33521:7;33548:23;;;:14;:23;;;;;;;33459:120::o;33587:107::-;33667:12;:19;33587:107;:::o;43229:855::-;43502:12;:19;43402:15;;;;;43613:1;:8;;43600:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43600:22:0;;43569:53;;43651:11;43633:12;43646:1;43633:15;;;;;;;;;;;;;:29;-1:-1:-1;;;;;43633:29:0;;;-1:-1:-1;;;;;43633:29:0;;;;;43677:6;43673:123;43691:6;43687:1;:10;43673:123;;;43753:12;43766:1;43753:15;;;;;;;;;;;;;;;;;;;43744:39;;;-1:-1:-1;;;43744:39:0;;;;-1:-1:-1;;;;;43753:15:0;;;;43744:37;;:39;;;;;;;;;;43753:15;43744:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43744:39:0;43717:17;;:12;;43730:1;:3;;;43717:17;;;;;;-1:-1:-1;;;;;43717:67:0;;;:17;;;;;;;;;;;:67;43699:3;;43673:123;;;;43806:30;43855:6;43853:1;:8;43839:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43839:23:0;;43806:56;;43892:12;43899:4;43892:6;:12::i;:::-;43873:13;43887:1;43873:16;;;;;;;;;;;;;:31;;;;;43919:6;43915:116;43933:6;43929:1;:10;43915:116;;;43990:12;44003:1;43990:15;;;;;;;;;;;;;;;;;;;43981:38;;;-1:-1:-1;;;43981:38:0;;-1:-1:-1;;;;;43981:38:0;;;;;;;;;43990:15;;;;;43981:32;;:38;;;;;;;;;;;43990:15;43981:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43981:38:0;43960:18;;:13;;43974:1;:3;;;43960:18;;;;;;;;;;;;;;;:59;43941:3;;43915:116;;;-1:-1:-1;44049:12:0;;;;-1:-1:-1;43229:855:0;-1:-1:-1;;;;;43229:855:0:o;31107:35::-;;;;:::o;30908:41::-;;;:::o;30997:31::-;;;;:::o;30681:35::-;;;:::o;12316:158::-;12374:7;12407:1;12402;:6;;12394:49;;;;;-1:-1:-1;;;12394:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12461:5:0;;;12316:158::o;11854:179::-;11912:7;11944:5;;;11968:6;;;;11960:46;;;;;-1:-1:-1;;;11960:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12024:1;11854:179;-1:-1:-1;;;11854:179:0:o;12733:220::-;12791:7;12815:6;12811:20;;-1:-1:-1;12830:1:0;12823:8;;12811:20;12854:5;;;12858:1;12854;:5;:1;12878:5;;;;;:10;12870:56;;;;-1:-1:-1;;;12870:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13431:153;13489:7;13521:1;13517;:5;13509:44;;;;;-1:-1:-1;;;13509:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13575:1;13571;:5;;;;;;;13431:153;-1:-1:-1;;;13431:153:0:o;25404:205::-;25532:68;;;-1:-1:-1;;;;;25532:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25532:68:0;-1:-1:-1;;;25532:68:0;;;25505:96;;25525:5;;25505:19;:96::i;39110:649::-;39163:1;34144:16;:14;:16::i;:::-;34121:20;:39;34188:26;:24;:26::i;:::-;34171:14;:43;-1:-1:-1;;;;;34229:21:0;;;34225:157;;34286:15;34293:7;34286:6;:15::i;:::-;-1:-1:-1;;;;;34267:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34350:20;;34316:22;:31;;;;;;:54;34225:157;39177:14:::1;39194:11;-1:-1:-1::0;;;;;39194:21:0::1;;39224:4;39194:36;;;;;;;;;;;;;-1:-1:-1::0;;;;;39194:36:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39194:36:0;39274:12:::1;::::0;39194:36;;-1:-1:-1;39255:15:0::1;:31;39251:334;;39316:20;:6:::0;30801::::1;39316:10;:20::i;:::-;39303:10;:33:::0;39251:334:::1;;;39369:17;39389:12:::0;;:33:::1;::::0;39406:15:::1;39389:16;:33::i;:::-;39369:53;;39437:16;39456:25;39470:10;;39456:9;:13;;:25;;;;:::i;:::-;39437:44:::0;-1:-1:-1;39505:20:0::1;:6:::0;39437:44;39505:10:::1;:20::i;:::-;39496:29:::0;-1:-1:-1;39553:20:0::1;39496:29:::0;30801:6:::1;39553:10;:20::i;:::-;39540:10;:33:::0;-1:-1:-1;;39251:334:0::1;39595:14;:23:::0;;;39646:15:::1;39629:14;:32:::0;;;39687:29:::1;::::0;30801:6:::1;39687:19;:29::i;:::-;39672:12;:44:::0;39732:19:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;34392:1;39110:649:::0;:::o;38612:252::-;38755:1;38740:12;;:16;:63;;;;-1:-1:-1;38779:12:0;;:24;;38796:6;38779:16;:24::i;:::-;38760:15;:43;;38740:63;38736:121;;;38822:23;:21;:23::i;25219:177::-;25329:58;;;-1:-1:-1;;;;;25329:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25329:58:0;-1:-1:-1;;;25329:58:0;;;25302:86;;25322:5;;25302:19;:86::i;:::-;25219:177;;;:::o;39767:1197::-;39845:1;34144:16;:14;:16::i;:::-;34121:20;:39;34188:26;:24;:26::i;:::-;34171:14;:43;-1:-1:-1;;;;;34229:21:0;;;34225:157;;34286:15;34293:7;34286:6;:15::i;:::-;-1:-1:-1;;;;;34267:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34350:20;;34316:22;:31;;;;;;:54;34225:157;39869:6:::1;::::0;::::1;;39865:157;;40004:7;;39865:157;40236:62;::::0;;-1:-1:-1;;;40236:62:0;;40275:7:::1;40236:62;::::0;::::1;::::0;40292:4:::1;40236:62:::0;;;;;;40214:18:::1;::::0;-1:-1:-1;;;;;40248:16:0::1;40236:38;::::0;::::1;::::0;:62;;;;;;;;;;;:38;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40236:62:0::1;;::::0;40341:18:::1;::::0;40236:62;;-1:-1:-1;40309:14:0::1;::::0;40326:34:::1;::::0;40236:62;;40326:14:::1;:34::i;:::-;40371:18;:31:::0;;;40309:51;-1:-1:-1;40416:11:0;40413:23:::1;;40429:7;;;;40413:23;40479:12;;40460:15;:31;40456:334;;40521:20;:6:::0;30801::::1;40521:10;:20::i;:::-;40508:10;:33:::0;40456:334:::1;;;40574:17;40594:12:::0;;:33:::1;::::0;40611:15:::1;40594:16;:33::i;:::-;40574:53;;40642:16;40661:25;40675:10;;40661:9;:13;;:25;;;;:::i;:::-;40642:44:::0;-1:-1:-1;40710:20:0::1;:6:::0;40642:44;40710:10:::1;:20::i;:::-;40701:29:::0;-1:-1:-1;40758:20:0::1;40701:29:::0;30801:6:::1;40758:10;:20::i;:::-;40745:10;:33:::0;-1:-1:-1;;40456:334:0::1;40800:14;:23:::0;;;40851:15:::1;40834:14;:32:::0;;;40892:29:::1;::::0;30801:6:::1;40892:19;:29::i;:::-;40877:12;:44:::0;40937:19:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;34392:1;;39767:1197:::0;:::o;231:106::-;289:7;320:1;316;:5;:13;;328:1;316:13;;;-1:-1:-1;324:1:0;;309:20;-1:-1:-1;231:106:0:o;27524:761::-;27948:23;27974:69;28002:4;27974:69;;;;;;;;;;;;;;;;;27982:5;-1:-1:-1;;;;;27974:27:0;;;:69;;;;;:::i;:::-;28058:17;;27948:95;;-1:-1:-1;28058:21:0;28054:224;;28200:10;28189:30;;;;;;;;;;;;;;;-1:-1:-1;28189:30:0;28181:85;;;;-1:-1:-1;;;28181:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20222:195;20325:12;20357:52;20379:6;20387:4;20393:1;20396:12;20357:21;:52::i;:::-;20350:59;20222:195;-1:-1:-1;;;;20222:195:0:o;21274:530::-;21401:12;21459:5;21434:21;:30;;21426:81;;;;-1:-1:-1;;;21426:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21526:18;21537:6;21526:10;:18::i;:::-;21518:60;;;;;-1:-1:-1;;;21518:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21652:12;21666:23;21693:6;-1:-1:-1;;;;;21693:11:0;21713:5;21721:4;21693:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21693:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21651:75;;;;21744:52;21762:7;21771:10;21783:12;21744:17;:52::i;:::-;21737:59;21274:530;-1:-1:-1;;;;;;;21274:530:0:o;17304:422::-;17671:20;17710:8;;;17304:422::o;23814:742::-;23929:12;23958:7;23954:595;;;-1:-1:-1;23989:10:0;23982:17;;23954:595;24103:17;;:21;24099:439;;24366:10;24360:17;24427:15;24414:10;24410:2;24406:19;24399:44;24314:148;24509:12;24502:20;;-1:-1:-1;;;24502:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://beb8207404e64fbcaafb05d7f7891010c32fb260f88665f14e3262e011aef2d1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1.94 | 3,083.8344 | $5,989.04 |
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.