More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 52 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Recover Rewards | 21014434 | 26 days ago | IN | 0 ETH | 0.00081742 | ||||
Claim | 20763093 | 61 days ago | IN | 0 ETH | 0.00091164 | ||||
Claim | 20759610 | 61 days ago | IN | 0 ETH | 0.00029247 | ||||
Claim | 20759163 | 61 days ago | IN | 0 ETH | 0.00045296 | ||||
Claim | 20749843 | 63 days ago | IN | 0 ETH | 0.00036184 | ||||
Claim | 20749838 | 63 days ago | IN | 0 ETH | 0.00036197 | ||||
Stake | 20747548 | 63 days ago | IN | 0 ETH | 0.0005383 | ||||
Claim | 20746896 | 63 days ago | IN | 0 ETH | 0.00011236 | ||||
Claim | 20746896 | 63 days ago | IN | 0 ETH | 0.0001302 | ||||
Claim | 20745998 | 63 days ago | IN | 0 ETH | 0.00024659 | ||||
Claim | 20745904 | 63 days ago | IN | 0 ETH | 0.00064953 | ||||
Claim | 20745896 | 63 days ago | IN | 0 ETH | 0.00065822 | ||||
Claim | 20745857 | 63 days ago | IN | 0 ETH | 0.00018423 | ||||
Claim | 20745084 | 63 days ago | IN | 0 ETH | 0.00022639 | ||||
Stake | 20743197 | 64 days ago | IN | 0 ETH | 0.00096176 | ||||
Stake | 20742709 | 64 days ago | IN | 0 ETH | 0.00228648 | ||||
Claim | 20740922 | 64 days ago | IN | 0 ETH | 0.00024098 | ||||
Stake | 20740670 | 64 days ago | IN | 0 ETH | 0.00060166 | ||||
Claim | 20740660 | 64 days ago | IN | 0 ETH | 0.00025412 | ||||
Stake | 20740255 | 64 days ago | IN | 0 ETH | 0.00058142 | ||||
Stake | 20739990 | 64 days ago | IN | 0 ETH | 0.00042578 | ||||
Stake | 20739972 | 64 days ago | IN | 0 ETH | 0.00065786 | ||||
Stake | 20739917 | 64 days ago | IN | 0 ETH | 0.0005389 | ||||
Claim | 20737523 | 64 days ago | IN | 0 ETH | 0.00041998 | ||||
Claim | 20737378 | 64 days ago | IN | 0 ETH | 0.00057684 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vance
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-09-11 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.26; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } } /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } /** * @dev Standard ERC-20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @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 { bool private _paused; /** * @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); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @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()); } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title ERC-721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC-721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be * reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Library that provide common ERC-721 utility functions. * * See https://eips.ethereum.org/EIPS/eip-721[ERC-721]. */ library ERC721Utils { /** * @dev Performs an acceptance check for the provided `operator` by calling {IERC721-onERC721Received} * on the `to` address. The `operator` is generally the address that initiated the token transfer (i.e. `msg.sender`). * * The acceptance call is not executed and treated as a no-op if the target address doesn't contain code (i.e. an EOA). * Otherwise, the recipient must implement {IERC721Receiver-onERC721Received} and return the acceptance magic value to accept * the transfer. */ function checkOnERC721Received( address operator, address from, address to, uint256 tokenId, bytes memory data ) internal { if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(operator, from, tokenId, data) returns (bytes4 retval) { if (retval != IERC721Receiver.onERC721Received.selector) { // Token rejected revert IERC721Errors.ERC721InvalidReceiver(to); } } catch (bytes memory reason) { if (reason.length == 0) { // non-IERC721Receiver implementer revert IERC721Errors.ERC721InvalidReceiver(to); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } } } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } abstract contract Ownable { address private _owner; error OwnableUnauthorizedAccount(address account); error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } modifier onlyOwner() { _checkOwner(); _; } function owner() public view virtual returns (address) { return _owner; } function _checkOwner() internal view virtual { if (owner() != msg.sender) { revert OwnableUnauthorizedAccount(msg.sender); } } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC-721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint256 tokenId => address) private _owners; mapping(address owner => uint256) private _balances; mapping(uint256 tokenId => address) private _tokenApprovals; mapping(address owner => mapping(address operator => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual returns (uint256) { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { return _requireOwned(tokenId); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual { _approve(to, tokenId, _msgSender()); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. address previousOwner = _update(to, tokenId, _msgSender()); if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { transferFrom(from, to, tokenId); ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist * * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the * core ERC-721 logic MUST be matched with the use of {_increaseBalance} to keep balances * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`. */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. */ function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId]; } /** * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * particular (ignoring whether it is owned by `owner`). * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { return spender != address(0) && (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); } /** * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. * Reverts if: * - `spender` does not have approval from `owner` for `tokenId`. * - `spender` does not have approval to manage all of `owner`'s assets. * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { if (!_isAuthorized(owner, spender, tokenId)) { if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } else { revert ERC721InsufficientApproval(spender, tokenId); } } } /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. * * WARNING: Increasing an account's balance using this function tends to be paired with an override of the * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership * remain consistent with one another. */ function _increaseBalance(address account, uint128 value) internal virtual { unchecked { _balances[account] += value; } } /** * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. * * The `auth` argument is optional. If the value passed is non 0, then this function will check that * `auth` is either the owner of the token, or approved to operate on the token (by the owner). * * Emits a {Transfer} event. * * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. */ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { address from = _ownerOf(tokenId); // Perform (optional) operator check if (auth != address(0)) { _checkAuthorized(from, auth, tokenId); } // Execute the update if (from != address(0)) { // Clear approval. No need to re-authorize or emit the Approval event _approve(address(0), tokenId, address(0), false); unchecked { _balances[from] -= 1; } } if (to != address(0)) { unchecked { _balances[to] += 1; } } _owners[tokenId] = to; emit Transfer(from, to, tokenId); return from; } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner != address(0)) { revert ERC721InvalidSender(address(0)); } } /** * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); ERC721Utils.checkOnERC721Received(_msgSender(), address(0), to, tokenId, data); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal { address previousOwner = _update(address(0), tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } else if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients * are aware of the ERC-721 standard to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is like {safeTransferFrom} in the sense that it invokes * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `tokenId` token must exist and be owned by `from`. * - `to` cannot be the zero address. * - `from` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId) internal { _safeTransfer(from, to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is * either the owner of the token, or approved to operate on all tokens held by this owner. * * Emits an {Approval} event. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address to, uint256 tokenId, address auth) internal { _approve(to, tokenId, auth, true); } /** * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not * emitted in the context of transfers. */ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { // Avoid reading the owner unless necessary if (emitEvent || auth != address(0)) { address owner = _requireOwned(tokenId); // We do not use _isAuthorized because single-token approvals should not be able to call approve if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { revert ERC721InvalidApprover(auth); } if (emitEvent) { emit Approval(owner, to, tokenId); } } _tokenApprovals[tokenId] = to; } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Requirements: * - operator can't be the address zero. * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { if (operator == address(0)) { revert ERC721InvalidOperator(operator); } _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). * Returns the owner. * * Overrides to ownership logic should be done to {_ownerOf}. */ function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf(tokenId); if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } return owner; } } /** * @dev This implements an optional extension of {ERC721} defined in the ERC that adds enumerability * of all the token ids in the contract as well as all token ids owned by each account. * * CAUTION: {ERC721} extensions that implement custom `balanceOf` logic, such as {ERC721Consecutive}, * interfere with enumerability and should not be used together with {ERC721Enumerable}. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { mapping(address owner => mapping(uint256 index => uint256)) private _ownedTokens; mapping(uint256 tokenId => uint256) private _ownedTokensIndex; uint256[] private _allTokens; mapping(uint256 tokenId => uint256) private _allTokensIndex; /** * @dev An `owner`'s token query was out of bounds for `index`. * * NOTE: The owner being `address(0)` indicates a global out of bounds index. */ error ERC721OutOfBoundsIndex(address owner, uint256 index); /** * @dev Batch mint is not allowed. */ error ERC721EnumerableForbiddenBatchMint(); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256) { if (index >= balanceOf(owner)) { revert ERC721OutOfBoundsIndex(owner, index); } return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual returns (uint256) { if (index >= totalSupply()) { revert ERC721OutOfBoundsIndex(address(0), index); } return _allTokens[index]; } /** * @dev See {ERC721-_update}. */ function _update(address to, uint256 tokenId, address auth) internal virtual override returns (address) { address previousOwner = super._update(to, tokenId, auth); if (previousOwner == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (previousOwner != to) { _removeTokenFromOwnerEnumeration(previousOwner, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (previousOwner != to) { _addTokenToOwnerEnumeration(to, tokenId); } return previousOwner; } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = balanceOf(to) - 1; _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = balanceOf(from); uint256 tokenIndex = _ownedTokensIndex[tokenId]; mapping(uint256 index => uint256) storage _ownedTokensByOwner = _ownedTokens[from]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokensByOwner[lastTokenIndex]; _ownedTokensByOwner[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokensByOwner[lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } /** * See {ERC721-_increaseBalance}. We need that to account tokens that were minted in batch */ function _increaseBalance(address account, uint128 amount) internal virtual override { if (amount > 0) { revert ERC721EnumerableForbiddenBatchMint(); } super._increaseBalance(account, amount); } } contract Vance is ERC721Enumerable, Ownable, Pausable { IERC20 public immutable token; mapping (uint256 => uint256) public pools; mapping (uint256 => uint256) public deposits; mapping (uint256 => uint256) public poolRates; mapping (uint256 => uint256) public poolLocks; mapping (uint256 => uint256) public poolTotal; uint256 constant poolRateScale = 100_000_000_000; mapping (uint256 => uint256) public tokensRedeemable; mapping (uint256 => uint256) public lockedUntil; mapping (address => uint256) public personalClaims; uint256 public totalClaimed; uint256 internal _currentIndex; string internal _uri = ""; uint256 public rewardPool; uint256 internal payoutTotal; bool internal locked; modifier noReentrant() { require(!locked, "No re-entrancy"); locked = true; _; locked = false; } event Staked(address indexed user, uint256 deposit, uint256 payout, uint256 payoutDate); event Rewarded(address indexed user, uint256 deposit, uint256 payout); constructor(address _token) ERC721("Advanced Savings", "VANCE") Ownable(msg.sender) { token = IERC20(_token); _currentIndex = _startTokenId(); } function _startTokenId() internal pure virtual returns (uint256) { return 1; } function _nextTokenId() internal view returns (uint256) { return _currentIndex; } function setPool(uint256 pool, uint256 lock, uint256 rate) external onlyOwner { if(rate == 0) require(lock == 0, "Invalid settings"); poolLocks[pool] = lock; poolRates[pool] = rate; } function _baseURI() internal view override returns (string memory) { return _uri; } function setURI(string calldata uri) external onlyOwner { _uri = uri; } function stake(uint256 amount, uint256 pool) external whenNotPaused noReentrant { require(amount > 0 && poolRates[pool] > 0, "Invalid pool"); token.transferFrom(msg.sender, address(this), amount); _issue(amount, pool); } function _issue(uint256 amount, uint256 pool) internal { poolTotal[pool] += amount; uint256 mintId = _nextTokenId(); pools[mintId] = pool; uint256 unlocksOn = block.timestamp + poolLocks[pool]; lockedUntil[mintId] = unlocksOn; deposits[mintId] = amount; uint256 toRedeem = amount * poolRates[pool] / poolRateScale; require(toRedeem <= rewardPool - payoutTotal, "Insufficient rewards remaining"); tokensRedeemable[mintId] = toRedeem; payoutTotal += toRedeem; _safeMint(msg.sender, mintId); _currentIndex = mintId+1; emit Staked(msg.sender, amount, toRedeem, unlocksOn); } function claim(uint256 tokenId) external noReentrant { require(_ownerOf(tokenId) == msg.sender, "Not token owner"); if(block.timestamp < lockedUntil[tokenId]) _withdraw(msg.sender, tokenId, false); else _withdraw(msg.sender, tokenId, true); } function _withdraw(address owner, uint256 tokenId, bool issueReward) internal { _burn(tokenId); uint256 reward = tokensRedeemable[tokenId]; uint256 deposit = deposits[tokenId]; poolTotal[pools[tokenId]] -= deposit; if(issueReward && rewardPool >= reward) { rewardPool -= reward; payoutTotal -= reward; token.transfer(owner, reward + deposit); personalClaims[owner] += reward; totalClaimed += reward; emit Rewarded(owner, deposit, reward); } else { token.transfer(owner, deposit); } } function extractUser(address user, uint256 tokenId, bool issueReward) external onlyOwner noReentrant { require(user != address(0), "Invalid user"); _withdraw(user, tokenId, issueReward); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function addRewards(uint256 amount) external { //any account may add rewards, if desired token.transferFrom(msg.sender, address(this), amount); rewardPool += amount; } function recoverRewards() external onlyOwner { uint256 rp = rewardPool; //users can still extract deposits if rewards are disabled / removed rewardPool = 0; token.transfer(owner(), rp); } function stakes(address user, uint256 start, uint256 limit) external view returns (uint256[] memory IDs, uint256[] memory locks, uint256[] memory deposited, uint256[] memory tokens, string[] memory URIs) { uint256 balance = balanceOf(user); if (balance > 0) { if (start == 0) start = 1; if (start > balance) start = balance; if (start + (limit-1) > balance) limit = (balance - start) + 1; IDs = new uint256[](limit); locks = new uint256[](limit); deposited = new uint256[](limit); tokens = new uint256[](limit); URIs = new string[](limit); uint256 index = 0; for (uint256 i=start-1; i < start + limit - 1; i++) { uint256 id = tokenOfOwnerByIndex(user, i); IDs[index] = id; locks[index] = lockedUntil[id]; deposited[index] = deposits[id]; tokens[index] = tokensRedeemable[id]; URIs[index] = tokenURI(id); index++; } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ERC721EnumerableForbiddenBatchMint","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"ERC721OutOfBoundsIndex","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"}],"name":"Rewarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payoutDate","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"issueReward","type":"bool"}],"name":"extractUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockedUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"personalClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolLocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pool","type":"uint256"},{"internalType":"uint256","name":"lock","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"pool","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256[]","name":"IDs","type":"uint256[]"},{"internalType":"uint256[]","name":"locks","type":"uint256[]"},{"internalType":"uint256[]","name":"deposited","type":"uint256[]"},{"internalType":"uint256[]","name":"tokens","type":"uint256[]"},{"internalType":"string[]","name":"URIs","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensRedeemable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","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"}]
Contract Creation Code
60c06040525f60a090815260159061001790826101eb565b50348015610023575f80fd5b50604051612a40380380612a40833981016040819052610042916102a5565b336040518060400160405280601081526020016f416476616e63656420536176696e677360801b8152506040518060400160405280600581526020016456414e434560d81b815250815f908161009891906101eb565b5060016100a582826101eb565b5050506001600160a01b0381166100d557604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100de81610102565b50600a805460ff60a01b191690556001600160a01b031660805260016014556102d2565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061017b57607f821691505b60208210810361019957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101e657805f5260205f20601f840160051c810160208510156101c45750805b601f840160051c820191505b818110156101e3575f81556001016101d0565b50505b505050565b81516001600160401b0381111561020457610204610153565b610218816102128454610167565b8461019f565b6020601f82116001811461024a575f83156102335750848201515b5f19600385901b1c1916600184901b1784556101e3565b5f84815260208120601f198516915b828110156102795787850151825560209485019460019092019101610259565b508482101561029657868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082840312156102b5575f80fd5b81516001600160a01b03811681146102cb575f80fd5b9392505050565b60805161273361030d5f395f818161059e01528181610a2001528181610b9e01528181610c650152818161136501526114b501526127335ff3fe608060405234801561000f575f80fd5b506004361061024a575f3560e01c80637d39431511610140578063bd9ca6ad116100bf578063d54ad2a111610084578063d54ad2a114610533578063e985e9c51461053c578063f1c8f9641461054f578063f2fde38b14610562578063f52b619a14610575578063fc0c546a14610599575f80fd5b8063bd9ca6ad146104c7578063beceed39146104cf578063c00bac66146104e2578063c04b69bb14610501578063c87b56dd14610520575f80fd5b8063a22cb46511610105578063a22cb46514610444578063ac4afa3814610457578063b02c43d014610476578063b6333d9314610495578063b88d4fde146104b4575f80fd5b80637d394315146103f15780638456cb59146104105780638a251ed6146104185780638da5cb5b1461042b57806395d89b411461043c575f80fd5b806342842e0e116101cc57806370a082311161019157806370a0823114610385578063715018a6146103985780637aace44c146103a05780637b0472f0146103bf5780637cd78b02146103d2575f80fd5b806342842e0e146103315780634f6ccce7146103445780635c975abb146103575780636352211e1461036957806366666aa91461037c575f80fd5b806318160ddd1161021257806318160ddd146102de57806323b872dd146102f05780632f745c5914610303578063379607f5146103165780633f4ba83a14610329575f80fd5b806301ffc9a71461024e57806302fe53051461027657806306fdde031461028b578063081812fc146102a0578063095ea7b3146102cb575b5f80fd5b61026161025c366004611fb9565b6105c0565b60405190151581526020015b60405180910390f35b610289610284366004611fd4565b6105ea565b005b610293610604565b60405161026d9190612070565b6102b36102ae366004612082565b610693565b6040516001600160a01b03909116815260200161026d565b6102896102d93660046120b4565b6106ba565b6008545b60405190815260200161026d565b6102896102fe3660046120dc565b6106c9565b6102e26103113660046120b4565b610757565b610289610324366004612082565b6107ba565b61028961088f565b61028961033f3660046120dc565b6108a1565b6102e2610352366004612082565b6108bb565b600a54600160a01b900460ff16610261565b6102b3610377366004612082565b610910565b6102e260165481565b6102e2610393366004612116565b61091a565b61028961095f565b6102e26103ae366004612116565b60126020525f908152604090205481565b6102896103cd36600461212f565b610970565b6102e26103e0366004612082565b60116020525f908152604090205481565b6102e26103ff366004612082565b600d6020525f908152604090205481565b610289610aab565b61028961042636600461215c565b610abb565b600a546001600160a01b03166102b3565b610293610b52565b610289610452366004612199565b610b61565b6102e2610465366004612082565b600b6020525f908152604090205481565b6102e2610484366004612082565b600c6020525f908152604090205481565b6102e26104a3366004612082565b60106020525f908152604090205481565b6102896104c23660046121e2565b610b6c565b610289610b84565b6102896104dd366004612082565b610c43565b6102e26104f0366004612082565b600f6020525f908152604090205481565b6102e261050f366004612082565b600e6020525f908152604090205481565b61029361052e366004612082565b610cf1565b6102e260135481565b61026161054a3660046122bf565b610d56565b61028961055d3660046122f0565b610d83565b610289610570366004612116565b610df0565b610588610583366004612319565b610e2d565b60405161026d959493929190612383565b6102b37f000000000000000000000000000000000000000000000000000000000000000081565b5f6001600160e01b0319821663780e9d6360e01b14806105e457506105e48261112b565b92915050565b6105f261117a565b60156105ff8284836124b3565b505050565b60605f805461061290612437565b80601f016020809104026020016040519081016040528092919081815260200182805461063e90612437565b80156106895780601f1061066057610100808354040283529160200191610689565b820191905f5260205f20905b81548152906001019060200180831161066c57829003601f168201915b5050505050905090565b5f61069d826111b6565b505f828152600460205260409020546001600160a01b03166105e4565b6106c58282336111ee565b5050565b6001600160a01b0382166106f757604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f6107038383336111fb565b9050836001600160a01b0316816001600160a01b031614610751576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016106ee565b50505050565b5f6107618361091a565b82106107925760405163295f44f760e21b81526001600160a01b0384166004820152602481018390526044016106ee565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b60185460ff16156107dd5760405162461bcd60e51b81526004016106ee9061256d565b6018805460ff1916600117905533610809825f908152600260205260409020546001600160a01b031690565b6001600160a01b0316146108515760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b60448201526064016106ee565b5f818152601160205260409020544210156108765761087133825f6112ce565b610882565b610882338260016112ce565b506018805460ff19169055565b61089761117a565b61089f611528565b565b6105ff83838360405180602001604052805f815250610b6c565b5f6108c560085490565b82106108ed5760405163295f44f760e21b81525f6004820152602481018390526044016106ee565b6008828154811061090057610900612595565b905f5260205f2001549050919050565b5f6105e4826111b6565b5f6001600160a01b038216610944576040516322718ad960e21b81525f60048201526024016106ee565b506001600160a01b03165f9081526003602052604090205490565b61096761117a565b61089f5f61157d565b6109786115ce565b60185460ff161561099b5760405162461bcd60e51b81526004016106ee9061256d565b6018805460ff1916600117905581158015906109c357505f818152600d602052604090205415155b6109fe5760405162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a59081c1bdbdb60a21b60448201526064016106ee565b6040516323b872dd60e01b8152336004820152306024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af1158015610a6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9291906125a9565b50610a9d82826115f9565b50506018805460ff19169055565b610ab361117a565b61089f611778565b610ac361117a565b60185460ff1615610ae65760405162461bcd60e51b81526004016106ee9061256d565b6018805460ff191660011790556001600160a01b038316610b385760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103ab9b2b960a11b60448201526064016106ee565b610b438383836112ce565b50506018805460ff1916905550565b60606001805461061290612437565b6106c53383836117bb565b610b778484846106c9565b6107513385858585611859565b610b8c61117a565b601680545f9091556001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb610bd5600a546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015610c1f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c591906125a9565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af1158015610cb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd791906125a9565b508060165f828254610ce991906125d8565b909155505050565b6060610cfc826111b6565b505f610d06611978565b90505f815111610d245760405180602001604052805f815250610d4f565b80610d2e84611987565b604051602001610d3f929190612602565b6040516020818303038152906040525b9392505050565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b610d8b61117a565b805f03610dd3578115610dd35760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642073657474696e677360801b60448201526064016106ee565b5f928352600e6020908152604080852093909355600d9052912055565b610df861117a565b6001600160a01b038116610e2157604051631e4fbdf760e01b81525f60048201526024016106ee565b610e2a8161157d565b50565b60608060608060605f610e3f8961091a565b9050801561111f57875f03610e5357600197505b80881115610e5f578097505b80610e6b600189612616565b610e75908a6125d8565b1115610e9357610e858882612616565b610e909060016125d8565b96505b8667ffffffffffffffff811115610eac57610eac6121ce565b604051908082528060200260200182016040528015610ed5578160200160208202803683370190505b5095508667ffffffffffffffff811115610ef157610ef16121ce565b604051908082528060200260200182016040528015610f1a578160200160208202803683370190505b5094508667ffffffffffffffff811115610f3657610f366121ce565b604051908082528060200260200182016040528015610f5f578160200160208202803683370190505b5093508667ffffffffffffffff811115610f7b57610f7b6121ce565b604051908082528060200260200182016040528015610fa4578160200160208202803683370190505b5092508667ffffffffffffffff811115610fc057610fc06121ce565b604051908082528060200260200182016040528015610ff357816020015b6060815260200190600190039081610fde5790505b5091505f8061100360018b612616565b90505b60016110128a8c6125d8565b61101c9190612616565b81101561111c575f61102e8c83610757565b90508089848151811061104357611043612595565b60200260200101818152505060115f8281526020019081526020015f205488848151811061107357611073612595565b602002602001018181525050600c5f8281526020019081526020015f20548784815181106110a3576110a3612595565b60200260200101818152505060105f8281526020019081526020015f20548684815181106110d3576110d3612595565b6020026020010181815250506110e881610cf1565b8584815181106110fa576110fa612595565b6020026020010181905250828061111090612629565b93505050600101611006565b50505b50939792965093509350565b5f6001600160e01b031982166380ac58cd60e01b148061115b57506001600160e01b03198216635b5e139f60e01b145b806105e457506301ffc9a760e01b6001600160e01b03198316146105e4565b3361118d600a546001600160a01b031690565b6001600160a01b03161461089f5760405163118cdaa760e01b81523360048201526024016106ee565b5f818152600260205260408120546001600160a01b0316806105e457604051637e27328960e01b8152600481018490526024016106ee565b6105ff8383836001611a84565b5f80611208858585611b88565b90506001600160a01b0381166112645761125f84600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611287565b846001600160a01b0316816001600160a01b031614611287576112878185611c7a565b6001600160a01b0385166112a35761129e84611cf7565b6112c6565b846001600160a01b0316816001600160a01b0316146112c6576112c68585611d9e565b949350505050565b6112d782611dec565b5f82815260106020908152604080832054600c835281842054600b8452828520548552600f909352908320805491938392611313908490612616565b90915550839050801561132857508160165410155b1561148f578160165f82825461133e9190612616565b925050819055508160175f8282546113569190612616565b90915550506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb8661139584866125d8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af11580156113dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140191906125a9565b506001600160a01b0385165f90815260126020526040812080548492906114299084906125d8565b925050819055508160135f82825461144191906125d8565b909155505060408051828152602081018490526001600160a01b038716917f291e8ba3c0f4b0bd86e6e2346fcee1e7ca0975b1cc1886bfbc722d34f3f24d91910160405180910390a2611521565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156114fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151f91906125a9565b505b5050505050565b611530611e24565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600a54600160a01b900460ff161561089f5760405163d93c066560e01b815260040160405180910390fd5b5f818152600f6020526040812080548492906116169084906125d8565b90915550506014545f818152600b60209081526040808320859055848352600e90915281205461164690426125d8565b5f838152601160209081526040808320849055600c8252808320889055868352600d9091528120549192509064174876e800906116839087612641565b61168d919061266c565b905060175460165461169f9190612616565b8111156116ee5760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e7420726577617264732072656d61696e696e67000060448201526064016106ee565b5f838152601060205260408120829055601780548392906117109084906125d8565b9091555061172090503384611e4e565b61172b8360016125d8565b601455604080518681526020810183905290810183905233907fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed9060600160405180910390a25050505050565b6117806115ce565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115603390565b6001600160a01b0382166117ed57604051630b61174360e31b81526001600160a01b03831660048201526024016106ee565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561152157604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061189b90889088908790879060040161267f565b6020604051808303815f875af19250505080156118d5575060408051601f3d908101601f191682019092526118d2918101906126bb565b60015b61193c573d808015611902576040519150601f19603f3d011682016040523d82523d5f602084013e611907565b606091505b5080515f0361193457604051633250574960e11b81526001600160a01b03851660048201526024016106ee565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461151f57604051633250574960e11b81526001600160a01b03851660048201526024016106ee565b60606015805461061290612437565b6060815f036119ad5750506040805180820190915260018152600360fc1b602082015290565b815f5b81156119d657806119c081612629565b91506119cf9050600a8361266c565b91506119b0565b5f8167ffffffffffffffff8111156119f0576119f06121ce565b6040519080825280601f01601f191660200182016040528015611a1a576020820181803683370190505b5090505b84156112c657611a2f600183612616565b9150611a3c600a866126d6565b611a479060306125d8565b60f81b818381518110611a5c57611a5c612595565b60200101906001600160f81b03191690815f1a905350611a7d600a8661266c565b9450611a1e565b8080611a9857506001600160a01b03821615155b15611b59575f611aa7846111b6565b90506001600160a01b03831615801590611ad35750826001600160a01b0316816001600160a01b031614155b8015611ae65750611ae48184610d56565b155b15611b0f5760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016106ee565b8115611b575783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b0390811690831615611bb457611bb4818486611e67565b6001600160a01b03811615611bee57611bcf5f855f80611a84565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611c1c576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f611c848361091a565b5f838152600760209081526040808320546001600160a01b0388168452600690925290912091925090818314611cd9575f83815260208281526040808320548584528184208190558352600790915290208290555b5f938452600760209081526040808620869055938552525081205550565b6008545f90611d0890600190612616565b5f8381526009602052604081205460088054939450909284908110611d2f57611d2f612595565b905f5260205f20015490508060088381548110611d4e57611d4e612595565b5f918252602080832090910192909255828152600990915260408082208490558582528120556008805480611d8557611d856126e9565b600190038181905f5260205f20015f9055905550505050565b5f6001611daa8461091a565b611db49190612616565b6001600160a01b039093165f908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5f611df85f835f6111fb565b90506001600160a01b0381166106c557604051637e27328960e01b8152600481018390526024016106ee565b600a54600160a01b900460ff1661089f57604051638dfc202b60e01b815260040160405180910390fd5b6106c5828260405180602001604052805f815250611ecb565b611e72838383611ee2565b6105ff576001600160a01b038316611ea057604051637e27328960e01b8152600481018290526024016106ee565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016106ee565b611ed58383611f43565b6105ff335f858585611859565b5f6001600160a01b038316158015906112c65750826001600160a01b0316846001600160a01b03161480611f1b5750611f1b8484610d56565b806112c65750505f908152600460205260409020546001600160a01b03908116911614919050565b6001600160a01b038216611f6c57604051633250574960e11b81525f60048201526024016106ee565b5f611f7883835f6111fb565b90506001600160a01b038116156105ff576040516339e3563760e11b81525f60048201526024016106ee565b6001600160e01b031981168114610e2a575f80fd5b5f60208284031215611fc9575f80fd5b8135610d4f81611fa4565b5f8060208385031215611fe5575f80fd5b823567ffffffffffffffff811115611ffb575f80fd5b8301601f8101851361200b575f80fd5b803567ffffffffffffffff811115612021575f80fd5b856020828401011115612032575f80fd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610d4f6020830184612042565b5f60208284031215612092575f80fd5b5035919050565b80356001600160a01b03811681146120af575f80fd5b919050565b5f80604083850312156120c5575f80fd5b6120ce83612099565b946020939093013593505050565b5f805f606084860312156120ee575f80fd5b6120f784612099565b925061210560208501612099565b929592945050506040919091013590565b5f60208284031215612126575f80fd5b610d4f82612099565b5f8060408385031215612140575f80fd5b50508035926020909101359150565b8015158114610e2a575f80fd5b5f805f6060848603121561216e575f80fd5b61217784612099565b925060208401359150604084013561218e8161214f565b809150509250925092565b5f80604083850312156121aa575f80fd5b6121b383612099565b915060208301356121c38161214f565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156121f5575f80fd5b6121fe85612099565b935061220c60208601612099565b925060408501359150606085013567ffffffffffffffff81111561222e575f80fd5b8501601f8101871361223e575f80fd5b803567ffffffffffffffff811115612258576122586121ce565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715612287576122876121ce565b60405281815282820160200189101561229e575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156122d0575f80fd5b6122d983612099565b91506122e760208401612099565b90509250929050565b5f805f60608486031215612302575f80fd5b505081359360208301359350604090920135919050565b5f805f6060848603121561232b575f80fd5b61233484612099565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561237957815186526020958601959091019060010161235b565b5093949350505050565b60a081525f61239560a0830188612349565b82810360208401526123a78188612349565b905082810360408401526123bb8187612349565b905082810360608401526123cf8186612349565b9050828103608084015280845180835260208301915060208160051b840101602087015f5b8381101561242657601f19868403018552612410838351612042565b60209586019590935091909101906001016123f4565b50909b9a5050505050505050505050565b600181811c9082168061244b57607f821691505b60208210810361246957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156105ff57805f5260205f20601f840160051c810160208510156124945750805b601f840160051c820191505b81811015611521575f81556001016124a0565b67ffffffffffffffff8311156124cb576124cb6121ce565b6124df836124d98354612437565b8361246f565b5f601f841160018114612510575f85156124f95750838201355b5f19600387901b1c1916600186901b178355611521565b5f83815260208120601f198716915b8281101561253f578685013582556020948501946001909201910161251f565b508682101561255b575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252600e908201526d4e6f2072652d656e7472616e637960901b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156125b9575f80fd5b8151610d4f8161214f565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105e4576105e46125c4565b5f81518060208401855e5f93019283525090919050565b5f6112c661261083866125eb565b846125eb565b818103818111156105e4576105e46125c4565b5f6001820161263a5761263a6125c4565b5060010190565b80820281158282048414176105e4576105e46125c4565b634e487b7160e01b5f52601260045260245ffd5b5f8261267a5761267a612658565b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906126b190830184612042565b9695505050505050565b5f602082840312156126cb575f80fd5b8151610d4f81611fa4565b5f826126e4576126e4612658565b500690565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220b8806df1aba0e84c80a9215ecf9c67dba013d0a01a3541d068fb5eade8a3ce7064736f6c634300081a0033000000000000000000000000b905c47c93f50463d07caf4a8ad144f704ea85f4
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061024a575f3560e01c80637d39431511610140578063bd9ca6ad116100bf578063d54ad2a111610084578063d54ad2a114610533578063e985e9c51461053c578063f1c8f9641461054f578063f2fde38b14610562578063f52b619a14610575578063fc0c546a14610599575f80fd5b8063bd9ca6ad146104c7578063beceed39146104cf578063c00bac66146104e2578063c04b69bb14610501578063c87b56dd14610520575f80fd5b8063a22cb46511610105578063a22cb46514610444578063ac4afa3814610457578063b02c43d014610476578063b6333d9314610495578063b88d4fde146104b4575f80fd5b80637d394315146103f15780638456cb59146104105780638a251ed6146104185780638da5cb5b1461042b57806395d89b411461043c575f80fd5b806342842e0e116101cc57806370a082311161019157806370a0823114610385578063715018a6146103985780637aace44c146103a05780637b0472f0146103bf5780637cd78b02146103d2575f80fd5b806342842e0e146103315780634f6ccce7146103445780635c975abb146103575780636352211e1461036957806366666aa91461037c575f80fd5b806318160ddd1161021257806318160ddd146102de57806323b872dd146102f05780632f745c5914610303578063379607f5146103165780633f4ba83a14610329575f80fd5b806301ffc9a71461024e57806302fe53051461027657806306fdde031461028b578063081812fc146102a0578063095ea7b3146102cb575b5f80fd5b61026161025c366004611fb9565b6105c0565b60405190151581526020015b60405180910390f35b610289610284366004611fd4565b6105ea565b005b610293610604565b60405161026d9190612070565b6102b36102ae366004612082565b610693565b6040516001600160a01b03909116815260200161026d565b6102896102d93660046120b4565b6106ba565b6008545b60405190815260200161026d565b6102896102fe3660046120dc565b6106c9565b6102e26103113660046120b4565b610757565b610289610324366004612082565b6107ba565b61028961088f565b61028961033f3660046120dc565b6108a1565b6102e2610352366004612082565b6108bb565b600a54600160a01b900460ff16610261565b6102b3610377366004612082565b610910565b6102e260165481565b6102e2610393366004612116565b61091a565b61028961095f565b6102e26103ae366004612116565b60126020525f908152604090205481565b6102896103cd36600461212f565b610970565b6102e26103e0366004612082565b60116020525f908152604090205481565b6102e26103ff366004612082565b600d6020525f908152604090205481565b610289610aab565b61028961042636600461215c565b610abb565b600a546001600160a01b03166102b3565b610293610b52565b610289610452366004612199565b610b61565b6102e2610465366004612082565b600b6020525f908152604090205481565b6102e2610484366004612082565b600c6020525f908152604090205481565b6102e26104a3366004612082565b60106020525f908152604090205481565b6102896104c23660046121e2565b610b6c565b610289610b84565b6102896104dd366004612082565b610c43565b6102e26104f0366004612082565b600f6020525f908152604090205481565b6102e261050f366004612082565b600e6020525f908152604090205481565b61029361052e366004612082565b610cf1565b6102e260135481565b61026161054a3660046122bf565b610d56565b61028961055d3660046122f0565b610d83565b610289610570366004612116565b610df0565b610588610583366004612319565b610e2d565b60405161026d959493929190612383565b6102b37f000000000000000000000000b905c47c93f50463d07caf4a8ad144f704ea85f481565b5f6001600160e01b0319821663780e9d6360e01b14806105e457506105e48261112b565b92915050565b6105f261117a565b60156105ff8284836124b3565b505050565b60605f805461061290612437565b80601f016020809104026020016040519081016040528092919081815260200182805461063e90612437565b80156106895780601f1061066057610100808354040283529160200191610689565b820191905f5260205f20905b81548152906001019060200180831161066c57829003601f168201915b5050505050905090565b5f61069d826111b6565b505f828152600460205260409020546001600160a01b03166105e4565b6106c58282336111ee565b5050565b6001600160a01b0382166106f757604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f6107038383336111fb565b9050836001600160a01b0316816001600160a01b031614610751576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016106ee565b50505050565b5f6107618361091a565b82106107925760405163295f44f760e21b81526001600160a01b0384166004820152602481018390526044016106ee565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b60185460ff16156107dd5760405162461bcd60e51b81526004016106ee9061256d565b6018805460ff1916600117905533610809825f908152600260205260409020546001600160a01b031690565b6001600160a01b0316146108515760405162461bcd60e51b815260206004820152600f60248201526e2737ba103a37b5b2b71037bbb732b960891b60448201526064016106ee565b5f818152601160205260409020544210156108765761087133825f6112ce565b610882565b610882338260016112ce565b506018805460ff19169055565b61089761117a565b61089f611528565b565b6105ff83838360405180602001604052805f815250610b6c565b5f6108c560085490565b82106108ed5760405163295f44f760e21b81525f6004820152602481018390526044016106ee565b6008828154811061090057610900612595565b905f5260205f2001549050919050565b5f6105e4826111b6565b5f6001600160a01b038216610944576040516322718ad960e21b81525f60048201526024016106ee565b506001600160a01b03165f9081526003602052604090205490565b61096761117a565b61089f5f61157d565b6109786115ce565b60185460ff161561099b5760405162461bcd60e51b81526004016106ee9061256d565b6018805460ff1916600117905581158015906109c357505f818152600d602052604090205415155b6109fe5760405162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a59081c1bdbdb60a21b60448201526064016106ee565b6040516323b872dd60e01b8152336004820152306024820152604481018390527f000000000000000000000000b905c47c93f50463d07caf4a8ad144f704ea85f46001600160a01b0316906323b872dd906064016020604051808303815f875af1158015610a6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9291906125a9565b50610a9d82826115f9565b50506018805460ff19169055565b610ab361117a565b61089f611778565b610ac361117a565b60185460ff1615610ae65760405162461bcd60e51b81526004016106ee9061256d565b6018805460ff191660011790556001600160a01b038316610b385760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103ab9b2b960a11b60448201526064016106ee565b610b438383836112ce565b50506018805460ff1916905550565b60606001805461061290612437565b6106c53383836117bb565b610b778484846106c9565b6107513385858585611859565b610b8c61117a565b601680545f9091556001600160a01b037f000000000000000000000000b905c47c93f50463d07caf4a8ad144f704ea85f41663a9059cbb610bd5600a546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015610c1f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c591906125a9565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f000000000000000000000000b905c47c93f50463d07caf4a8ad144f704ea85f46001600160a01b0316906323b872dd906064016020604051808303815f875af1158015610cb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd791906125a9565b508060165f828254610ce991906125d8565b909155505050565b6060610cfc826111b6565b505f610d06611978565b90505f815111610d245760405180602001604052805f815250610d4f565b80610d2e84611987565b604051602001610d3f929190612602565b6040516020818303038152906040525b9392505050565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b610d8b61117a565b805f03610dd3578115610dd35760405162461bcd60e51b815260206004820152601060248201526f496e76616c69642073657474696e677360801b60448201526064016106ee565b5f928352600e6020908152604080852093909355600d9052912055565b610df861117a565b6001600160a01b038116610e2157604051631e4fbdf760e01b81525f60048201526024016106ee565b610e2a8161157d565b50565b60608060608060605f610e3f8961091a565b9050801561111f57875f03610e5357600197505b80881115610e5f578097505b80610e6b600189612616565b610e75908a6125d8565b1115610e9357610e858882612616565b610e909060016125d8565b96505b8667ffffffffffffffff811115610eac57610eac6121ce565b604051908082528060200260200182016040528015610ed5578160200160208202803683370190505b5095508667ffffffffffffffff811115610ef157610ef16121ce565b604051908082528060200260200182016040528015610f1a578160200160208202803683370190505b5094508667ffffffffffffffff811115610f3657610f366121ce565b604051908082528060200260200182016040528015610f5f578160200160208202803683370190505b5093508667ffffffffffffffff811115610f7b57610f7b6121ce565b604051908082528060200260200182016040528015610fa4578160200160208202803683370190505b5092508667ffffffffffffffff811115610fc057610fc06121ce565b604051908082528060200260200182016040528015610ff357816020015b6060815260200190600190039081610fde5790505b5091505f8061100360018b612616565b90505b60016110128a8c6125d8565b61101c9190612616565b81101561111c575f61102e8c83610757565b90508089848151811061104357611043612595565b60200260200101818152505060115f8281526020019081526020015f205488848151811061107357611073612595565b602002602001018181525050600c5f8281526020019081526020015f20548784815181106110a3576110a3612595565b60200260200101818152505060105f8281526020019081526020015f20548684815181106110d3576110d3612595565b6020026020010181815250506110e881610cf1565b8584815181106110fa576110fa612595565b6020026020010181905250828061111090612629565b93505050600101611006565b50505b50939792965093509350565b5f6001600160e01b031982166380ac58cd60e01b148061115b57506001600160e01b03198216635b5e139f60e01b145b806105e457506301ffc9a760e01b6001600160e01b03198316146105e4565b3361118d600a546001600160a01b031690565b6001600160a01b03161461089f5760405163118cdaa760e01b81523360048201526024016106ee565b5f818152600260205260408120546001600160a01b0316806105e457604051637e27328960e01b8152600481018490526024016106ee565b6105ff8383836001611a84565b5f80611208858585611b88565b90506001600160a01b0381166112645761125f84600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611287565b846001600160a01b0316816001600160a01b031614611287576112878185611c7a565b6001600160a01b0385166112a35761129e84611cf7565b6112c6565b846001600160a01b0316816001600160a01b0316146112c6576112c68585611d9e565b949350505050565b6112d782611dec565b5f82815260106020908152604080832054600c835281842054600b8452828520548552600f909352908320805491938392611313908490612616565b90915550839050801561132857508160165410155b1561148f578160165f82825461133e9190612616565b925050819055508160175f8282546113569190612616565b90915550506001600160a01b037f000000000000000000000000b905c47c93f50463d07caf4a8ad144f704ea85f41663a9059cbb8661139584866125d8565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af11580156113dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140191906125a9565b506001600160a01b0385165f90815260126020526040812080548492906114299084906125d8565b925050819055508160135f82825461144191906125d8565b909155505060408051828152602081018490526001600160a01b038716917f291e8ba3c0f4b0bd86e6e2346fcee1e7ca0975b1cc1886bfbc722d34f3f24d91910160405180910390a2611521565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f000000000000000000000000b905c47c93f50463d07caf4a8ad144f704ea85f4169063a9059cbb906044016020604051808303815f875af11580156114fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151f91906125a9565b505b5050505050565b611530611e24565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600a54600160a01b900460ff161561089f5760405163d93c066560e01b815260040160405180910390fd5b5f818152600f6020526040812080548492906116169084906125d8565b90915550506014545f818152600b60209081526040808320859055848352600e90915281205461164690426125d8565b5f838152601160209081526040808320849055600c8252808320889055868352600d9091528120549192509064174876e800906116839087612641565b61168d919061266c565b905060175460165461169f9190612616565b8111156116ee5760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e7420726577617264732072656d61696e696e67000060448201526064016106ee565b5f838152601060205260408120829055601780548392906117109084906125d8565b9091555061172090503384611e4e565b61172b8360016125d8565b601455604080518681526020810183905290810183905233907fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed9060600160405180910390a25050505050565b6117806115ce565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115603390565b6001600160a01b0382166117ed57604051630b61174360e31b81526001600160a01b03831660048201526024016106ee565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561152157604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061189b90889088908790879060040161267f565b6020604051808303815f875af19250505080156118d5575060408051601f3d908101601f191682019092526118d2918101906126bb565b60015b61193c573d808015611902576040519150601f19603f3d011682016040523d82523d5f602084013e611907565b606091505b5080515f0361193457604051633250574960e11b81526001600160a01b03851660048201526024016106ee565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461151f57604051633250574960e11b81526001600160a01b03851660048201526024016106ee565b60606015805461061290612437565b6060815f036119ad5750506040805180820190915260018152600360fc1b602082015290565b815f5b81156119d657806119c081612629565b91506119cf9050600a8361266c565b91506119b0565b5f8167ffffffffffffffff8111156119f0576119f06121ce565b6040519080825280601f01601f191660200182016040528015611a1a576020820181803683370190505b5090505b84156112c657611a2f600183612616565b9150611a3c600a866126d6565b611a479060306125d8565b60f81b818381518110611a5c57611a5c612595565b60200101906001600160f81b03191690815f1a905350611a7d600a8661266c565b9450611a1e565b8080611a9857506001600160a01b03821615155b15611b59575f611aa7846111b6565b90506001600160a01b03831615801590611ad35750826001600160a01b0316816001600160a01b031614155b8015611ae65750611ae48184610d56565b155b15611b0f5760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016106ee565b8115611b575783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b0390811690831615611bb457611bb4818486611e67565b6001600160a01b03811615611bee57611bcf5f855f80611a84565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611c1c576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f611c848361091a565b5f838152600760209081526040808320546001600160a01b0388168452600690925290912091925090818314611cd9575f83815260208281526040808320548584528184208190558352600790915290208290555b5f938452600760209081526040808620869055938552525081205550565b6008545f90611d0890600190612616565b5f8381526009602052604081205460088054939450909284908110611d2f57611d2f612595565b905f5260205f20015490508060088381548110611d4e57611d4e612595565b5f918252602080832090910192909255828152600990915260408082208490558582528120556008805480611d8557611d856126e9565b600190038181905f5260205f20015f9055905550505050565b5f6001611daa8461091a565b611db49190612616565b6001600160a01b039093165f908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b5f611df85f835f6111fb565b90506001600160a01b0381166106c557604051637e27328960e01b8152600481018390526024016106ee565b600a54600160a01b900460ff1661089f57604051638dfc202b60e01b815260040160405180910390fd5b6106c5828260405180602001604052805f815250611ecb565b611e72838383611ee2565b6105ff576001600160a01b038316611ea057604051637e27328960e01b8152600481018290526024016106ee565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016106ee565b611ed58383611f43565b6105ff335f858585611859565b5f6001600160a01b038316158015906112c65750826001600160a01b0316846001600160a01b03161480611f1b5750611f1b8484610d56565b806112c65750505f908152600460205260409020546001600160a01b03908116911614919050565b6001600160a01b038216611f6c57604051633250574960e11b81525f60048201526024016106ee565b5f611f7883835f6111fb565b90506001600160a01b038116156105ff576040516339e3563760e11b81525f60048201526024016106ee565b6001600160e01b031981168114610e2a575f80fd5b5f60208284031215611fc9575f80fd5b8135610d4f81611fa4565b5f8060208385031215611fe5575f80fd5b823567ffffffffffffffff811115611ffb575f80fd5b8301601f8101851361200b575f80fd5b803567ffffffffffffffff811115612021575f80fd5b856020828401011115612032575f80fd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610d4f6020830184612042565b5f60208284031215612092575f80fd5b5035919050565b80356001600160a01b03811681146120af575f80fd5b919050565b5f80604083850312156120c5575f80fd5b6120ce83612099565b946020939093013593505050565b5f805f606084860312156120ee575f80fd5b6120f784612099565b925061210560208501612099565b929592945050506040919091013590565b5f60208284031215612126575f80fd5b610d4f82612099565b5f8060408385031215612140575f80fd5b50508035926020909101359150565b8015158114610e2a575f80fd5b5f805f6060848603121561216e575f80fd5b61217784612099565b925060208401359150604084013561218e8161214f565b809150509250925092565b5f80604083850312156121aa575f80fd5b6121b383612099565b915060208301356121c38161214f565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f80608085870312156121f5575f80fd5b6121fe85612099565b935061220c60208601612099565b925060408501359150606085013567ffffffffffffffff81111561222e575f80fd5b8501601f8101871361223e575f80fd5b803567ffffffffffffffff811115612258576122586121ce565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715612287576122876121ce565b60405281815282820160200189101561229e575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156122d0575f80fd5b6122d983612099565b91506122e760208401612099565b90509250929050565b5f805f60608486031215612302575f80fd5b505081359360208301359350604090920135919050565b5f805f6060848603121561232b575f80fd5b61233484612099565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b8281101561237957815186526020958601959091019060010161235b565b5093949350505050565b60a081525f61239560a0830188612349565b82810360208401526123a78188612349565b905082810360408401526123bb8187612349565b905082810360608401526123cf8186612349565b9050828103608084015280845180835260208301915060208160051b840101602087015f5b8381101561242657601f19868403018552612410838351612042565b60209586019590935091909101906001016123f4565b50909b9a5050505050505050505050565b600181811c9082168061244b57607f821691505b60208210810361246957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156105ff57805f5260205f20601f840160051c810160208510156124945750805b601f840160051c820191505b81811015611521575f81556001016124a0565b67ffffffffffffffff8311156124cb576124cb6121ce565b6124df836124d98354612437565b8361246f565b5f601f841160018114612510575f85156124f95750838201355b5f19600387901b1c1916600186901b178355611521565b5f83815260208120601f198716915b8281101561253f578685013582556020948501946001909201910161251f565b508682101561255b575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252600e908201526d4e6f2072652d656e7472616e637960901b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156125b9575f80fd5b8151610d4f8161214f565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105e4576105e46125c4565b5f81518060208401855e5f93019283525090919050565b5f6112c661261083866125eb565b846125eb565b818103818111156105e4576105e46125c4565b5f6001820161263a5761263a6125c4565b5060010190565b80820281158282048414176105e4576105e46125c4565b634e487b7160e01b5f52601260045260245ffd5b5f8261267a5761267a612658565b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906126b190830184612042565b9695505050505050565b5f602082840312156126cb575f80fd5b8151610d4f81611fa4565b5f826126e4576126e4612658565b500690565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220b8806df1aba0e84c80a9215ecf9c67dba013d0a01a3541d068fb5eade8a3ce7064736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b905c47c93f50463d07caf4a8ad144f704ea85f4
-----Decoded View---------------
Arg [0] : _token (address): 0xb905C47c93F50463D07CAf4A8ad144f704ea85F4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b905c47c93f50463d07caf4a8ad144f704ea85f4
Deployed Bytecode Sourcemap
49083:5802:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42996:224;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;42996:224:0;;;;;;;;50896:85;;;;;;:::i;:::-;;:::i;:::-;;27372:91;;;:::i;:::-;;;;;;;:::i;28544:158::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2120:32:1;;;2102:51;;2090:2;2075:18;28544:158:0;1956:203:1;28363:115:0;;;;;;:::i;:::-;;:::i;43640:104::-;43719:10;:17;43640:104;;;2793:25:1;;;2781:2;2766:18;43640:104:0;2647:177:1;29213:588:0;;;;;;:::i;:::-;;:::i;43304:260::-;;;;;;:::i;:::-;;:::i;51967:301::-;;;;;;:::i;:::-;;:::i;53227:67::-;;;:::i;29872:134::-;;;;;;:::i;:::-;;:::i;43821:231::-;;;;;;:::i;:::-;;:::i;7138:86::-;7209:7;;-1:-1:-1;;;7209:7:0;;;;7138:86;;27185:120;;;;;;:::i;:::-;;:::i;49773:25::-;;;;;;26910:213;;;;;;:::i;:::-;;:::i;24940:103::-;;;:::i;49607:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;50989:254;;;;;;:::i;:::-;;:::i;49551:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;49281:45;;;;;;:::i;:::-;;;;;;;;;;;;;;53156:63;;;:::i;52937:211::-;;;;;;:::i;:::-;;:::i;24679:87::-;24752:6;;-1:-1:-1;;;;;24752:6:0;24679:87;;27532:95;;;:::i;28774:146::-;;;;;;:::i;:::-;;:::i;49182:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;49230:44;;;;;;:::i;:::-;;;;;;;;;;;;;;49492:52;;;;;;:::i;:::-;;;;;;;;;;;;;;30077:236;;;;;;:::i;:::-;;:::i;53509:228::-;;;:::i;53302:199::-;;;;;;:::i;:::-;;:::i;49385:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;49333;;;;;;:::i;:::-;;;;;;;;;;;;;;27698:260;;;;;;:::i;:::-;;:::i;49664:27::-;;;;;;28991:155;;;;;;:::i;:::-;;:::i;50568:215::-;;;;;;:::i;:::-;;:::i;25049:220::-;;;;;;:::i;:::-;;:::i;53749:1133::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;49144:29::-;;;;;42996:224;43098:4;-1:-1:-1;;;;;;43122:50:0;;-1:-1:-1;;;43122:50:0;;:90;;;43176:36;43200:11;43176:23;:36::i;:::-;43115:97;42996:224;-1:-1:-1;;42996:224:0:o;50896:85::-;24640:13;:11;:13::i;:::-;50963:4:::1;:10;50970:3:::0;;50963:4;:10:::1;:::i;:::-;;50896:85:::0;;:::o;27372:91::-;27417:13;27450:5;27443:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27372:91;:::o;28544:158::-;28611:7;28631:22;28645:7;28631:13;:22::i;:::-;-1:-1:-1;31146:7:0;31173:24;;;:15;:24;;;;;;-1:-1:-1;;;;;31173:24:0;28673:21;31076:129;28363:115;28435:35;28444:2;28448:7;175:10;28435:8;:35::i;:::-;28363:115;;:::o;29213:588::-;-1:-1:-1;;;;;29308:16:0;;29304:89;;29348:33;;-1:-1:-1;;;29348:33:0;;29378:1;29348:33;;;2102:51:1;2075:18;;29348:33:0;;;;;;;;29304:89;29614:21;29638:34;29646:2;29650:7;175:10;29638:7;:34::i;:::-;29614:58;;29704:4;-1:-1:-1;;;;;29687:21:0;:13;-1:-1:-1;;;;;29687:21:0;;29683:111;;29732:50;;-1:-1:-1;;;29732:50:0;;-1:-1:-1;;;;;11991:32:1;;;29732:50:0;;;11973:51:1;12040:18;;;12033:34;;;12103:32;;12083:18;;;12076:60;11946:18;;29732:50:0;11771:371:1;29683:111:0;29293:508;29213:588;;;:::o;43304:260::-;43392:7;43425:16;43435:5;43425:9;:16::i;:::-;43416:5;:25;43412:101;;43465:36;;-1:-1:-1;;;43465:36:0;;-1:-1:-1;;;;;12339:32:1;;43465:36:0;;;12321:51:1;12388:18;;;12381:34;;;12294:18;;43465:36:0;12147:274:1;43412:101:0;-1:-1:-1;;;;;;43530:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;43304:260::o;51967:301::-;49912:6;;;;49911:7;49903:34;;;;-1:-1:-1;;;49903:34:0;;;;;;;:::i;:::-;49948:6;:13;;-1:-1:-1;;49948:13:0;49957:4;49948:13;;;52060:10:::1;52039:17;52048:7:::0;30904;30931:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30931:16:0;;30838:117;52039:17:::1;-1:-1:-1::0;;;;;52039:31:0::1;;52031:59;;;::::0;-1:-1:-1;;;52031:59:0;;12971:2:1;52031:59:0::1;::::0;::::1;12953:21:1::0;13010:2;12990:18;;;12983:30;-1:-1:-1;;;13029:18:1;;;13022:45;13084:18;;52031:59:0::1;12769:339:1::0;52031:59:0::1;52122:20;::::0;;;:11:::1;:20;::::0;;;;;52104:15:::1;:38;52101:159;;;52157:37;52167:10;52179:7;52188:5;52157:9;:37::i;:::-;52101:159;;;52224:36;52234:10;52246:7;52255:4;52224:9;:36::i;:::-;-1:-1:-1::0;49984:6:0;:14;;-1:-1:-1;;49984:14:0;;;51967:301::o;53227:67::-;24640:13;:11;:13::i;:::-;53276:10:::1;:8;:10::i;:::-;53227:67::o:0;29872:134::-;29959:39;29976:4;29982:2;29986:7;29959:39;;;;;;;;;;;;:16;:39::i;43821:231::-;43887:7;43920:13;43719:10;:17;;43640:104;43920:13;43911:5;:22;43907:103;;43957:41;;-1:-1:-1;;;43957:41:0;;43988:1;43957:41;;;12321:51:1;12388:18;;;12381:34;;;12294:18;;43957:41:0;12147:274:1;43907:103:0;44027:10;44038:5;44027:17;;;;;;;;:::i;:::-;;;;;;;;;44020:24;;43821:231;;;:::o;27185:120::-;27248:7;27275:22;27289:7;27275:13;:22::i;26910:213::-;26973:7;-1:-1:-1;;;;;26997:19:0;;26993:89;;27040:30;;-1:-1:-1;;;27040:30:0;;27067:1;27040:30;;;2102:51:1;2075:18;;27040:30:0;1956:203:1;26993:89:0;-1:-1:-1;;;;;;27099:16:0;;;;;:9;:16;;;;;;;26910:213::o;24940:103::-;24640:13;:11;:13::i;:::-;25005:30:::1;25032:1;25005:18;:30::i;50989:254::-:0;6743:19;:17;:19::i;:::-;49912:6:::1;::::0;::::1;;49911:7;49903:34;;;;-1:-1:-1::0;;;49903:34:0::1;;;;;;;:::i;:::-;49948:6;:13:::0;;-1:-1:-1;;49948:13:0::1;49957:4;49948:13;::::0;;51088:10;;;;;:33:::2;;-1:-1:-1::0;51120:1:0::2;51102:15:::0;;;:9:::2;:15;::::0;;;;;:19;;51088:33:::2;51080:58;;;::::0;-1:-1:-1;;;51080:58:0;;13447:2:1;51080:58:0::2;::::0;::::2;13429:21:1::0;13486:2;13466:18;;;13459:30;-1:-1:-1;;;13505:18:1;;;13498:42;13557:18;;51080:58:0::2;13245:336:1::0;51080:58:0::2;51149:53;::::0;-1:-1:-1;;;51149:53:0;;51168:10:::2;51149:53;::::0;::::2;13788:51:1::0;51188:4:0::2;13855:18:1::0;;;13848:60;13924:18;;;13917:34;;;51149:5:0::2;-1:-1:-1::0;;;;;51149:18:0::2;::::0;::::2;::::0;13761::1;;51149:53:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51215:20;51222:6;51230:4;51215:6;:20::i;:::-;-1:-1:-1::0;;49984:6:0::1;:14:::0;;-1:-1:-1;;49984:14:0::1;::::0;;50989:254::o;53156:63::-;24640:13;:11;:13::i;:::-;53203:8:::1;:6;:8::i;52937:211::-:0;24640:13;:11;:13::i;:::-;49912:6:::1;::::0;::::1;;49911:7;49903:34;;;;-1:-1:-1::0;;;49903:34:0::1;;;;;;;:::i;:::-;49948:6;:13:::0;;-1:-1:-1;;49948:13:0::1;49957:4;49948:13;::::0;;-1:-1:-1;;;;;53057:18:0;::::2;53049:43;;;::::0;-1:-1:-1;;;53049:43:0;;14414:2:1;53049:43:0::2;::::0;::::2;14396:21:1::0;14453:2;14433:18;;;14426:30;-1:-1:-1;;;14472:18:1;;;14465:42;14524:18;;53049:43:0::2;14212:336:1::0;53049:43:0::2;53103:37;53113:4;53119:7;53128:11;53103:9;:37::i;:::-;-1:-1:-1::0;;49984:6:0::1;:14:::0;;-1:-1:-1;;49984:14:0::1;::::0;;-1:-1:-1;52937:211:0:o;27532:95::-;27579:13;27612:7;27605:14;;;;;:::i;28774:146::-;28860:52;175:10;28893:8;28903;28860:18;:52::i;30077:236::-;30191:31;30204:4;30210:2;30214:7;30191:12;:31::i;:::-;30233:72;175:10;30281:4;30287:2;30291:7;30300:4;30233:33;:72::i;53509:228::-;24640:13;:11;:13::i;:::-;53578:10:::1;::::0;;53565::::1;53677:14:::0;;;-1:-1:-1;;;;;53702:5:0::1;:14;;53717:7;24752:6:::0;;-1:-1:-1;;;;;24752:6:0;;24679:87;53717:7:::1;53702:27;::::0;-1:-1:-1;;;;;;53702:27:0::1;::::0;;;;;;-1:-1:-1;;;;;12339:32:1;;;53702:27:0::1;::::0;::::1;12321:51:1::0;12388:18;;;12381:34;;;12294:18;;53702:27:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53302:199::-:0;53409:53;;-1:-1:-1;;;53409:53:0;;53428:10;53409:53;;;13788:51:1;53448:4:0;13855:18:1;;;13848:60;13924:18;;;13917:34;;;53409:5:0;-1:-1:-1;;;;;53409:18:0;;;;13761::1;;53409:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53487:6;53473:10;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;;53302:199:0:o;27698:260::-;27762:13;27788:22;27802:7;27788:13;:22::i;:::-;;27823:21;27847:10;:8;:10::i;:::-;27823:34;;27899:1;27881:7;27875:21;:25;:75;;;;;;;;;;;;;;;;;27917:7;27926:18;:7;:16;:18::i;:::-;27903:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27875:75;27868:82;27698:260;-1:-1:-1;;;27698:260:0:o;28991:155::-;-1:-1:-1;;;;;29103:25:0;;;29079:4;29103:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28991:155::o;50568:215::-;24640:13;:11;:13::i;:::-;50660:4:::1;50668:1;50660:9:::0;50657:52:::1;;50679:9:::0;;50671:38:::1;;;::::0;-1:-1:-1;;;50671:38:0;;15506:2:1;50671:38:0::1;::::0;::::1;15488:21:1::0;15545:2;15525:18;;;15518:30;-1:-1:-1;;;15564:18:1;;;15557:46;15620:18;;50671:38:0::1;15304:340:1::0;50671:38:0::1;50720:15;::::0;;;:9:::1;:15;::::0;;;;;;;:22;;;;50753:9:::1;:15:::0;;;;:22;50568:215::o;25049:220::-;24640:13;:11;:13::i;:::-;-1:-1:-1;;;;;25134:22:0;::::1;25130:93;;25180:31;::::0;-1:-1:-1;;;25180:31:0;;25208:1:::1;25180:31;::::0;::::1;2102:51:1::0;2075:18;;25180:31:0::1;1956:203:1::0;25130:93:0::1;25233:28;25252:8;25233:18;:28::i;:::-;25049:220:::0;:::o;53749:1133::-;53832:20;53854:22;53878:26;53906:23;53931:20;53964:15;53982;53992:4;53982:9;:15::i;:::-;53964:33;-1:-1:-1;54012:11:0;;54008:867;;54044:5;54053:1;54044:10;54040:25;;54064:1;54056:9;;54040:25;54092:7;54084:5;:15;54080:36;;;54109:7;54101:15;;54080:36;54155:7;54144;54150:1;54144:5;:7;:::i;:::-;54135:17;;:5;:17;:::i;:::-;:27;54131:62;;;54173:15;54183:5;54173:7;:15;:::i;:::-;54172:21;;54192:1;54172:21;:::i;:::-;54164:29;;54131:62;54230:5;54216:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54216:20:0;;54210:26;;54273:5;54259:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54259:20:0;;54251:28;;54320:5;54306:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54306:20:0;;54294:32;;54364:5;54350:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54350:20:0;;54341:29;;54405:5;54392:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54385:26:0;-1:-1:-1;54437:13:0;;54498:7;54504:1;54498:5;:7;:::i;:::-;54488:17;;54483:381;54527:1;54511:13;54519:5;54511;:13;:::i;:::-;:17;;;;:::i;:::-;54507:1;:21;54483:381;;;54554:10;54567:28;54587:4;54593:1;54567:19;:28::i;:::-;54554:41;;54627:2;54614:3;54618:5;54614:10;;;;;;;;:::i;:::-;;;;;;:15;;;;;54663:11;:15;54675:2;54663:15;;;;;;;;;;;;54648:5;54654;54648:12;;;;;;;;:::i;:::-;;;;;;:30;;;;;54716:8;:12;54725:2;54716:12;;;;;;;;;;;;54697:9;54707:5;54697:16;;;;;;;;:::i;:::-;;;;;;:31;;;;;54763:16;:20;54780:2;54763:20;;;;;;;;;;;;54747:6;54754:5;54747:13;;;;;;;;:::i;:::-;;;;;;:36;;;;;54816:12;54825:2;54816:8;:12::i;:::-;54802:4;54807:5;54802:11;;;;;;;;:::i;:::-;;;;;;:26;;;;54841:7;;;;;:::i;:::-;;-1:-1:-1;;;54530:3:0;;54483:381;;;;54025:850;54008:867;53953:929;53749:1133;;;;;;;;;:::o;26541:305::-;26643:4;-1:-1:-1;;;;;;26680:40:0;;-1:-1:-1;;;26680:40:0;;:105;;-1:-1:-1;;;;;;;26737:48:0;;-1:-1:-1;;;26737:48:0;26680:105;:158;;;-1:-1:-1;;;;;;;;;;15173:40:0;;;26802:36;15073:148;24772:162;24843:10;24832:7;24752:6;;-1:-1:-1;;;;;24752:6:0;;24679:87;24832:7;-1:-1:-1;;;;;24832:21:0;;24828:99;;24877:38;;-1:-1:-1;;;24877:38:0;;24904:10;24877:38;;;2102:51:1;2075:18;;24877:38:0;1956:203:1;41595:247:0;41658:7;30931:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30931:16:0;;41722:90;;41769:31;;-1:-1:-1;;;41769:31:0;;;;;2793:25:1;;;2766:18;;41769:31:0;2647:177:1;39827:122:0;39908:33;39917:2;39921:7;39930:4;39936;39908:8;:33::i;44113:640::-;44208:7;44228:21;44252:32;44266:2;44270:7;44279:4;44252:13;:32::i;:::-;44228:56;-1:-1:-1;;;;;;44301:27:0;;44297:214;;44345:40;44377:7;45577:10;:17;;45550:24;;;;:15;:24;;;;;:44;;;45605:24;;;;;;;;;;;;45473:164;44345:40;44297:214;;;44424:2;-1:-1:-1;;;;;44407:19:0;:13;-1:-1:-1;;;;;44407:19:0;;44403:108;;44443:56;44476:13;44491:7;44443:32;:56::i;:::-;-1:-1:-1;;;;;44525:16:0;;44521:192;;44558:45;44595:7;44558:36;:45::i;:::-;44521:192;;;44642:2;-1:-1:-1;;;;;44625:19:0;:13;-1:-1:-1;;;;;44625:19:0;;44621:92;;44661:40;44689:2;44693:7;44661:27;:40::i;:::-;44732:13;44113:640;-1:-1:-1;;;;44113:640:0:o;52276:653::-;52365:14;52371:7;52365:5;:14::i;:::-;52401;52418:25;;;:16;:25;;;;;;;;;52472:8;:17;;;;;;52510:5;:14;;;;;;52500:25;;:9;:25;;;;;;:36;;52418:25;;52472:17;;52500:36;;52472:17;;52500:36;:::i;:::-;;;;-1:-1:-1;52550:11:0;;-1:-1:-1;52550:35:0;;;;;52579:6;52565:10;;:20;;52550:35;52547:375;;;52616:6;52602:10;;:20;;;;;;;:::i;:::-;;;;;;;;52652:6;52637:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;52673:5:0;:14;;52688:5;52695:16;52704:7;52695:6;:16;:::i;:::-;52673:39;;-1:-1:-1;;;;;;52673:39:0;;;;;;;-1:-1:-1;;;;;12339:32:1;;;52673:39:0;;;12321:51:1;12388:18;;;12381:34;12294:18;;52673:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52727:21:0;;;;;;:14;:21;;;;;:31;;52752:6;;52727:21;:31;;52752:6;;52727:31;:::i;:::-;;;;;;;;52789:6;52773:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;52815:32:0;;;16096:25:1;;;16152:2;16137:18;;16130:34;;;-1:-1:-1;;;;;52815:32:0;;;;;16069:18:1;52815:32:0;;;;;;;52547:375;;;52880:30;;-1:-1:-1;;;52880:30:0;;-1:-1:-1;;;;;12339:32:1;;;52880:30:0;;;12321:51:1;12388:18;;;12381:34;;;52880:5:0;:14;;;;12294:18:1;;52880:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52547:375;52354:575;;52276:653;;;:::o;8039:120::-;7002:16;:14;:16::i;:::-;8098:7:::1;:15:::0;;-1:-1:-1;;;;8098:15:0::1;::::0;;8129:22:::1;175:10:::0;8138:12:::1;8129:22;::::0;-1:-1:-1;;;;;2120:32:1;;;2102:51;;2090:2;2075:18;8129:22:0::1;;;;;;;8039:120::o:0;25275:191::-;25368:6;;;-1:-1:-1;;;;;25385:17:0;;;-1:-1:-1;;;;;;25385:17:0;;;;;;;25418:40;;25368:6;;;25385:17;25368:6;;25418:40;;25349:16;;25418:40;25338:128;25275:191;:::o;7297:132::-;7209:7;;-1:-1:-1;;;7209:7:0;;;;7359:63;;;7395:15;;-1:-1:-1;;;7395:15:0;;;;;;;;;;;51251:708;51317:15;;;;:9;:15;;;;;:25;;51336:6;;51317:15;:25;;51336:6;;51317:25;:::i;:::-;;;;-1:-1:-1;;50535:13:0;;51363:14;51405:13;;;:5;:13;;;;;;;;:20;;;51476:15;;;:9;:15;;;;;;51458:33;;:15;:33;:::i;:::-;51502:19;;;;:11;:19;;;;;;;;:31;;;51544:8;:16;;;;;:25;;;51610:15;;;:9;:15;;;;;;51438:53;;-1:-1:-1;51502:19:0;49470:15;;51601:24;;51563:6;51601:24;:::i;:::-;:40;;;;:::i;:::-;51582:59;;51685:11;;51672:10;;:24;;;;:::i;:::-;51660:8;:36;;51652:79;;;;-1:-1:-1;;;51652:79:0;;16807:2:1;51652:79:0;;;16789:21:1;16846:2;16826:18;;;16819:30;16885:32;16865:18;;;16858:60;16935:18;;51652:79:0;16605:354:1;51652:79:0;51742:24;;;;:16;:24;;;;;:35;;;51788:11;:23;;51769:8;;51742:24;51788:23;;51769:8;;51788:23;:::i;:::-;;;;-1:-1:-1;51824:29:0;;-1:-1:-1;51834:10:0;51846:6;51824:9;:29::i;:::-;51880:8;:6;51887:1;51880:8;:::i;:::-;51864:13;:24;51904:47;;;17166:25:1;;;17222:2;17207:18;;17200:34;;;17250:18;;;17243:34;;;51911:10:0;;51904:47;;17154:2:1;17139:18;51904:47:0;;;;;;;51306:653;;;51251:708;;:::o;7780:118::-;6743:19;:17;:19::i;:::-;7840:7:::1;:14:::0;;-1:-1:-1;;;;7840:14:0::1;-1:-1:-1::0;;;7840:14:0::1;::::0;;7870:20:::1;7877:12;175:10:::0;;95:98;41034:318;-1:-1:-1;;;;;41142:22:0;;41138:93;;41188:31;;-1:-1:-1;;;41188:31:0;;-1:-1:-1;;;;;2120:32:1;;41188:31:0;;;2102:51:1;2075:18;;41188:31:0;1956:203:1;41138:93:0;-1:-1:-1;;;;;41241:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41241:46:0;;;;;;;;;;41303:41;;540::1;;;41303::0;;513:18:1;41303:41:0;;;;;;;41034:318;;;:::o;22288:988::-;-1:-1:-1;;;;;22475:14:0;;;:18;22471:798;;22514:67;;-1:-1:-1;;;22514:67:0;;-1:-1:-1;;;;;22514:36:0;;;;;:67;;22551:8;;22561:4;;22567:7;;22576:4;;22514:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22514:67:0;;;;;;;;-1:-1:-1;;22514:67:0;;;;;;;;;;;;:::i;:::-;;;22510:748;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22877:6;:13;22894:1;22877:18;22873:370;;22983:39;;-1:-1:-1;;;22983:39:0;;-1:-1:-1;;;;;2120:32:1;;22983:39:0;;;2102:51:1;2075:18;;22983:39:0;1956:203:1;22873:370:0;23193:6;23187:13;23178:6;23174:2;23170:15;23163:38;22510:748;-1:-1:-1;;;;;;22629:51:0;;-1:-1:-1;;;22629:51:0;22625:185;;22751:39;;-1:-1:-1;;;22751:39:0;;-1:-1:-1;;;;;2120:32:1;;22751:39:0;;;2102:51:1;2075:18;;22751:39:0;1956:203:1;50791:97:0;50843:13;50876:4;50869:11;;;;;:::i;8392:723::-;8448:13;8669:5;8678:1;8669:10;8665:53;;-1:-1:-1;;8696:10:0;;;;;;;;;;;;-1:-1:-1;;;8696:10:0;;;;;8392:723::o;8665:53::-;8743:5;8728:12;8784:78;8791:9;;8784:78;;8817:8;;;;:::i;:::-;;-1:-1:-1;8840:10:0;;-1:-1:-1;8848:2:0;8840:10;;:::i;:::-;;;8784:78;;;8872:19;8904:6;8894:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8894:17:0;;8872:39;;8922:154;8929:10;;8922:154;;8956:11;8966:1;8956:11;;:::i;:::-;;-1:-1:-1;9025:10:0;9033:2;9025:5;:10;:::i;:::-;9012:24;;:2;:24;:::i;:::-;8999:39;;8982:6;8989;8982:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8982:56:0;;;;;;;;-1:-1:-1;9053:11:0;9062:2;9053:11;;:::i;:::-;;;8922:154;;40137:678;40299:9;:31;;;-1:-1:-1;;;;;;40312:18:0;;;;40299:31;40295:471;;;40347:13;40363:22;40377:7;40363:13;:22::i;:::-;40347:38;-1:-1:-1;;;;;;40516:18:0;;;;;;:35;;;40547:4;-1:-1:-1;;;;;40538:13:0;:5;-1:-1:-1;;;;;40538:13:0;;;40516:35;:69;;;;;40556:29;40573:5;40580:4;40556:16;:29::i;:::-;40555:30;40516:69;40512:144;;;40613:27;;-1:-1:-1;;;40613:27:0;;-1:-1:-1;;;;;2120:32:1;;40613:27:0;;;2102:51:1;2075:18;;40613:27:0;1956:203:1;40512:144:0;40676:9;40672:83;;;40731:7;40727:2;-1:-1:-1;;;;;40711:28:0;40720:5;-1:-1:-1;;;;;40711:28:0;;;;;;;;;;;40672:83;40332:434;40295:471;-1:-1:-1;;40778:24:0;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40778:29:0;-1:-1:-1;;;;;40778:29:0;;;;;;;;;;40137:678::o;34037:824::-;34123:7;30931:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30931:16:0;;;;34238:18;;;34234:88;;34273:37;34290:4;34296;34302:7;34273:16;:37::i;:::-;-1:-1:-1;;;;;34369:18:0;;;34365:263;;34487:48;34504:1;34508:7;34525:1;34529:5;34487:8;:48::i;:::-;-1:-1:-1;;;;;34581:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;34581:20:0;;;34365:263;-1:-1:-1;;;;;34644:16:0;;;34640:111;;-1:-1:-1;;;;;34706:13:0;;;;;;:9;:13;;;;;:18;;34723:1;34706:18;;;34640:111;34763:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34763:21:0;-1:-1:-1;;;;;34763:21:0;;;;;;;;;34802:27;;34763:16;;34802:27;;;;;;;34849:4;34037:824;-1:-1:-1;;;;34037:824:0:o;46264:1075::-;46530:22;46555:15;46565:4;46555:9;:15::i;:::-;46581:18;46602:26;;;:17;:26;;;;;;;;;-1:-1:-1;;;;;46705:18:0;;;;:12;:18;;;;;;46530:40;;-1:-1:-1;46602:26:0;46830:28;;;46826:330;;46875:19;46897:35;;;;;;;;;;;;46949:31;;;;;;:45;;;47067:30;;:17;:30;;;;;:43;;;46826:330;47252:26;;;;:17;:26;;;;;;;;47245:33;;;47296:35;;;;-1:-1:-1;47296:35:0;;47289:42;-1:-1:-1;46264:1075:0:o;47634:1079::-;47912:10;:17;47887:22;;47912:21;;47932:1;;47912:21;:::i;:::-;47944:18;47965:24;;;:15;:24;;;;;;48338:10;:26;;47887:46;;-1:-1:-1;47965:24:0;;47887:46;;48338:26;;;;;;:::i;:::-;;;;;;;;;48316:48;;48402:11;48377:10;48388;48377:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;48482:28;;;:15;:28;;;;;;;:41;;;48654:24;;;;;48647:31;48689:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47705:1008;;;47634:1079;:::o;45054:218::-;45139:14;45172:1;45156:13;45166:2;45156:9;:13::i;:::-;:17;;;;:::i;:::-;-1:-1:-1;;;;;45184:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;45229:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;45054:218:0:o;36773:232::-;36825:21;36849:40;36865:1;36869:7;36886:1;36849:7;:40::i;:::-;36825:64;-1:-1:-1;;;;;;36904:27:0;;36900:98;;36955:31;;-1:-1:-1;;;36955:31:0;;;;;2793:25:1;;;2766:18;;36955:31:0;2647:177:1;7506:130:0;7209:7;;-1:-1:-1;;;7209:7:0;;;;7565:64;;7602:15;;-1:-1:-1;;;7602:15:0;;;;;;;;;;;35895:102;35963:26;35973:2;35977:7;35963:26;;;;;;;;;;;;:9;:26::i;32244:376::-;32357:38;32371:5;32378:7;32387;32357:13;:38::i;:::-;32352:261;;-1:-1:-1;;;;;32416:19:0;;32412:190;;32463:31;;-1:-1:-1;;;32463:31:0;;;;;2793:25:1;;;2766:18;;32463:31:0;2647:177:1;32412:190:0;32542:44;;-1:-1:-1;;;32542:44:0;;-1:-1:-1;;;;;12339:32:1;;32542:44:0;;;12321:51:1;12388:18;;;12381:34;;;12294:18;;32542:44:0;12147:274:1;36224:210:0;36319:18;36325:2;36329:7;36319:5;:18::i;:::-;36348:78;175:10;36404:1;36408:2;36412:7;36421:4;36348:33;:78::i;31525:276::-;31628:4;-1:-1:-1;;;;;31665:21:0;;;;;;:128;;;31713:7;-1:-1:-1;;;;;31704:16:0;:5;-1:-1:-1;;;;;31704:16:0;;:52;;;;31724:32;31741:5;31748:7;31724:16;:32::i;:::-;31704:88;;;-1:-1:-1;;31146:7:0;31173:24;;;:15;:24;;;;;;-1:-1:-1;;;;;31173:24:0;;;31760:32;;;;31645:148;-1:-1:-1;31525:276:0:o;35197:335::-;-1:-1:-1;;;;;35265:16:0;;35261:89;;35305:33;;-1:-1:-1;;;35305:33:0;;35335:1;35305:33;;;2102:51:1;2075:18;;35305:33:0;1956:203:1;35261:89:0;35360:21;35384:32;35392:2;35396:7;35413:1;35384:7;:32::i;:::-;35360:56;-1:-1:-1;;;;;;35431:27:0;;;35427:98;;35482:31;;-1:-1:-1;;;35482:31:0;;35510:1;35482:31;;;2102:51:1;2075:18;;35482:31:0;1956:203:1;14:131;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:587::-;663:6;671;724:2;712:9;703:7;699:23;695:32;692:52;;;740:1;737;730:12;692:52;780:9;767:23;813:18;805:6;802:30;799:50;;;845:1;842;835:12;799:50;868:22;;921:4;913:13;;909:27;-1:-1:-1;899:55:1;;950:1;947;940:12;899:55;990:2;977:16;1016:18;1008:6;1005:30;1002:50;;;1048:1;1045;1038:12;1002:50;1093:7;1088:2;1079:6;1075:2;1071:15;1067:24;1064:37;1061:57;;;1114:1;1111;1104:12;1061:57;1145:2;1137:11;;;;;1167:6;;-1:-1:-1;592:587:1;-1:-1:-1;;;592:587:1:o;1184:300::-;1237:3;1275:5;1269:12;1302:6;1297:3;1290:19;1358:6;1351:4;1344:5;1340:16;1333:4;1328:3;1324:14;1318:47;1410:1;1403:4;1394:6;1389:3;1385:16;1381:27;1374:38;1473:4;1466:2;1462:7;1457:2;1449:6;1445:15;1441:29;1436:3;1432:39;1428:50;1421:57;;;1184:300;;;;:::o;1489:231::-;1638:2;1627:9;1620:21;1601:4;1658:56;1710:2;1699:9;1695:18;1687:6;1658:56;:::i;1725:226::-;1784:6;1837:2;1825:9;1816:7;1812:23;1808:32;1805:52;;;1853:1;1850;1843:12;1805:52;-1:-1:-1;1898:23:1;;1725:226;-1:-1:-1;1725:226:1:o;2164:173::-;2232:20;;-1:-1:-1;;;;;2281:31:1;;2271:42;;2261:70;;2327:1;2324;2317:12;2261:70;2164:173;;;:::o;2342:300::-;2410:6;2418;2471:2;2459:9;2450:7;2446:23;2442:32;2439:52;;;2487:1;2484;2477:12;2439:52;2510:29;2529:9;2510:29;:::i;:::-;2500:39;2608:2;2593:18;;;;2580:32;;-1:-1:-1;;;2342:300:1:o;2829:374::-;2906:6;2914;2922;2975:2;2963:9;2954:7;2950:23;2946:32;2943:52;;;2991:1;2988;2981:12;2943:52;3014:29;3033:9;3014:29;:::i;:::-;3004:39;;3062:38;3096:2;3085:9;3081:18;3062:38;:::i;:::-;2829:374;;3052:48;;-1:-1:-1;;;3169:2:1;3154:18;;;;3141:32;;2829:374::o;3208:186::-;3267:6;3320:2;3308:9;3299:7;3295:23;3291:32;3288:52;;;3336:1;3333;3326:12;3288:52;3359:29;3378:9;3359:29;:::i;3399:346::-;3467:6;3475;3528:2;3516:9;3507:7;3503:23;3499:32;3496:52;;;3544:1;3541;3534:12;3496:52;-1:-1:-1;;3589:23:1;;;3709:2;3694:18;;;3681:32;;-1:-1:-1;3399:346:1:o;3750:118::-;3836:5;3829:13;3822:21;3815:5;3812:32;3802:60;;3858:1;3855;3848:12;3873:435;3947:6;3955;3963;4016:2;4004:9;3995:7;3991:23;3987:32;3984:52;;;4032:1;4029;4022:12;3984:52;4055:29;4074:9;4055:29;:::i;:::-;4045:39;-1:-1:-1;4153:2:1;4138:18;;4125:32;;-1:-1:-1;4233:2:1;4218:18;;4205:32;4246:30;4205:32;4246:30;:::i;:::-;4295:7;4285:17;;;3873:435;;;;;:::o;4313:315::-;4378:6;4386;4439:2;4427:9;4418:7;4414:23;4410:32;4407:52;;;4455:1;4452;4445:12;4407:52;4478:29;4497:9;4478:29;:::i;:::-;4468:39;;4557:2;4546:9;4542:18;4529:32;4570:28;4592:5;4570:28;:::i;:::-;4617:5;4607:15;;;4313:315;;;;;:::o;4633:127::-;4694:10;4689:3;4685:20;4682:1;4675:31;4725:4;4722:1;4715:15;4749:4;4746:1;4739:15;4765:1207;4860:6;4868;4876;4884;4937:3;4925:9;4916:7;4912:23;4908:33;4905:53;;;4954:1;4951;4944:12;4905:53;4977:29;4996:9;4977:29;:::i;:::-;4967:39;;5025:38;5059:2;5048:9;5044:18;5025:38;:::i;:::-;5015:48;-1:-1:-1;5132:2:1;5117:18;;5104:32;;-1:-1:-1;5211:2:1;5196:18;;5183:32;5238:18;5227:30;;5224:50;;;5270:1;5267;5260:12;5224:50;5293:22;;5346:4;5338:13;;5334:27;-1:-1:-1;5324:55:1;;5375:1;5372;5365:12;5324:55;5415:2;5402:16;5441:18;5433:6;5430:30;5427:56;;;5463:18;;:::i;:::-;5512:2;5506:9;5604:2;5566:17;;-1:-1:-1;;5562:31:1;;;5595:2;5558:40;5554:54;5542:67;;5639:18;5624:34;;5660:22;;;5621:62;5618:88;;;5686:18;;:::i;:::-;5722:2;5715:22;5746;;;5787:15;;;5804:2;5783:24;5780:37;-1:-1:-1;5777:57:1;;;5830:1;5827;5820:12;5777:57;5886:6;5881:2;5877;5873:11;5868:2;5860:6;5856:15;5843:50;5939:1;5934:2;5925:6;5917;5913:19;5909:28;5902:39;5960:6;5950:16;;;;;4765:1207;;;;;;;:::o;5977:260::-;6045:6;6053;6106:2;6094:9;6085:7;6081:23;6077:32;6074:52;;;6122:1;6119;6112:12;6074:52;6145:29;6164:9;6145:29;:::i;:::-;6135:39;;6193:38;6227:2;6216:9;6212:18;6193:38;:::i;:::-;6183:48;;5977:260;;;;;:::o;6242:466::-;6319:6;6327;6335;6388:2;6376:9;6367:7;6363:23;6359:32;6356:52;;;6404:1;6401;6394:12;6356:52;-1:-1:-1;;6449:23:1;;;6569:2;6554:18;;6541:32;;-1:-1:-1;6672:2:1;6657:18;;;6644:32;;6242:466;-1:-1:-1;6242:466:1:o;6713:420::-;6790:6;6798;6806;6859:2;6847:9;6838:7;6834:23;6830:32;6827:52;;;6875:1;6872;6865:12;6827:52;6898:29;6917:9;6898:29;:::i;:::-;6888:39;6996:2;6981:18;;6968:32;;-1:-1:-1;7097:2:1;7082:18;;;7069:32;;6713:420;-1:-1:-1;;;6713:420:1:o;7138:::-;7191:3;7229:5;7223:12;7256:6;7251:3;7244:19;7288:4;7283:3;7279:14;7272:21;;7327:4;7320:5;7316:16;7350:1;7360:173;7374:6;7371:1;7368:13;7360:173;;;7435:13;;7423:26;;7478:4;7469:14;;;;7506:17;;;;7396:1;7389:9;7360:173;;;-1:-1:-1;7549:3:1;;7138:420;-1:-1:-1;;;;7138:420:1:o;7563:1574::-;8074:3;8063:9;8056:22;8037:4;8101:57;8153:3;8142:9;8138:19;8130:6;8101:57;:::i;:::-;8206:9;8198:6;8194:22;8189:2;8178:9;8174:18;8167:50;8240:44;8277:6;8269;8240:44;:::i;:::-;8226:58;;8332:9;8324:6;8320:22;8315:2;8304:9;8300:18;8293:50;8366:44;8403:6;8395;8366:44;:::i;:::-;8352:58;;8458:9;8450:6;8446:22;8441:2;8430:9;8426:18;8419:50;8492:44;8529:6;8521;8492:44;:::i;:::-;8478:58;;8585:9;8577:6;8573:22;8567:3;8556:9;8552:19;8545:51;8616:6;8651;8645:13;8682:6;8674;8667:22;8717:2;8709:6;8705:15;8698:22;;8776:2;8766:6;8763:1;8759:14;8751:6;8747:27;8743:36;8814:2;8806:6;8802:15;8835:1;8845:263;8859:6;8856:1;8853:13;8845:263;;;8949:2;8945:7;8936:6;8928;8924:19;8920:33;8915:3;8908:46;8977:51;9021:6;9012;9006:13;8977:51;:::i;:::-;9063:2;9086:12;;;;8967:61;;-1:-1:-1;9051:15:1;;;;;8881:1;8874:9;8845:263;;;-1:-1:-1;9125:6:1;;7563:1574;-1:-1:-1;;;;;;;;;;;7563:1574:1:o;9363:380::-;9442:1;9438:12;;;;9485;;;9506:61;;9560:4;9552:6;9548:17;9538:27;;9506:61;9613:2;9605:6;9602:14;9582:18;9579:38;9576:161;;9659:10;9654:3;9650:20;9647:1;9640:31;9694:4;9691:1;9684:15;9722:4;9719:1;9712:15;9576:161;;9363:380;;;:::o;9874:518::-;9976:2;9971:3;9968:11;9965:421;;;10012:5;10009:1;10002:16;10056:4;10053:1;10043:18;10126:2;10114:10;10110:19;10107:1;10103:27;10097:4;10093:38;10162:4;10150:10;10147:20;10144:47;;;-1:-1:-1;10185:4:1;10144:47;10240:2;10235:3;10231:12;10228:1;10224:20;10218:4;10214:31;10204:41;;10295:81;10313:2;10306:5;10303:13;10295:81;;;10372:1;10358:16;;10339:1;10328:13;10295:81;;10568:1198;10692:18;10687:3;10684:27;10681:53;;;10714:18;;:::i;:::-;10743:94;10833:3;10793:38;10825:4;10819:11;10793:38;:::i;:::-;10787:4;10743:94;:::i;:::-;10863:1;10888:2;10883:3;10880:11;10905:1;10900:608;;;;11552:1;11569:3;11566:93;;;-1:-1:-1;11625:19:1;;;11612:33;11566:93;-1:-1:-1;;10525:1:1;10521:11;;;10517:24;10513:29;10503:40;10549:1;10545:11;;;10500:57;11672:78;;10873:887;;10900:608;9821:1;9814:14;;;9858:4;9845:18;;-1:-1:-1;;10936:17:1;;;11051:229;11065:7;11062:1;11059:14;11051:229;;;11154:19;;;11141:33;11126:49;;11261:4;11246:20;;;;11214:1;11202:14;;;;11081:12;11051:229;;;11055:3;11308;11299:7;11296:16;11293:159;;;11432:1;11428:6;11422:3;11416;11413:1;11409:11;11405:21;11401:34;11397:39;11384:9;11379:3;11375:19;11362:33;11358:79;11350:6;11343:95;11293:159;;;11495:1;11489:3;11486:1;11482:11;11478:19;11472:4;11465:33;10873:887;;10568:1198;;;:::o;12426:338::-;12628:2;12610:21;;;12667:2;12647:18;;;12640:30;-1:-1:-1;;;12701:2:1;12686:18;;12679:44;12755:2;12740:18;;12426:338::o;13113:127::-;13174:10;13169:3;13165:20;13162:1;13155:31;13205:4;13202:1;13195:15;13229:4;13226:1;13219:15;13962:245;14029:6;14082:2;14070:9;14061:7;14057:23;14053:32;14050:52;;;14098:1;14095;14088:12;14050:52;14130:9;14124:16;14149:28;14171:5;14149:28;:::i;14553:127::-;14614:10;14609:3;14605:20;14602:1;14595:31;14645:4;14642:1;14635:15;14669:4;14666:1;14659:15;14685:125;14750:9;;;14771:10;;;14768:36;;;14784:18;;:::i;14815:212::-;14857:3;14895:5;14889:12;14939:6;14932:4;14925:5;14921:16;14916:3;14910:36;15001:1;14965:16;;14990:13;;;-1:-1:-1;14965:16:1;;14815:212;-1:-1:-1;14815:212:1:o;15032:267::-;15211:3;15236:57;15262:30;15288:3;15280:6;15262:30;:::i;:::-;15254:6;15236:57;:::i;15649:128::-;15716:9;;;15737:11;;;15734:37;;;15751:18;;:::i;15782:135::-;15821:3;15842:17;;;15839:43;;15862:18;;:::i;:::-;-1:-1:-1;15909:1:1;15898:13;;15782:135::o;16175:168::-;16248:9;;;16279;;16296:15;;;16290:22;;16276:37;16266:71;;16317:18;;:::i;16348:127::-;16409:10;16404:3;16400:20;16397:1;16390:31;16440:4;16437:1;16430:15;16464:4;16461:1;16454:15;16480:120;16520:1;16546;16536:35;;16551:18;;:::i;:::-;-1:-1:-1;16585:9:1;;16480:120::o;17288:496::-;-1:-1:-1;;;;;17519:32:1;;;17501:51;;17588:32;;17583:2;17568:18;;17561:60;17652:2;17637:18;;17630:34;;;17700:3;17695:2;17680:18;;17673:31;;;-1:-1:-1;;17721:57:1;;17758:19;;17750:6;17721:57;:::i;:::-;17713:65;17288:496;-1:-1:-1;;;;;;17288:496:1:o;17789:249::-;17858:6;17911:2;17899:9;17890:7;17886:23;17882:32;17879:52;;;17927:1;17924;17917:12;17879:52;17959:9;17953:16;17978:30;18002:5;17978:30;:::i;18043:112::-;18075:1;18101;18091:35;;18106:18;;:::i;:::-;-1:-1:-1;18140:9:1;;18043:112::o;18160:127::-;18221:10;18216:3;18212:20;18209:1;18202:31;18252:4;18249:1;18242:15;18276:4;18273:1;18266:15
Swarm Source
ipfs://b8806df1aba0e84c80a9215ecf9c67dba013d0a01a3541d068fb5eade8a3ce70
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.