More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,378 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 21465224 | 2 hrs ago | IN | 0 ETH | 0.00064134 | ||||
Stake | 21463244 | 9 hrs ago | IN | 0 ETH | 0.0006592 | ||||
Stake | 21460115 | 19 hrs ago | IN | 0 ETH | 0.00067836 | ||||
Stake | 21452666 | 44 hrs ago | IN | 0 ETH | 0.00102506 | ||||
Stake | 21433836 | 4 days ago | IN | 0 ETH | 0.0014443 | ||||
Stake | 21433337 | 4 days ago | IN | 0 ETH | 0.00150483 | ||||
Stake | 21432206 | 4 days ago | IN | 0 ETH | 0.00291364 | ||||
Stake | 21429661 | 5 days ago | IN | 0 ETH | 0.00225294 | ||||
Unstake | 21428873 | 5 days ago | IN | 0 ETH | 0.00158374 | ||||
Unstake | 21428169 | 5 days ago | IN | 0 ETH | 0.0008318 | ||||
Stake | 21427431 | 5 days ago | IN | 0 ETH | 0.00152996 | ||||
Stake | 21427227 | 5 days ago | IN | 0 ETH | 0.00106723 | ||||
Stake | 21427211 | 5 days ago | IN | 0 ETH | 0.00144753 | ||||
Stake | 21426886 | 5 days ago | IN | 0 ETH | 0.00159652 | ||||
Stake | 21426794 | 5 days ago | IN | 0 ETH | 0.00113159 | ||||
Stake | 21425490 | 5 days ago | IN | 0 ETH | 0.00176989 | ||||
Stake | 21425484 | 5 days ago | IN | 0 ETH | 0.00163887 | ||||
Stake | 21425144 | 5 days ago | IN | 0 ETH | 0.00200589 | ||||
Unstake | 21425113 | 5 days ago | IN | 0 ETH | 0.00120826 | ||||
Stake | 21423555 | 5 days ago | IN | 0 ETH | 0.00213447 | ||||
Stake | 21422411 | 6 days ago | IN | 0 ETH | 0.00191713 | ||||
Stake | 21421415 | 6 days ago | IN | 0 ETH | 0.00106351 | ||||
Unstake | 21419130 | 6 days ago | IN | 0 ETH | 0.00094008 | ||||
Stake | 21418379 | 6 days ago | IN | 0 ETH | 0.00146582 | ||||
Stake | 21416404 | 6 days ago | IN | 0 ETH | 0.00410577 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
JungleStaking
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-10-05 */ // SPDX-License-Identifier: MIT // File: contracts/interfaces/IStaking.sol pragma solidity 0.8.18; interface IStaking { function stake(uint256 amount) external; function unstake(uint256 amount) external; function claimReward() external; function earned(address stakeholder) external view returns (uint256); function stakingToken() external view returns (address); function rewardToken() external view returns (address); function rewardAmount() external view returns (uint256); function startTime() external view returns (uint256); function stopTime() external view returns (uint256); function duration() external view returns (uint256); function lockTime() external view returns (uint256); function totalStaked() external view returns (uint256); function totalStakedRatio() external view returns (uint256); function getRewardTokenBalance() external view returns (uint256); function getStakingTokenBalance() external view returns (uint256); } // File: @openzeppelin/contracts/utils/Context.sol // 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/security/Pausable.sol // 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/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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: @openzeppelin/contracts/security/ReentrancyGuard.sol // 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: contracts/JungleStaking.sol pragma solidity 0.8.18; contract JungleStaking is Ownable, Pausable, ReentrancyGuard { using SafeERC20 for IERC20; using Address for address; struct Stakeholder { uint256 staked; // amount of staked tokens uint256 timestamp; uint256 earnedRewards; uint256 rewardDebt; uint256 totalRewardsClaimed; } struct Pool { address stakingToken; uint256 dailyRewardRate; // Reward rate per day (in tokens) uint256 startTime; uint256 lockTime; uint256 totalStaked; uint256 rewardPerSecond; uint256 accRewardPerShare; uint256 lastRewardTimestamp; mapping(address => Stakeholder) stakeholders; } Pool[] Pools; uint256 private constant REWARDS_PRECISION = 1e12; uint256 private constant SECONDS_PER_DAY = 86400; event Staked(address indexed staker, uint256 amount, uint256 poolId); event Withdraw(address indexed staker, uint256 rewardAmount, uint256 poolId); event Recover(address indexed token, uint256 amount); event OffchainReward(address indexed to, uint256 poolId, uint256 reward); constructor() { } function recoverTokens(IERC20 _token) external onlyOwner { uint256 balance = _token.balanceOf(address(this)); _token.transfer(owner(), balance); emit Recover(address(_token), balance); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function addPool( address _stakingToken, uint256 _dailyRewardRate, // Reward rate per day (in tokens) uint256 _startTime, uint256 _lockTime ) external onlyOwner { require(_stakingToken.isContract(), "Staking: stakingToken not a contract address"); require(_dailyRewardRate > 0, "Staking: dailyRewardRate must be greater than zero"); require(_lockTime > 0, "Staking: lockTime must be greater than zero"); Pool storage newPool = Pools.push(); newPool.stakingToken = _stakingToken; newPool.dailyRewardRate = _dailyRewardRate; newPool.startTime = _startTime; newPool.lockTime = _lockTime; newPool.rewardPerSecond = _dailyRewardRate / SECONDS_PER_DAY; // Calculate reward per second newPool.lastRewardTimestamp = _startTime; newPool.accRewardPerShare = 0; } function setDailyReward(uint256 _poolId, uint256 _dailyRewardRate) external onlyOwner { require(_dailyRewardRate > 0, "Staking: dailyRewardRate must be greater than zero"); Pool storage pool = Pools[_poolId]; pool.dailyRewardRate = _dailyRewardRate; pool.rewardPerSecond = _dailyRewardRate / SECONDS_PER_DAY; // Calculate reward per second updatePoolRewards(_poolId); } function stake(uint256 _amount, uint256 _poolId) external whenNotPaused { updatePoolRewards(_poolId); Pool storage pool = Pools[_poolId]; require(block.timestamp >= pool.startTime, "Staking: staking not started"); require(_amount > 0, "Staking: amount can't be 0"); Stakeholder storage stakeholder = pool.stakeholders[msg.sender]; if (stakeholder.staked > 0) { uint256 accumulatedReward = (stakeholder.staked * pool.accRewardPerShare) / REWARDS_PRECISION; uint256 pendingReward = accumulatedReward - stakeholder.rewardDebt; _withdrawReward(msg.sender, _poolId, pendingReward); } stakeholder.staked += _amount; stakeholder.rewardDebt = (stakeholder.staked * pool.accRewardPerShare) / REWARDS_PRECISION; stakeholder.timestamp = block.timestamp; pool.totalStaked += _amount; IERC20(pool.stakingToken).safeTransferFrom(msg.sender, address(this), _amount); emit Staked(msg.sender, _amount, _poolId); } function unstake(uint256 _amount, uint256 _poolId) external whenNotPaused nonReentrant { updatePoolRewards(_poolId); Pool storage pool = Pools[_poolId]; require(_amount > 0, "Staking: amount have to be bigger than 0"); Stakeholder storage stakeholder = pool.stakeholders[msg.sender]; require(stakeholder.staked > 0, "Staking: you have not participated in staking"); require(stakeholder.staked >= _amount, "Staking: cannot unstake more than your balance"); uint256 accumulatedReward = (stakeholder.staked * pool.accRewardPerShare) / REWARDS_PRECISION; uint256 pendingReward = accumulatedReward - stakeholder.rewardDebt; stakeholder.rewardDebt = accumulatedReward - ((_amount * pool.accRewardPerShare) / REWARDS_PRECISION); stakeholder.staked -= _amount; pool.totalStaked -= _amount; _withdrawReward(msg.sender, _poolId, pendingReward); _withdrawStaked(msg.sender, _amount, pool.stakingToken); } function claimRewards(uint256 _poolId) external whenNotPaused nonReentrant { updatePoolRewards(_poolId); Pool storage pool = Pools[_poolId]; Stakeholder storage stakeholder = pool.stakeholders[msg.sender]; uint256 rewardsToHarvest = (stakeholder.staked * pool.accRewardPerShare) / REWARDS_PRECISION - stakeholder.rewardDebt; if (rewardsToHarvest == 0) { stakeholder.rewardDebt = (stakeholder.staked * pool.accRewardPerShare) / REWARDS_PRECISION; return; } stakeholder.rewardDebt = (stakeholder.staked * pool.accRewardPerShare) / REWARDS_PRECISION; _withdrawReward(msg.sender, _poolId, rewardsToHarvest); } function updatePoolRewards(uint256 pid) public { Pool storage pool = Pools[pid]; uint256 currentTimestamp = block.timestamp; if (currentTimestamp > pool.lastRewardTimestamp) { uint256 lpSupply = pool.totalStaked; if (lpSupply > 0) { uint256 timestamps = currentTimestamp - pool.lastRewardTimestamp; uint256 rewards = timestamps * pool.rewardPerSecond; pool.accRewardPerShare = pool.accRewardPerShare + ((rewards * REWARDS_PRECISION) / lpSupply); } pool.lastRewardTimestamp = currentTimestamp; } } function earned(address _stakeholder, uint256 _poolId) public view returns (uint256) { Pool storage pool = Pools[_poolId]; Stakeholder memory stakeholder = pool.stakeholders[_stakeholder]; if (stakeholder.staked == 0) return 0; uint256 accRewardPerShare = pool.accRewardPerShare; uint256 lpSupply = pool.totalStaked; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 timestampSinceLastReward = block.timestamp - pool.lastRewardTimestamp; uint256 rewards = timestampSinceLastReward * pool.rewardPerSecond; accRewardPerShare = accRewardPerShare + ((rewards * REWARDS_PRECISION) / lpSupply); } uint256 pending = ((stakeholder.staked * accRewardPerShare) / REWARDS_PRECISION) - stakeholder.rewardDebt; return pending; } function getStartTime(uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return pool.startTime; } function getLockTime(uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return pool.lockTime; } function getTotalStaked(uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return pool.totalStaked; } function getStakingTokenBalance(uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return IERC20(pool.stakingToken).balanceOf(address(this)); } function getTimeRemaining(uint256 _poolId) public view returns (uint256) { Pool storage pool = Pools[_poolId]; uint256 timeRemaining = block.timestamp >= pool.startTime ? 0 : pool.startTime - block.timestamp; return timeRemaining; } function getTimeElapsed(uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; uint256 timeElapsed = block.timestamp >= pool.startTime ? block.timestamp - pool.startTime : 0; return timeElapsed; } function getStaked(address _stakeholder, uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return pool.stakeholders[_stakeholder].staked; } function getStakedLock(address _stakeholder, uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return pool.stakeholders[_stakeholder].timestamp; } function getRewardShare(uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return pool.accRewardPerShare; } function getDailyRewardRate(uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return pool.dailyRewardRate; } function getLastReward(uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return pool.lastRewardTimestamp; } function getTotalRewardsClaimed(address _stakeholder, uint256 _poolId) external view returns (uint256) { Pool storage pool = Pools[_poolId]; return pool.stakeholders[_stakeholder].totalRewardsClaimed; } function _withdrawStaked(address _to, uint256 _amount, address _stakingToken) internal { IERC20(_stakingToken).safeTransfer(_to, _amount); } function _withdrawReward(address _to, uint256 _poolId, uint256 _reward) internal { Pool storage pool = Pools[_poolId]; pool.stakeholders[_to].totalRewardsClaimed += _reward; emit OffchainReward(_to, _poolId, _reward); emit Withdraw(msg.sender, _reward, _poolId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"OffchainReward","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":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolId","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":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"uint256","name":"_dailyRewardRate","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_lockTime","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeholder","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getDailyRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getLastReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getRewardShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeholder","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeholder","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getStakedLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getStakingTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getTimeElapsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getTimeRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeholder","type":"address"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getTotalRewardsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"getTotalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"contract IERC20","name":"_token","type":"address"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_dailyRewardRate","type":"uint256"}],"name":"setDailyReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","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"},{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePoolRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a33610030565b6000805460ff60a01b1916905560018055610080565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611b388061008f6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80638456cb59116100de578063bc2be1be11610097578063eda6d23411610071578063eda6d2341461033b578063f0d1b0991461034e578063f2fde38b14610361578063fd1b192e1461037457600080fd5b8063bc2be1be14610302578063cb87957a14610315578063d169fdee1461032857600080fd5b80638456cb59146102935780638cd429911461029b5780638da5cb5b146102ae5780638fafd71b146102c95780639e2c8a5b146102dc578063adb82b31146102ef57600080fd5b806348c1982d1161014b5780635c975abb116101255780635c975abb146102485780635fe89eeb14610265578063715018a6146102785780637b0472f01461028057600080fd5b806348c1982d1461020f578063554f987b146102225780635a4ec0ca1461023557600080fd5b80630962ef791461019357806316114acd146101a857806323dc7521146101bb5780632f8899f3146101e15780633e491d47146101f45780633f4ba83a14610207575b600080fd5b6101a66101a1366004611879565b610387565b005b6101a66101b63660046118a7565b6104fd565b6101ce6101c93660046118c4565b61064c565b6040519081526020015b60405180910390f35b6101ce6101ef366004611879565b610698565b6101ce6102023660046118c4565b6106c9565b6101a6610803565b6101ce61021d366004611879565b610815565b6101a66102303660046118f0565b6108ae565b6101a6610243366004611912565b610926565b600054600160a01b900460ff1660405190151581526020016101d8565b6101ce610273366004611879565b610b09565b6101a6610b3a565b6101a661028e3660046118f0565b610b4c565b6101a6610d64565b6101ce6102a9366004611879565b610d74565b6000546040516001600160a01b0390911681526020016101d8565b6101ce6102d73660046118c4565b610dc8565b6101a66102ea3660046118f0565b610e10565b6101a66102fd366004611879565b6110cc565b6101ce610310366004611879565b611171565b6101ce610323366004611879565b6111a2565b6101ce6103363660046118c4565b6111d3565b6101ce610349366004611879565b61121e565b6101ce61035c366004611879565b61124f565b6101a661036f3660046118a7565b611280565b6101ce610382366004611879565b6112f9565b600054600160a01b900460ff16156103ba5760405162461bcd60e51b81526004016103b19061194d565b60405180910390fd5b60026001540361040c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b1565b600260015561041a816110cc565b60006002828154811061042f5761042f611977565b600091825260208083203384526008600990930201918201905260408220600381015460068301548254939550919392909164e8d4a510009161047291906119a3565b61047c91906119ba565b61048691906119dc565b9050806000036104c1576006830154825464e8d4a51000916104a7916119a3565b6104b191906119ba565b82600301819055505050506104f6565b6006830154825464e8d4a51000916104d8916119a3565b6104e291906119ba565b60038301556104f2338583611343565b5050505b5060018055565b610505611423565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561054c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057091906119ef565b9050816001600160a01b031663a9059cbb6105936000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156105e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106049190611a08565b50816001600160a01b03167f817c5912299b2d8eea4d9429e557c7b42c96a31499b4229932d1f070f068e37a8260405161064091815260200190565b60405180910390a25050565b6000806002838154811061066257610662611977565b600091825260208083206001600160a01b0388168452600860099093020191909101905260409020600401549150505b92915050565b600080600283815481106106ae576106ae611977565b60009182526020909120600460099092020101549392505050565b600080600283815481106106df576106df611977565b600091825260208083206001600160a01b0388168452600860099093020191820181526040808420815160a08101835281548082526001830154948201949094526002820154928101929092526003810154606083015260040154608082015291935090910361075457600092505050610692565b6006820154600483015460078401544211801561077057508015155b156107c657600084600701544261078791906119dc565b9050600085600501548261079b91906119a3565b9050826107ad64e8d4a51000836119a3565b6107b791906119ba565b6107c19085611a2a565b935050505b6000836060015164e8d4a510008486600001516107e391906119a3565b6107ed91906119ba565b6107f791906119dc565b98975050505050505050565b61080b611423565b61081361147d565b565b6000806002838154811061082b5761082b611977565b6000918252602090912060099091020180546040516370a0823160e01b81523060048201529192506001600160a01b0316906370a0823190602401602060405180830381865afa158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a791906119ef565b9392505050565b6108b6611423565b600081116108d65760405162461bcd60e51b81526004016103b190611a3d565b6000600283815481106108eb576108eb611977565b90600052602060002090600902019050818160010181905550620151808261091391906119ba565b6005820155610921836110cc565b505050565b61092e611423565b6001600160a01b0384163b61099a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e673a207374616b696e67546f6b656e206e6f74206120636f6e7460448201526b72616374206164647265737360a01b60648201526084016103b1565b600083116109ba5760405162461bcd60e51b81526004016103b190611a3d565b60008111610a1e5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e673a206c6f636b54696d65206d7573742062652067726561746560448201526a72207468616e207a65726f60a81b60648201526084016103b1565b600280546001810182556000919091526009027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180546001600160a01b0387166001600160a01b03199091161781557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82018590557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad082018490557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad1909101829055610aef62015180856119ba565b600582015560078101929092555060006006909101555050565b60008060028381548110610b1f57610b1f611977565b60009182526020909120600160099092020101549392505050565b610b42611423565b610813600061151a565b600054600160a01b900460ff1615610b765760405162461bcd60e51b81526004016103b19061194d565b610b7f816110cc565b600060028281548110610b9457610b94611977565b906000526020600020906009020190508060020154421015610bf85760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e673a207374616b696e67206e6f7420737461727465640000000060448201526064016103b1565b60008311610c485760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e673a20616d6f756e742063616e2774206265203000000000000060448201526064016103b1565b3360009081526008820160205260409020805415610caa57600064e8d4a5100083600601548360000154610c7c91906119a3565b610c8691906119ba565b90506000826003015482610c9a91906119dc565b9050610ca7338683611343565b50505b83816000016000828254610cbe9190611a2a565b90915550506006820154815464e8d4a5100091610cda916119a3565b610ce491906119ba565b6003820155426001820155600482018054859190600090610d06908490611a2a565b90915550508154610d22906001600160a01b031633308761156a565b604080518581526020810185905233917f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9091015b60405180910390a250505050565b610d6c611423565b6108136115db565b60008060028381548110610d8a57610d8a611977565b9060005260206000209060090201905060008160020154421015610dbd57428260020154610db891906119dc565b610dc0565b60005b949350505050565b60008060028381548110610dde57610dde611977565b600091825260208083206001600160a01b03881684526008600990930201919091019052604090205491505092915050565b600054600160a01b900460ff1615610e3a5760405162461bcd60e51b81526004016103b19061194d565b600260015403610e8c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b1565b6002600155610e9a816110cc565b600060028281548110610eaf57610eaf611977565b9060005260206000209060090201905060008311610f205760405162461bcd60e51b815260206004820152602860248201527f5374616b696e673a20616d6f756e74206861766520746f206265206269676765604482015267072207468616e20360c41b60648201526084016103b1565b33600090815260088201602052604090208054610f955760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e673a20796f752068617665206e6f74207061727469636970617460448201526c656420696e207374616b696e6760981b60648201526084016103b1565b8054841115610ffd5760405162461bcd60e51b815260206004820152602e60248201527f5374616b696e673a2063616e6e6f7420756e7374616b65206d6f72652074686160448201526d6e20796f75722062616c616e636560901b60648201526084016103b1565b600064e8d4a510008360060154836000015461101991906119a3565b61102391906119ba565b9050600082600301548261103791906119dc565b905064e8d4a5100084600601548761104f91906119a3565b61105991906119ba565b61106390836119dc565b600384015582548690849060009061107c9084906119dc565b925050819055508584600401600082825461109791906119dc565b909155506110a89050338683611343565b83546110c090339088906001600160a01b0316611640565b50506001805550505050565b6000600282815481106110e1576110e1611977565b9060005260206000209060090201905060004290508160070154811115610921576004820154801561116657600083600701548361111f91906119dc565b9050600084600501548261113391906119a3565b90508261114564e8d4a51000836119a3565b61114f91906119ba565b856006015461115e9190611a2a565b600686015550505b506007919091015550565b6000806002838154811061118757611187611977565b60009182526020909120600260099092020101549392505050565b600080600283815481106111b8576111b8611977565b60009182526020909120600760099092020101549392505050565b600080600283815481106111e9576111e9611977565b600091825260208083206001600160a01b03881684526008600990930201919091019052604090206001015491505092915050565b6000806002838154811061123457611234611977565b60009182526020909120600360099092020101549392505050565b6000806002838154811061126557611265611977565b60009182526020909120600660099092020101549392505050565b611288611423565b6001600160a01b0381166112ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103b1565b6112f68161151a565b50565b6000806002838154811061130f5761130f611977565b9060005260206000209060090201905060008160020154421015611334576000610dc0565b6002820154610dc090426119dc565b60006002838154811061135857611358611977565b9060005260206000209060090201905081816008016000866001600160a01b03166001600160a01b0316815260200190815260200160002060040160008282546113a29190611a2a565b909155505060408051848152602081018490526001600160a01b038616917f3c7af7c431fd801c91ee3b8020e578ffb40eea978986670dc808845279c5f9c4910160405180910390a2604080518381526020810185905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689101610d56565b6000546001600160a01b031633146108135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b1565b600054600160a01b900460ff166114cd5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103b1565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526115d59085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611654565b50505050565b600054600160a01b900460ff16156116055760405162461bcd60e51b81526004016103b19061194d565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114fd3390565b6109216001600160a01b0382168484611726565b60006116a9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117569092919063ffffffff16565b80519091501561092157808060200190518101906116c79190611a08565b6109215760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b1565b6040516001600160a01b03831660248201526044810182905261092190849063a9059cbb60e01b9060640161159e565b6060610dc0848460008585600080866001600160a01b0316858760405161177d9190611ab3565b60006040518083038185875af1925050503d80600081146117ba576040519150601f19603f3d011682016040523d82523d6000602084013e6117bf565b606091505b50915091506117d0878383876117db565b979650505050505050565b6060831561184a578251600003611843576001600160a01b0385163b6118435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b1565b5081610dc0565b610dc0838381511561185f5781518083602001fd5b8060405162461bcd60e51b81526004016103b19190611acf565b60006020828403121561188b57600080fd5b5035919050565b6001600160a01b03811681146112f657600080fd5b6000602082840312156118b957600080fd5b81356108a781611892565b600080604083850312156118d757600080fd5b82356118e281611892565b946020939093013593505050565b6000806040838503121561190357600080fd5b50508035926020909101359150565b6000806000806080858703121561192857600080fd5b843561193381611892565b966020860135965060408601359560600135945092505050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106925761069261198d565b6000826119d757634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156106925761069261198d565b600060208284031215611a0157600080fd5b5051919050565b600060208284031215611a1a57600080fd5b815180151581146108a757600080fd5b808201808211156106925761069261198d565b60208082526032908201527f5374616b696e673a206461696c7952657761726452617465206d7573742062656040820152712067726561746572207468616e207a65726f60701b606082015260800190565b60005b83811015611aaa578181015183820152602001611a92565b50506000910152565b60008251611ac5818460208701611a8f565b9190910192915050565b6020815260008251806020840152611aee816040850160208701611a8f565b601f01601f1916919091016040019291505056fea2646970667358221220a5d78f827d2b7aec310a63aa081c89c098d9884003c9045791412bc47ef37c2b64736f6c63430008120033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80638456cb59116100de578063bc2be1be11610097578063eda6d23411610071578063eda6d2341461033b578063f0d1b0991461034e578063f2fde38b14610361578063fd1b192e1461037457600080fd5b8063bc2be1be14610302578063cb87957a14610315578063d169fdee1461032857600080fd5b80638456cb59146102935780638cd429911461029b5780638da5cb5b146102ae5780638fafd71b146102c95780639e2c8a5b146102dc578063adb82b31146102ef57600080fd5b806348c1982d1161014b5780635c975abb116101255780635c975abb146102485780635fe89eeb14610265578063715018a6146102785780637b0472f01461028057600080fd5b806348c1982d1461020f578063554f987b146102225780635a4ec0ca1461023557600080fd5b80630962ef791461019357806316114acd146101a857806323dc7521146101bb5780632f8899f3146101e15780633e491d47146101f45780633f4ba83a14610207575b600080fd5b6101a66101a1366004611879565b610387565b005b6101a66101b63660046118a7565b6104fd565b6101ce6101c93660046118c4565b61064c565b6040519081526020015b60405180910390f35b6101ce6101ef366004611879565b610698565b6101ce6102023660046118c4565b6106c9565b6101a6610803565b6101ce61021d366004611879565b610815565b6101a66102303660046118f0565b6108ae565b6101a6610243366004611912565b610926565b600054600160a01b900460ff1660405190151581526020016101d8565b6101ce610273366004611879565b610b09565b6101a6610b3a565b6101a661028e3660046118f0565b610b4c565b6101a6610d64565b6101ce6102a9366004611879565b610d74565b6000546040516001600160a01b0390911681526020016101d8565b6101ce6102d73660046118c4565b610dc8565b6101a66102ea3660046118f0565b610e10565b6101a66102fd366004611879565b6110cc565b6101ce610310366004611879565b611171565b6101ce610323366004611879565b6111a2565b6101ce6103363660046118c4565b6111d3565b6101ce610349366004611879565b61121e565b6101ce61035c366004611879565b61124f565b6101a661036f3660046118a7565b611280565b6101ce610382366004611879565b6112f9565b600054600160a01b900460ff16156103ba5760405162461bcd60e51b81526004016103b19061194d565b60405180910390fd5b60026001540361040c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b1565b600260015561041a816110cc565b60006002828154811061042f5761042f611977565b600091825260208083203384526008600990930201918201905260408220600381015460068301548254939550919392909164e8d4a510009161047291906119a3565b61047c91906119ba565b61048691906119dc565b9050806000036104c1576006830154825464e8d4a51000916104a7916119a3565b6104b191906119ba565b82600301819055505050506104f6565b6006830154825464e8d4a51000916104d8916119a3565b6104e291906119ba565b60038301556104f2338583611343565b5050505b5060018055565b610505611423565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561054c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057091906119ef565b9050816001600160a01b031663a9059cbb6105936000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156105e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106049190611a08565b50816001600160a01b03167f817c5912299b2d8eea4d9429e557c7b42c96a31499b4229932d1f070f068e37a8260405161064091815260200190565b60405180910390a25050565b6000806002838154811061066257610662611977565b600091825260208083206001600160a01b0388168452600860099093020191909101905260409020600401549150505b92915050565b600080600283815481106106ae576106ae611977565b60009182526020909120600460099092020101549392505050565b600080600283815481106106df576106df611977565b600091825260208083206001600160a01b0388168452600860099093020191820181526040808420815160a08101835281548082526001830154948201949094526002820154928101929092526003810154606083015260040154608082015291935090910361075457600092505050610692565b6006820154600483015460078401544211801561077057508015155b156107c657600084600701544261078791906119dc565b9050600085600501548261079b91906119a3565b9050826107ad64e8d4a51000836119a3565b6107b791906119ba565b6107c19085611a2a565b935050505b6000836060015164e8d4a510008486600001516107e391906119a3565b6107ed91906119ba565b6107f791906119dc565b98975050505050505050565b61080b611423565b61081361147d565b565b6000806002838154811061082b5761082b611977565b6000918252602090912060099091020180546040516370a0823160e01b81523060048201529192506001600160a01b0316906370a0823190602401602060405180830381865afa158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a791906119ef565b9392505050565b6108b6611423565b600081116108d65760405162461bcd60e51b81526004016103b190611a3d565b6000600283815481106108eb576108eb611977565b90600052602060002090600902019050818160010181905550620151808261091391906119ba565b6005820155610921836110cc565b505050565b61092e611423565b6001600160a01b0384163b61099a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e673a207374616b696e67546f6b656e206e6f74206120636f6e7460448201526b72616374206164647265737360a01b60648201526084016103b1565b600083116109ba5760405162461bcd60e51b81526004016103b190611a3d565b60008111610a1e5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e673a206c6f636b54696d65206d7573742062652067726561746560448201526a72207468616e207a65726f60a81b60648201526084016103b1565b600280546001810182556000919091526009027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180546001600160a01b0387166001600160a01b03199091161781557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82018590557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad082018490557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad1909101829055610aef62015180856119ba565b600582015560078101929092555060006006909101555050565b60008060028381548110610b1f57610b1f611977565b60009182526020909120600160099092020101549392505050565b610b42611423565b610813600061151a565b600054600160a01b900460ff1615610b765760405162461bcd60e51b81526004016103b19061194d565b610b7f816110cc565b600060028281548110610b9457610b94611977565b906000526020600020906009020190508060020154421015610bf85760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e673a207374616b696e67206e6f7420737461727465640000000060448201526064016103b1565b60008311610c485760405162461bcd60e51b815260206004820152601a60248201527f5374616b696e673a20616d6f756e742063616e2774206265203000000000000060448201526064016103b1565b3360009081526008820160205260409020805415610caa57600064e8d4a5100083600601548360000154610c7c91906119a3565b610c8691906119ba565b90506000826003015482610c9a91906119dc565b9050610ca7338683611343565b50505b83816000016000828254610cbe9190611a2a565b90915550506006820154815464e8d4a5100091610cda916119a3565b610ce491906119ba565b6003820155426001820155600482018054859190600090610d06908490611a2a565b90915550508154610d22906001600160a01b031633308761156a565b604080518581526020810185905233917f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9091015b60405180910390a250505050565b610d6c611423565b6108136115db565b60008060028381548110610d8a57610d8a611977565b9060005260206000209060090201905060008160020154421015610dbd57428260020154610db891906119dc565b610dc0565b60005b949350505050565b60008060028381548110610dde57610dde611977565b600091825260208083206001600160a01b03881684526008600990930201919091019052604090205491505092915050565b600054600160a01b900460ff1615610e3a5760405162461bcd60e51b81526004016103b19061194d565b600260015403610e8c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103b1565b6002600155610e9a816110cc565b600060028281548110610eaf57610eaf611977565b9060005260206000209060090201905060008311610f205760405162461bcd60e51b815260206004820152602860248201527f5374616b696e673a20616d6f756e74206861766520746f206265206269676765604482015267072207468616e20360c41b60648201526084016103b1565b33600090815260088201602052604090208054610f955760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e673a20796f752068617665206e6f74207061727469636970617460448201526c656420696e207374616b696e6760981b60648201526084016103b1565b8054841115610ffd5760405162461bcd60e51b815260206004820152602e60248201527f5374616b696e673a2063616e6e6f7420756e7374616b65206d6f72652074686160448201526d6e20796f75722062616c616e636560901b60648201526084016103b1565b600064e8d4a510008360060154836000015461101991906119a3565b61102391906119ba565b9050600082600301548261103791906119dc565b905064e8d4a5100084600601548761104f91906119a3565b61105991906119ba565b61106390836119dc565b600384015582548690849060009061107c9084906119dc565b925050819055508584600401600082825461109791906119dc565b909155506110a89050338683611343565b83546110c090339088906001600160a01b0316611640565b50506001805550505050565b6000600282815481106110e1576110e1611977565b9060005260206000209060090201905060004290508160070154811115610921576004820154801561116657600083600701548361111f91906119dc565b9050600084600501548261113391906119a3565b90508261114564e8d4a51000836119a3565b61114f91906119ba565b856006015461115e9190611a2a565b600686015550505b506007919091015550565b6000806002838154811061118757611187611977565b60009182526020909120600260099092020101549392505050565b600080600283815481106111b8576111b8611977565b60009182526020909120600760099092020101549392505050565b600080600283815481106111e9576111e9611977565b600091825260208083206001600160a01b03881684526008600990930201919091019052604090206001015491505092915050565b6000806002838154811061123457611234611977565b60009182526020909120600360099092020101549392505050565b6000806002838154811061126557611265611977565b60009182526020909120600660099092020101549392505050565b611288611423565b6001600160a01b0381166112ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103b1565b6112f68161151a565b50565b6000806002838154811061130f5761130f611977565b9060005260206000209060090201905060008160020154421015611334576000610dc0565b6002820154610dc090426119dc565b60006002838154811061135857611358611977565b9060005260206000209060090201905081816008016000866001600160a01b03166001600160a01b0316815260200190815260200160002060040160008282546113a29190611a2a565b909155505060408051848152602081018490526001600160a01b038616917f3c7af7c431fd801c91ee3b8020e578ffb40eea978986670dc808845279c5f9c4910160405180910390a2604080518381526020810185905233917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689101610d56565b6000546001600160a01b031633146108135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103b1565b600054600160a01b900460ff166114cd5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103b1565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526115d59085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611654565b50505050565b600054600160a01b900460ff16156116055760405162461bcd60e51b81526004016103b19061194d565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114fd3390565b6109216001600160a01b0382168484611726565b60006116a9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117569092919063ffffffff16565b80519091501561092157808060200190518101906116c79190611a08565b6109215760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b1565b6040516001600160a01b03831660248201526044810182905261092190849063a9059cbb60e01b9060640161159e565b6060610dc0848460008585600080866001600160a01b0316858760405161177d9190611ab3565b60006040518083038185875af1925050503d80600081146117ba576040519150601f19603f3d011682016040523d82523d6000602084013e6117bf565b606091505b50915091506117d0878383876117db565b979650505050505050565b6060831561184a578251600003611843576001600160a01b0385163b6118435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b1565b5081610dc0565b610dc0838381511561185f5781518083602001fd5b8060405162461bcd60e51b81526004016103b19190611acf565b60006020828403121561188b57600080fd5b5035919050565b6001600160a01b03811681146112f657600080fd5b6000602082840312156118b957600080fd5b81356108a781611892565b600080604083850312156118d757600080fd5b82356118e281611892565b946020939093013593505050565b6000806040838503121561190357600080fd5b50508035926020909101359150565b6000806000806080858703121561192857600080fd5b843561193381611892565b966020860135965060408601359560600135945092505050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176106925761069261198d565b6000826119d757634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156106925761069261198d565b600060208284031215611a0157600080fd5b5051919050565b600060208284031215611a1a57600080fd5b815180151581146108a757600080fd5b808201808211156106925761069261198d565b60208082526032908201527f5374616b696e673a206461696c7952657761726452617465206d7573742062656040820152712067726561746572207468616e207a65726f60701b606082015260800190565b60005b83811015611aaa578181015183820152602001611a92565b50506000910152565b60008251611ac5818460208701611a8f565b9190910192915050565b6020815260008251806020840152611aee816040850160208701611a8f565b601f01601f1916919091016040019291505056fea2646970667358221220a5d78f827d2b7aec310a63aa081c89c098d9884003c9045791412bc47ef37c2b64736f6c63430008120033
Deployed Bytecode Sourcemap
42095:10147:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47104:708;;;;;;:::i;:::-;;:::i;:::-;;43284:218;;;;;;:::i;:::-;;:::i;51535:225::-;;;;;;:::i;:::-;;:::i;:::-;;;1092:25:1;;;1080:2;1065:18;51535:225:0;;;;;;;;49671:160;;;;;;:::i;:::-;;:::i;48468:869::-;;;;;;:::i;:::-;;:::i;43581:67::-;;;:::i;49839:202::-;;;;;;:::i;:::-;;:::i;44565:423::-;;;;;;:::i;:::-;;:::i;43656:901::-;;;;;;:::i;:::-;;:::i;3083:86::-;3130:4;3154:7;-1:-1:-1;;;3154:7:0;;;;3083:86;;2011:14:1;;2004:22;1986:41;;1974:2;1959:18;3083:86:0;1846:187:1;51184:168:0;;;;;;:::i;:::-;;:::i;6152:103::-;;;:::i;44996:1071::-;;;;;;:::i;:::-;;:::i;43510:63::-;;;:::i;50049:264::-;;;;;;:::i;:::-;;:::i;5504:87::-;5550:7;5577:6;5504:87;;-1:-1:-1;;;;;5577:6:0;;;2184:51:1;;2172:2;2157:18;5504:87:0;2038:203:1;50589:199:0;;;;;;:::i;:::-;;:::i;46075:1021::-;;;;;;:::i;:::-;;:::i;47820:640::-;;;;;;:::i;:::-;;:::i;49345:156::-;;;;;;:::i;:::-;;:::i;51360:167::-;;;;;;:::i;:::-;;:::i;50796:206::-;;;;;;:::i;:::-;;:::i;49509:154::-;;;;;;:::i;:::-;;:::i;51010:166::-;;;;;;:::i;:::-;;:::i;6410:201::-;;;;;;:::i;:::-;;:::i;50321:260::-;;;;;;:::i;:::-;;:::i;47104:708::-;3130:4;3154:7;-1:-1:-1;;;3154:7:0;;;;3408:9;3400:38;;;;-1:-1:-1;;;3400:38:0;;;;;;;:::i;:::-;;;;;;;;;41063:1:::1;41661:7;;:19:::0;41653:63:::1;;;::::0;-1:-1:-1;;;41653:63:0;;3053:2:1;41653:63:0::1;::::0;::::1;3035:21:1::0;3092:2;3072:18;;;3065:30;3131:33;3111:18;;;3104:61;3182:18;;41653:63:0::1;2851:355:1::0;41653:63:0::1;41063:1;41794:7;:18:::0;47190:26:::2;47208:7:::0;47190:17:::2;:26::i;:::-;47227:17;47247:5;47253:7;47247:14;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;47324:10:::2;47306:29:::0;;:17:::2;47247:14;::::0;;::::2;;47306:17:::0;;::::2;:29:::0;;;;;47441:22:::2;::::0;::::2;::::0;47395::::2;::::0;::::2;::::0;47374:18;;47247:14;;-1:-1:-1;47306:29:0;;47247:14;47441:22;;42886:4:::2;::::0;47374:43:::2;::::0;47395:22;47374:43:::2;:::i;:::-;47373:65;;;;:::i;:::-;:90;;;;:::i;:::-;47346:117;;47478:16;47498:1;47478:21:::0;47474:165:::2;;47563:22;::::0;::::2;::::0;47542:18;;42886:4:::2;::::0;47542:43:::2;::::0;::::2;:::i;:::-;47541:65;;;;:::i;:::-;47516:11;:22;;:90;;;;47621:7;;;;;47474:165;47696:22;::::0;::::2;::::0;47675:18;;42886:4:::2;::::0;47675:43:::2;::::0;::::2;:::i;:::-;47674:65;;;;:::i;:::-;47649:22;::::0;::::2;:90:::0;47750:54:::2;47766:10;47778:7:::0;47787:16;47750:15:::2;:54::i;:::-;47179:633;;;41825:1;-1:-1:-1::0;41019:1:0::1;41973:22:::0;;47104:708::o;43284:218::-;5390:13;:11;:13::i;:::-;43370:31:::1;::::0;-1:-1:-1;;;43370:31:0;;43395:4:::1;43370:31;::::0;::::1;2184:51:1::0;43352:15:0::1;::::0;-1:-1:-1;;;;;43370:16:0;::::1;::::0;::::1;::::0;2157:18:1;;43370:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43352:49;;43412:6;-1:-1:-1::0;;;;;43412:15:0::1;;43428:7;5550::::0;5577:6;-1:-1:-1;;;;;5577:6:0;;5504:87;43428:7:::1;43412:33;::::0;-1:-1:-1;;;;;;43412:33:0::1;::::0;;;;;;-1:-1:-1;;;;;4384:32:1;;;43412:33:0::1;::::0;::::1;4366:51:1::0;4433:18;;;4426:34;;;4339:18;;43412:33:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43477:6;-1:-1:-1::0;;;;;43461:33:0::1;;43486:7;43461:33;;;;1092:25:1::0;;1080:2;1065:18;;946:177;43461:33:0::1;;;;;;;;43341:161;43284:218:::0;:::o;51535:225::-;51629:7;51649:17;51669:5;51675:7;51669:14;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;51701:31:0;;;;:17;51669:14;;;;;51701:17;;;;:31;;;;;:51;;;;-1:-1:-1;;51535:225:0;;;;;:::o;49671:160::-;49735:7;49755:17;49775:5;49781:7;49775:14;;;;;;;;:::i;:::-;;;;;;;;;49807:16;49775:14;;;;;49807:16;;;49671:160;-1:-1:-1;;;49671:160:0:o;48468:869::-;48544:7;48564:17;48584:5;48590:7;48584:14;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;48642:31:0;;;;:17;48584:14;;;;;48642:17;;;:31;;;;;;48609:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48584:14;;-1:-1:-1;48609:64:0;;48688:23;48684:37;;48720:1;48713:8;;;;;;48684:37;48762:22;;;;48814:16;;;;48863:24;;;;48845:15;:42;:59;;;;-1:-1:-1;48891:13:0;;;48845:59;48841:346;;;48921:32;48974:4;:24;;;48956:15;:42;;;;:::i;:::-;48921:77;;49013:15;49058:4;:20;;;49031:24;:47;;;;:::i;:::-;49013:65;-1:-1:-1;49166:8:0;49135:27;42886:4;49013:65;49135:27;:::i;:::-;49134:40;;;;:::i;:::-;49113:62;;:17;:62;:::i;:::-;49093:82;;48906:281;;48841:346;49197:15;49280:11;:22;;;42886:4;49238:17;49217:11;:18;;;:38;;;;:::i;:::-;49216:60;;;;:::i;:::-;49215:87;;;;:::i;:::-;49197:105;48468:869;-1:-1:-1;;;;;;;;48468:869:0:o;43581:67::-;5390:13;:11;:13::i;:::-;43630:10:::1;:8;:10::i;:::-;43581:67::o:0;49839:202::-;49911:7;49931:17;49951:5;49957:7;49951:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;49990:17;;49983:50;;-1:-1:-1;;;49983:50:0;;50027:4;49983:50;;;2184:51:1;49951:14:0;;-1:-1:-1;;;;;;49990:17:0;;49983:35;;2157:18:1;;49983:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49976:57;49839:202;-1:-1:-1;;;49839:202:0:o;44565:423::-;5390:13;:11;:13::i;:::-;44689:1:::1;44670:16;:20;44662:83;;;;-1:-1:-1::0;;;44662:83:0::1;;;;;;;:::i;:::-;44758:17;44778:5;44784:7;44778:14;;;;;;;;:::i;:::-;;;;;;;;;;;44758:34;;44826:16;44803:4;:20;;:39;;;;42940:5;44876:16;:34;;;;:::i;:::-;44853:20;::::0;::::1;:57:::0;44954:26:::1;44972:7:::0;44954:17:::1;:26::i;:::-;44651:337;44565:423:::0;;:::o;43656:901::-;5390:13;:11;:13::i;:::-;-1:-1:-1;;;;;43877:24:0;::::1;26847:19:::0;43869:83:::1;;;::::0;-1:-1:-1;;;43869:83:0;;5504:2:1;43869:83:0::1;::::0;::::1;5486:21:1::0;5543:2;5523:18;;;5516:30;5582:34;5562:18;;;5555:62;-1:-1:-1;;;5633:18:1;;;5626:42;5685:19;;43869:83:0::1;5302:408:1::0;43869:83:0::1;43990:1;43971:16;:20;43963:83;;;;-1:-1:-1::0;;;43963:83:0::1;;;;;;;:::i;:::-;44077:1;44065:9;:13;44057:69;;;::::0;-1:-1:-1;;;44057:69:0;;5917:2:1;44057:69:0::1;::::0;::::1;5899:21:1::0;5956:2;5936:18;;;5929:30;5995:34;5975:18;;;5968:62;-1:-1:-1;;;6046:18:1;;;6039:41;6097:19;;44057:69:0::1;5715:407:1::0;44057:69:0::1;44162:5;:12:::0;;::::1;::::0;::::1;::::0;;44139:20:::1;44162:12:::0;;;;::::1;;::::0;;::::1;44187:36:::0;;-1:-1:-1;;;;;44187:36:0;::::1;-1:-1:-1::0;;;;;;44187:36:0;;::::1;;::::0;;44234:23;;;:42;;;44287:17;;;:30;;;44328:16;;;;:28;;;44393:34:::1;42940:5;44260:16:::0;44393:34:::1;:::i;:::-;44367:23;::::0;::::1;:60:::0;44469:27:::1;::::0;::::1;:40:::0;;;;-1:-1:-1;;44520:25:0::1;::::0;;::::1;:29:::0;-1:-1:-1;;43656:901:0:o;51184:168::-;51252:7;51272:17;51292:5;51298:7;51292:14;;;;;;;;:::i;:::-;;;;;;;;;51324:20;51292:14;;;;;51324:20;;;51184:168;-1:-1:-1;;;51184:168:0:o;6152:103::-;5390:13;:11;:13::i;:::-;6217:30:::1;6244:1;6217:18;:30::i;44996:1071::-:0;3130:4;3154:7;-1:-1:-1;;;3154:7:0;;;;3408:9;3400:38;;;;-1:-1:-1;;;3400:38:0;;;;;;;:::i;:::-;45079:26:::1;45097:7;45079:17;:26::i;:::-;45116:17;45136:5;45142:7;45136:14;;;;;;;;:::i;:::-;;;;;;;;;;;45116:34;;45190:4;:14;;;45171:15;:33;;45163:74;;;::::0;-1:-1:-1;;;45163:74:0;;6329:2:1;45163:74:0::1;::::0;::::1;6311:21:1::0;6368:2;6348:18;;;6341:30;6407;6387:18;;;6380:58;6455:18;;45163:74:0::1;6127:352:1::0;45163:74:0::1;45266:1;45256:7;:11;45248:50;;;::::0;-1:-1:-1;;;45248:50:0;;6686:2:1;45248:50:0::1;::::0;::::1;6668:21:1::0;6725:2;6705:18;;;6698:30;6764:28;6744:18;;;6737:56;6810:18;;45248:50:0::1;6484:350:1::0;45248:50:0::1;45363:10;45311:31;45345:29:::0;;;:17:::1;::::0;::::1;:29;::::0;;;;45391:18;;:22;45387:295:::1;;45430:25;42886:4;45480;:22;;;45459:11;:18;;;:43;;;;:::i;:::-;45458:65;;;;:::i;:::-;45430:93;;45538:21;45582:11;:22;;;45562:17;:42;;;;:::i;:::-;45538:66;;45619:51;45635:10;45647:7;45656:13;45619:15;:51::i;:::-;45415:267;;45387:295;45714:7;45692:11;:18;;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;45779:22:0::1;::::0;::::1;::::0;45758:18;;42886:4:::1;::::0;45758:43:::1;::::0;::::1;:::i;:::-;45757:65;;;;:::i;:::-;45732:22;::::0;::::1;:90:::0;45859:15:::1;45835:21;::::0;::::1;:39:::0;45887:16:::1;::::0;::::1;:27:::0;;45907:7;;45887:16;-1:-1:-1;;45887:27:0::1;::::0;45907:7;;45887:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;45934:17:0;;45927:78:::1;::::0;-1:-1:-1;;;;;45934:17:0::1;45970:10;45990:4;45997:7:::0;45927:42:::1;:78::i;:::-;46023:36;::::0;;7013:25:1;;;7069:2;7054:18;;7047:34;;;46030:10:0::1;::::0;46023:36:::1;::::0;6986:18:1;46023:36:0::1;;;;;;;;45068:999;;44996:1071:::0;;:::o;43510:63::-;5390:13;:11;:13::i;:::-;43557:8:::1;:6;:8::i;50049:264::-:0;50113:7;50133:17;50153:5;50159:7;50153:14;;;;;;;;:::i;:::-;;;;;;;;;;;50133:34;;50178:21;50221:4;:14;;;50202:15;:33;;:72;;50259:15;50242:4;:14;;;:32;;;;:::i;:::-;50202:72;;;50238:1;50202:72;50178:96;50049:264;-1:-1:-1;;;;50049:264:0:o;50589:199::-;50670:7;50690:17;50710:5;50716:7;50710:14;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;50742:31:0;;;;:17;50710:14;;;;;50742:17;;;;:31;;;;;:38;;-1:-1:-1;;50589:199:0;;;;:::o;46075:1021::-;3130:4;3154:7;-1:-1:-1;;;3154:7:0;;;;3408:9;3400:38;;;;-1:-1:-1;;;3400:38:0;;;;;;;:::i;:::-;41063:1:::1;41661:7;;:19:::0;41653:63:::1;;;::::0;-1:-1:-1;;;41653:63:0;;3053:2:1;41653:63:0::1;::::0;::::1;3035:21:1::0;3092:2;3072:18;;;3065:30;3131:33;3111:18;;;3104:61;3182:18;;41653:63:0::1;2851:355:1::0;41653:63:0::1;41063:1;41794:7;:18:::0;46173:26:::2;46191:7:::0;46173:17:::2;:26::i;:::-;46210:17;46230:5;46236:7;46230:14;;;;;;;;:::i;:::-;;;;;;;;;;;46210:34;;46275:1;46265:7;:11;46257:64;;;::::0;-1:-1:-1;;;46257:64:0;;7294:2:1;46257:64:0::2;::::0;::::2;7276:21:1::0;7333:2;7313:18;;;7306:30;7372:34;7352:18;;;7345:62;-1:-1:-1;;;7423:18:1;;;7416:38;7471:19;;46257:64:0::2;7092:404:1::0;46257:64:0::2;46384:10;46332:31;46366:29:::0;;;:17:::2;::::0;::::2;:29;::::0;;;;46414:18;;46406:80:::2;;;::::0;-1:-1:-1;;;46406:80:0;;7703:2:1;46406:80:0::2;::::0;::::2;7685:21:1::0;7742:2;7722:18;;;7715:30;7781:34;7761:18;;;7754:62;-1:-1:-1;;;7832:18:1;;;7825:43;7885:19;;46406:80:0::2;7501:409:1::0;46406:80:0::2;46505:18:::0;;:29;-1:-1:-1;46505:29:0::2;46497:88;;;::::0;-1:-1:-1;;;46497:88:0;;8117:2:1;46497:88:0::2;::::0;::::2;8099:21:1::0;8156:2;8136:18;;;8129:30;8195:34;8175:18;;;8168:62;-1:-1:-1;;;8246:18:1;;;8239:44;8300:19;;46497:88:0::2;7915:410:1::0;46497:88:0::2;46596:25;42886:4;46646;:22;;;46625:11;:18;;;:43;;;;:::i;:::-;46624:65;;;;:::i;:::-;46596:93;;46700:21;46744:11;:22;;;46724:17;:42;;;;:::i;:::-;46700:66;;42886:4;46836;:22;;;46826:7;:32;;;;:::i;:::-;46825:54;;;;:::i;:::-;46804:76;::::0;:17;:76:::2;:::i;:::-;46779:22;::::0;::::2;:101:::0;46891:29;;46913:7;;46779:11;;46891:18:::2;::::0;:29:::2;::::0;46913:7;;46891:29:::2;:::i;:::-;;;;;;;;46953:7;46933:4;:16;;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;46971:51:0::2;::::0;-1:-1:-1;46987:10:0::2;46999:7:::0;47008:13;46971:15:::2;:51::i;:::-;47070:17:::0;;47033:55:::2;::::0;47049:10:::2;::::0;47061:7;;-1:-1:-1;;;;;47070:17:0::2;47033:15;:55::i;:::-;-1:-1:-1::0;;41019:1:0::1;41973:22:::0;;-1:-1:-1;;;;46075:1021:0:o;47820:640::-;47878:17;47898:5;47904:3;47898:10;;;;;;;;:::i;:::-;;;;;;;;;;;47878:30;;47919:24;47946:15;47919:42;;47995:4;:24;;;47976:16;:43;47972:481;;;48055:16;;;;48090:12;;48086:298;;48123:18;48163:4;:24;;;48144:16;:43;;;;:::i;:::-;48123:64;;48206:15;48237:4;:20;;;48224:10;:33;;;;:::i;:::-;48206:51;-1:-1:-1;48359:8:0;48328:27;42886:4;48206:51;48328:27;:::i;:::-;48327:40;;;;:::i;:::-;48301:4;:22;;;:67;;;;:::i;:::-;48276:22;;;:92;-1:-1:-1;;48086:298:0;-1:-1:-1;48398:24:0;;;;;:43;-1:-1:-1;47820:640:0:o;49345:156::-;49407:7;49427:17;49447:5;49453:7;49447:14;;;;;;;;:::i;:::-;;;;;;;;;49479;49447;;;;;49479;;;49345:156;-1:-1:-1;;;49345:156:0:o;51360:167::-;51423:7;51443:17;51463:5;51469:7;51463:14;;;;;;;;:::i;:::-;;;;;;;;;51495:24;51463:14;;;;;51495:24;;;51360:167;-1:-1:-1;;;51360:167:0:o;50796:206::-;50881:7;50901:17;50921:5;50927:7;50921:14;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;50953:31:0;;;;:17;50921:14;;;;;50953:17;;;;:31;;;;;:41;;;;-1:-1:-1;;50796:206:0;;;;:::o;49509:154::-;49570:7;49590:17;49610:5;49616:7;49610:14;;;;;;;;:::i;:::-;;;;;;;;;49642:13;49610:14;;;;;49642:13;;;49509:154;-1:-1:-1;;;49509:154:0:o;51010:166::-;51074:7;51094:17;51114:5;51120:7;51114:14;;;;;;;;:::i;:::-;;;;;;;;;51146:22;51114:14;;;;;51146:22;;;51010:166;-1:-1:-1;;;51010:166:0:o;6410:201::-;5390:13;:11;:13::i;:::-;-1:-1:-1;;;;;6499:22:0;::::1;6491:73;;;::::0;-1:-1:-1;;;6491:73:0;;8532:2:1;6491:73:0::1;::::0;::::1;8514:21:1::0;8571:2;8551:18;;;8544:30;8610:34;8590:18;;;8583:62;-1:-1:-1;;;8661:18:1;;;8654:36;8707:19;;6491:73:0::1;8330:402:1::0;6491:73:0::1;6575:28;6594:8;6575:18;:28::i;:::-;6410:201:::0;:::o;50321:260::-;50385:7;50405:17;50425:5;50431:7;50425:14;;;;;;;;:::i;:::-;;;;;;;;;;;50405:34;;50450:19;50491:4;:14;;;50472:15;:33;;:72;;50543:1;50472:72;;;50526:14;;;;50508:32;;:15;:32;:::i;51930:309::-;52022:17;52042:5;52048:7;52042:14;;;;;;;;:::i;:::-;;;;;;;;;;;52022:34;;52113:7;52067:4;:17;;:22;52085:3;-1:-1:-1;;;;;52067:22:0;-1:-1:-1;;;;;52067:22:0;;;;;;;;;;;;:42;;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;;52138:37:0;;;7013:25:1;;;7069:2;7054:18;;7047:34;;;-1:-1:-1;;;;;52138:37:0;;;;;6986:18:1;52138:37:0;;;;;;;52193:38;;;7013:25:1;;;7069:2;7054:18;;7047:34;;;52202:10:0;;52193:38;;6986:18:1;52193:38:0;6839:248:1;5669:132:0;5550:7;5577:6;-1:-1:-1;;;;;5577:6:0;1817:10;5733:23;5725:68;;;;-1:-1:-1;;;5725:68:0;;8939:2:1;5725:68:0;;;8921:21:1;;;8958:18;;;8951:30;9017:34;8997:18;;;8990:62;9069:18;;5725:68:0;8737:356:1;4142:120:0;3130:4;3154:7;-1:-1:-1;;;3154:7:0;;;;3678:41;;;;-1:-1:-1;;;3678:41:0;;9300:2:1;3678:41:0;;;9282:21:1;9339:2;9319:18;;;9312:30;-1:-1:-1;;;9358:18:1;;;9351:50;9418:18;;3678:41:0;9098:344:1;3678:41:0;4211:5:::1;4201:15:::0;;-1:-1:-1;;;;4201:15:0::1;::::0;;4232:22:::1;1817:10:::0;4241:12:::1;4232:22;::::0;-1:-1:-1;;;;;2202:32:1;;;2184:51;;2172:2;2157:18;4232:22:0::1;;;;;;;4142:120::o:0;6771:191::-;6845:16;6864:6;;-1:-1:-1;;;;;6881:17:0;;;-1:-1:-1;;;;;;6881:17:0;;;;;;6914:40;;6864:6;;;;;;;6914:40;;6845:16;6914:40;6834:128;6771:191;:::o;35680:248::-;35851:68;;-1:-1:-1;;;;;9705:15:1;;;35851:68:0;;;9687:34:1;9757:15;;9737:18;;;9730:43;9789:18;;;9782:34;;;35824:96:0;;35844:5;;-1:-1:-1;;;35874:27:0;9622:18:1;;35851:68:0;;;;-1:-1:-1;;35851:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35851:68:0;-1:-1:-1;;;;;;35851:68:0;;;;;;;;;;35824:19;:96::i;:::-;35680:248;;;;:::o;3883:118::-;3130:4;3154:7;-1:-1:-1;;;3154:7:0;;;;3408:9;3400:38;;;;-1:-1:-1;;;3400:38:0;;;;;;;:::i;:::-;3943:7:::1;:14:::0;;-1:-1:-1;;;;3943:14:0::1;-1:-1:-1::0;;;3943:14:0::1;::::0;;3973:20:::1;3980:12;1817:10:::0;;1737:98;51768:154;51866:48;-1:-1:-1;;;;;51866:34:0;;51901:3;51906:7;51866:34;:48::i;38528:716::-;38952:23;38978:69;39006:4;38978:69;;;;;;;;;;;;;;;;;38986:5;-1:-1:-1;;;;;38978:27:0;;;:69;;;;;:::i;:::-;39062:17;;38952:95;;-1:-1:-1;39062:21:0;39058:179;;39159:10;39148:30;;;;;;;;;;;;:::i;:::-;39140:85;;;;-1:-1:-1;;;39140:85:0;;10029:2:1;39140:85:0;;;10011:21:1;10068:2;10048:18;;;10041:30;10107:34;10087:18;;;10080:62;-1:-1:-1;;;10158:18:1;;;10151:40;10208:19;;39140:85:0;9827:406:1;35461:211:0;35605:58;;-1:-1:-1;;;;;4384:32:1;;35605:58:0;;;4366:51:1;4433:18;;;4426:34;;;35578:86:0;;35598:5;;-1:-1:-1;;;35628:23:0;4339:18:1;;35605:58:0;4192:274:1;29309:229:0;29446:12;29478:52;29500:6;29508:4;29514:1;29517:12;29446;30717;30731:23;30758:6;-1:-1:-1;;;;;30758:11:0;30777:5;30784:4;30758:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30716:73;;;;30807:69;30834:6;30842:7;30851:10;30863:12;30807:26;:69::i;:::-;30800:76;30429:455;-1:-1:-1;;;;;;;30429:455:0:o;33002:644::-;33187:12;33216:7;33212:427;;;33244:10;:17;33265:1;33244:22;33240:290;;-1:-1:-1;;;;;26847:19:0;;;33454:60;;;;-1:-1:-1;;;33454:60:0;;11394:2:1;33454:60:0;;;11376:21:1;11433:2;11413:18;;;11406:30;11472:31;11452:18;;;11445:59;11521:18;;33454:60:0;11192:353:1;33454:60:0;-1:-1:-1;33551:10:0;33544:17;;33212:427;33594:33;33602:10;33614:12;34349:17;;:21;34345:388;;34581:10;34575:17;34638:15;34625:10;34621:2;34617:19;34610:44;34345:388;34708:12;34701:20;;-1:-1:-1;;;34701:20:0;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:139::-;-1:-1:-1;;;;;282:31:1;;272:42;;262:70;;328:1;325;318:12;343:270;417:6;470:2;458:9;449:7;445:23;441:32;438:52;;;486:1;483;476:12;438:52;525:9;512:23;544:39;577:5;544:39;:::i;618:323::-;686:6;694;747:2;735:9;726:7;722:23;718:32;715:52;;;763:1;760;753:12;715:52;802:9;789:23;821:39;854:5;821:39;:::i;:::-;879:5;931:2;916:18;;;;903:32;;-1:-1:-1;;;618:323:1:o;1128:248::-;1196:6;1204;1257:2;1245:9;1236:7;1232:23;1228:32;1225:52;;;1273:1;1270;1263:12;1225:52;-1:-1:-1;;1296:23:1;;;1366:2;1351:18;;;1338:32;;-1:-1:-1;1128:248:1:o;1381:460::-;1467:6;1475;1483;1491;1544:3;1532:9;1523:7;1519:23;1515:33;1512:53;;;1561:1;1558;1551:12;1512:53;1600:9;1587:23;1619:39;1652:5;1619:39;:::i;:::-;1677:5;1729:2;1714:18;;1701:32;;-1:-1:-1;1780:2:1;1765:18;;1752:32;;1831:2;1816:18;1803:32;;-1:-1:-1;1381:460:1;-1:-1:-1;;;1381:460:1:o;2506:340::-;2708:2;2690:21;;;2747:2;2727:18;;;2720:30;-1:-1:-1;;;2781:2:1;2766:18;;2759:46;2837:2;2822:18;;2506:340::o;3211:127::-;3272:10;3267:3;3263:20;3260:1;3253:31;3303:4;3300:1;3293:15;3327:4;3324:1;3317:15;3343:127;3404:10;3399:3;3395:20;3392:1;3385:31;3435:4;3432:1;3425:15;3459:4;3456:1;3449:15;3475:168;3548:9;;;3579;;3596:15;;;3590:22;;3576:37;3566:71;;3617:18;;:::i;3648:217::-;3688:1;3714;3704:132;;3758:10;3753:3;3749:20;3746:1;3739:31;3793:4;3790:1;3783:15;3821:4;3818:1;3811:15;3704:132;-1:-1:-1;3850:9:1;;3648:217::o;3870:128::-;3937:9;;;3958:11;;;3955:37;;;3972:18;;:::i;4003:184::-;4073:6;4126:2;4114:9;4105:7;4101:23;4097:32;4094:52;;;4142:1;4139;4132:12;4094:52;-1:-1:-1;4165:16:1;;4003:184;-1:-1:-1;4003:184:1:o;4471:277::-;4538:6;4591:2;4579:9;4570:7;4566:23;4562:32;4559:52;;;4607:1;4604;4597:12;4559:52;4639:9;4633:16;4692:5;4685:13;4678:21;4671:5;4668:32;4658:60;;4714:1;4711;4704:12;4753:125;4818:9;;;4839:10;;;4836:36;;;4852:18;;:::i;4883:414::-;5085:2;5067:21;;;5124:2;5104:18;;;5097:30;5163:34;5158:2;5143:18;;5136:62;-1:-1:-1;;;5229:2:1;5214:18;;5207:48;5287:3;5272:19;;4883:414::o;10645:250::-;10730:1;10740:113;10754:6;10751:1;10748:13;10740:113;;;10830:11;;;10824:18;10811:11;;;10804:39;10776:2;10769:10;10740:113;;;-1:-1:-1;;10887:1:1;10869:16;;10862:27;10645:250::o;10900:287::-;11029:3;11067:6;11061:13;11083:66;11142:6;11137:3;11130:4;11122:6;11118:17;11083:66;:::i;:::-;11165:16;;;;;10900:287;-1:-1:-1;;10900:287:1:o;11550:396::-;11699:2;11688:9;11681:21;11662:4;11731:6;11725:13;11774:6;11769:2;11758:9;11754:18;11747:34;11790:79;11862:6;11857:2;11846:9;11842:18;11837:2;11829:6;11825:15;11790:79;:::i;:::-;11930:2;11909:15;-1:-1:-1;;11905:29:1;11890:45;;;;11937:2;11886:54;;11550:396;-1:-1:-1;;11550:396:1:o
Swarm Source
ipfs://a5d78f827d2b7aec310a63aa081c89c098d9884003c9045791412bc47ef37c2b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.133245 | 4,974,992.9867 | $662,892.94 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.