More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xd4c0ca0e383d0073758878423e0037d2b0d0b40c040437999de6fa434d498e24 | Get Reward | (pending) | 45 hrs ago | IN | 0 ETH | (Pending) | |||
Withdraw | 21331245 | 1 hr ago | IN | 0 ETH | 0.00520361 | ||||
Get Reward | 21331237 | 1 hr ago | IN | 0 ETH | 0.00739404 | ||||
Get Reward | 21330697 | 3 hrs ago | IN | 0 ETH | 0.00721813 | ||||
Withdraw | 21329983 | 5 hrs ago | IN | 0 ETH | 0.00873088 | ||||
Get Reward | 21329966 | 5 hrs ago | IN | 0 ETH | 0.01538993 | ||||
Withdraw | 21329746 | 6 hrs ago | IN | 0 ETH | 0.00946682 | ||||
Get Reward | 21328998 | 9 hrs ago | IN | 0 ETH | 0.00536151 | ||||
Withdraw | 21328941 | 9 hrs ago | IN | 0 ETH | 0.00382902 | ||||
Withdraw | 21328861 | 9 hrs ago | IN | 0 ETH | 0.00450492 | ||||
Get Reward | 21328819 | 9 hrs ago | IN | 0 ETH | 0.00581119 | ||||
Get Reward | 21328802 | 9 hrs ago | IN | 0 ETH | 0.00475632 | ||||
Withdraw | 21328800 | 9 hrs ago | IN | 0 ETH | 0.00421432 | ||||
Withdraw | 21328741 | 9 hrs ago | IN | 0 ETH | 0.00307952 | ||||
Withdraw | 21328676 | 10 hrs ago | IN | 0 ETH | 0.00406963 | ||||
Withdraw | 21328054 | 12 hrs ago | IN | 0 ETH | 0.00380478 | ||||
Get Reward | 21327805 | 13 hrs ago | IN | 0 ETH | 0.00495064 | ||||
Get Reward | 21327395 | 14 hrs ago | IN | 0 ETH | 0.00521765 | ||||
Withdraw | 21327385 | 14 hrs ago | IN | 0 ETH | 0.00366648 | ||||
Get Reward | 21327183 | 15 hrs ago | IN | 0 ETH | 0.00481556 | ||||
Withdraw | 21326944 | 15 hrs ago | IN | 0 ETH | 0.00385837 | ||||
Withdraw | 21325068 | 22 hrs ago | IN | 0 ETH | 0.005798 | ||||
Get Reward | 21325061 | 22 hrs ago | IN | 0 ETH | 0.00599568 | ||||
Withdraw | 21323221 | 28 hrs ago | IN | 0 ETH | 0.00760717 | ||||
Get Reward | 21322178 | 31 hrs ago | IN | 0 ETH | 0.0526287 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BaseRewardPool
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-18 */ // 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 returns (address); } 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); } 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\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: @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: @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\BaseRewardPool.sol pragma solidity 0.6.12; /** *Submitted for verification at Etherscan.io on 2020-07-17 */ /* ____ __ __ __ _ / __/__ __ ___ / /_ / / ___ / /_ (_)__ __ _\ \ / // // _ \/ __// _ \/ -_)/ __// / \ \ / /___/ \_, //_//_/\__//_//_/\__/ \__//_/ /_\_\ /___/ * Synthetix: BaseRewardPool.sol * * 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 */ contract BaseRewardPool { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 public rewardToken; IERC20 public stakingToken; uint256 public constant duration = 7 days; address public operator; address public rewardManager; uint256 public pid; uint256 public periodFinish = 0; uint256 public rewardRate = 0; uint256 public lastUpdateTime; uint256 public rewardPerTokenStored; uint256 public queuedRewards = 0; uint256 public currentRewards = 0; uint256 public historicalRewards = 0; uint256 public constant newRewardRatio = 830; uint256 private _totalSupply; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; mapping(address => uint256) private _balances; 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( uint256 pid_, address stakingToken_, address rewardToken_, address operator_, address rewardManager_ ) public { pid = pid_; stakingToken = IERC20(stakingToken_); rewardToken = IERC20(rewardToken_); operator = operator_; rewardManager = rewardManager_; } function totalSupply() public view returns (uint256) { return _totalSupply; } function balanceOf(address account) public view returns (uint256) { return _balances[account]; } function extraRewardsLength() external view returns (uint256) { return extraRewards.length; } function addExtraReward(address _reward) external returns(bool){ require(msg.sender == rewardManager, "!authorized"); require(_reward != address(0),"!reward setting"); extraRewards.push(_reward); return true; } 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) { if (totalSupply() == 0) { return rewardPerTokenStored; } return rewardPerTokenStored.add( lastTimeRewardApplicable() .sub(lastUpdateTime) .mul(rewardRate) .mul(1e18) .div(totalSupply()) ); } function earned(address account) public view returns (uint256) { return balanceOf(account) .mul(rewardPerToken().sub(userRewardPerTokenPaid[account])) .div(1e18) .add(rewards[account]); } function stake(uint256 _amount) public updateReward(msg.sender) returns(bool) { require(_amount > 0, 'RewardPool : Cannot stake 0'); //also stake to linked rewards for(uint i=0; i < extraRewards.length; i++){ IRewards(extraRewards[i]).stake(msg.sender, _amount); } _totalSupply = _totalSupply.add(_amount); _balances[msg.sender] = _balances[msg.sender].add(_amount); stakingToken.safeTransferFrom(msg.sender, address(this), _amount); emit Staked(msg.sender, _amount); return true; } function stakeAll() external returns(bool){ uint256 balance = stakingToken.balanceOf(msg.sender); stake(balance); return true; } function stakeFor(address _for, uint256 _amount) public updateReward(_for) returns(bool) { require(_amount > 0, 'RewardPool : Cannot stake 0'); //also stake to linked rewards for(uint i=0; i < extraRewards.length; i++){ IRewards(extraRewards[i]).stake(_for, _amount); } //give to _for _totalSupply = _totalSupply.add(_amount); _balances[_for] = _balances[_for].add(_amount); //take away from sender stakingToken.safeTransferFrom(msg.sender, address(this), _amount); emit Staked(_for, _amount); return true; } function withdraw(uint256 amount, bool claim) public updateReward(msg.sender) returns(bool) { require(amount > 0, 'RewardPool : Cannot withdraw 0'); //also withdraw from linked rewards for(uint i=0; i < extraRewards.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); } return true; } function withdrawAll(bool claim) external{ withdraw(_balances[msg.sender],claim); } function withdrawAndUnwrap(uint256 amount, bool claim) public updateReward(msg.sender) returns(bool){ //also withdraw from linked rewards for(uint i=0; i < extraRewards.length; i++){ IRewards(extraRewards[i]).withdraw(msg.sender, amount); } _totalSupply = _totalSupply.sub(amount); _balances[msg.sender] = _balances[msg.sender].sub(amount); //tell operator to withdraw from here directly to user IDeposit(operator).withdrawTo(pid,amount,msg.sender); emit Withdrawn(msg.sender, amount); //get rewards too if(claim){ getReward(msg.sender,true); } return true; } function withdrawAllAndUnwrap(bool claim) external{ withdrawAndUnwrap(_balances[msg.sender],claim); } function getReward(address _account, bool _claimExtras) public updateReward(_account) returns(bool){ uint256 reward = earned(_account); if (reward > 0) { rewards[_account] = 0; rewardToken.safeTransfer(_account, reward); IDeposit(operator).rewardClaimed(pid, _account, reward); emit RewardPaid(_account, reward); } //also get rewards from linked rewards if(_claimExtras){ for(uint i=0; i < extraRewards.length; i++){ IRewards(extraRewards[i]).getReward(_account); } } return true; } function getReward() external returns(bool){ getReward(msg.sender,true); return true; } function donate(uint256 _amount) external returns(bool){ IERC20(rewardToken).safeTransferFrom(msg.sender, address(this), _amount); queuedRewards = queuedRewards.add(_amount); } function queueNewRewards(uint256 _rewards) external returns(bool){ require(msg.sender == operator, "!authorized"); _rewards = _rewards.add(queuedRewards); if (block.timestamp >= periodFinish) { notifyRewardAmount(_rewards); queuedRewards = 0; return true; } //et = now - (finish-duration) uint256 elapsedTime = block.timestamp.sub(periodFinish.sub(duration)); //current at now: rewardRate * elapsedTime uint256 currentAtNow = rewardRate * elapsedTime; uint256 queuedRatio = currentAtNow.mul(1000).div(_rewards); //uint256 queuedRatio = currentRewards.mul(1000).div(_rewards); if(queuedRatio < newRewardRatio){ notifyRewardAmount(_rewards); queuedRewards = 0; }else{ queuedRewards = _rewards; } return true; } function notifyRewardAmount(uint256 reward) internal updateReward(address(0)) { historicalRewards = historicalRewards.add(reward); 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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"pid_","type":"uint256"},{"internalType":"address","name":"stakingToken_","type":"address"},{"internalType":"address","name":"rewardToken_","type":"address"},{"internalType":"address","name":"operator_","type":"address"},{"internalType":"address","name":"rewardManager_","type":"address"}],"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":[{"internalType":"bool","name":"","type":"bool"}],"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":"clearExtraRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"donate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_claimExtras","type":"bool"}],"name":"getReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"historicalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"newRewardRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"}],"name":"queueNewRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"queuedRewards","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":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_for","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"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":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"claim","type":"bool"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"claim","type":"bool"}],"name":"withdrawAllAndUnwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claim","type":"bool"}],"name":"withdrawAndUnwrap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600555600060065560006009556000600a556000600b5534801561002957600080fd5b50604051611ba2380380611ba2833981810160405260a081101561004c57600080fd5b508051602082015160408301516060840151608090940151600493909355600180546001600160a01b03199081166001600160a01b039485161790915560008054821692841692909217825560028054821695841695909517909455600380549094169190921617909155611adb9081906100c790396000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c80637050ccd911610125578063c32e7202116100ad578063df136d651161007c578063df136d65146104e3578063ebe2b12b146104eb578063f1068454146104f3578063f14faf6f146104fb578063f7c618c1146105185761021b565b8063c32e7202146104a6578063c8f33c91146104cb578063cd3daf9d146104d3578063d55a23f4146104db5761021b565b806380faa57d116100f457806380faa57d1461044b5780638b876347146104535780638dcb406114610479578063901a7d5314610481578063a694fc3a146104895761021b565b80637050ccd9146103e757806370a082311461041557806372f702f31461043b5780637b0a47ee146104435761021b565b806338d07436116101a8578063570ca73511610177578063570ca7351461038c578063590a41f5146103945780635e43c47b146103b157806363d38c3b146103d75780636c8bcee8146103df5761021b565b806338d07436146103235780633d18b9121461034857806340c354461461035057806349f039a21461036d5761021b565b80630fb5a6b4116101ef5780630fb5a6b4146102ac57806318160ddd146102b45780631c1c6fe5146102bc578063262d3d6d146102db5780632ee40908146102e35761021b565b80628cc262146102205780630569d388146102585780630700037d146102625780630f4ef8a614610288575b600080fd5b6102466004803603602081101561023657600080fd5b50356001600160a01b0316610520565b60408051918252519081900360200190f35b610260610590565b005b6102466004803603602081101561027857600080fd5b50356001600160a01b03166105eb565b6102906105fd565b604080516001600160a01b039092168252519081900360200190f35b61024661060c565b610246610613565b610260600480360360208110156102d257600080fd5b5035151561061a565b610246610638565b61030f600480360360408110156102f957600080fd5b506001600160a01b03813516906020013561063e565b604080519115158252519081900360200190f35b61030f6004803603604081101561033957600080fd5b50803590602001351515610831565b61030f610a20565b6102906004803603602081101561036657600080fd5b5035610a35565b6102606004803603602081101561038357600080fd5b50351515610a5c565b610290610a76565b61030f600480360360208110156103aa57600080fd5b5035610a85565b61030f600480360360208110156103c757600080fd5b50356001600160a01b0316610b72565b610246610c63565b610246610c69565b61030f600480360360408110156103fd57600080fd5b506001600160a01b0381351690602001351515610c6f565b6102466004803603602081101561042b57600080fd5b50356001600160a01b0316610e61565b610290610e7c565b610246610e8b565b610246610e91565b6102466004803603602081101561046957600080fd5b50356001600160a01b0316610ea4565b61030f610eb6565b610246610f46565b61030f6004803603602081101561049f57600080fd5b5035610f4c565b61030f600480360360408110156104bc57600080fd5b50803590602001351515611128565b61024661130d565b610246611313565b610246611361565b610246611367565b61024661136d565b610246611373565b61030f6004803603602081101561051157600080fd5b5035611379565b6102906113a7565b6001600160a01b0381166000908152600e6020908152604080832054600d909252822054610588919061058290670de0b6b3a76400009061057c9061056d90610567611313565b906113b6565b61057688610e61565b90611418565b90611478565b906114df565b90505b919050565b6003546001600160a01b031633146105dd576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6105e9601060006119fa565b565b600e6020526000908152604090205481565b6003546001600160a01b031681565b62093a8081565b600c545b90565b336000908152600f60205260409020546106349082610831565b5050565b600b5481565b600082610649611313565b600855610654610e91565b6007556001600160a01b0381161561069b5761066f81610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b600083116106f0576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b60005b601054811015610787576010818154811061070a57fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038981166004830152602482018990529151919092169263adc9772e926044808201939182900301818387803b15801561076357600080fd5b505af1158015610777573d6000803e3d6000fd5b5050600190920191506106f39050565b50600c5461079590846114df565b600c556001600160a01b0384166000908152600f60205260409020546107bb90846114df565b6001600160a01b038086166000908152600f60205260409020919091556001546107e89116333086611539565b6040805184815290516001600160a01b038616917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060019392505050565b60003361083c611313565b600855610847610e91565b6007556001600160a01b0381161561088e5761086281610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b600084116108e3576040805162461bcd60e51b815260206004820152601e60248201527f526577617264506f6f6c203a2043616e6e6f7420776974686472617720300000604482015290519081900360640190fd5b60005b60105481101561097657601081815481106108fd57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b15801561095257600080fd5b505af1158015610966573d6000803e3d6000fd5b5050600190920191506108e69050565b50600c5461098490856113b6565b600c55336000908152600f60205260409020546109a190856113b6565b336000818152600f60205260409020919091556001546109cd916001600160a01b039091169086611599565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a28215610a1657610a14336001610c6f565b505b5060019392505050565b6000610a2d336001610c6f565b506001905090565b60108181548110610a4257fe5b6000918252602090912001546001600160a01b0316905081565b336000908152600f60205260409020546106349082611128565b6002546001600160a01b031681565b6002546000906001600160a01b03163314610ad5576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b600954610ae39083906114df565b91506005544210610b0457610af7826115f0565b506000600955600161058b565b6000610b28610b2162093a806005546113b690919063ffffffff16565b42906113b6565b60065490915081026000610b428561057c846103e8611418565b905061033e811015610b6157610b57856115f0565b6000600955610b67565b60098590555b506001949350505050565b6003546000906001600160a01b03163314610bc2576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216610c0f576040805162461bcd60e51b815260206004820152600f60248201526e217265776172642073657474696e6760881b604482015290519081900360640190fd5b5060108054600181810183556000929092527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0384166001600160a01b0319909116179055919050565b60095481565b61033e81565b600082610c7a611313565b600855610c85610e91565b6007556001600160a01b03811615610ccc57610ca081610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b6000610cd785610520565b90508015610dbf576001600160a01b038086166000908152600e6020526040812081905554610d0891168683611599565b60025460048054604080516371192b1760e01b8152928301919091526001600160a01b0388811660248401526044830185905290519216916371192b179160648082019260009290919082900301818387803b158015610d6757600080fd5b505af1158015610d7b573d6000803e3d6000fd5b50506040805184815290516001600160a01b03891693507fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048692509081900360200190a25b8315610b675760005b601054811015610e555760108181548110610ddf57fe5b600091825260208220015460408051630c00007b60e41b81526001600160a01b038a811660048301529151919092169263c00007b0926024808201939182900301818387803b158015610e3157600080fd5b505af1158015610e45573d6000803e3d6000fd5b505060019092019150610dc89050565b50506001949350505050565b6001600160a01b03166000908152600f602052604090205490565b6001546001600160a01b031681565b60065481565b6000610e9f42600554611716565b905090565b600d6020526000908152604090205481565b600154604080516370a0823160e01b8152336004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610f0657600080fd5b505afa158015610f1a573d6000803e3d6000fd5b505050506040513d6020811015610f3057600080fd5b50519050610f3d81610f4c565b50600191505090565b600a5481565b600033610f57611313565b600855610f62610e91565b6007556001600160a01b03811615610fa957610f7d81610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b60008311610ffe576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b60005b601054811015611091576010818154811061101857fe5b6000918252602082200154604080516356e4bb9760e11b81523360048201526024810188905290516001600160a01b039092169263adc9772e9260448084019382900301818387803b15801561106d57600080fd5b505af1158015611081573d6000803e3d6000fd5b5050600190920191506110019050565b50600c5461109f90846114df565b600c55336000908152600f60205260409020546110bc90846114df565b336000818152600f60205260409020919091556001546110e9916001600160a01b03909116903086611539565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a250600192915050565b600033611133611313565b60085561113e610e91565b6007556001600160a01b038116156111855761115981610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b60005b601054811015611218576010818154811061119f57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b1580156111f457600080fd5b505af1158015611208573d6000803e3d6000fd5b5050600190920191506111889050565b50600c5461122690856113b6565b600c55336000908152600f602052604090205461124390856113b6565b336000818152600f6020526040808220939093556002546004805485516305335c3960e21b81529182015260248101899052604481019390935292516001600160a01b03909316926314cd70e492606480820193929182900301818387803b1580156112ae57600080fd5b505af11580156112c2573d6000803e3d6000fd5b50506040805187815290513393507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d592509081900360200190a28215610a1657610a14336001610c6f565b60075481565b600061131d610613565b61132a5750600854610617565b610e9f611358611338610613565b61057c670de0b6b3a7640000610576600654610576600754610567610e91565b600854906114df565b60105490565b60085481565b60055481565b60045481565b60008054611392906001600160a01b0316333085611539565b60095461139f90836114df565b600955919050565b6000546001600160a01b031681565b60008282111561140d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b60008261142757506000611412565b8282028284828161143457fe5b04146114715760405162461bcd60e51b8152600401808060200182810382526021815260200180611a5b6021913960400191505060405180910390fd5b9392505050565b60008082116114ce576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816114d757fe5b049392505050565b600082820183811015611471576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261159390859061172c565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115eb90849061172c565b505050565b60006115fa611313565b600855611605610e91565b6007556001600160a01b0381161561164c5761162081610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b600b5461165990836114df565b600b55600554421061167a576116728262093a80611478565b6006556116c4565b60055460009061168a90426113b6565b905060006116a36006548361141890919063ffffffff16565b90506116af84826114df565b93506116be8462093a80611478565b60065550505b600a8290554260078190556116dc9062093a806114df565b6005556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b60008183106117255781611471565b5090919050565b6060611781826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117dd9092919063ffffffff16565b8051909150156115eb578080602001905160208110156117a057600080fd5b50516115eb5760405162461bcd60e51b815260040180806020018281038252602a815260200180611a7c602a913960400191505060405180910390fd5b60606117ec84846000856117f4565b949350505050565b6060824710156118355760405162461bcd60e51b8152600401808060200182810382526026815260200180611a356026913960400191505060405180910390fd5b61183e85611950565b61188f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106118ce5780518252601f1990920191602091820191016118af565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611930576040519150601f19603f3d011682016040523d82523d6000602084013e611935565b606091505b5091509150611945828286611956565b979650505050505050565b3b151590565b60608315611965575081611471565b8251156119755782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156119bf5781810151838201526020016119a7565b50505050905090810190601f1680156119ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080546000825590600052602060002090810190611a189190611a1b565b50565b5b80821115611a305760008155600101611a1c565b509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c2587b5a77d7a7f733569d1f0dd4c08f00e3e34db8828f410842bfa6d54215fe64736f6c634300060c0033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062b9c7356a2dc64a1969e19c23e4f579f9810aa7000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061021b5760003560e01c80637050ccd911610125578063c32e7202116100ad578063df136d651161007c578063df136d65146104e3578063ebe2b12b146104eb578063f1068454146104f3578063f14faf6f146104fb578063f7c618c1146105185761021b565b8063c32e7202146104a6578063c8f33c91146104cb578063cd3daf9d146104d3578063d55a23f4146104db5761021b565b806380faa57d116100f457806380faa57d1461044b5780638b876347146104535780638dcb406114610479578063901a7d5314610481578063a694fc3a146104895761021b565b80637050ccd9146103e757806370a082311461041557806372f702f31461043b5780637b0a47ee146104435761021b565b806338d07436116101a8578063570ca73511610177578063570ca7351461038c578063590a41f5146103945780635e43c47b146103b157806363d38c3b146103d75780636c8bcee8146103df5761021b565b806338d07436146103235780633d18b9121461034857806340c354461461035057806349f039a21461036d5761021b565b80630fb5a6b4116101ef5780630fb5a6b4146102ac57806318160ddd146102b45780631c1c6fe5146102bc578063262d3d6d146102db5780632ee40908146102e35761021b565b80628cc262146102205780630569d388146102585780630700037d146102625780630f4ef8a614610288575b600080fd5b6102466004803603602081101561023657600080fd5b50356001600160a01b0316610520565b60408051918252519081900360200190f35b610260610590565b005b6102466004803603602081101561027857600080fd5b50356001600160a01b03166105eb565b6102906105fd565b604080516001600160a01b039092168252519081900360200190f35b61024661060c565b610246610613565b610260600480360360208110156102d257600080fd5b5035151561061a565b610246610638565b61030f600480360360408110156102f957600080fd5b506001600160a01b03813516906020013561063e565b604080519115158252519081900360200190f35b61030f6004803603604081101561033957600080fd5b50803590602001351515610831565b61030f610a20565b6102906004803603602081101561036657600080fd5b5035610a35565b6102606004803603602081101561038357600080fd5b50351515610a5c565b610290610a76565b61030f600480360360208110156103aa57600080fd5b5035610a85565b61030f600480360360208110156103c757600080fd5b50356001600160a01b0316610b72565b610246610c63565b610246610c69565b61030f600480360360408110156103fd57600080fd5b506001600160a01b0381351690602001351515610c6f565b6102466004803603602081101561042b57600080fd5b50356001600160a01b0316610e61565b610290610e7c565b610246610e8b565b610246610e91565b6102466004803603602081101561046957600080fd5b50356001600160a01b0316610ea4565b61030f610eb6565b610246610f46565b61030f6004803603602081101561049f57600080fd5b5035610f4c565b61030f600480360360408110156104bc57600080fd5b50803590602001351515611128565b61024661130d565b610246611313565b610246611361565b610246611367565b61024661136d565b610246611373565b61030f6004803603602081101561051157600080fd5b5035611379565b6102906113a7565b6001600160a01b0381166000908152600e6020908152604080832054600d909252822054610588919061058290670de0b6b3a76400009061057c9061056d90610567611313565b906113b6565b61057688610e61565b90611418565b90611478565b906114df565b90505b919050565b6003546001600160a01b031633146105dd576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6105e9601060006119fa565b565b600e6020526000908152604090205481565b6003546001600160a01b031681565b62093a8081565b600c545b90565b336000908152600f60205260409020546106349082610831565b5050565b600b5481565b600082610649611313565b600855610654610e91565b6007556001600160a01b0381161561069b5761066f81610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b600083116106f0576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b60005b601054811015610787576010818154811061070a57fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038981166004830152602482018990529151919092169263adc9772e926044808201939182900301818387803b15801561076357600080fd5b505af1158015610777573d6000803e3d6000fd5b5050600190920191506106f39050565b50600c5461079590846114df565b600c556001600160a01b0384166000908152600f60205260409020546107bb90846114df565b6001600160a01b038086166000908152600f60205260409020919091556001546107e89116333086611539565b6040805184815290516001600160a01b038616917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25060019392505050565b60003361083c611313565b600855610847610e91565b6007556001600160a01b0381161561088e5761086281610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b600084116108e3576040805162461bcd60e51b815260206004820152601e60248201527f526577617264506f6f6c203a2043616e6e6f7420776974686472617720300000604482015290519081900360640190fd5b60005b60105481101561097657601081815481106108fd57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b15801561095257600080fd5b505af1158015610966573d6000803e3d6000fd5b5050600190920191506108e69050565b50600c5461098490856113b6565b600c55336000908152600f60205260409020546109a190856113b6565b336000818152600f60205260409020919091556001546109cd916001600160a01b039091169086611599565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a28215610a1657610a14336001610c6f565b505b5060019392505050565b6000610a2d336001610c6f565b506001905090565b60108181548110610a4257fe5b6000918252602090912001546001600160a01b0316905081565b336000908152600f60205260409020546106349082611128565b6002546001600160a01b031681565b6002546000906001600160a01b03163314610ad5576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b600954610ae39083906114df565b91506005544210610b0457610af7826115f0565b506000600955600161058b565b6000610b28610b2162093a806005546113b690919063ffffffff16565b42906113b6565b60065490915081026000610b428561057c846103e8611418565b905061033e811015610b6157610b57856115f0565b6000600955610b67565b60098590555b506001949350505050565b6003546000906001600160a01b03163314610bc2576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038216610c0f576040805162461bcd60e51b815260206004820152600f60248201526e217265776172642073657474696e6760881b604482015290519081900360640190fd5b5060108054600181810183556000929092527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0384166001600160a01b0319909116179055919050565b60095481565b61033e81565b600082610c7a611313565b600855610c85610e91565b6007556001600160a01b03811615610ccc57610ca081610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b6000610cd785610520565b90508015610dbf576001600160a01b038086166000908152600e6020526040812081905554610d0891168683611599565b60025460048054604080516371192b1760e01b8152928301919091526001600160a01b0388811660248401526044830185905290519216916371192b179160648082019260009290919082900301818387803b158015610d6757600080fd5b505af1158015610d7b573d6000803e3d6000fd5b50506040805184815290516001600160a01b03891693507fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048692509081900360200190a25b8315610b675760005b601054811015610e555760108181548110610ddf57fe5b600091825260208220015460408051630c00007b60e41b81526001600160a01b038a811660048301529151919092169263c00007b0926024808201939182900301818387803b158015610e3157600080fd5b505af1158015610e45573d6000803e3d6000fd5b505060019092019150610dc89050565b50506001949350505050565b6001600160a01b03166000908152600f602052604090205490565b6001546001600160a01b031681565b60065481565b6000610e9f42600554611716565b905090565b600d6020526000908152604090205481565b600154604080516370a0823160e01b8152336004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610f0657600080fd5b505afa158015610f1a573d6000803e3d6000fd5b505050506040513d6020811015610f3057600080fd5b50519050610f3d81610f4c565b50600191505090565b600a5481565b600033610f57611313565b600855610f62610e91565b6007556001600160a01b03811615610fa957610f7d81610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b60008311610ffe576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b60005b601054811015611091576010818154811061101857fe5b6000918252602082200154604080516356e4bb9760e11b81523360048201526024810188905290516001600160a01b039092169263adc9772e9260448084019382900301818387803b15801561106d57600080fd5b505af1158015611081573d6000803e3d6000fd5b5050600190920191506110019050565b50600c5461109f90846114df565b600c55336000908152600f60205260409020546110bc90846114df565b336000818152600f60205260409020919091556001546110e9916001600160a01b03909116903086611539565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a250600192915050565b600033611133611313565b60085561113e610e91565b6007556001600160a01b038116156111855761115981610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b60005b601054811015611218576010818154811061119f57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b1580156111f457600080fd5b505af1158015611208573d6000803e3d6000fd5b5050600190920191506111889050565b50600c5461122690856113b6565b600c55336000908152600f602052604090205461124390856113b6565b336000818152600f6020526040808220939093556002546004805485516305335c3960e21b81529182015260248101899052604481019390935292516001600160a01b03909316926314cd70e492606480820193929182900301818387803b1580156112ae57600080fd5b505af11580156112c2573d6000803e3d6000fd5b50506040805187815290513393507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d592509081900360200190a28215610a1657610a14336001610c6f565b60075481565b600061131d610613565b61132a5750600854610617565b610e9f611358611338610613565b61057c670de0b6b3a7640000610576600654610576600754610567610e91565b600854906114df565b60105490565b60085481565b60055481565b60045481565b60008054611392906001600160a01b0316333085611539565b60095461139f90836114df565b600955919050565b6000546001600160a01b031681565b60008282111561140d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b60008261142757506000611412565b8282028284828161143457fe5b04146114715760405162461bcd60e51b8152600401808060200182810382526021815260200180611a5b6021913960400191505060405180910390fd5b9392505050565b60008082116114ce576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816114d757fe5b049392505050565b600082820183811015611471576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261159390859061172c565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115eb90849061172c565b505050565b60006115fa611313565b600855611605610e91565b6007556001600160a01b0381161561164c5761162081610520565b6001600160a01b0382166000908152600e6020908152604080832093909355600854600d909152919020555b600b5461165990836114df565b600b55600554421061167a576116728262093a80611478565b6006556116c4565b60055460009061168a90426113b6565b905060006116a36006548361141890919063ffffffff16565b90506116af84826114df565b93506116be8462093a80611478565b60065550505b600a8290554260078190556116dc9062093a806114df565b6005556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b60008183106117255781611471565b5090919050565b6060611781826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117dd9092919063ffffffff16565b8051909150156115eb578080602001905160208110156117a057600080fd5b50516115eb5760405162461bcd60e51b815260040180806020018281038252602a815260200180611a7c602a913960400191505060405180910390fd5b60606117ec84846000856117f4565b949350505050565b6060824710156118355760405162461bcd60e51b8152600401808060200182810382526026815260200180611a356026913960400191505060405180910390fd5b61183e85611950565b61188f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106118ce5780518252601f1990920191602091820191016118af565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611930576040519150601f19603f3d011682016040523d82523d6000602084013e611935565b606091505b5091509150611945828286611956565b979650505050505050565b3b151590565b60608315611965575081611471565b8251156119755782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156119bf5781810151838201526020016119a7565b50505050905090810190601f1680156119ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080546000825590600052602060002090810190611a189190611a1b565b50565b5b80821115611a305760008155600101611a1c565b509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c2587b5a77d7a7f733569d1f0dd4c08f00e3e34db8828f410842bfa6d54215fe64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062b9c7356a2dc64a1969e19c23e4f579f9810aa7000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d
-----Decoded View---------------
Arg [0] : pid_ (uint256): 0
Arg [1] : stakingToken_ (address): 0x62B9c7356A2Dc64a1969e19C23e4f579F9810Aa7
Arg [2] : rewardToken_ (address): 0xD533a949740bb3306d119CC777fa900bA034cd52
Arg [3] : operator_ (address): 0xF403C135812408BFbE8713b5A23a04b3D48AAE31
Arg [4] : rewardManager_ (address): 0xEdCCB35798fae4925718A43cc608aE136208aa8D
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 00000000000000000000000062b9c7356a2dc64a1969e19c23e4f579f9810aa7
Arg [2] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [3] : 000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31
Arg [4] : 000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d
Deployed Bytecode Sourcemap
29619:9147:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32730:265;;;;;;;;;;;;;;;;-1:-1:-1;32730:265:0;-1:-1:-1;;;;;32730:265:0;;:::i;:::-;;;;;;;;;;;;;;;;31676:137;;;:::i;:::-;;30350:42;;;;;;;;;;;;;;;;-1:-1:-1;30350:42:0;-1:-1:-1;;;;;30350:42:0;;:::i;29864:28::-;;;:::i;:::-;;;;-1:-1:-1;;;;;29864:28:0;;;;;;;;;;;;;;29784:41;;;:::i;31085:91::-;;;:::i;35220:97::-;;;;;;;;;;;;;;;;-1:-1:-1;35220:97:0;;;;:::i;30157:36::-;;;:::i;33818:681::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33818:681:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34509:703;;;;;;;;;;;;;;;;-1:-1:-1;34509:703:0;;;;;;;;;:::i;36825:110::-;;;:::i;30453:29::-;;;;;;;;;;;;;;;;-1:-1:-1;30453:29:0;;:::i;36047:115::-;;;;;;;;;;;;;;;;-1:-1:-1;36047:115:0;;;;:::i;29834:23::-;;;:::i;37150:925::-;;;;;;;;;;;;;;;;-1:-1:-1;37150:925:0;;:::i;31417:253::-;;;;;;;;;;;;;;;;-1:-1:-1;31417:253:0;-1:-1:-1;;;;;31417:253:0;;:::i;30078:32::-;;;:::i;30200:44::-;;;:::i;36170:647::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36170:647:0;;;;;;;;;;:::i;31184:110::-;;;;;;;;;;;;;;;;-1:-1:-1;31184:110:0;-1:-1:-1;;;;;31184:110:0;;:::i;29751:26::-;;;:::i;29964:29::-;;;:::i;32159:135::-;;;:::i;30286:57::-;;;;;;;;;;;;;;;;-1:-1:-1;30286:57:0;-1:-1:-1;;;;;30286:57:0;;:::i;33650:160::-;;;:::i;30117:33::-;;;:::i;33003:639::-;;;;;;;;;;;;;;;;-1:-1:-1;33003:639:0;;:::i;35325:714::-;;;;;;;;;;;;;;;;-1:-1:-1;35325:714:0;;;;;;;;;:::i;30000:29::-;;;:::i;32302:420::-;;;:::i;31302:107::-;;;:::i;30036:35::-;;;:::i;29926:31::-;;;:::i;29901:18::-;;;:::i;36943:199::-;;;;;;;;;;;;;;;;-1:-1:-1;36943:199:0;;:::i;29719:25::-;;;:::i;32730:265::-;-1:-1:-1;;;;;32970:16:0;;32784:7;32970:16;;;:7;:16;;;;;;;;;32886:22;:31;;;;;;32824:163;;32970:16;32824:123;;32942:4;;32824:95;;32865:53;;:16;:14;:16::i;:::-;:20;;:53::i;:::-;32824:18;32834:7;32824:9;:18::i;:::-;:40;;:95::i;:::-;:117;;:123::i;:::-;:145;;:163::i;:::-;32804:183;;32730:265;;;;:::o;31676:137::-;31746:13;;-1:-1:-1;;;;;31746:13:0;31732:10;:27;31724:51;;;;;-1:-1:-1;;;31724:51:0;;;;;;;;;;;;-1:-1:-1;;;31724:51:0;;;;;;;;;;;;;;;31786:19;31793:12;;31786:19;:::i;:::-;31676:137::o;30350:42::-;;;;;;;;;;;;;:::o;29864:28::-;;;-1:-1:-1;;;;;29864:28:0;;:::o;29784:41::-;29819:6;29784:41;:::o;31085:91::-;31156:12;;31085:91;;:::o;35220:97::-;35291:10;35281:21;;;;:9;:21;;;;;;35272:37;;35303:5;35272:8;:37::i;:::-;;35220:97;:::o;30157:36::-;;;;:::o;33818:681::-;33928:4;33905;31894:16;:14;:16::i;:::-;31871:20;:39;31938:26;:24;:26::i;:::-;31921:14;:43;-1:-1:-1;;;;;31979:21:0;;;31975:157;;32036:15;32043:7;32036:6;:15::i;:::-;-1:-1:-1;;;;;32017:16:0;;;;;;:7;:16;;;;;;;;:34;;;;32100:20;;32066:22;:31;;;;;;:54;31975:157;33968:1:::1;33958:7;:11;33950:51;;;::::0;;-1:-1:-1;;;33950:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;34066:6;34062:116;34080:12;:19:::0;34076:23;::::1;34062:116;;;34129:12;34142:1;34129:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;34120:46:::1;::::0;;-1:-1:-1;;;34120:46:0;;-1:-1:-1;;;;;34120:46:0;;::::1;;::::0;::::1;::::0;;;;;;;;;34129:15;;;::::1;::::0;34120:31:::1;::::0;:46;;;;;;;;;;;34129:15;;34120:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34101:3:0::1;::::0;;::::1;::::0;-1:-1:-1;34062:116:0::1;::::0;-1:-1:-1;34062:116:0::1;;-1:-1:-1::0;34229:12:0::1;::::0;:25:::1;::::0;34246:7;34229:16:::1;:25::i;:::-;34214:12;:40:::0;-1:-1:-1;;;;;34283:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:28:::1;::::0;34303:7;34283:19:::1;:28::i;:::-;-1:-1:-1::0;;;;;34265:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;:46;;;;34357:12:::1;::::0;:65:::1;::::0;:12:::1;34387:10;34407:4;34414:7:::0;34357:29:::1;:65::i;:::-;34438:21;::::0;;;;;;;-1:-1:-1;;;;;34438:21:0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;34487:4:0::1;::::0;33818:681;-1:-1:-1;;;33818:681:0:o;34509:703::-;34622:4;34593:10;31894:16;:14;:16::i;:::-;31871:20;:39;31938:26;:24;:26::i;:::-;31921:14;:43;-1:-1:-1;;;;;31979:21:0;;;31975:157;;32036:15;32043:7;32036:6;:15::i;:::-;-1:-1:-1;;;;;32017:16:0;;;;;;:7;:16;;;;;;;;:34;;;;32100:20;;32066:22;:31;;;;;;:54;31975:157;34661:1:::1;34652:6;:10;34644:53;;;::::0;;-1:-1:-1;;;34644:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;34759:6;34755:124;34773:12;:19:::0;34769:23;::::1;34755:124;;;34822:12;34835:1;34822:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;34813:54:::1;::::0;;-1:-1:-1;;;34813:54:0;;34848:10:::1;34813:54;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;34822:15:0;;::::1;::::0;34813:34:::1;::::0;:54;;;;;;;;;;34822:15;;34813:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34794:3:0::1;::::0;;::::1;::::0;-1:-1:-1;34755:124:0::1;::::0;-1:-1:-1;34755:124:0::1;;-1:-1:-1::0;34906:12:0::1;::::0;:24:::1;::::0;34923:6;34906:16:::1;:24::i;:::-;34891:12;:39:::0;34975:10:::1;34965:21;::::0;;;:9:::1;:21;::::0;;;;;:33:::1;::::0;34991:6;34965:25:::1;:33::i;:::-;34951:10;34941:21;::::0;;;:9:::1;:21;::::0;;;;:57;;;;35011:12:::1;::::0;:45:::1;::::0;-1:-1:-1;;;;;35011:12:0;;::::1;::::0;35049:6;35011:25:::1;:45::i;:::-;35072:29;::::0;;;;;;;35082:10:::1;::::0;35072:29:::1;::::0;;;;;::::1;::::0;;::::1;35122:5;35119:62;;;35143:26;35153:10;35164:4;35143:9;:26::i;:::-;;35119:62;-1:-1:-1::0;35200:4:0::1;::::0;34509:703;-1:-1:-1;;;34509:703:0:o;36825:110::-;36863:4;36879:26;36889:10;36900:4;36879:9;:26::i;:::-;;36923:4;36916:11;;36825:110;:::o;30453:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30453:29:0;;-1:-1:-1;30453:29:0;:::o;36047:115::-;36136:10;36126:21;;;;:9;:21;;;;;;36108:46;;36148:5;36108:17;:46::i;29834:23::-;;;-1:-1:-1;;;;;29834:23:0;;:::o;37150:925::-;37248:8;;37210:4;;-1:-1:-1;;;;;37248:8:0;37234:10;:22;37226:46;;;;;-1:-1:-1;;;37226:46:0;;;;;;;;;;;;-1:-1:-1;;;37226:46:0;;;;;;;;;;;;;;;37309:13;;37296:27;;:8;;:12;:27::i;:::-;37285:38;;37359:12;;37340:15;:31;37336:150;;37388:28;37407:8;37388:18;:28::i;:::-;-1:-1:-1;37447:1:0;37431:13;:17;37470:4;37463:11;;37336:150;37538:19;37560:47;37580:26;29819:6;37580:12;;:16;;:26;;;;:::i;:::-;37560:15;;:19;:47::i;:::-;37693:10;;37538:69;;-1:-1:-1;37693:24:0;;37670:20;37750:36;37777:8;37750:22;37693:24;37767:4;37750:16;:22::i;:36::-;37728:58;;30241:3;37875:11;:28;37872:174;;;37919:28;37938:8;37919:18;:28::i;:::-;37978:1;37962:13;:17;37872:174;;;38010:13;:24;;;37872:174;-1:-1:-1;38063:4:0;;37150:925;-1:-1:-1;;;;37150:925:0:o;31417:253::-;31513:13;;31475:4;;-1:-1:-1;;;;;31513:13:0;31499:10;:27;31491:51;;;;;-1:-1:-1;;;31491:51:0;;;;;;;;;;;;-1:-1:-1;;;31491:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31561:21:0;;31553:48;;;;;-1:-1:-1;;;31553:48:0;;;;;;;;;;;;-1:-1:-1;;;31553:48:0;;;;;;;;;;;;;;;-1:-1:-1;31614:12:0;:26;;;;;;;;-1:-1:-1;31614:26:0;;;;;;;;-1:-1:-1;;;;;31614:26:0;;-1:-1:-1;;;;;;31614:26:0;;;;;;31417:253;;;:::o;30078:32::-;;;;:::o;30200:44::-;30241:3;30200:44;:::o;36170:647::-;36264:4;36246:8;31894:16;:14;:16::i;:::-;31871:20;:39;31938:26;:24;:26::i;:::-;31921:14;:43;-1:-1:-1;;;;;31979:21:0;;;31975:157;;32036:15;32043:7;32036:6;:15::i;:::-;-1:-1:-1;;;;;32017:16:0;;;;;;:7;:16;;;;;;;;:34;;;;32100:20;;32066:22;:31;;;;;;:54;31975:157;36280:14:::1;36297:16;36304:8;36297:6;:16::i;:::-;36280:33:::0;-1:-1:-1;36328:10:0;;36324:239:::1;;-1:-1:-1::0;;;;;36355:17:0;;::::1;36375:1;36355:17:::0;;;:7:::1;:17;::::0;;;;:21;;;36391:11;:42:::1;::::0;:11:::1;36363:8:::0;36426:6;36391:24:::1;:42::i;:::-;36457:8;::::0;36481:3:::1;::::0;;36448:55:::1;::::0;;-1:-1:-1;;;36448:55:0;;;;::::1;::::0;;;;-1:-1:-1;;;;;36448:55:0;;::::1;::::0;;;;;;;;;;;;36457:8;::::1;::::0;36448:32:::1;::::0;:55;;;;;36457:8:::1;::::0;36448:55;;;;;;;;36457:8;;36448:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36523:28:0::1;::::0;;;;;;;-1:-1:-1;;;;;36523:28:0;::::1;::::0;-1:-1:-1;36523:28:0::1;::::0;-1:-1:-1;36523:28:0;;;;::::1;::::0;;::::1;36324:239;36626:12;36623:165;;;36658:6;36654:123;36672:12;:19:::0;36668:23;::::1;36654:123;;;36725:12;36738:1;36725:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;36716:45:::1;::::0;;-1:-1:-1;;;36716:45:0;;-1:-1:-1;;;;;36716:45:0;;::::1;;::::0;::::1;::::0;;;36725:15;;;::::1;::::0;36716:35:::1;::::0;:45;;;;;;;;;;;36725:15;;36716:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36693:3:0::1;::::0;;::::1;::::0;-1:-1:-1;36654:123:0::1;::::0;-1:-1:-1;36654:123:0::1;;;-1:-1:-1::0;36805:4:0::1;::::0;36170:647;-1:-1:-1;;;;36170:647:0:o;31184:110::-;-1:-1:-1;;;;;31268:18:0;31241:7;31268:18;;;:9;:18;;;;;;;31184:110::o;29751:26::-;;;-1:-1:-1;;;;;29751:26:0;;:::o;29964:29::-;;;;:::o;32159:135::-;32216:7;32243:43;32256:15;32273:12;;32243;:43::i;:::-;32236:50;;32159:135;:::o;30286:57::-;;;;;;;;;;;;;:::o;33650:160::-;33721:12;;:34;;;-1:-1:-1;;;33721:34:0;;33744:10;33721:34;;;;;;33687:4;;;;-1:-1:-1;;;;;33721:12:0;;;;:22;;:34;;;;;;;;;;;;;;;:12;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33721:34:0;;-1:-1:-1;33766:14:0;33721:34;33766:5;:14::i;:::-;;33798:4;33791:11;;;33650:160;:::o;30117:33::-;;;;:::o;33003:639::-;33102:4;33073:10;31894:16;:14;:16::i;:::-;31871:20;:39;31938:26;:24;:26::i;:::-;31921:14;:43;-1:-1:-1;;;;;31979:21:0;;;31975:157;;32036:15;32043:7;32036:6;:15::i;:::-;-1:-1:-1;;;;;32017:16:0;;;;;;:7;:16;;;;;;;;:34;;;;32100:20;;32066:22;:31;;;;;;:54;31975:157;33142:1:::1;33132:7;:11;33124:51;;;::::0;;-1:-1:-1;;;33124:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33240:6;33236:122;33254:12;:19:::0;33250:23;::::1;33236:122;;;33303:12;33316:1;33303:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;33294:52:::1;::::0;;-1:-1:-1;;;33294:52:0;;33326:10:::1;33294:52;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;33303:15:0;;::::1;::::0;33294:31:::1;::::0;:52;;;;;;;;;;33303:15;;33294:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;33275:3:0::1;::::0;;::::1;::::0;-1:-1:-1;33236:122:0::1;::::0;-1:-1:-1;33236:122:0::1;;-1:-1:-1::0;33385:12:0::1;::::0;:25:::1;::::0;33402:7;33385:16:::1;:25::i;:::-;33370:12;:40:::0;33455:10:::1;33445:21;::::0;;;:9:::1;:21;::::0;;;;;:34:::1;::::0;33471:7;33445:25:::1;:34::i;:::-;33431:10;33421:21;::::0;;;:9:::1;:21;::::0;;;;:58;;;;33492:12:::1;::::0;:65:::1;::::0;-1:-1:-1;;;;;33492:12:0;;::::1;::::0;33542:4:::1;33549:7:::0;33492:29:::1;:65::i;:::-;33573:27;::::0;;;;;;;33580:10:::1;::::0;33573:27:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;33630:4:0::1;::::0;33003:639;-1:-1:-1;;33003:639:0:o;35325:714::-;35420:4;35400:10;31894:16;:14;:16::i;:::-;31871:20;:39;31938:26;:24;:26::i;:::-;31921:14;:43;-1:-1:-1;;;;;31979:21:0;;;31975:157;;32036:15;32043:7;32036:6;:15::i;:::-;-1:-1:-1;;;;;32017:16:0;;;;;;:7;:16;;;;;;;;:34;;;;32100:20;;32066:22;:31;;;;;;:54;31975:157;35487:6:::1;35483:124;35501:12;:19:::0;35497:23;::::1;35483:124;;;35550:12;35563:1;35550:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;35541:54:::1;::::0;;-1:-1:-1;;;35541:54:0;;35576:10:::1;35541:54;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;35550:15:0;;::::1;::::0;35541:34:::1;::::0;:54;;;;;;;;;;35550:15;;35541:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35522:3:0::1;::::0;;::::1;::::0;-1:-1:-1;35483:124:0::1;::::0;-1:-1:-1;35483:124:0::1;;-1:-1:-1::0;35642:12:0::1;::::0;:24:::1;::::0;35659:6;35642:16:::1;:24::i;:::-;35627:12;:39:::0;35711:10:::1;35701:21;::::0;;;:9:::1;:21;::::0;;;;;:33:::1;::::0;35727:6;35701:25:::1;:33::i;:::-;35687:10;35677:21;::::0;;;:9:::1;:21;::::0;;;;;:57;;;;35820:8:::1;::::0;35841:3:::1;::::0;;35811:52;;-1:-1:-1;;;35811:52:0;;;;::::1;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35820:8:0;;::::1;::::0;35811:29:::1;::::0;:52;;;;;35677:21;35811:52;;;;;;35677:21;35820:8;35811:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35879:29:0::1;::::0;;;;;;;35889:10:::1;::::0;-1:-1:-1;35879:29:0::1;::::0;-1:-1:-1;35879:29:0;;;;::::1;::::0;;::::1;35951:5;35948:62;;;35972:26;35982:10;35993:4;35972:9;:26::i;30000:29::-:0;;;;:::o;32302:420::-;32349:7;32373:13;:11;:13::i;:::-;32369:78;;-1:-1:-1;32415:20:0;;32408:27;;32369:78;32477:237;32520:179;32685:13;:11;:13::i;:::-;32520:138;32653:4;32520:106;32615:10;;32520:68;32573:14;;32520:26;:24;:26::i;:179::-;32477:20;;;:24;:237::i;31302:107::-;31382:12;:19;31302:107;:::o;30036:35::-;;;;:::o;29926:31::-;;;;:::o;29901:18::-;;;;:::o;36943:199::-;36993:4;37016:11;;37009:72;;-1:-1:-1;;;;;37016:11:0;37046:10;37066:4;37073:7;37009:36;:72::i;:::-;37108:13;;:26;;37126:7;37108:17;:26::i;:::-;37092:13;:42;36943:199;;-1:-1:-1;36943:199:0:o;29719:25::-;;;-1:-1:-1;;;;;29719:25:0;;:::o;9293:158::-;9351:7;9384:1;9379;:6;;9371:49;;;;;-1:-1:-1;;;9371:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9438:5:0;;;9293:158;;;;;:::o;9710:220::-;9768:7;9792:6;9788:20;;-1:-1:-1;9807:1:0;9800:8;;9788:20;9831:5;;;9835:1;9831;:5;:1;9855:5;;;;;:10;9847:56;;;;-1:-1:-1;;;9847:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9921:1;9710:220;-1:-1:-1;;;9710:220:0:o;10408:153::-;10466:7;10498:1;10494;:5;10486:44;;;;;-1:-1:-1;;;10486:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10552:1;10548;:5;;;;;;;10408:153;-1:-1:-1;;;10408:153:0:o;8831:179::-;8889:7;8921:5;;;8945:6;;;;8937:46;;;;;-1:-1:-1;;;8937:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25177:205;25305:68;;;-1:-1:-1;;;;;25305:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25305:68:0;-1:-1:-1;;;25305:68:0;;;25278:96;;25298:5;;25278:19;:96::i;:::-;25177:205;;;;:::o;24992:177::-;25102:58;;;-1:-1:-1;;;;;25102:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25102:58:0;-1:-1:-1;;;25102:58:0;;;25075:86;;25095:5;;25075:19;:86::i;:::-;24992:177;;;:::o;38083:680::-;38175:1;31894:16;:14;:16::i;:::-;31871:20;:39;31938:26;:24;:26::i;:::-;31921:14;:43;-1:-1:-1;;;;;31979:21:0;;;31975:157;;32036:15;32043:7;32036:6;:15::i;:::-;-1:-1:-1;;;;;32017:16:0;;;;;;:7;:16;;;;;;;;:34;;;;32100:20;;32066:22;:31;;;;;;:54;31975:157;38215:17:::1;::::0;:29:::1;::::0;38237:6;38215:21:::1;:29::i;:::-;38195:17;:49:::0;38278:12:::1;::::0;38259:15:::1;:31;38255:334;;38320:20;:6:::0;29819::::1;38320:10;:20::i;:::-;38307:10;:33:::0;38255:334:::1;;;38393:12;::::0;38373:17:::1;::::0;38393:33:::1;::::0;38410:15:::1;38393:16;:33::i;:::-;38373:53;;38441:16;38460:25;38474:10;;38460:9;:13;;:25;;;;:::i;:::-;38441:44:::0;-1:-1:-1;38509:20:0::1;:6:::0;38441:44;38509:10:::1;:20::i;:::-;38500:29:::0;-1:-1:-1;38557:20:0::1;38500:29:::0;29819:6:::1;38557:10;:20::i;:::-;38544:10;:33:::0;-1:-1:-1;;38255:334:0::1;38599:14;:23:::0;;;38650:15:::1;38633:14;:32:::0;;;38691:29:::1;::::0;29819:6:::1;38691:19;:29::i;:::-;38676:12;:44:::0;38736:19:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;38083:680:::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;27297:761::-;27721:23;27747:69;27775:4;27747:69;;;;;;;;;;;;;;;;;27755:5;-1:-1:-1;;;;;27747:27:0;;;:69;;;;;:::i;:::-;27831:17;;27721:95;;-1:-1:-1;27831:21:0;27827:224;;27973:10;27962:30;;;;;;;;;;;;;;;-1:-1:-1;27962:30:0;27954:85;;;;-1:-1:-1;;;27954:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19993:195;20096:12;20128:52;20150:6;20158:4;20164:1;20167:12;20128:21;:52::i;:::-;20121:59;19993:195;-1:-1:-1;;;;19993:195:0:o;21045:530::-;21172:12;21230:5;21205:21;:30;;21197:81;;;;-1:-1:-1;;;21197:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21297:18;21308:6;21297:10;:18::i;:::-;21289:60;;;;;-1:-1:-1;;;21289:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21423:12;21437:23;21464:6;-1:-1:-1;;;;;21464:11:0;21484:5;21492:4;21464:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21464:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21422:75;;;;21515:52;21533:7;21542:10;21554:12;21515:17;:52::i;:::-;21508:59;21045:530;-1:-1:-1;;;;;;;21045:530:0:o;17075:422::-;17442:20;17481:8;;;17075:422::o;23585:742::-;23700:12;23729:7;23725:595;;;-1:-1:-1;23760:10:0;23753:17;;23725:595;23874:17;;:21;23870:439;;24137:10;24131:17;24198:15;24185:10;24181:2;24177:19;24170:44;24085:148;24280:12;24273:20;;-1:-1:-1;;;24273:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://c2587b5a77d7a7f733569d1f0dd4c08f00e3e34db8828f410842bfa6d54215fe
Loading...
Loading
Loading...
Loading
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.