Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 254 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 18325751 | 360 days ago | IN | 0 ETH | 0.00090468 | ||||
Withdraw | 16271797 | 648 days ago | IN | 0 ETH | 0.00141827 | ||||
Withdraw | 15824239 | 711 days ago | IN | 0 ETH | 0.00122724 | ||||
Withdraw | 15581474 | 745 days ago | IN | 0 ETH | 0.00052378 | ||||
Withdraw | 15411667 | 771 days ago | IN | 0 ETH | 0.00130996 | ||||
Withdraw | 15244145 | 798 days ago | IN | 0 ETH | 0.00101885 | ||||
Withdraw | 15241040 | 798 days ago | IN | 0 ETH | 0.00183769 | ||||
Withdraw | 15190848 | 806 days ago | IN | 0 ETH | 0.00071975 | ||||
Withdraw | 15165898 | 810 days ago | IN | 0 ETH | 0.00147421 | ||||
Withdraw | 15143249 | 813 days ago | IN | 0 ETH | 0.00476746 | ||||
Withdraw | 15128907 | 815 days ago | IN | 0 ETH | 0.00298287 | ||||
Withdraw | 15118865 | 817 days ago | IN | 0 ETH | 0.00453645 | ||||
Withdraw | 15105231 | 819 days ago | IN | 0 ETH | 0.00162063 | ||||
Withdraw | 15100220 | 820 days ago | IN | 0 ETH | 0.00246599 | ||||
Withdraw | 15100040 | 820 days ago | IN | 0 ETH | 0.00222486 | ||||
Withdraw | 15099529 | 820 days ago | IN | 0 ETH | 0.00241523 | ||||
Withdraw | 15098903 | 820 days ago | IN | 0 ETH | 0.00488928 | ||||
Withdraw | 15096565 | 820 days ago | IN | 0 ETH | 0.00748844 | ||||
Withdraw | 15062633 | 826 days ago | IN | 0 ETH | 0.00151338 | ||||
Withdraw | 15043711 | 829 days ago | IN | 0 ETH | 0.00454755 | ||||
Stake | 15040922 | 829 days ago | IN | 0 ETH | 0.00514917 | ||||
Stake | 14997094 | 838 days ago | IN | 0 ETH | 0.00462633 | ||||
Withdraw | 14995180 | 838 days ago | IN | 0 ETH | 0.00210729 | ||||
Stake | 14987838 | 839 days ago | IN | 0 ETH | 0.00284507 | ||||
Stake | 14985331 | 840 days ago | IN | 0 ETH | 0.0016138 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14798550 | 871 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
StakingRewards
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-18 */ // SPDX-License-Identifier: MIT // Sources flattened with hardhat v2.6.8 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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"); (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"); (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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^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 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/staking-rewards/interfaces/StakingRewardsInterface.sol pragma solidity ^0.8.0; interface StakingRewardsInterface { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function lastTimeRewardApplicable(address _rewardsToken) external view returns (uint256); function rewardPerToken(address _rewardsToken) external view returns (uint256); function earned(address _rewardsToken, address account) external view returns (uint256); function getRewardRate(address _rewardsToken) external view returns (uint256); function getRewardForDuration(address _rewardsToken) external view returns (uint256); function getRewardsTokenCount() external view returns (uint256); function getAllRewardsTokens() external view returns (address[] memory); function getStakingToken() external view returns (address); function stake(uint256 amount) external; function stakeFor(address account, uint256 amount) external; function withdraw(uint256 amount) external; function withdrawFor(address account, uint256 amount) external; function getReward() external; function getRewardFor(address account) external; function exit() external; } // File contracts/staking-rewards/StakingRewards.sol pragma solidity ^0.8.0; contract StakingRewards is Ownable, Pausable, ReentrancyGuard, StakingRewardsInterface { using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ /// @notice The staking token address IERC20 public stakingToken; /// @notice The list of rewards tokens address[] public rewardsTokens; /// @notice The reward tokens mapping mapping(address => bool) public rewardsTokensMap; /// @notice The period finish timestamp of every reward token mapping(address => uint256) public periodFinish; /// @notice The reward rate of every reward token mapping(address => uint256) public rewardRate; /// @notice The reward duration of every reward token mapping(address => uint256) public rewardsDuration; /// @notice The last updated timestamp of every reward token mapping(address => uint256) public lastUpdateTime; /// @notice The reward per token of every reward token mapping(address => uint256) public rewardPerTokenStored; /// @notice The reward per token paid to users of every reward token mapping(address => mapping(address => uint256)) public rewardPerTokenPaid; /// @notice The unclaimed rewards to users of every reward token mapping(address => mapping(address => uint256)) public rewards; /// @notice The helper contract that could stake, withdraw and claim rewards for users address public helperContract; /// @notice The total amount of the staking token staked in the contract uint256 private _totalSupply; /// @notice The user balance of the staking token staked in the contract mapping(address => uint256) private _balances; /* ========== CONSTRUCTOR ========== */ constructor(address _stakingToken, address _helperContract) { stakingToken = IERC20(_stakingToken); helperContract = _helperContract; } /* ========== VIEWS ========== */ /** * @notice Return the total amount of the staking token staked in the contract. * @return The total supply */ function totalSupply() external view returns (uint256) { return _totalSupply; } /** * @notice Return user balance of the staking token staked in the contract. * @return The user balance */ function balanceOf(address account) external view returns (uint256) { return _balances[account]; } /** * @notice Return the last time reward is applicable. * @param _rewardsToken The reward token address * @return The last applicable timestamp */ function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint256) { return getBlockTimestamp() < periodFinish[_rewardsToken] ? getBlockTimestamp() : periodFinish[_rewardsToken]; } /** * @notice Return the reward token amount per staking token. * @param _rewardsToken The reward token address * @return The reward token amount */ function rewardPerToken(address _rewardsToken) public view returns (uint256) { // Return 0 if the rewards token is not supported. if (!rewardsTokensMap[_rewardsToken]) { return 0; } if (_totalSupply == 0) { return rewardPerTokenStored[_rewardsToken]; } // rewardPerTokenStored + [(lastTimeRewardApplicable - lastUpdateTime) * rewardRate / _totalSupply] return rewardPerTokenStored[_rewardsToken] + (((lastTimeRewardApplicable(_rewardsToken) - lastUpdateTime[_rewardsToken]) * rewardRate[_rewardsToken] * 1e18) / _totalSupply); } /** * @notice Return the reward token amount a user earned. * @param _rewardsToken The reward token address * @param account The user address * @return The reward token amount */ function earned(address _rewardsToken, address account) public view returns (uint256) { // Return 0 if the rewards token is not supported. if (!rewardsTokensMap[_rewardsToken]) { return 0; } // rewards + (rewardPerToken - rewardPerTokenPaid) * _balances return (_balances[account] * (rewardPerToken(_rewardsToken) - rewardPerTokenPaid[_rewardsToken][account])) / 1e18 + rewards[_rewardsToken][account]; } /** * @notice Return the reward rate. * @param _rewardsToken The reward token address * @return The reward rate */ function getRewardRate(address _rewardsToken) external view returns (uint256) { return rewardRate[_rewardsToken]; } /** * @notice Return the reward token for duration. * @param _rewardsToken The reward token address * @return The reward token amount */ function getRewardForDuration(address _rewardsToken) external view returns (uint256) { return rewardRate[_rewardsToken] * rewardsDuration[_rewardsToken]; } /** * @notice Return the amount of reward tokens. * @return The amount of reward tokens */ function getRewardsTokenCount() external view returns (uint256) { return rewardsTokens.length; } /** * @notice Return all the reward tokens. * @return All the reward tokens */ function getAllRewardsTokens() external view returns (address[] memory) { return rewardsTokens; } /** * @notice Return the staking token. * @return The staking token */ function getStakingToken() external view returns (address) { return address(stakingToken); } /** * @notice Return the current block timestamp. * @return The current block timestamp */ function getBlockTimestamp() public view virtual returns (uint256) { return block.timestamp; } /* ========== MUTATIVE FUNCTIONS ========== */ /** * @notice Stake the staking token. * @param amount The amount of the staking token */ function stake(uint256 amount) external nonReentrant whenNotPaused updateReward(msg.sender) { _stakeFor(msg.sender, amount); } /** * @notice Stake the staking token for other user. * @param account The user address * @param amount The amount of the staking token */ function stakeFor(address account, uint256 amount) external nonReentrant whenNotPaused updateReward(account) { require(msg.sender == helperContract, "unauthorized"); require(account != address(0), "invalid account"); _stakeFor(account, amount); } function _stakeFor(address account, uint256 amount) internal { require(amount > 0, "invalid amount"); _totalSupply = _totalSupply + amount; _balances[account] = _balances[account] + amount; stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Staked(account, amount); } /** * @notice Withdraw the staked token. * @param amount The amount of the staking token */ function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) { _withdrawFor(msg.sender, amount); } /** * @notice Withdraw the staked token for other user. * @dev This function can only be called by helper. * @param account The user address * @param amount The amount of the staking token */ function withdrawFor(address account, uint256 amount) public nonReentrant updateReward(account) { require(msg.sender == helperContract, "unauthorized"); require(account != address(0), "invalid account"); _withdrawFor(account, amount); } function _withdrawFor(address account, uint256 amount) internal { require(amount > 0, "invalid amount"); _totalSupply = _totalSupply - amount; _balances[account] = _balances[account] - amount; stakingToken.safeTransfer(msg.sender, amount); emit Withdrawn(account, amount); } /** * @notice Claim rewards for the message sender. */ function getReward() public nonReentrant updateReward(msg.sender) { _getRewardFor(msg.sender); } /** * @notice Claim rewards for an account. * @dev This function can only be called by helper. * @param account The user address */ function getRewardFor(address account) public nonReentrant updateReward(account) { require(msg.sender == helperContract, "unauthorized"); require(account != address(0), "invalid account"); _getRewardFor(account); } function _getRewardFor(address account) internal { for (uint256 i = 0; i < rewardsTokens.length; i++) { uint256 reward = rewards[rewardsTokens[i]][account]; uint256 remain = IERC20(rewardsTokens[i]).balanceOf(address(this)); if (reward > 0 && reward <= remain) { rewards[rewardsTokens[i]][account] = 0; IERC20(rewardsTokens[i]).safeTransfer(account, reward); emit RewardPaid(account, rewardsTokens[i], reward); } } } /** * @notice Withdraw all the staked tokens and claim rewards. */ function exit() external { withdraw(_balances[msg.sender]); getReward(); } /* ========== RESTRICTED FUNCTIONS ========== */ /** * @notice Set new reward amount. * @dev Make sure the admin deposits `reward` of reward tokens into the contract before calling this function. * @param rewardsToken The reward token address * @param reward The reward amount */ function notifyRewardAmount(address rewardsToken, uint256 reward) external onlyOwner updateReward(address(0)) { require(rewardsTokensMap[rewardsToken], "reward token not supported"); if (getBlockTimestamp() >= periodFinish[rewardsToken]) { rewardRate[rewardsToken] = reward / rewardsDuration[rewardsToken]; } else { uint256 remaining = periodFinish[rewardsToken] - getBlockTimestamp(); uint256 leftover = remaining * rewardRate[rewardsToken]; rewardRate[rewardsToken] = (reward + leftover) / rewardsDuration[rewardsToken]; } // Ensure the provided reward amount is not more than the balance in the contract. // This keeps the reward rate in the right range, preventing overflows due to // very high values of rewardRate in the earned and rewardsPerToken functions; // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow. uint256 balance = IERC20(rewardsToken).balanceOf(address(this)); require( rewardRate[rewardsToken] <= balance / rewardsDuration[rewardsToken], "reward rate too high" ); lastUpdateTime[rewardsToken] = getBlockTimestamp(); periodFinish[rewardsToken] = getBlockTimestamp() + rewardsDuration[rewardsToken]; emit RewardAdded(rewardsToken, reward); } /** * @notice Seize the accidentally deposited tokens. * @dev Thes staking tokens cannot be seized. * @param tokenAddress The token address * @param tokenAmount The token amount */ function recoverToken(address tokenAddress, uint256 tokenAmount) external onlyOwner { require( tokenAddress != address(stakingToken), "cannot withdraw staking token" ); IERC20(tokenAddress).safeTransfer(owner(), tokenAmount); emit Recovered(tokenAddress, tokenAmount); } /** * @notice Set the rewards duration. * @param rewardsToken The reward token address * @param duration The new duration */ function setRewardsDuration(address rewardsToken, uint256 duration) external onlyOwner { require(rewardsTokensMap[rewardsToken], "reward token not supported"); require( getBlockTimestamp() > periodFinish[rewardsToken], "previous rewards not complete" ); _setRewardsDuration(rewardsToken, duration); } /** * @notice Support new rewards token. * @param rewardsToken The reward token address * @param duration The duration */ function addRewardsToken(address rewardsToken, uint256 duration) external onlyOwner { require( !rewardsTokensMap[rewardsToken], "rewards token already supported" ); rewardsTokens.push(rewardsToken); rewardsTokensMap[rewardsToken] = true; emit RewardsTokenAdded(rewardsToken); _setRewardsDuration(rewardsToken, duration); } /** * @notice Set the helper contract. * @param helper The helper contract address */ function setHelperContract(address helper) external onlyOwner { helperContract = helper; emit HelperContractSet(helper); } /** * @notice Pause the staking. */ function pause() external onlyOwner { _pause(); } /** * @notice Unpause the staking. */ function unpause() external onlyOwner { _unpause(); } function _setRewardsDuration(address rewardsToken, uint256 duration) internal { rewardsDuration[rewardsToken] = duration; emit RewardsDurationUpdated(rewardsToken, duration); } /* ========== MODIFIERS ========== */ /** * @notice Update the reward information. * @param user The user address */ modifier updateReward(address user) { for (uint256 i = 0; i < rewardsTokens.length; i++) { address token = rewardsTokens[i]; rewardPerTokenStored[token] = rewardPerToken(token); lastUpdateTime[token] = lastTimeRewardApplicable(token); if (user != address(0)) { rewards[token][user] = earned(token, user); rewardPerTokenPaid[token][user] = rewardPerTokenStored[token]; } } _; } /* ========== EVENTS ========== */ /** * @notice Emitted when new reward tokens are added */ event RewardAdded(address rewardsToken, uint256 reward); /** * @notice Emitted when user staked */ event Staked(address indexed user, uint256 amount); /** * @notice Emitted when user withdrew */ event Withdrawn(address indexed user, uint256 amount); /** * @notice Emitted when rewards are paied */ event RewardPaid( address indexed user, address rewardsToken, uint256 reward ); /** * @notice Emitted when a reward duration is updated */ event RewardsDurationUpdated(address rewardsToken, uint256 newDuration); /** * @notice Emitted when a token is recovered by admin */ event Recovered(address token, uint256 amount); /** * @notice Emitted when a reward token is added */ event RewardsTokenAdded(address rewardsToken); /** * @notice Emitted when new helper contract is set */ event HelperContractSet(address helper); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_helperContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"helper","type":"address"}],"name":"HelperContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardsToken","type":"address"},{"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":"address","name":"rewardsToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardsToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardsToken","type":"address"}],"name":"RewardsTokenAdded","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","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":"rewardsToken","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"addRewardsToken","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":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllRewardsTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockTimestamp","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"}],"name":"getRewardFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"helperContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardsToken","type":"address"},{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsTokensMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"helper","type":"address"}],"name":"setHelperContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardsToken","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFor","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620026b4380380620026b48339810160408190526200003491620000ef565b6200003f3362000082565b6000805460ff60a01b1916905560018055600280546001600160a01b039384166001600160a01b031991821617909155600c805492909316911617905562000127565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000ea57600080fd5b919050565b600080604083850312156200010357600080fd5b6200010e83620000d2565b91506200011e60208401620000d2565b90509250929050565b61257d80620001376000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806388d04b1e1161013b578063c5639cc6116100b8578063e70b9e271161007c578063e70b9e2714610548578063e9fad8ee14610573578063ea7cbff11461057b578063f1229777146105a4578063f2fde38b146105b757600080fd5b8063c5639cc6146104d7578063cba43fe6146104ea578063da09d19d1461050d578063db518db21461052d578063e5c21aba1461054057600080fd5b8063a694fc3a116100ff578063a694fc3a14610478578063b29a81401461048b578063b66503cf1461049e578063b6d0dcd8146104b1578063bcd11014146104c457600080fd5b806388d04b1e146104105780638da5cb5b146104235780639ce43f90146104345780639f9106d114610454578063a5dc9e1b1461046557600080fd5b80633f4ba83a116101c9578063715018a61161018d578063715018a6146103ba57806372f702f3146103c2578063796b89b9146103ed5780638040c65b146103f35780638456cb591461040857600080fd5b80633f4ba83a146103385780635c975abb146103405780635d9103511461035e578063638634ee1461037e57806370a082311461039157600080fd5b806327b936741161021057806327b93674146102bf5780632ce9aead146102ea5780632e1a7d4d1461030a5780632ee409081461031d5780633d18b9121461033057600080fd5b8063055de2751461024d57806318160ddd14610262578063211dc32d14610279578063221ca18c1461028c5780632378bea6146102ac575b600080fd5b61026061025b366004612217565b6105ca565b005b600d545b6040519081526020015b60405180910390f35b610266610287366004612232565b61074e565b61026661029a366004612217565b60066020526000908152604090205481565b6102606102ba366004612265565b610811565b6102666102cd366004612232565b600a60209081526000928352604080842090915290825290205481565b6102666102f8366004612217565b60086020526000908152604090205481565b61026061031836600461228f565b610918565b61026061032b366004612265565b610a3c565b610260610be3565b610260610d0d565b600054600160a01b900460ff165b6040519015158152602001610270565b61026661036c366004612217565b60076020526000908152604090205481565b61026661038c366004612217565b610d41565b61026661039f366004612217565b6001600160a01b03166000908152600e602052604090205490565b610260610d84565b6002546103d5906001600160a01b031681565b6040516001600160a01b039091168152602001610270565b42610266565b6103fb610db8565b60405161027091906122a8565b610260610e1a565b61026061041e366004612265565b610e4c565b6000546001600160a01b03166103d5565b610266610442366004612217565b60096020526000908152604090205481565b6002546001600160a01b03166103d5565b600c546103d5906001600160a01b031681565b61026061048636600461228f565b610f80565b610260610499366004612265565b6110ce565b6102606104ac366004612265565b6111c3565b6103d56104bf36600461228f565b6115ba565b6102666104d2366004612217565b6115e4565b6102606104e5366004612217565b611612565b61034e6104f8366004612217565b60046020526000908152604090205460ff1681565b61026661051b366004612217565b60056020526000908152604090205481565b61026061053b366004612265565b611690565b600354610266565b610266610556366004612232565b600b60209081526000928352604080842090915290825290205481565b610260611804565b610266610589366004612217565b6001600160a01b031660009081526006602052604090205490565b6102666105b2366004612217565b611825565b6102606105c5366004612217565b6118f4565b600260015414156105f65760405162461bcd60e51b81526004016105ed906122f5565b60405180910390fd5b60026001558060005b6003548110156106ec5760006003828154811061061e5761061e61232c565b6000918252602090912001546001600160a01b0316905061063e81611825565b6001600160a01b03821660009081526009602052604090205561066081610d41565b6001600160a01b038083166000908152600860205260409020919091558316156106d95761068e818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b50806106e481612358565b9150506105ff565b50600c546001600160a01b031633146107175760405162461bcd60e51b81526004016105ed90612373565b6001600160a01b03821661073d5760405162461bcd60e51b81526004016105ed90612399565b6107468261198f565b505060018055565b6001600160a01b03821660009081526004602052604081205460ff166107765750600061080b565b6001600160a01b038084166000818152600b6020908152604080832094871680845294825280832054938352600a82528083209483529390529190912054670de0b6b3a7640000906107c786611825565b6107d191906123c2565b6001600160a01b0385166000908152600e60205260409020546107f491906123d9565b6107fe91906123f8565b610808919061241a565b90505b92915050565b6000546001600160a01b0316331461083b5760405162461bcd60e51b81526004016105ed90612432565b6001600160a01b03821660009081526004602052604090205460ff166108a35760405162461bcd60e51b815260206004820152601a60248201527f72657761726420746f6b656e206e6f7420737570706f7274656400000000000060448201526064016105ed565b6001600160a01b038216600090815260056020526040902054421161090a5760405162461bcd60e51b815260206004820152601d60248201527f70726576696f75732072657761726473206e6f7420636f6d706c65746500000060448201526064016105ed565b6109148282611b96565b5050565b6002600154141561093b5760405162461bcd60e51b81526004016105ed906122f5565b60026001553360005b600354811015610a31576000600382815481106109635761096361232c565b6000918252602090912001546001600160a01b0316905061098381611825565b6001600160a01b0382166000908152600960205260409020556109a581610d41565b6001600160a01b03808316600090815260086020526040902091909155831615610a1e576109d3818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b5080610a2981612358565b915050610944565b506107463383611be7565b60026001541415610a5f5760405162461bcd60e51b81526004016105ed906122f5565b6002600155600054600160a01b900460ff1615610a8e5760405162461bcd60e51b81526004016105ed90612467565b8160005b600354811015610b7f57600060038281548110610ab157610ab161232c565b6000918252602090912001546001600160a01b03169050610ad181611825565b6001600160a01b038216600090815260096020526040902055610af381610d41565b6001600160a01b03808316600090815260086020526040902091909155831615610b6c57610b21818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b5080610b7781612358565b915050610a92565b50600c546001600160a01b03163314610baa5760405162461bcd60e51b81526004016105ed90612373565b6001600160a01b038316610bd05760405162461bcd60e51b81526004016105ed90612399565b610bda8383611cd0565b50506001805550565b60026001541415610c065760405162461bcd60e51b81526004016105ed906122f5565b60026001553360005b600354811015610cfc57600060038281548110610c2e57610c2e61232c565b6000918252602090912001546001600160a01b03169050610c4e81611825565b6001600160a01b038216600090815260096020526040902055610c7081610d41565b6001600160a01b03808316600090815260086020526040902091909155831615610ce957610c9e818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b5080610cf481612358565b915050610c0f565b50610d063361198f565b5060018055565b6000546001600160a01b03163314610d375760405162461bcd60e51b81526004016105ed90612432565b610d3f611dae565b565b6001600160a01b0381166000908152600560205260408120544210610d7e576001600160a01b03821660009081526005602052604090205461080b565b4261080b565b6000546001600160a01b03163314610dae5760405162461bcd60e51b81526004016105ed90612432565b610d3f6000611e4b565b60606003805480602002602001604051908101604052809291908181526020018280548015610e1057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610df2575b5050505050905090565b6000546001600160a01b03163314610e445760405162461bcd60e51b81526004016105ed90612432565b610d3f611e9b565b6000546001600160a01b03163314610e765760405162461bcd60e51b81526004016105ed90612432565b6001600160a01b03821660009081526004602052604090205460ff1615610edf5760405162461bcd60e51b815260206004820152601f60248201527f7265776172647320746f6b656e20616c726561647920737570706f727465640060448201526064016105ed565b6003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b038516908117909155600081815260046020908152604091829020805460ff1916909417909355519081527f0cb82d053b920831ee1dc1e166c0dc6d25c39520802e3767eada637d1e856c65910160405180910390a16109148282611b96565b60026001541415610fa35760405162461bcd60e51b81526004016105ed906122f5565b6002600155600054600160a01b900460ff1615610fd25760405162461bcd60e51b81526004016105ed90612467565b3360005b6003548110156110c357600060038281548110610ff557610ff561232c565b6000918252602090912001546001600160a01b0316905061101581611825565b6001600160a01b03821660009081526009602052604090205561103781610d41565b6001600160a01b038083166000908152600860205260409020919091558316156110b057611065818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b50806110bb81612358565b915050610fd6565b506107463383611cd0565b6000546001600160a01b031633146110f85760405162461bcd60e51b81526004016105ed90612432565b6002546001600160a01b03838116911614156111565760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207769746864726177207374616b696e6720746f6b656e00000060448201526064016105ed565b61117c61116b6000546001600160a01b031690565b6001600160a01b0384169083611f00565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2891015b60405180910390a15050565b6000546001600160a01b031633146111ed5760405162461bcd60e51b81526004016105ed90612432565b6000805b6003548110156112de576000600382815481106112105761121061232c565b6000918252602090912001546001600160a01b0316905061123081611825565b6001600160a01b03821660009081526009602052604090205561125281610d41565b6001600160a01b038083166000908152600860205260409020919091558316156112cb57611280818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b50806112d681612358565b9150506111f1565b506001600160a01b03831660009081526004602052604090205460ff166113475760405162461bcd60e51b815260206004820152601a60248201527f72657761726420746f6b656e206e6f7420737570706f7274656400000000000060448201526064016105ed565b6001600160a01b03831660009081526005602052604090205442106113a7576001600160a01b03831660009081526007602052604090205461138990836123f8565b6001600160a01b03841660009081526006602052604090205561143e565b6001600160a01b0383166000908152600560205260408120546113cb9042906123c2565b6001600160a01b038516600090815260066020526040812054919250906113f290836123d9565b6001600160a01b038616600090815260076020526040902054909150611418828661241a565b61142291906123f8565b6001600160a01b03861660009081526006602052604090205550505b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190612491565b6001600160a01b0385166000908152600760205260409020549091506114cf90826123f8565b6001600160a01b038516600090815260066020526040902054111561152d5760405162461bcd60e51b81526020600482015260146024820152730e4caeec2e4c840e4c2e8ca40e8dede40d0d2ced60631b60448201526064016105ed565b426001600160a01b0385166000908152600860209081526040808320939093556007905220544261155e919061241a565b6001600160a01b0385166000818152600560209081526040918290209390935580519182529181018590527fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e29910160405180910390a150505050565b600381815481106115ca57600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038116600090815260076020908152604080832054600690925282205461080b91906123d9565b6000546001600160a01b0316331461163c5760405162461bcd60e51b81526004016105ed90612432565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527fd463ca58ea00d3f552e95dc3ea8fa97034bfd2c9d9b13ec245080dfa176feac89060200160405180910390a150565b600260015414156116b35760405162461bcd60e51b81526004016105ed906122f5565b60026001558160005b6003548110156117a9576000600382815481106116db576116db61232c565b6000918252602090912001546001600160a01b031690506116fb81611825565b6001600160a01b03821660009081526009602052604090205561171d81610d41565b6001600160a01b038083166000908152600860205260409020919091558316156117965761174b818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b50806117a181612358565b9150506116bc565b50600c546001600160a01b031633146117d45760405162461bcd60e51b81526004016105ed90612373565b6001600160a01b0383166117fa5760405162461bcd60e51b81526004016105ed90612399565b610bda8383611be7565b336000908152600e602052604090205461181d90610918565b610d3f610be3565b6001600160a01b03811660009081526004602052604081205460ff1661184d57506000919050565b600d5461187057506001600160a01b031660009081526009602052604090205490565b600d546001600160a01b0383166000908152600660209081526040808320546008909252909120546118a185610d41565b6118ab91906123c2565b6118b591906123d9565b6118c790670de0b6b3a76400006123d9565b6118d191906123f8565b6001600160a01b03831660009081526009602052604090205461080b919061241a565b6000546001600160a01b0316331461191e5760405162461bcd60e51b81526004016105ed90612432565b6001600160a01b0381166119835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ed565b61198c81611e4b565b50565b60005b600354811015610914576000600b6000600384815481106119b5576119b561232c565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220938716825292909252812054600380549193509084908110611a0257611a0261232c565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a779190612491565b9050600082118015611a895750808211155b15611b81576000600b600060038681548110611aa757611aa761232c565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093891682529290925290205560038054611b1591869185919087908110611af957611af961232c565b6000918252602090912001546001600160a01b03169190611f00565b836001600160a01b03167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e60038581548110611b5357611b5361232c565b60009182526020918290200154604080516001600160a01b0390921682529181018690520160405180910390a25b50508080611b8e90612358565b915050611992565b6001600160a01b038216600081815260076020908152604091829020849055815192835282018390527fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f4954591016111b7565b60008111611c285760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016105ed565b80600d54611c3691906123c2565b600d556001600160a01b0382166000908152600e6020526040902054611c5d9082906123c2565b6001600160a01b038084166000908152600e6020526040902091909155600254611c8991163383611f00565b816001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051611cc491815260200190565b60405180910390a25050565b60008111611d115760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016105ed565b80600d54611d1f919061241a565b600d556001600160a01b0382166000908152600e6020526040902054611d4690829061241a565b6001600160a01b038084166000908152600e6020526040902091909155600254611d739116333084611f68565b816001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051611cc491815260200190565b600054600160a01b900460ff16611dfe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105ed565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a01b900460ff1615611ec55760405162461bcd60e51b81526004016105ed90612467565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e2e3390565b6040516001600160a01b038316602482015260448101829052611f6390849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611fa6565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611fa09085906323b872dd60e01b90608401611f2c565b50505050565b6000611ffb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120789092919063ffffffff16565b805190915015611f63578080602001905181019061201991906124aa565b611f635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105ed565b60606120878484600085612091565b90505b9392505050565b6060824710156120f25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105ed565b6001600160a01b0385163b6121495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105ed565b600080866001600160a01b0316858760405161216591906124f8565b60006040518083038185875af1925050503d80600081146121a2576040519150601f19603f3d011682016040523d82523d6000602084013e6121a7565b606091505b50915091506121b78282866121c2565b979650505050505050565b606083156121d157508161208a565b8251156121e15782518084602001fd5b8160405162461bcd60e51b81526004016105ed9190612514565b80356001600160a01b038116811461221257600080fd5b919050565b60006020828403121561222957600080fd5b610808826121fb565b6000806040838503121561224557600080fd5b61224e836121fb565b915061225c602084016121fb565b90509250929050565b6000806040838503121561227857600080fd5b612281836121fb565b946020939093013593505050565b6000602082840312156122a157600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156122e95783516001600160a01b0316835292840192918401916001016122c4565b50909695505050505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561236c5761236c612342565b5060010190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600f908201526e1a5b9d985b1a59081858d8dbdd5b9d608a1b604082015260600190565b6000828210156123d4576123d4612342565b500390565b60008160001904831182151516156123f3576123f3612342565b500290565b60008261241557634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561242d5761242d612342565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6000602082840312156124a357600080fd5b5051919050565b6000602082840312156124bc57600080fd5b8151801515811461208a57600080fd5b60005b838110156124e75781810151838201526020016124cf565b83811115611fa05750506000910152565b6000825161250a8184602087016124cc565b9190910192915050565b60208152600082518060208401526125338160408501602087016124cc565b601f01601f1916919091016040019291505056fea2646970667358221220f05dc9ed545f09d95be2075775a6a5ddfdd3fc5946cd47df2327884376ca051064736f6c634300080b00330000000000000000000000001977870a4c18a728c19dd4eb6542451df06e0a4b00000000000000000000000084d30da8be6ba709ad4374c106acfcd4d61061e1
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c806388d04b1e1161013b578063c5639cc6116100b8578063e70b9e271161007c578063e70b9e2714610548578063e9fad8ee14610573578063ea7cbff11461057b578063f1229777146105a4578063f2fde38b146105b757600080fd5b8063c5639cc6146104d7578063cba43fe6146104ea578063da09d19d1461050d578063db518db21461052d578063e5c21aba1461054057600080fd5b8063a694fc3a116100ff578063a694fc3a14610478578063b29a81401461048b578063b66503cf1461049e578063b6d0dcd8146104b1578063bcd11014146104c457600080fd5b806388d04b1e146104105780638da5cb5b146104235780639ce43f90146104345780639f9106d114610454578063a5dc9e1b1461046557600080fd5b80633f4ba83a116101c9578063715018a61161018d578063715018a6146103ba57806372f702f3146103c2578063796b89b9146103ed5780638040c65b146103f35780638456cb591461040857600080fd5b80633f4ba83a146103385780635c975abb146103405780635d9103511461035e578063638634ee1461037e57806370a082311461039157600080fd5b806327b936741161021057806327b93674146102bf5780632ce9aead146102ea5780632e1a7d4d1461030a5780632ee409081461031d5780633d18b9121461033057600080fd5b8063055de2751461024d57806318160ddd14610262578063211dc32d14610279578063221ca18c1461028c5780632378bea6146102ac575b600080fd5b61026061025b366004612217565b6105ca565b005b600d545b6040519081526020015b60405180910390f35b610266610287366004612232565b61074e565b61026661029a366004612217565b60066020526000908152604090205481565b6102606102ba366004612265565b610811565b6102666102cd366004612232565b600a60209081526000928352604080842090915290825290205481565b6102666102f8366004612217565b60086020526000908152604090205481565b61026061031836600461228f565b610918565b61026061032b366004612265565b610a3c565b610260610be3565b610260610d0d565b600054600160a01b900460ff165b6040519015158152602001610270565b61026661036c366004612217565b60076020526000908152604090205481565b61026661038c366004612217565b610d41565b61026661039f366004612217565b6001600160a01b03166000908152600e602052604090205490565b610260610d84565b6002546103d5906001600160a01b031681565b6040516001600160a01b039091168152602001610270565b42610266565b6103fb610db8565b60405161027091906122a8565b610260610e1a565b61026061041e366004612265565b610e4c565b6000546001600160a01b03166103d5565b610266610442366004612217565b60096020526000908152604090205481565b6002546001600160a01b03166103d5565b600c546103d5906001600160a01b031681565b61026061048636600461228f565b610f80565b610260610499366004612265565b6110ce565b6102606104ac366004612265565b6111c3565b6103d56104bf36600461228f565b6115ba565b6102666104d2366004612217565b6115e4565b6102606104e5366004612217565b611612565b61034e6104f8366004612217565b60046020526000908152604090205460ff1681565b61026661051b366004612217565b60056020526000908152604090205481565b61026061053b366004612265565b611690565b600354610266565b610266610556366004612232565b600b60209081526000928352604080842090915290825290205481565b610260611804565b610266610589366004612217565b6001600160a01b031660009081526006602052604090205490565b6102666105b2366004612217565b611825565b6102606105c5366004612217565b6118f4565b600260015414156105f65760405162461bcd60e51b81526004016105ed906122f5565b60405180910390fd5b60026001558060005b6003548110156106ec5760006003828154811061061e5761061e61232c565b6000918252602090912001546001600160a01b0316905061063e81611825565b6001600160a01b03821660009081526009602052604090205561066081610d41565b6001600160a01b038083166000908152600860205260409020919091558316156106d95761068e818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b50806106e481612358565b9150506105ff565b50600c546001600160a01b031633146107175760405162461bcd60e51b81526004016105ed90612373565b6001600160a01b03821661073d5760405162461bcd60e51b81526004016105ed90612399565b6107468261198f565b505060018055565b6001600160a01b03821660009081526004602052604081205460ff166107765750600061080b565b6001600160a01b038084166000818152600b6020908152604080832094871680845294825280832054938352600a82528083209483529390529190912054670de0b6b3a7640000906107c786611825565b6107d191906123c2565b6001600160a01b0385166000908152600e60205260409020546107f491906123d9565b6107fe91906123f8565b610808919061241a565b90505b92915050565b6000546001600160a01b0316331461083b5760405162461bcd60e51b81526004016105ed90612432565b6001600160a01b03821660009081526004602052604090205460ff166108a35760405162461bcd60e51b815260206004820152601a60248201527f72657761726420746f6b656e206e6f7420737570706f7274656400000000000060448201526064016105ed565b6001600160a01b038216600090815260056020526040902054421161090a5760405162461bcd60e51b815260206004820152601d60248201527f70726576696f75732072657761726473206e6f7420636f6d706c65746500000060448201526064016105ed565b6109148282611b96565b5050565b6002600154141561093b5760405162461bcd60e51b81526004016105ed906122f5565b60026001553360005b600354811015610a31576000600382815481106109635761096361232c565b6000918252602090912001546001600160a01b0316905061098381611825565b6001600160a01b0382166000908152600960205260409020556109a581610d41565b6001600160a01b03808316600090815260086020526040902091909155831615610a1e576109d3818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b5080610a2981612358565b915050610944565b506107463383611be7565b60026001541415610a5f5760405162461bcd60e51b81526004016105ed906122f5565b6002600155600054600160a01b900460ff1615610a8e5760405162461bcd60e51b81526004016105ed90612467565b8160005b600354811015610b7f57600060038281548110610ab157610ab161232c565b6000918252602090912001546001600160a01b03169050610ad181611825565b6001600160a01b038216600090815260096020526040902055610af381610d41565b6001600160a01b03808316600090815260086020526040902091909155831615610b6c57610b21818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b5080610b7781612358565b915050610a92565b50600c546001600160a01b03163314610baa5760405162461bcd60e51b81526004016105ed90612373565b6001600160a01b038316610bd05760405162461bcd60e51b81526004016105ed90612399565b610bda8383611cd0565b50506001805550565b60026001541415610c065760405162461bcd60e51b81526004016105ed906122f5565b60026001553360005b600354811015610cfc57600060038281548110610c2e57610c2e61232c565b6000918252602090912001546001600160a01b03169050610c4e81611825565b6001600160a01b038216600090815260096020526040902055610c7081610d41565b6001600160a01b03808316600090815260086020526040902091909155831615610ce957610c9e818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b5080610cf481612358565b915050610c0f565b50610d063361198f565b5060018055565b6000546001600160a01b03163314610d375760405162461bcd60e51b81526004016105ed90612432565b610d3f611dae565b565b6001600160a01b0381166000908152600560205260408120544210610d7e576001600160a01b03821660009081526005602052604090205461080b565b4261080b565b6000546001600160a01b03163314610dae5760405162461bcd60e51b81526004016105ed90612432565b610d3f6000611e4b565b60606003805480602002602001604051908101604052809291908181526020018280548015610e1057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610df2575b5050505050905090565b6000546001600160a01b03163314610e445760405162461bcd60e51b81526004016105ed90612432565b610d3f611e9b565b6000546001600160a01b03163314610e765760405162461bcd60e51b81526004016105ed90612432565b6001600160a01b03821660009081526004602052604090205460ff1615610edf5760405162461bcd60e51b815260206004820152601f60248201527f7265776172647320746f6b656e20616c726561647920737570706f727465640060448201526064016105ed565b6003805460018082019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b038516908117909155600081815260046020908152604091829020805460ff1916909417909355519081527f0cb82d053b920831ee1dc1e166c0dc6d25c39520802e3767eada637d1e856c65910160405180910390a16109148282611b96565b60026001541415610fa35760405162461bcd60e51b81526004016105ed906122f5565b6002600155600054600160a01b900460ff1615610fd25760405162461bcd60e51b81526004016105ed90612467565b3360005b6003548110156110c357600060038281548110610ff557610ff561232c565b6000918252602090912001546001600160a01b0316905061101581611825565b6001600160a01b03821660009081526009602052604090205561103781610d41565b6001600160a01b038083166000908152600860205260409020919091558316156110b057611065818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b50806110bb81612358565b915050610fd6565b506107463383611cd0565b6000546001600160a01b031633146110f85760405162461bcd60e51b81526004016105ed90612432565b6002546001600160a01b03838116911614156111565760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207769746864726177207374616b696e6720746f6b656e00000060448201526064016105ed565b61117c61116b6000546001600160a01b031690565b6001600160a01b0384169083611f00565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2891015b60405180910390a15050565b6000546001600160a01b031633146111ed5760405162461bcd60e51b81526004016105ed90612432565b6000805b6003548110156112de576000600382815481106112105761121061232c565b6000918252602090912001546001600160a01b0316905061123081611825565b6001600160a01b03821660009081526009602052604090205561125281610d41565b6001600160a01b038083166000908152600860205260409020919091558316156112cb57611280818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b50806112d681612358565b9150506111f1565b506001600160a01b03831660009081526004602052604090205460ff166113475760405162461bcd60e51b815260206004820152601a60248201527f72657761726420746f6b656e206e6f7420737570706f7274656400000000000060448201526064016105ed565b6001600160a01b03831660009081526005602052604090205442106113a7576001600160a01b03831660009081526007602052604090205461138990836123f8565b6001600160a01b03841660009081526006602052604090205561143e565b6001600160a01b0383166000908152600560205260408120546113cb9042906123c2565b6001600160a01b038516600090815260066020526040812054919250906113f290836123d9565b6001600160a01b038616600090815260076020526040902054909150611418828661241a565b61142291906123f8565b6001600160a01b03861660009081526006602052604090205550505b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190612491565b6001600160a01b0385166000908152600760205260409020549091506114cf90826123f8565b6001600160a01b038516600090815260066020526040902054111561152d5760405162461bcd60e51b81526020600482015260146024820152730e4caeec2e4c840e4c2e8ca40e8dede40d0d2ced60631b60448201526064016105ed565b426001600160a01b0385166000908152600860209081526040808320939093556007905220544261155e919061241a565b6001600160a01b0385166000818152600560209081526040918290209390935580519182529181018590527fac24935fd910bc682b5ccb1a07b718cadf8cf2f6d1404c4f3ddc3662dae40e29910160405180910390a150505050565b600381815481106115ca57600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038116600090815260076020908152604080832054600690925282205461080b91906123d9565b6000546001600160a01b0316331461163c5760405162461bcd60e51b81526004016105ed90612432565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527fd463ca58ea00d3f552e95dc3ea8fa97034bfd2c9d9b13ec245080dfa176feac89060200160405180910390a150565b600260015414156116b35760405162461bcd60e51b81526004016105ed906122f5565b60026001558160005b6003548110156117a9576000600382815481106116db576116db61232c565b6000918252602090912001546001600160a01b031690506116fb81611825565b6001600160a01b03821660009081526009602052604090205561171d81610d41565b6001600160a01b038083166000908152600860205260409020919091558316156117965761174b818461074e565b6001600160a01b038083166000818152600b60209081526040808320948916808452948252808320959095559181526009825283812054600a83528482209382529290915291909120555b50806117a181612358565b9150506116bc565b50600c546001600160a01b031633146117d45760405162461bcd60e51b81526004016105ed90612373565b6001600160a01b0383166117fa5760405162461bcd60e51b81526004016105ed90612399565b610bda8383611be7565b336000908152600e602052604090205461181d90610918565b610d3f610be3565b6001600160a01b03811660009081526004602052604081205460ff1661184d57506000919050565b600d5461187057506001600160a01b031660009081526009602052604090205490565b600d546001600160a01b0383166000908152600660209081526040808320546008909252909120546118a185610d41565b6118ab91906123c2565b6118b591906123d9565b6118c790670de0b6b3a76400006123d9565b6118d191906123f8565b6001600160a01b03831660009081526009602052604090205461080b919061241a565b6000546001600160a01b0316331461191e5760405162461bcd60e51b81526004016105ed90612432565b6001600160a01b0381166119835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ed565b61198c81611e4b565b50565b60005b600354811015610914576000600b6000600384815481106119b5576119b561232c565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220938716825292909252812054600380549193509084908110611a0257611a0261232c565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a779190612491565b9050600082118015611a895750808211155b15611b81576000600b600060038681548110611aa757611aa761232c565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093891682529290925290205560038054611b1591869185919087908110611af957611af961232c565b6000918252602090912001546001600160a01b03169190611f00565b836001600160a01b03167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e60038581548110611b5357611b5361232c565b60009182526020918290200154604080516001600160a01b0390921682529181018690520160405180910390a25b50508080611b8e90612358565b915050611992565b6001600160a01b038216600081815260076020908152604091829020849055815192835282018390527fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f4954591016111b7565b60008111611c285760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016105ed565b80600d54611c3691906123c2565b600d556001600160a01b0382166000908152600e6020526040902054611c5d9082906123c2565b6001600160a01b038084166000908152600e6020526040902091909155600254611c8991163383611f00565b816001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d582604051611cc491815260200190565b60405180910390a25050565b60008111611d115760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016105ed565b80600d54611d1f919061241a565b600d556001600160a01b0382166000908152600e6020526040902054611d4690829061241a565b6001600160a01b038084166000908152600e6020526040902091909155600254611d739116333084611f68565b816001600160a01b03167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d82604051611cc491815260200190565b600054600160a01b900460ff16611dfe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105ed565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600054600160a01b900460ff1615611ec55760405162461bcd60e51b81526004016105ed90612467565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e2e3390565b6040516001600160a01b038316602482015260448101829052611f6390849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611fa6565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611fa09085906323b872dd60e01b90608401611f2c565b50505050565b6000611ffb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120789092919063ffffffff16565b805190915015611f63578080602001905181019061201991906124aa565b611f635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105ed565b60606120878484600085612091565b90505b9392505050565b6060824710156120f25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105ed565b6001600160a01b0385163b6121495760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105ed565b600080866001600160a01b0316858760405161216591906124f8565b60006040518083038185875af1925050503d80600081146121a2576040519150601f19603f3d011682016040523d82523d6000602084013e6121a7565b606091505b50915091506121b78282866121c2565b979650505050505050565b606083156121d157508161208a565b8251156121e15782518084602001fd5b8160405162461bcd60e51b81526004016105ed9190612514565b80356001600160a01b038116811461221257600080fd5b919050565b60006020828403121561222957600080fd5b610808826121fb565b6000806040838503121561224557600080fd5b61224e836121fb565b915061225c602084016121fb565b90509250929050565b6000806040838503121561227857600080fd5b612281836121fb565b946020939093013593505050565b6000602082840312156122a157600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156122e95783516001600160a01b0316835292840192918401916001016122c4565b50909695505050505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561236c5761236c612342565b5060010190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600f908201526e1a5b9d985b1a59081858d8dbdd5b9d608a1b604082015260600190565b6000828210156123d4576123d4612342565b500390565b60008160001904831182151516156123f3576123f3612342565b500290565b60008261241557634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561242d5761242d612342565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6000602082840312156124a357600080fd5b5051919050565b6000602082840312156124bc57600080fd5b8151801515811461208a57600080fd5b60005b838110156124e75781810151838201526020016124cf565b83811115611fa05750506000910152565b6000825161250a8184602087016124cc565b9190910192915050565b60208152600082518060208401526125338160408501602087016124cc565b601f01601f1916919091016040019291505056fea2646970667358221220f05dc9ed545f09d95be2075775a6a5ddfdd3fc5946cd47df2327884376ca051064736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001977870a4c18a728c19dd4eb6542451df06e0a4b00000000000000000000000084d30da8be6ba709ad4374c106acfcd4d61061e1
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x1977870a4c18a728C19Dd4eB6542451DF06e0A4b
Arg [1] : _helperContract (address): 0x84D30DA8bE6ba709ad4374c106ACfCD4d61061E1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001977870a4c18a728c19dd4eb6542451df06e0a4b
Arg [1] : 00000000000000000000000084d30da8be6ba709ad4374c106acfcd4d61061e1
Deployed Bytecode Sourcemap
25567:16078:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34521:278;;;;;;:::i;:::-;;:::i;:::-;;27691:93;27764:12;;27691:93;;;529:25:1;;;517:2;502:18;27691:93:0;;;;;;;;29657:578;;;;;;:::i;:::-;;:::i;26207:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;38119:390;;;;;;:::i;:::-;;:::i;26701:73::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;26445:49;;;;;;:::i;:::-;;;;;;;;;;;;;;33133:162;;;;;;:::i;:::-;;:::i;32346:319::-;;;;;;:::i;:::-;;:::i;34242:110::-;;;:::i;39551:67::-;;;:::i;4664:86::-;4711:4;4735:7;-1:-1:-1;;;4735:7:0;;;;4664:86;;;1439:14:1;;1432:22;1414:41;;1402:2;1387:18;4664:86:0;1274:187:1;26320:50:0;;;;;;:::i;:::-;;;;;;;;;;;;;;28221:293;;;;;;:::i;:::-;;:::i;27924:112::-;;;;;;:::i;:::-;-1:-1:-1;;;;;28010:18:0;27983:7;28010:18;;;:9;:18;;;;;;;27924:112;2711:103;;;:::i;25811:26::-;;;;;-1:-1:-1;;;;;25811:26:0;;;;;;-1:-1:-1;;;;;1644:32:1;;;1626:51;;1614:2;1599:18;25811:26:0;1466:217:1;31706:108:0;31791:15;31706:108;;31265:111;;;:::i;:::-;;;;;;;:::i;39425:63::-;;;:::i;38668:434::-;;;;;;:::i;:::-;;:::i;2060:87::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;2060:87;;26563:55;;;;;;:::i;:::-;;;;;;;;;;;;;;31478:106;31563:12;;-1:-1:-1;;;;;31563:12:0;31478:106;;27016:29;;;;;-1:-1:-1;;;;;27016:29:0;;;31989:181;;;;;;:::i;:::-;;:::i;37597:360::-;;;;;;:::i;:::-;;:::i;35868:1505::-;;;;;;:::i;:::-;;:::i;25890:30::-;;;;;;:::i;:::-;;:::i;30722:201::-;;;;;;:::i;:::-;;:::i;39219:145::-;;;;;;:::i;:::-;;:::i;25972:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;26096:47;;;;;;:::i;:::-;;;;;;;;;;;;;;33530:300;;;;;;:::i;:::-;;:::i;31045:110::-;31127:13;:20;31045:110;;26853:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;35441:97;;;:::i;30387:161::-;;;;;;:::i;:::-;-1:-1:-1;;;;;30515:25:0;30483:7;30515:25;;;:10;:25;;;;;;;30387:161;28700:735;;;;;;:::i;:::-;;:::i;2969:201::-;;;;;;:::i;:::-;;:::i;34521:278::-;7668:1;8266:7;;:19;;8258:63;;;;-1:-1:-1;;;8258:63:0;;;;;;;:::i;:::-;;;;;;;;;7668:1;8399:7;:18;34620:7;40046:9:::1;40041:441;40065:13;:20:::0;40061:24;::::1;40041:441;;;40107:13;40123;40137:1;40123:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;40123:16:0::1;::::0;-1:-1:-1;40184:21:0::1;40123:16:::0;40184:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;40154:27:0;::::1;;::::0;;;:20:::1;:27;::::0;;;;:51;40244:31:::1;40175:5:::0;40244:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;40220:21:0;;::::1;;::::0;;;:14:::1;:21;::::0;;;;:55;;;;40294:18;::::1;::::0;40290:181:::1;;40356:19;40363:5;40370:4;40356:6;:19::i;:::-;-1:-1:-1::0;;;;;40333:14:0;;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;;:42;;;;40428:27;;;:20:::1;:27:::0;;;;;;40394:18:::1;:25:::0;;;;;:31;;;;;;;;;;;:61;40290:181:::1;-1:-1:-1::0;40087:3:0;::::1;::::0;::::1;:::i;:::-;;;;40041:441;;;-1:-1:-1::0;34667:14:0::2;::::0;-1:-1:-1;;;;;34667:14:0::2;34653:10;:28;34645:53;;;;-1:-1:-1::0;;;34645:53:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34717:21:0;::::2;34709:49;;;;-1:-1:-1::0;;;34709:49:0::2;;;;;;;:::i;:::-;34769:22;34783:7;34769:13;:22::i;:::-;-1:-1:-1::0;;7624:1:0;8578:22;;34521:278::o;29657:578::-;-1:-1:-1;;;;;29851:31:0;;29761:7;29851:31;;;:16;:31;;;;;;;;29846:73;;-1:-1:-1;29906:1:0;29899:8;;29846:73;-1:-1:-1;;;;;30196:22:0;;;;;;;:7;:22;;;;;;;;:31;;;;;;;;;;;;;30116:33;;;:18;:33;;;;;:42;;;;;;;;;;;30176:4;;30063:29;30204:13;30063:14;:29::i;:::-;:95;;;;:::i;:::-;-1:-1:-1;;;;;30024:18:0;;;;;;:9;:18;;;;;;:135;;;;:::i;:::-;30023:157;;;;:::i;:::-;:204;;;;:::i;:::-;30003:224;;29657:578;;;;;:::o;38119:390::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38248:30:0;::::1;;::::0;;;:16:::1;:30;::::0;;;;;::::1;;38240:69;;;::::0;-1:-1:-1;;;38240:69:0;;5229:2:1;38240:69:0::1;::::0;::::1;5211:21:1::0;5268:2;5248:18;;;5241:30;5307:28;5287:18;;;5280:56;5353:18;;38240:69:0::1;5027:350:1::0;38240:69:0::1;-1:-1:-1::0;;;;;38364:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;31791:15;38342:48:::1;38320:127;;;::::0;-1:-1:-1;;;38320:127:0;;5584:2:1;38320:127:0::1;::::0;::::1;5566:21:1::0;5623:2;5603:18;;;5596:30;5662:31;5642:18;;;5635:59;5711:18;;38320:127:0::1;5382:353:1::0;38320:127:0::1;38458:43;38478:12;38492:8;38458:19;:43::i;:::-;38119:390:::0;;:::o;33133:162::-;7668:1;8266:7;;:19;;8258:63;;;;-1:-1:-1;;;8258:63:0;;;;;;;:::i;:::-;7668:1;8399:7;:18;33227:10:::1;40046:9;40041:441;40065:13;:20:::0;40061:24;::::1;40041:441;;;40107:13;40123;40137:1;40123:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;40123:16:0::1;::::0;-1:-1:-1;40184:21:0::1;40123:16:::0;40184:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;40154:27:0;::::1;;::::0;;;:20:::1;:27;::::0;;;;:51;40244:31:::1;40175:5:::0;40244:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;40220:21:0;;::::1;;::::0;;;:14:::1;:21;::::0;;;;:55;;;;40294:18;::::1;::::0;40290:181:::1;;40356:19;40363:5;40370:4;40356:6;:19::i;:::-;-1:-1:-1::0;;;;;40333:14:0;;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;;:42;;;;40428:27;;;:20:::1;:27:::0;;;;;;40394:18:::1;:25:::0;;;;;:31;;;;;;;;;;;:61;40290:181:::1;-1:-1:-1::0;40087:3:0;::::1;::::0;::::1;:::i;:::-;;;;40041:441;;;;33255:32:::2;33268:10;33280:6;33255:12;:32::i;32346:319::-:0;7668:1;8266:7;;:19;;8258:63;;;;-1:-1:-1;;;8258:63:0;;;;;;;:::i;:::-;7668:1;8399:7;:18;4711:4;4735:7;-1:-1:-1;;;4735:7:0;;;;4989:9:::1;4981:38;;;;-1:-1:-1::0;;;4981:38:0::1;;;;;;;:::i;:::-;32482:7:::2;40046:9;40041:441;40065:13;:20:::0;40061:24;::::2;40041:441;;;40107:13;40123;40137:1;40123:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;40123:16:0::2;::::0;-1:-1:-1;40184:21:0::2;40123:16:::0;40184:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;40154:27:0;::::2;;::::0;;;:20:::2;:27;::::0;;;;:51;40244:31:::2;40175:5:::0;40244:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;40220:21:0;;::::2;;::::0;;;:14:::2;:21;::::0;;;;:55;;;;40294:18;::::2;::::0;40290:181:::2;;40356:19;40363:5;40370:4;40356:6;:19::i;:::-;-1:-1:-1::0;;;;;40333:14:0;;::::2;;::::0;;;:7:::2;:14;::::0;;;;;;;:20;;::::2;::::0;;;;;;;;;:42;;;;40428:27;;;:20:::2;:27:::0;;;;;;40394:18:::2;:25:::0;;;;;:31;;;;;;;;;;;:61;40290:181:::2;-1:-1:-1::0;40087:3:0;::::2;::::0;::::2;:::i;:::-;;;;40041:441;;;-1:-1:-1::0;32529:14:0::3;::::0;-1:-1:-1;;;;;32529:14:0::3;32515:10;:28;32507:53;;;;-1:-1:-1::0;;;32507:53:0::3;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32579:21:0;::::3;32571:49;;;;-1:-1:-1::0;;;32571:49:0::3;;;;;;;:::i;:::-;32631:26;32641:7;32650:6;32631:9;:26::i;:::-;-1:-1:-1::0;;7624:1:0;8578:22;;-1:-1:-1;32346:319:0:o;34242:110::-;7668:1;8266:7;;:19;;8258:63;;;;-1:-1:-1;;;8258:63:0;;;;;;;:::i;:::-;7668:1;8399:7;:18;34296:10:::1;40046:9;40041:441;40065:13;:20:::0;40061:24;::::1;40041:441;;;40107:13;40123;40137:1;40123:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;40123:16:0::1;::::0;-1:-1:-1;40184:21:0::1;40123:16:::0;40184:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;40154:27:0;::::1;;::::0;;;:20:::1;:27;::::0;;;;:51;40244:31:::1;40175:5:::0;40244:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;40220:21:0;;::::1;;::::0;;;:14:::1;:21;::::0;;;;:55;;;;40294:18;::::1;::::0;40290:181:::1;;40356:19;40363:5;40370:4;40356:6;:19::i;:::-;-1:-1:-1::0;;;;;40333:14:0;;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;;:42;;;;40428:27;;;:20:::1;:27:::0;;;;;;40394:18:::1;:25:::0;;;;;:31;;;;;;;;;;;:61;40290:181:::1;-1:-1:-1::0;40087:3:0;::::1;::::0;::::1;:::i;:::-;;;;40041:441;;;;34319:25:::2;34333:10;34319:13;:25::i;:::-;-1:-1:-1::0;7624:1:0;8578:22;;34242:110::o;39551:67::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;39600:10:::1;:8;:10::i;:::-;39551:67::o:0;28221:293::-;-1:-1:-1;;;;;28393:27:0;;28326:7;28393:27;;;:12;:27;;;;;;31791:15;28371:49;:135;;-1:-1:-1;;;;;28479:27:0;;;;;;:12;:27;;;;;;28371:135;;;31791:15;28440:19;31706:108;2711:103;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;2776:30:::1;2803:1;2776:18;:30::i;31265:111::-:0;31319:16;31355:13;31348:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31348:20:0;;;;;;;;;;;;;;;;;;;;;;;31265:111;:::o;39425:63::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;39472:8:::1;:6;:8::i;38668:434::-:0;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38809:30:0;::::1;;::::0;;;:16:::1;:30;::::0;;;;;::::1;;38808:31;38786:112;;;::::0;-1:-1:-1;;;38786:112:0;;6287:2:1;38786:112:0::1;::::0;::::1;6269:21:1::0;6326:2;6306:18;;;6299:30;6365:33;6345:18;;;6338:61;6416:18;;38786:112:0::1;6085:355:1::0;38786:112:0::1;38911:13;:32:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;38911:32:0::1;-1:-1:-1::0;;;;;38911:32:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;38954:30:0;;;:16:::1;38911:32;38954:30:::0;;;;;;;;:37;;-1:-1:-1;;38954:37:0::1;::::0;;::::1;::::0;;;39007:31;1626:51:1;;;39007:31:0::1;::::0;1599:18:1;39007:31:0::1;;;;;;;39051:43;39071:12;39085:8;39051:19;:43::i;31989:181::-:0;7668:1;8266:7;;:19;;8258:63;;;;-1:-1:-1;;;8258:63:0;;;;;;;:::i;:::-;7668:1;8399:7;:18;4711:4;4735:7;-1:-1:-1;;;4735:7:0;;;;4989:9:::1;4981:38;;;;-1:-1:-1::0;;;4981:38:0::1;;;;;;;:::i;:::-;32105:10:::2;40046:9;40041:441;40065:13;:20:::0;40061:24;::::2;40041:441;;;40107:13;40123;40137:1;40123:16;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;-1:-1:-1;;;;;40123:16:0::2;::::0;-1:-1:-1;40184:21:0::2;40123:16:::0;40184:14:::2;:21::i;:::-;-1:-1:-1::0;;;;;40154:27:0;::::2;;::::0;;;:20:::2;:27;::::0;;;;:51;40244:31:::2;40175:5:::0;40244:24:::2;:31::i;:::-;-1:-1:-1::0;;;;;40220:21:0;;::::2;;::::0;;;:14:::2;:21;::::0;;;;:55;;;;40294:18;::::2;::::0;40290:181:::2;;40356:19;40363:5;40370:4;40356:6;:19::i;:::-;-1:-1:-1::0;;;;;40333:14:0;;::::2;;::::0;;;:7:::2;:14;::::0;;;;;;;:20;;::::2;::::0;;;;;;;;;:42;;;;40428:27;;;:20:::2;:27:::0;;;;;;40394:18:::2;:25:::0;;;;;:31;;;;;;;;;;;:61;40290:181:::2;-1:-1:-1::0;40087:3:0;::::2;::::0;::::2;:::i;:::-;;;;40041:441;;;;32133:29:::3;32143:10;32155:6;32133:9;:29::i;37597:360::-:0;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;37761:12:::1;::::0;-1:-1:-1;;;;;37737:37:0;;::::1;37761:12:::0;::::1;37737:37;;37715:116;;;::::0;-1:-1:-1;;;37715:116:0;;6647:2:1;37715:116:0::1;::::0;::::1;6629:21:1::0;6686:2;6666:18;;;6659:30;6725:31;6705:18;;;6698:59;6774:18;;37715:116:0::1;6445:353:1::0;37715:116:0::1;37842:55;37876:7;2106::::0;2133:6;-1:-1:-1;;;;;2133:6:0;;2060:87;37876:7:::1;-1:-1:-1::0;;;;;37842:33:0;::::1;::::0;37885:11;37842:33:::1;:55::i;:::-;37913:36;::::0;;-1:-1:-1;;;;;6995:32:1;;6977:51;;7059:2;7044:18;;7037:34;;;37913:36:0::1;::::0;6950:18:1;37913:36:0::1;;;;;;;;37597:360:::0;;:::o;35868:1505::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;36001:1:::1;::::0;40041:441:::1;40065:13;:20:::0;40061:24;::::1;40041:441;;;40107:13;40123;40137:1;40123:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;40123:16:0::1;::::0;-1:-1:-1;40184:21:0::1;40123:16:::0;40184:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;40154:27:0;::::1;;::::0;;;:20:::1;:27;::::0;;;;:51;40244:31:::1;40175:5:::0;40244:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;40220:21:0;;::::1;;::::0;;;:14:::1;:21;::::0;;;;:55;;;;40294:18;::::1;::::0;40290:181:::1;;40356:19;40363:5;40370:4;40356:6;:19::i;:::-;-1:-1:-1::0;;;;;40333:14:0;;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;;:42;;;;40428:27;;;:20:::1;:27:::0;;;;;;40394:18:::1;:25:::0;;;;;:31;;;;;;;;;;;:61;40290:181:::1;-1:-1:-1::0;40087:3:0;::::1;::::0;::::1;:::i;:::-;;;;40041:441;;;-1:-1:-1::0;;;;;;36029:30:0;::::2;;::::0;;;:16:::2;:30;::::0;;;;;::::2;;36021:69;;;::::0;-1:-1:-1;;;36021:69:0;;5229:2:1;36021:69:0::2;::::0;::::2;5211:21:1::0;5268:2;5248:18;;;5241:30;5307:28;5287:18;;;5280:56;5353:18;;36021:69:0::2;5027:350:1::0;36021:69:0::2;-1:-1:-1::0;;;;;36130:26:0;::::2;;::::0;;;:12:::2;:26;::::0;;;;;31791:15;36107:49:::2;36103:462;;-1:-1:-1::0;;;;;36209:29:0;::::2;;::::0;;;:15:::2;:29;::::0;;;;;36200:38:::2;::::0;:6;:38:::2;:::i;:::-;-1:-1:-1::0;;;;;36173:24:0;::::2;;::::0;;;:10:::2;:24;::::0;;;;:65;36103:462:::2;;;-1:-1:-1::0;;;;;36291:26:0;::::2;36271:17;36291:26:::0;;;:12:::2;:26;::::0;;;;;:65:::2;::::0;31791:15;;36291:65:::2;:::i;:::-;-1:-1:-1::0;;;;;36402:24:0;::::2;36371:16;36402:24:::0;;;:10:::2;:24;::::0;;;;;36271:85;;-1:-1:-1;36371:16:0;36390:36:::2;::::0;36271:85;36390:36:::2;:::i;:::-;-1:-1:-1::0;;;;;36524:29:0;::::2;;::::0;;;:15:::2;:29;::::0;;;;;36371:55;;-1:-1:-1;36486:17:0::2;36371:55:::0;36486:6;:17:::2;:::i;:::-;36485:68;;;;:::i;:::-;-1:-1:-1::0;;;;;36441:24:0;::::2;;::::0;;;:10:::2;:24;::::0;;;;:112;-1:-1:-1;;36103:462:0::2;36943:45;::::0;-1:-1:-1;;;36943:45:0;;36982:4:::2;36943:45;::::0;::::2;1626:51:1::0;36925:15:0::2;::::0;-1:-1:-1;;;;;36943:30:0;::::2;::::0;::::2;::::0;1599:18:1;;36943:45:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37059:29:0;::::2;;::::0;;;:15:::2;:29;::::0;;;;;36925:63;;-1:-1:-1;37049:39:0::2;::::0;36925:63;37049:39:::2;:::i;:::-;-1:-1:-1::0;;;;;37021:24:0;::::2;;::::0;;;:10:::2;:24;::::0;;;;;:67:::2;;36999:137;;;::::0;-1:-1:-1;;;36999:137:0;;7473:2:1;36999:137:0::2;::::0;::::2;7455:21:1::0;7512:2;7492:18;;;7485:30;-1:-1:-1;;;7531:18:1;;;7524:50;7591:18;;36999:137:0::2;7271:344:1::0;36999:137:0::2;31791:15:::0;-1:-1:-1;;;;;37149:28:0;::::2;;::::0;;;:14:::2;:28;::::0;;;;;;;:50;;;;37287:15:::2;:29:::0;;;;31791:15;37252:64:::2;;;;:::i;:::-;-1:-1:-1::0;;;;;37210:26:0;::::2;;::::0;;;:12:::2;:26;::::0;;;;;;;;:106;;;;37332:33;;6977:51:1;;;7044:18;;;7037:34;;;37332:33:0::2;::::0;6950:18:1;37332:33:0::2;;;;;;;36010:1363;2351:1:::1;35868:1505:::0;;:::o;25890:30::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25890:30:0;;-1:-1:-1;25890:30:0;:::o;30722:201::-;-1:-1:-1;;;;;30885:30:0;;30825:7;30885:30;;;:15;:30;;;;;;;;;30857:10;:25;;;;;;:58;;30885:30;30857:58;:::i;39219:145::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;39292:14:::1;:23:::0;;-1:-1:-1;;;;;;39292:23:0::1;-1:-1:-1::0;;;;;39292:23:0;::::1;::::0;;::::1;::::0;;;39331:25:::1;::::0;1626:51:1;;;39331:25:0::1;::::0;1614:2:1;1599:18;39331:25:0::1;;;;;;;39219:145:::0;:::o;33530:300::-;7668:1;8266:7;;:19;;8258:63;;;;-1:-1:-1;;;8258:63:0;;;;;;;:::i;:::-;7668:1;8399:7;:18;33644:7;40046:9:::1;40041:441;40065:13;:20:::0;40061:24;::::1;40041:441;;;40107:13;40123;40137:1;40123:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;40123:16:0::1;::::0;-1:-1:-1;40184:21:0::1;40123:16:::0;40184:14:::1;:21::i;:::-;-1:-1:-1::0;;;;;40154:27:0;::::1;;::::0;;;:20:::1;:27;::::0;;;;:51;40244:31:::1;40175:5:::0;40244:24:::1;:31::i;:::-;-1:-1:-1::0;;;;;40220:21:0;;::::1;;::::0;;;:14:::1;:21;::::0;;;;:55;;;;40294:18;::::1;::::0;40290:181:::1;;40356:19;40363:5;40370:4;40356:6;:19::i;:::-;-1:-1:-1::0;;;;;40333:14:0;;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:20;;::::1;::::0;;;;;;;;;:42;;;;40428:27;;;:20:::1;:27:::0;;;;;;40394:18:::1;:25:::0;;;;;:31;;;;;;;;;;;:61;40290:181:::1;-1:-1:-1::0;40087:3:0;::::1;::::0;::::1;:::i;:::-;;;;40041:441;;;-1:-1:-1::0;33691:14:0::2;::::0;-1:-1:-1;;;;;33691:14:0::2;33677:10;:28;33669:53;;;;-1:-1:-1::0;;;33669:53:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33741:21:0;::::2;33733:49;;;;-1:-1:-1::0;;;33733:49:0::2;;;;;;;:::i;:::-;33793:29;33806:7;33815:6;33793:12;:29::i;35441:97::-:0;35496:10;35486:21;;;;:9;:21;;;;;;35477:31;;:8;:31::i;:::-;35519:11;:9;:11::i;28700:735::-;-1:-1:-1;;;;;28885:31:0;;28795:7;28885:31;;;:16;:31;;;;;;;;28880:73;;-1:-1:-1;28940:1:0;;28700:735;-1:-1:-1;28700:735:0:o;28880:73::-;28969:12;;28965:92;;-1:-1:-1;;;;;;29010:35:0;;;;;:20;:35;;;;;;;28700:735::o;28965:92::-;29414:12;;-1:-1:-1;;;;;29361:25:0;;;;;;:10;:25;;;;;;;;;29311:14;:29;;;;;;;29252:39;29372:13;29252:24;:39::i;:::-;:88;;;;:::i;:::-;29251:135;;;;:::i;:::-;:159;;29406:4;29251:159;:::i;:::-;29250:176;;;;:::i;:::-;-1:-1:-1;;;;;29198:35:0;;;;;;:20;:35;;;;;;:229;;;;:::i;2969:201::-;2106:7;2133:6;-1:-1:-1;;;;;2133:6:0;860:10;2280:23;2272:68;;;;-1:-1:-1;;;2272:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3058:22:0;::::1;3050:73;;;::::0;-1:-1:-1;;;3050:73:0;;7822:2:1;3050:73:0::1;::::0;::::1;7804:21:1::0;7861:2;7841:18;;;7834:30;7900:34;7880:18;;;7873:62;-1:-1:-1;;;7951:18:1;;;7944:36;7997:19;;3050:73:0::1;7620:402:1::0;3050:73:0::1;3134:28;3153:8;3134:18;:28::i;:::-;2969:201:::0;:::o;34807:542::-;34872:9;34867:475;34891:13;:20;34887:24;;34867:475;;;34933:14;34950:7;:25;34958:13;34972:1;34958:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;34958:16:0;;;34950:25;;;;;;;;;;;;;;;:34;;;;;;;;;;;;35023:13;:16;;34950:34;;-1:-1:-1;35023:13:0;35037:1;;35023:16;;;;;;:::i;:::-;;;;;;;;;;;35016:49;;-1:-1:-1;;;35016:49:0;;35059:4;35016:49;;;1626:51:1;-1:-1:-1;;;;;35023:16:0;;;;35016:34;;1599:18:1;;35016:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34999:66;;35093:1;35084:6;:10;:30;;;;;35108:6;35098;:16;;35084:30;35080:251;;;35172:1;35135:7;:25;35143:13;35157:1;35143:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35143:16:0;;;35135:25;;;;;;;;;;;;;;;:34;;;;;;;;;;;:38;35199:13;:16;;35192:54;;35161:7;;35239:6;;35199:13;35213:1;;35199:16;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;35199:16:0;;35192:54;:37;:54::i;:::-;35281:7;-1:-1:-1;;;;;35270:45:0;;35290:13;35304:1;35290:16;;;;;;;;:::i;:::-;;;;;;;;;;;;35270:45;;;-1:-1:-1;;;;;35290:16:0;;;6977:51:1;;7044:18;;;7037:34;;;6950:18;35270:45:0;;;;;;;35080:251;34918:424;;34913:3;;;;;:::i;:::-;;;;34867:475;;39626:213;-1:-1:-1;;;;;39729:29:0;;;;;;:15;:29;;;;;;;;;:40;;;39785:46;;6977:51:1;;;7044:18;;7037:34;;;39785:46:0;;6950:18:1;39785:46:0;6803:274:1;33838:324:0;33930:1;33921:6;:10;33913:37;;;;-1:-1:-1;;;33913:37:0;;8229:2:1;33913:37:0;;;8211:21:1;8268:2;8248:18;;;8241:30;-1:-1:-1;;;8287:18:1;;;8280:44;8341:18;;33913:37:0;8027:338:1;33913:37:0;33991:6;33976:12;;:21;;;;:::i;:::-;33961:12;:36;-1:-1:-1;;;;;34029:18:0;;;;;;:9;:18;;;;;;:27;;34050:6;;34029:27;:::i;:::-;-1:-1:-1;;;;;34008:18:0;;;;;;;:9;:18;;;;;:48;;;;34067:12;;:45;;:12;34093:10;34105:6;34067:25;:45::i;:::-;34138:7;-1:-1:-1;;;;;34128:26:0;;34147:6;34128:26;;;;529:25:1;;517:2;502:18;;383:177;34128:26:0;;;;;;;;33838:324;;:::o;32673:337::-;32762:1;32753:6;:10;32745:37;;;;-1:-1:-1;;;32745:37:0;;8229:2:1;32745:37:0;;;8211:21:1;8268:2;8248:18;;;8241:30;-1:-1:-1;;;8287:18:1;;;8280:44;8341:18;;32745:37:0;8027:338:1;32745:37:0;32823:6;32808:12;;:21;;;;:::i;:::-;32793:12;:36;-1:-1:-1;;;;;32861:18:0;;;;;;:9;:18;;;;;;:27;;32882:6;;32861:27;:::i;:::-;-1:-1:-1;;;;;32840:18:0;;;;;;;:9;:18;;;;;:48;;;;32899:12;;:64;;:12;32929:10;32949:4;32956:6;32899:29;:64::i;:::-;32986:7;-1:-1:-1;;;;;32979:23:0;;32995:6;32979:23;;;;529:25:1;;517:2;502:18;;383:177;5723:120:0;4711:4;4735:7;-1:-1:-1;;;4735:7:0;;;;5259:41;;;;-1:-1:-1;;;5259:41:0;;8572:2:1;5259:41:0;;;8554:21:1;8611:2;8591:18;;;8584:30;-1:-1:-1;;;8630:18:1;;;8623:50;8690:18;;5259:41:0;8370:344:1;5259:41:0;5792:5:::1;5782:15:::0;;-1:-1:-1;;;;5782:15:0::1;::::0;;5813:22:::1;860:10:::0;5822:12:::1;5813:22;::::0;-1:-1:-1;;;;;1644:32:1;;;1626:51;;1614:2;1599:18;5813:22:0::1;;;;;;;5723:120::o:0;3330:191::-;3404:16;3423:6;;-1:-1:-1;;;;;3440:17:0;;;-1:-1:-1;;;;;;3440:17:0;;;;;;3473:40;;3423:6;;;;;;;3473:40;;3404:16;3473:40;3393:128;3330:191;:::o;5464:118::-;4711:4;4735:7;-1:-1:-1;;;4735:7:0;;;;4989:9;4981:38;;;;-1:-1:-1;;;4981:38:0;;;;;;;:::i;:::-;5524:7:::1;:14:::0;;-1:-1:-1;;;;5524:14:0::1;-1:-1:-1::0;;;5524:14:0::1;::::0;;5554:20:::1;5561:12;860:10:::0;;780:98;20710:211;20854:58;;-1:-1:-1;;;;;6995:32:1;;20854:58:0;;;6977:51:1;7044:18;;;7037:34;;;20827:86:0;;20847:5;;-1:-1:-1;;;20877:23:0;6950:18:1;;20854:58:0;;;;-1:-1:-1;;20854:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;20854:58:0;-1:-1:-1;;;;;;20854:58:0;;;;;;;;;;20827:19;:86::i;:::-;20710:211;;;:::o;20929:248::-;21100:68;;-1:-1:-1;;;;;8977:15:1;;;21100:68:0;;;8959:34:1;9029:15;;9009:18;;;9002:43;9061:18;;;9054:34;;;21073:96:0;;21093:5;;-1:-1:-1;;;21123:27:0;8894:18:1;;21100:68:0;8719:375:1;21073:96:0;20929:248;;;;:::o;23283:716::-;23707:23;23733:69;23761:4;23733:69;;;;;;;;;;;;;;;;;23741:5;-1:-1:-1;;;;;23733:27:0;;;:69;;;;;:::i;:::-;23817:17;;23707:95;;-1:-1:-1;23817:21:0;23813:179;;23914:10;23903:30;;;;;;;;;;;;:::i;:::-;23895:85;;;;-1:-1:-1;;;23895:85:0;;9583:2:1;23895:85:0;;;9565:21:1;9622:2;9602:18;;;9595:30;9661:34;9641:18;;;9634:62;-1:-1:-1;;;9712:18:1;;;9705:40;9762:19;;23895:85:0;9381:406:1;15484:229:0;15621:12;15653:52;15675:6;15683:4;15689:1;15692:12;15653:21;:52::i;:::-;15646:59;;15484:229;;;;;;:::o;16604:510::-;16774:12;16832:5;16807:21;:30;;16799:81;;;;-1:-1:-1;;;16799:81:0;;9994:2:1;16799:81:0;;;9976:21:1;10033:2;10013:18;;;10006:30;10072:34;10052:18;;;10045:62;-1:-1:-1;;;10123:18:1;;;10116:36;10169:19;;16799:81:0;9792:402:1;16799:81:0;-1:-1:-1;;;;;13034:19:0;;;16891:60;;;;-1:-1:-1;;;16891:60:0;;10401:2:1;16891:60:0;;;10383:21:1;10440:2;10420:18;;;10413:30;10479:31;10459:18;;;10452:59;10528:18;;16891:60:0;10199:353:1;16891:60:0;16965:12;16979:23;17006:6;-1:-1:-1;;;;;17006:11:0;17025:5;17032:4;17006:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16964:73;;;;17055:51;17072:7;17081:10;17093:12;17055:16;:51::i;:::-;17048:58;16604:510;-1:-1:-1;;;;;;;16604:510:0:o;19290:712::-;19440:12;19469:7;19465:530;;;-1:-1:-1;19500:10:0;19493:17;;19465:530;19614:17;;:21;19610:374;;19812:10;19806:17;19873:15;19860:10;19856:2;19852:19;19845:44;19610:374;19955:12;19948:20;;-1:-1:-1;;;19948:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;565:260::-;633:6;641;694:2;682:9;673:7;669:23;665:32;662:52;;;710:1;707;700:12;662:52;733:29;752:9;733:29;:::i;:::-;723:39;;781:38;815:2;804:9;800:18;781:38;:::i;:::-;771:48;;565:260;;;;;:::o;830:254::-;898:6;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;1074:2;1059:18;;;;1046:32;;-1:-1:-1;;;830:254:1:o;1089:180::-;1148:6;1201:2;1189:9;1180:7;1176:23;1172:32;1169:52;;;1217:1;1214;1207:12;1169:52;-1:-1:-1;1240:23:1;;1089:180;-1:-1:-1;1089:180:1:o;1688:658::-;1859:2;1911:21;;;1981:13;;1884:18;;;2003:22;;;1830:4;;1859:2;2082:15;;;;2056:2;2041:18;;;1830:4;2125:195;2139:6;2136:1;2133:13;2125:195;;;2204:13;;-1:-1:-1;;;;;2200:39:1;2188:52;;2295:15;;;;2260:12;;;;2236:1;2154:9;2125:195;;;-1:-1:-1;2337:3:1;;1688:658;-1:-1:-1;;;;;;1688:658:1:o;2559:355::-;2761:2;2743:21;;;2800:2;2780:18;;;2773:30;2839:33;2834:2;2819:18;;2812:61;2905:2;2890:18;;2559:355::o;2919:127::-;2980:10;2975:3;2971:20;2968:1;2961:31;3011:4;3008:1;3001:15;3035:4;3032:1;3025:15;3051:127;3112:10;3107:3;3103:20;3100:1;3093:31;3143:4;3140:1;3133:15;3167:4;3164:1;3157:15;3183:135;3222:3;-1:-1:-1;;3243:17:1;;3240:43;;;3263:18;;:::i;:::-;-1:-1:-1;3310:1:1;3299:13;;3183:135::o;3323:336::-;3525:2;3507:21;;;3564:2;3544:18;;;3537:30;-1:-1:-1;;;3598:2:1;3583:18;;3576:42;3650:2;3635:18;;3323:336::o;3664:339::-;3866:2;3848:21;;;3905:2;3885:18;;;3878:30;-1:-1:-1;;;3939:2:1;3924:18;;3917:45;3994:2;3979:18;;3664:339::o;4008:125::-;4048:4;4076:1;4073;4070:8;4067:34;;;4081:18;;:::i;:::-;-1:-1:-1;4118:9:1;;4008:125::o;4138:168::-;4178:7;4244:1;4240;4236:6;4232:14;4229:1;4226:21;4221:1;4214:9;4207:17;4203:45;4200:71;;;4251:18;;:::i;:::-;-1:-1:-1;4291:9:1;;4138:168::o;4311:217::-;4351:1;4377;4367:132;;4421:10;4416:3;4412:20;4409:1;4402:31;4456:4;4453:1;4446:15;4484:4;4481:1;4474:15;4367:132;-1:-1:-1;4513:9:1;;4311:217::o;4533:128::-;4573:3;4604:1;4600:6;4597:1;4594:13;4591:39;;;4610:18;;:::i;:::-;-1:-1:-1;4646:9:1;;4533:128::o;4666:356::-;4868:2;4850:21;;;4887:18;;;4880:30;4946:34;4941:2;4926:18;;4919:62;5013:2;4998:18;;4666:356::o;5740:340::-;5942:2;5924:21;;;5981:2;5961:18;;;5954:30;-1:-1:-1;;;6015:2:1;6000:18;;5993:46;6071:2;6056:18;;5740:340::o;7082:184::-;7152:6;7205:2;7193:9;7184:7;7180:23;7176:32;7173:52;;;7221:1;7218;7211:12;7173:52;-1:-1:-1;7244:16:1;;7082:184;-1:-1:-1;7082:184:1:o;9099:277::-;9166:6;9219:2;9207:9;9198:7;9194:23;9190:32;9187:52;;;9235:1;9232;9225:12;9187:52;9267:9;9261:16;9320:5;9313:13;9306:21;9299:5;9296:32;9286:60;;9342:1;9339;9332:12;10557:258;10629:1;10639:113;10653:6;10650:1;10647:13;10639:113;;;10729:11;;;10723:18;10710:11;;;10703:39;10675:2;10668:10;10639:113;;;10770:6;10767:1;10764:13;10761:48;;;-1:-1:-1;;10805:1:1;10787:16;;10780:27;10557:258::o;10820:274::-;10949:3;10987:6;10981:13;11003:53;11049:6;11044:3;11037:4;11029:6;11025:17;11003:53;:::i;:::-;11072:16;;;;;10820:274;-1:-1:-1;;10820:274:1:o;11099:383::-;11248:2;11237:9;11230:21;11211:4;11280:6;11274:13;11323:6;11318:2;11307:9;11303:18;11296:34;11339:66;11398:6;11393:2;11382:9;11378:18;11373:2;11365:6;11361:15;11339:66;:::i;:::-;11466:2;11445:15;-1:-1:-1;;11441:29:1;11426:45;;;;11473:2;11422:54;;11099:383;-1:-1:-1;;11099:383:1:o
Swarm Source
ipfs://f05dc9ed545f09d95be2075775a6a5ddfdd3fc5946cd47df2327884376ca0510
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.