ERC-20
Overview
Max Total Supply
5,165.10043882845 JUICE
Holders
5
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
4,178.775149441 JUICEValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Juice
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-03 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/introspection/IERC165.sol /** * @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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol /** * @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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @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); /** * @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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol /** * @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 tokenId); /** * @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); } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Context.sol /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } } // File: contracts/Token.sol // contracts/Token.sol contract Juice is ERC20Burnable, Ownable { using SafeMath for uint256; uint256 public MAX_WALLET_STAKED = 100; uint256 public EMISSIONS_RATE = 11574070000000; address nullAddress = 0x0000000000000000000000000000000000000000; address public nfTokenAddress; //Mapping of mouse to timestamp mapping(uint256 => uint256) internal tokenIdToTimeStamp; //Mapping of mouse to staker mapping(uint256 => address) internal tokenIdToStaker; //Mapping of staker to NFT id mapping(address => uint256[]) internal stakerToTokenIds; uint256 internal stakedCount = 0; constructor() ERC20("Juice", "JUICE") {} function setNfTokenAddress(address _nfTokenAddress) public onlyOwner { nfTokenAddress = _nfTokenAddress; return; } function getTokensStaked(address staker) public view returns (uint256[] memory) { return stakerToTokenIds[staker]; } /** * @dev Get Staked Count */ function getStakedCount() public view returns (uint256) { return stakedCount; } function remove(address staker, uint256 index) internal { if (index >= stakerToTokenIds[staker].length) return; for (uint256 i = index; i < stakerToTokenIds[staker].length - 1; i++) { stakerToTokenIds[staker][i] = stakerToTokenIds[staker][i + 1]; } stakerToTokenIds[staker].pop(); stakedCount--; } function removeTokenIdFromStaker(address staker, uint256 tokenId) internal { for (uint256 i = 0; i < stakerToTokenIds[staker].length; i++) { if (stakerToTokenIds[staker][i] == tokenId) { //This is the tokenId to remove; remove(staker, i); } } } function stakeByIds(uint256[] memory tokenIds) public { require( stakerToTokenIds[msg.sender].length + tokenIds.length <= MAX_WALLET_STAKED, "Must have less than 50 tokens staked!" ); for (uint256 i = 0; i < tokenIds.length; i++) { require( IERC721(nfTokenAddress).ownerOf(tokenIds[i]) == msg.sender && tokenIdToStaker[tokenIds[i]] == nullAddress, "Token must be stakable by you!" ); IERC721(nfTokenAddress).transferFrom( msg.sender, address(this), tokenIds[i] ); stakerToTokenIds[msg.sender].push(tokenIds[i]); tokenIdToTimeStamp[tokenIds[i]] = block.timestamp; tokenIdToStaker[tokenIds[i]] = msg.sender; stakedCount++; } } function unstakeAll() public { require( stakerToTokenIds[msg.sender].length > 0, "Must have at least one token staked!" ); uint256 totalRewards = 0; for (uint256 i = stakerToTokenIds[msg.sender].length; i > 0; i--) { uint256 tokenId = stakerToTokenIds[msg.sender][i - 1]; IERC721(nfTokenAddress).transferFrom( address(this), msg.sender, tokenId ); totalRewards = totalRewards + ((block.timestamp - tokenIdToTimeStamp[tokenId]) * emissionRateByTokenId(tokenId)); removeTokenIdFromStaker(msg.sender, tokenId); tokenIdToStaker[tokenId] = nullAddress; } _mint(msg.sender, totalRewards); } function unstakeByIds(uint256[] memory tokenIds) public { uint256 totalRewards = 0; for (uint256 i = 0; i < tokenIds.length; i++) { require( tokenIdToStaker[tokenIds[i]] == msg.sender, "Message Sender was not original staker!" ); IERC721(nfTokenAddress).transferFrom( address(this), msg.sender, tokenIds[i] ); totalRewards = totalRewards + ((block.timestamp - tokenIdToTimeStamp[tokenIds[i]]) * emissionRateByTokenId(tokenIds[i])); removeTokenIdFromStaker(msg.sender, tokenIds[i]); tokenIdToStaker[tokenIds[i]] = nullAddress; } _mint(msg.sender, totalRewards); } function claimByTokenId(uint256 tokenId) public { require( tokenIdToStaker[tokenId] == msg.sender, "Token is not claimable by you!" ); _mint( msg.sender, ((block.timestamp - tokenIdToTimeStamp[tokenId]) * emissionRateByTokenId(tokenId)) ); tokenIdToTimeStamp[tokenId] = block.timestamp; } function claimAll() public { uint256[] memory tokenIds = stakerToTokenIds[msg.sender]; uint256 totalRewards = 0; for (uint256 i = 0; i < tokenIds.length; i++) { require( tokenIdToStaker[tokenIds[i]] == msg.sender, "Token is not claimable by you!" ); totalRewards = totalRewards + ((block.timestamp - tokenIdToTimeStamp[tokenIds[i]]) * emissionRateByTokenId(tokenIds[i])); tokenIdToTimeStamp[tokenIds[i]] = block.timestamp; } _mint(msg.sender, totalRewards); } function getAllRewards(address staker) public view returns (uint256) { uint256[] memory tokenIds = stakerToTokenIds[staker]; uint256 totalRewards = 0; for (uint256 i = 0; i < tokenIds.length; i++) { totalRewards = totalRewards + ((block.timestamp - tokenIdToTimeStamp[tokenIds[i]]) * emissionRateByTokenId(tokenIds[i])); } return totalRewards; } function getRewardsByTokenId(uint256 tokenId) public view returns (uint256) { require( tokenIdToStaker[tokenId] != nullAddress, "Token is not staked!" ); uint256 secondsStaked = block.timestamp - tokenIdToTimeStamp[tokenId]; return secondsStaked * emissionRateByTokenId(tokenId); } function getStaker(uint256 tokenId) public view returns (address) { return tokenIdToStaker[tokenId]; } /** * @dev Returns the current emission rate by token id */ function emissionRateByTokenId(uint256 tokenId) public view returns (uint256) { if(tokenId <= 4096) return 1 * EMISSIONS_RATE; if(tokenId > 4096 && tokenId <= 6144) return 2 * EMISSIONS_RATE; if(tokenId > 6144 && tokenId <= 7168) return 3 * EMISSIONS_RATE; if(tokenId > 7168 && tokenId <= 7680) return 4 * EMISSIONS_RATE; if(tokenId > 7680 && tokenId <= 7936) return 5 * EMISSIONS_RATE; if(tokenId > 7936 && tokenId <= 8064) return 6 * EMISSIONS_RATE; if(tokenId > 8064 && tokenId <= 8128) return 7 * EMISSIONS_RATE; if(tokenId > 8128 && tokenId <= 8160) return 8 * EMISSIONS_RATE; if(tokenId > 8160 && tokenId <= 8176) return 16 * EMISSIONS_RATE; if(tokenId > 8176 && tokenId <= 8184) return 32 * EMISSIONS_RATE; if(tokenId > 8184 && tokenId <= 8188) return 64 * EMISSIONS_RATE; if(tokenId > 8188 && tokenId <= 8190) return 128 * EMISSIONS_RATE; if(tokenId > 8190 && tokenId == 8191) return 256 * EMISSIONS_RATE; revert(); } function mintForBurnedNft(address account, uint256 amount) public { require(nfTokenAddress == msg.sender, "You can't call this method"); _mint(account, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EMISSIONS_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WALLET_STAKED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimByTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"emissionRateByTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getAllRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRewardsByTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTokensStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintForBurnedNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nfTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nfTokenAddress","type":"address"}],"name":"setNfTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeByIds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526064600655650a86cc54b980600755600880546001600160a01b03191690556000600d553480156200003557600080fd5b50604051806040016040528060058152602001644a7569636560d81b815250604051806040016040528060058152602001644a5549434560d81b81525081600390805190602001906200008a92919062000119565b508051620000a090600490602084019062000119565b505050620000bd620000b7620000c360201b60201c565b620000c7565b620001fc565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012790620001bf565b90600052602060002090601f0160209004810192826200014b576000855562000196565b82601f106200016657805160ff191683800117855562000196565b8280016001018555821562000196579182015b828111156200019657825182559160200191906001019062000179565b50620001a4929150620001a8565b5090565b5b80821115620001a45760008155600101620001a9565b600181811c90821680620001d457607f821691505b60208210811415620001f657634e487b7160e01b600052602260045260246000fd5b50919050565b6121ab806200020c6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e1461040f578063e3c998fe14610448578063f2fde38b14610471578063f421f0b71461048457600080fd5b8063a9059cbb146103d8578063ba7e7662146103eb578063d1058e59146103f4578063d9ffad47146103fc57600080fd5b80638ab8fab3116100de5780638ab8fab3146103a35780638da5cb5b146103ac57806395d89b41146103bd578063a457c2d7146103c557600080fd5b8063715018a61461036d57806372d40ff11461037557806379cc67901461038857806386d170821461039b57600080fd5b806342966c68116101875780635666b7ad116101565780635666b7ad146102f35780635e1f1e2a1461031e5780636954e70d1461033157806370a082311461034457600080fd5b806342966c681461029a57806348aa1936146102ad578063515ec105146102c057806352eb7796146102d357600080fd5b8063313ce567116101c3578063313ce5671461025b57806335322f371461026a578063362a3fad14610274578063395093511461028757600080fd5b806306fdde03146101f5578063095ea7b31461021357806318160ddd1461023657806323b872dd14610248575b600080fd5b6101fd610497565b60405161020a9190611fc3565b60405180910390f35b610226610221366004611e75565b610529565b604051901515815260200161020a565b6002545b60405190815260200161020a565b610226610256366004611e34565b61053f565b6040516012815260200161020a565b6102726105ee565b005b61023a610282366004611dc1565b61079f565b610226610295366004611e75565b61089a565b6102726102a8366004611f66565b6108d6565b6102726102bb366004611ea1565b6108e0565b61023a6102ce366004611f66565b610b3b565b6102e66102e1366004611dc1565b610bd6565b60405161020a9190611f7f565b600954610306906001600160a01b031681565b6040516001600160a01b03909116815260200161020a565b61027261032c366004611f66565b610c42565b61023a61033f366004611f66565b610cf0565b61023a610352366004611dc1565b6001600160a01b031660009081526020819052604090205490565b610272610ed6565b610272610383366004611dc1565b610f0c565b610272610396366004611e75565b610f56565b600d5461023a565b61023a60065481565b6005546001600160a01b0316610306565b6101fd610fdc565b6102266103d3366004611e75565b610feb565b6102266103e6366004611e75565b611084565b61023a60075481565b610272611091565b61027261040a366004611ea1565b611234565b61023a61041d366004611dfb565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610306610456366004611f66565b6000908152600b60205260409020546001600160a01b031690565b61027261047f366004611dc1565b611599565b610272610492366004611e75565b611631565b6060600380546104a6906120b2565b80601f01602080910402602001604051908101604052809291908181526020018280546104d2906120b2565b801561051f5780601f106104f45761010080835404028352916020019161051f565b820191906000526020600020905b81548152906001019060200180831161050257829003601f168201915b5050505050905090565b6000610536338484611695565b50600192915050565b600061054c8484846117b9565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105d65760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105e38533858403611695565b506001949350505050565b336000908152600c60205260409020546106565760405162461bcd60e51b8152602060048201526024808201527f4d7573742068617665206174206c65617374206f6e6520746f6b656e207374616044820152636b65642160e01b60648201526084016105cd565b336000908152600c60205260408120545b801561079157336000908152600c60205260408120610687600184612084565b8154811061069757610697612134565b6000918252602090912001546009546040516323b872dd60e01b8152306004820152336024820152604481018390529192506001600160a01b0316906323b872dd90606401600060405180830381600087803b1580156106f657600080fd5b505af115801561070a573d6000803e3d6000fd5b5050505061071781610cf0565b6000828152600a60205260409020546107309042612084565b61073a9190612065565b610744908461204d565b92506107503382611988565b6008546000918252600b602052604090912080546001600160a01b0319166001600160a01b03909216919091179055806107898161209b565b915050610667565b5061079c3382611a05565b50565b6001600160a01b0381166000908152600c60209081526040808320805482518185028101850190935280835284938301828280156107fc57602002820191906000526020600020905b8154815260200190600101908083116107e8575b505050505090506000805b82518110156108925761083283828151811061082557610825612134565b6020026020010151610cf0565b600a600085848151811061084857610848612134565b60200260200101518152602001908152602001600020544261086a9190612084565b6108749190612065565b61087e908361204d565b91508061088a816120ed565b915050610807565b509392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105369185906108d190869061204d565b611695565b61079c3382611ae4565b6000805b8251811015610b2c57336001600160a01b0316600b600085848151811061090d5761090d612134565b6020908102919091018101518252810191909152604001600020546001600160a01b03161461098e5760405162461bcd60e51b815260206004820152602760248201527f4d6573736167652053656e64657220776173206e6f74206f726967696e616c206044820152667374616b65722160c81b60648201526084016105cd565b60095483516001600160a01b03909116906323b872dd90309033908790869081106109bb576109bb612134565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610a1557600080fd5b505af1158015610a29573d6000803e3d6000fd5b50505050610a4283828151811061082557610825612134565b600a6000858481518110610a5857610a58612134565b602002602001015181526020019081526020016000205442610a7a9190612084565b610a849190612065565b610a8e908361204d565b9150610ab333848381518110610aa657610aa6612134565b6020026020010151611988565b600860009054906101000a90046001600160a01b0316600b6000858481518110610adf57610adf612134565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508080610b24906120ed565b9150506108e4565b50610b373382611a05565b5050565b6008546000828152600b602052604081205490916001600160a01b0391821691161415610ba15760405162461bcd60e51b8152602060048201526014602482015273546f6b656e206973206e6f74207374616b65642160601b60448201526064016105cd565b6000828152600a6020526040812054610bba9042612084565b9050610bc583610cf0565b610bcf9082612065565b9392505050565b6001600160a01b0381166000908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c3657602002820191906000526020600020905b815481526020019060010190808311610c22575b50505050509050919050565b6000818152600b60205260409020546001600160a01b03163314610ca85760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e206973206e6f7420636c61696d61626c6520627920796f7521000060448201526064016105cd565b610cdd33610cb583610cf0565b6000848152600a6020526040902054610cce9042612084565b610cd89190612065565b611a05565b6000908152600a60205260409020429055565b60006110008211610d0f57600754610d09906001612065565b92915050565b61100082118015610d2257506118008211155b15610d3557600754610d09906002612065565b61180082118015610d485750611c008211155b15610d5b57600754610d09906003612065565b611c0082118015610d6e5750611e008211155b15610d8157600754610d09906004612065565b611e0082118015610d945750611f008211155b15610da757600754610d09906005612065565b611f0082118015610dba5750611f808211155b15610dcd57600754610d09906006612065565b611f8082118015610de05750611fc08211155b15610df25760078054610d0991612065565b611fc082118015610e055750611fe08211155b15610e1857600754610d09906008612065565b611fe082118015610e2b5750611ff08211155b15610e3e57600754610d09906010612065565b611ff082118015610e515750611ff88211155b15610e6457600754610d09906020612065565b611ff882118015610e775750611ffc8211155b15610e8a57600754610d09906040612065565b611ffc82118015610e9d5750611ffe8211155b15610eb057600754610d09906080612065565b611ffe82118015610ec2575081611fff145b156101f057600754610d0990610100612065565b6005546001600160a01b03163314610f005760405162461bcd60e51b81526004016105cd90612018565b610f0a6000611c32565b565b6005546001600160a01b03163314610f365760405162461bcd60e51b81526004016105cd90612018565b600980546001600160a01b0383166001600160a01b031990911617905550565b6000610f62833361041d565b905081811015610fc05760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b60648201526084016105cd565b610fcd8333848403611695565b610fd78383611ae4565b505050565b6060600480546104a6906120b2565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561106d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105cd565b61107a3385858403611695565b5060019392505050565b60006105363384846117b9565b336000908152600c60209081526040808320805482518185028101850190935280835291929091908301828280156110e857602002820191906000526020600020905b8154815260200190600101908083116110d4575b505050505090506000805b8251811015610b2c57336001600160a01b0316600b600085848151811061111c5761111c612134565b6020908102919091018101518252810191909152604001600020546001600160a01b03161461118d5760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e206973206e6f7420636c61696d61626c6520627920796f7521000060448201526064016105cd565b6111a283828151811061082557610825612134565b600a60008584815181106111b8576111b8612134565b6020026020010151815260200190815260200160002054426111da9190612084565b6111e49190612065565b6111ee908361204d565b915042600a600085848151811061120757611207612134565b6020026020010151815260200190815260200160002081905550808061122c906120ed565b9150506110f3565b6006548151336000908152600c6020526040902054611253919061204d565b11156112af5760405162461bcd60e51b815260206004820152602560248201527f4d7573742068617665206c657373207468616e20353020746f6b656e73207374604482015264616b65642160d81b60648201526084016105cd565b60005b8151811015610b3757600954825133916001600160a01b031690636352211e908590859081106112e4576112e4612134565b60200260200101516040518263ffffffff1660e01b815260040161130a91815260200190565b60206040518083038186803b15801561132257600080fd5b505afa158015611336573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135a9190611dde565b6001600160a01b03161480156113ba575060085482516001600160a01b0390911690600b9060009085908590811061139457611394612134565b6020908102919091018101518252810191909152604001600020546001600160a01b0316145b6114065760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e206d757374206265207374616b61626c6520627920796f7521000060448201526064016105cd565b60095482516001600160a01b03909116906323b872dd903390309086908690811061143357611433612134565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561148d57600080fd5b505af11580156114a1573d6000803e3d6000fd5b5050336000908152600c602052604090208451909250849150839081106114ca576114ca612134565b602090810291909101810151825460018101845560009384529183209091015582514291600a9185908590811061150357611503612134565b602002602001015181526020019081526020016000208190555033600b600084848151811061153457611534612134565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d6000815480929190611581906120ed565b91905055508080611591906120ed565b9150506112b2565b6005546001600160a01b031633146115c35760405162461bcd60e51b81526004016105cd90612018565b6001600160a01b0381166116285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105cd565b61079c81611c32565b6009546001600160a01b0316331461168b5760405162461bcd60e51b815260206004820152601a60248201527f596f752063616e27742063616c6c2074686973206d6574686f6400000000000060448201526064016105cd565b610b378282611a05565b6001600160a01b0383166116f75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105cd565b6001600160a01b0382166117585760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105cd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661181d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105cd565b6001600160a01b03821661187f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105cd565b6001600160a01b038316600090815260208190526040902054818110156118f75760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105cd565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061192e90849061204d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161197a91815260200190565b60405180910390a350505050565b60005b6001600160a01b0383166000908152600c6020526040902054811015610fd7576001600160a01b0383166000908152600c602052604090208054839190839081106119d8576119d8612134565b906000526020600020015414156119f3576119f38382611c84565b806119fd816120ed565b91505061198b565b6001600160a01b038216611a5b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105cd565b8060026000828254611a6d919061204d565b90915550506001600160a01b03821660009081526020819052604081208054839290611a9a90849061204d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216611b445760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105cd565b6001600160a01b03821660009081526020819052604090205481811015611bb85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105cd565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611be7908490612084565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152600c60205260409020548110611ca7575050565b805b6001600160a01b0383166000908152600c6020526040902054611cce90600190612084565b811015611d67576001600160a01b0383166000908152600c60205260409020611cf882600161204d565b81548110611d0857611d08612134565b9060005260206000200154600c6000856001600160a01b03166001600160a01b031681526020019081526020016000208281548110611d4957611d49612134565b60009182526020909120015580611d5f816120ed565b915050611ca9565b506001600160a01b0382166000908152600c60205260409020805480611d8f57611d8f61211e565b60019003818190600052602060002001600090559055600d6000815480929190611db89061209b565b91905055505050565b600060208284031215611dd357600080fd5b8135610bcf81612160565b600060208284031215611df057600080fd5b8151610bcf81612160565b60008060408385031215611e0e57600080fd5b8235611e1981612160565b91506020830135611e2981612160565b809150509250929050565b600080600060608486031215611e4957600080fd5b8335611e5481612160565b92506020840135611e6481612160565b929592945050506040919091013590565b60008060408385031215611e8857600080fd5b8235611e9381612160565b946020939093013593505050565b60006020808385031215611eb457600080fd5b823567ffffffffffffffff80821115611ecc57600080fd5b818501915085601f830112611ee057600080fd5b813581811115611ef257611ef261214a565b8060051b604051601f19603f83011681018181108582111715611f1757611f1761214a565b604052828152858101935084860182860187018a1015611f3657600080fd5b600095505b83861015611f59578035855260019590950194938601938601611f3b565b5098975050505050505050565b600060208284031215611f7857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015611fb757835183529284019291840191600101611f9b565b50909695505050505050565b600060208083528351808285015260005b81811015611ff057858101830151858201604001528201611fd4565b81811115612002576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561206057612060612108565b500190565b600081600019048311821515161561207f5761207f612108565b500290565b60008282101561209657612096612108565b500390565b6000816120aa576120aa612108565b506000190190565b600181811c908216806120c657607f821691505b602082108114156120e757634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561210157612101612108565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461079c57600080fdfea2646970667358221220fa79e7b6fb9795d8c9e5d0fa309dd6d458a51038938637bbce291c51d5b6eeb464736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e1461040f578063e3c998fe14610448578063f2fde38b14610471578063f421f0b71461048457600080fd5b8063a9059cbb146103d8578063ba7e7662146103eb578063d1058e59146103f4578063d9ffad47146103fc57600080fd5b80638ab8fab3116100de5780638ab8fab3146103a35780638da5cb5b146103ac57806395d89b41146103bd578063a457c2d7146103c557600080fd5b8063715018a61461036d57806372d40ff11461037557806379cc67901461038857806386d170821461039b57600080fd5b806342966c68116101875780635666b7ad116101565780635666b7ad146102f35780635e1f1e2a1461031e5780636954e70d1461033157806370a082311461034457600080fd5b806342966c681461029a57806348aa1936146102ad578063515ec105146102c057806352eb7796146102d357600080fd5b8063313ce567116101c3578063313ce5671461025b57806335322f371461026a578063362a3fad14610274578063395093511461028757600080fd5b806306fdde03146101f5578063095ea7b31461021357806318160ddd1461023657806323b872dd14610248575b600080fd5b6101fd610497565b60405161020a9190611fc3565b60405180910390f35b610226610221366004611e75565b610529565b604051901515815260200161020a565b6002545b60405190815260200161020a565b610226610256366004611e34565b61053f565b6040516012815260200161020a565b6102726105ee565b005b61023a610282366004611dc1565b61079f565b610226610295366004611e75565b61089a565b6102726102a8366004611f66565b6108d6565b6102726102bb366004611ea1565b6108e0565b61023a6102ce366004611f66565b610b3b565b6102e66102e1366004611dc1565b610bd6565b60405161020a9190611f7f565b600954610306906001600160a01b031681565b6040516001600160a01b03909116815260200161020a565b61027261032c366004611f66565b610c42565b61023a61033f366004611f66565b610cf0565b61023a610352366004611dc1565b6001600160a01b031660009081526020819052604090205490565b610272610ed6565b610272610383366004611dc1565b610f0c565b610272610396366004611e75565b610f56565b600d5461023a565b61023a60065481565b6005546001600160a01b0316610306565b6101fd610fdc565b6102266103d3366004611e75565b610feb565b6102266103e6366004611e75565b611084565b61023a60075481565b610272611091565b61027261040a366004611ea1565b611234565b61023a61041d366004611dfb565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610306610456366004611f66565b6000908152600b60205260409020546001600160a01b031690565b61027261047f366004611dc1565b611599565b610272610492366004611e75565b611631565b6060600380546104a6906120b2565b80601f01602080910402602001604051908101604052809291908181526020018280546104d2906120b2565b801561051f5780601f106104f45761010080835404028352916020019161051f565b820191906000526020600020905b81548152906001019060200180831161050257829003601f168201915b5050505050905090565b6000610536338484611695565b50600192915050565b600061054c8484846117b9565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105d65760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105e38533858403611695565b506001949350505050565b336000908152600c60205260409020546106565760405162461bcd60e51b8152602060048201526024808201527f4d7573742068617665206174206c65617374206f6e6520746f6b656e207374616044820152636b65642160e01b60648201526084016105cd565b336000908152600c60205260408120545b801561079157336000908152600c60205260408120610687600184612084565b8154811061069757610697612134565b6000918252602090912001546009546040516323b872dd60e01b8152306004820152336024820152604481018390529192506001600160a01b0316906323b872dd90606401600060405180830381600087803b1580156106f657600080fd5b505af115801561070a573d6000803e3d6000fd5b5050505061071781610cf0565b6000828152600a60205260409020546107309042612084565b61073a9190612065565b610744908461204d565b92506107503382611988565b6008546000918252600b602052604090912080546001600160a01b0319166001600160a01b03909216919091179055806107898161209b565b915050610667565b5061079c3382611a05565b50565b6001600160a01b0381166000908152600c60209081526040808320805482518185028101850190935280835284938301828280156107fc57602002820191906000526020600020905b8154815260200190600101908083116107e8575b505050505090506000805b82518110156108925761083283828151811061082557610825612134565b6020026020010151610cf0565b600a600085848151811061084857610848612134565b60200260200101518152602001908152602001600020544261086a9190612084565b6108749190612065565b61087e908361204d565b91508061088a816120ed565b915050610807565b509392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105369185906108d190869061204d565b611695565b61079c3382611ae4565b6000805b8251811015610b2c57336001600160a01b0316600b600085848151811061090d5761090d612134565b6020908102919091018101518252810191909152604001600020546001600160a01b03161461098e5760405162461bcd60e51b815260206004820152602760248201527f4d6573736167652053656e64657220776173206e6f74206f726967696e616c206044820152667374616b65722160c81b60648201526084016105cd565b60095483516001600160a01b03909116906323b872dd90309033908790869081106109bb576109bb612134565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610a1557600080fd5b505af1158015610a29573d6000803e3d6000fd5b50505050610a4283828151811061082557610825612134565b600a6000858481518110610a5857610a58612134565b602002602001015181526020019081526020016000205442610a7a9190612084565b610a849190612065565b610a8e908361204d565b9150610ab333848381518110610aa657610aa6612134565b6020026020010151611988565b600860009054906101000a90046001600160a01b0316600b6000858481518110610adf57610adf612134565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508080610b24906120ed565b9150506108e4565b50610b373382611a05565b5050565b6008546000828152600b602052604081205490916001600160a01b0391821691161415610ba15760405162461bcd60e51b8152602060048201526014602482015273546f6b656e206973206e6f74207374616b65642160601b60448201526064016105cd565b6000828152600a6020526040812054610bba9042612084565b9050610bc583610cf0565b610bcf9082612065565b9392505050565b6001600160a01b0381166000908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c3657602002820191906000526020600020905b815481526020019060010190808311610c22575b50505050509050919050565b6000818152600b60205260409020546001600160a01b03163314610ca85760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e206973206e6f7420636c61696d61626c6520627920796f7521000060448201526064016105cd565b610cdd33610cb583610cf0565b6000848152600a6020526040902054610cce9042612084565b610cd89190612065565b611a05565b6000908152600a60205260409020429055565b60006110008211610d0f57600754610d09906001612065565b92915050565b61100082118015610d2257506118008211155b15610d3557600754610d09906002612065565b61180082118015610d485750611c008211155b15610d5b57600754610d09906003612065565b611c0082118015610d6e5750611e008211155b15610d8157600754610d09906004612065565b611e0082118015610d945750611f008211155b15610da757600754610d09906005612065565b611f0082118015610dba5750611f808211155b15610dcd57600754610d09906006612065565b611f8082118015610de05750611fc08211155b15610df25760078054610d0991612065565b611fc082118015610e055750611fe08211155b15610e1857600754610d09906008612065565b611fe082118015610e2b5750611ff08211155b15610e3e57600754610d09906010612065565b611ff082118015610e515750611ff88211155b15610e6457600754610d09906020612065565b611ff882118015610e775750611ffc8211155b15610e8a57600754610d09906040612065565b611ffc82118015610e9d5750611ffe8211155b15610eb057600754610d09906080612065565b611ffe82118015610ec2575081611fff145b156101f057600754610d0990610100612065565b6005546001600160a01b03163314610f005760405162461bcd60e51b81526004016105cd90612018565b610f0a6000611c32565b565b6005546001600160a01b03163314610f365760405162461bcd60e51b81526004016105cd90612018565b600980546001600160a01b0383166001600160a01b031990911617905550565b6000610f62833361041d565b905081811015610fc05760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b60648201526084016105cd565b610fcd8333848403611695565b610fd78383611ae4565b505050565b6060600480546104a6906120b2565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561106d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105cd565b61107a3385858403611695565b5060019392505050565b60006105363384846117b9565b336000908152600c60209081526040808320805482518185028101850190935280835291929091908301828280156110e857602002820191906000526020600020905b8154815260200190600101908083116110d4575b505050505090506000805b8251811015610b2c57336001600160a01b0316600b600085848151811061111c5761111c612134565b6020908102919091018101518252810191909152604001600020546001600160a01b03161461118d5760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e206973206e6f7420636c61696d61626c6520627920796f7521000060448201526064016105cd565b6111a283828151811061082557610825612134565b600a60008584815181106111b8576111b8612134565b6020026020010151815260200190815260200160002054426111da9190612084565b6111e49190612065565b6111ee908361204d565b915042600a600085848151811061120757611207612134565b6020026020010151815260200190815260200160002081905550808061122c906120ed565b9150506110f3565b6006548151336000908152600c6020526040902054611253919061204d565b11156112af5760405162461bcd60e51b815260206004820152602560248201527f4d7573742068617665206c657373207468616e20353020746f6b656e73207374604482015264616b65642160d81b60648201526084016105cd565b60005b8151811015610b3757600954825133916001600160a01b031690636352211e908590859081106112e4576112e4612134565b60200260200101516040518263ffffffff1660e01b815260040161130a91815260200190565b60206040518083038186803b15801561132257600080fd5b505afa158015611336573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135a9190611dde565b6001600160a01b03161480156113ba575060085482516001600160a01b0390911690600b9060009085908590811061139457611394612134565b6020908102919091018101518252810191909152604001600020546001600160a01b0316145b6114065760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e206d757374206265207374616b61626c6520627920796f7521000060448201526064016105cd565b60095482516001600160a01b03909116906323b872dd903390309086908690811061143357611433612134565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561148d57600080fd5b505af11580156114a1573d6000803e3d6000fd5b5050336000908152600c602052604090208451909250849150839081106114ca576114ca612134565b602090810291909101810151825460018101845560009384529183209091015582514291600a9185908590811061150357611503612134565b602002602001015181526020019081526020016000208190555033600b600084848151811061153457611534612134565b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d6000815480929190611581906120ed565b91905055508080611591906120ed565b9150506112b2565b6005546001600160a01b031633146115c35760405162461bcd60e51b81526004016105cd90612018565b6001600160a01b0381166116285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105cd565b61079c81611c32565b6009546001600160a01b0316331461168b5760405162461bcd60e51b815260206004820152601a60248201527f596f752063616e27742063616c6c2074686973206d6574686f6400000000000060448201526064016105cd565b610b378282611a05565b6001600160a01b0383166116f75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105cd565b6001600160a01b0382166117585760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105cd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661181d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105cd565b6001600160a01b03821661187f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105cd565b6001600160a01b038316600090815260208190526040902054818110156118f75760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105cd565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061192e90849061204d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161197a91815260200190565b60405180910390a350505050565b60005b6001600160a01b0383166000908152600c6020526040902054811015610fd7576001600160a01b0383166000908152600c602052604090208054839190839081106119d8576119d8612134565b906000526020600020015414156119f3576119f38382611c84565b806119fd816120ed565b91505061198b565b6001600160a01b038216611a5b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105cd565b8060026000828254611a6d919061204d565b90915550506001600160a01b03821660009081526020819052604081208054839290611a9a90849061204d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216611b445760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105cd565b6001600160a01b03821660009081526020819052604090205481811015611bb85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105cd565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611be7908490612084565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152600c60205260409020548110611ca7575050565b805b6001600160a01b0383166000908152600c6020526040902054611cce90600190612084565b811015611d67576001600160a01b0383166000908152600c60205260409020611cf882600161204d565b81548110611d0857611d08612134565b9060005260206000200154600c6000856001600160a01b03166001600160a01b031681526020019081526020016000208281548110611d4957611d49612134565b60009182526020909120015580611d5f816120ed565b915050611ca9565b506001600160a01b0382166000908152600c60205260409020805480611d8f57611d8f61211e565b60019003818190600052602060002001600090559055600d6000815480929190611db89061209b565b91905055505050565b600060208284031215611dd357600080fd5b8135610bcf81612160565b600060208284031215611df057600080fd5b8151610bcf81612160565b60008060408385031215611e0e57600080fd5b8235611e1981612160565b91506020830135611e2981612160565b809150509250929050565b600080600060608486031215611e4957600080fd5b8335611e5481612160565b92506020840135611e6481612160565b929592945050506040919091013590565b60008060408385031215611e8857600080fd5b8235611e9381612160565b946020939093013593505050565b60006020808385031215611eb457600080fd5b823567ffffffffffffffff80821115611ecc57600080fd5b818501915085601f830112611ee057600080fd5b813581811115611ef257611ef261214a565b8060051b604051601f19603f83011681018181108582111715611f1757611f1761214a565b604052828152858101935084860182860187018a1015611f3657600080fd5b600095505b83861015611f59578035855260019590950194938601938601611f3b565b5098975050505050505050565b600060208284031215611f7857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015611fb757835183529284019291840191600101611f9b565b50909695505050505050565b600060208083528351808285015260005b81811015611ff057858101830151858201604001528201611fd4565b81811115612002576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561206057612060612108565b500190565b600081600019048311821515161561207f5761207f612108565b500290565b60008282101561209657612096612108565b500390565b6000816120aa576120aa612108565b506000190190565b600181811c908216806120c657607f821691505b602082108114156120e757634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561210157612101612108565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461079c57600080fdfea2646970667358221220fa79e7b6fb9795d8c9e5d0fa309dd6d458a51038938637bbce291c51d5b6eeb464736f6c63430008070033
Deployed Bytecode Sourcemap
33397:8019:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22117:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24284:169;;;;;;:::i;:::-;;:::i;:::-;;;4402:14:1;;4395:22;4377:41;;4365:2;4350:18;24284:169:0;4237:187:1;23237:108:0;23325:12;;23237:108;;;12996:25:1;;;12984:2;12969:18;23237:108:0;12850:177:1;24935:492:0;;;;;;:::i;:::-;;:::i;23079:93::-;;;23162:2;13174:36:1;;13162:2;13147:18;23079:93:0;13032:184:1;36208:844:0;;;:::i;:::-;;38940:446;;;;;;:::i;:::-;;:::i;25836:215::-;;;;;;:::i;:::-;;:::i;32544:91::-;;;;;;:::i;:::-;;:::i;37060:825::-;;;;;;:::i;:::-;;:::i;39394:384::-;;;;;;:::i;:::-;;:::i;34220:162::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33653:29::-;;;;;-1:-1:-1;;;;;33653:29:0;;;;;;-1:-1:-1;;;;;3176:32:1;;;3158:51;;3146:2;3131:18;33653:29:0;3012:203:1;37893:394:0;;;;;;:::i;:::-;;:::i;39991:1229::-;;;;;;:::i;:::-;;:::i;23408:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23509:18:0;23482:7;23509:18;;;;;;;;;;;;23408:127;15996:94;;;:::i;34075:137::-;;;;;;:::i;:::-;;:::i;32954:368::-;;;;;;:::i;:::-;;:::i;34436:125::-;34542:11;;34436:125;;33480:38;;;;;;15345:87;15418:6;;-1:-1:-1;;;;;15418:6:0;15345:87;;22336:104;;;:::i;26554:413::-;;;;;;:::i;:::-;;:::i;23748:175::-;;;;;;:::i;:::-;;:::i;33525:46::-;;;;;;38295:637;;;:::i;35274:926::-;;;;;;:::i;:::-;;:::i;23986:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24102:18:0;;;24075:7;24102:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23986:151;39786:116;;;;;;:::i;:::-;39843:7;39870:24;;;:15;:24;;;;;;-1:-1:-1;;;;;39870:24:0;;39786:116;16245:192;;;;;;:::i;:::-;;:::i;41228:185::-;;;;;;:::i;:::-;;:::i;22117:100::-;22171:13;22204:5;22197:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22117:100;:::o;24284:169::-;24367:4;24384:39;14238:10;24407:7;24416:6;24384:8;:39::i;:::-;-1:-1:-1;24441:4:0;24284:169;;;;:::o;24935:492::-;25075:4;25092:36;25102:6;25110:9;25121:6;25092:9;:36::i;:::-;-1:-1:-1;;;;;25168:19:0;;25141:24;25168:19;;;:11;:19;;;;;;;;14238:10;25168:33;;;;;;;;25220:26;;;;25212:79;;;;-1:-1:-1;;;25212:79:0;;8735:2:1;25212:79:0;;;8717:21:1;8774:2;8754:18;;;8747:30;8813:34;8793:18;;;8786:62;-1:-1:-1;;;8864:18:1;;;8857:38;8912:19;;25212:79:0;;;;;;;;;25327:57;25336:6;14238:10;25377:6;25358:16;:25;25327:8;:57::i;:::-;-1:-1:-1;25415:4:0;;24935:492;-1:-1:-1;;;;24935:492:0:o;36208:844::-;36287:10;36308:1;36270:28;;;:16;:28;;;;;:35;36248:125;;;;-1:-1:-1;;;36248:125:0;;8330:2:1;36248:125:0;;;8312:21:1;8369:2;8349:18;;;8342:30;8408:34;8388:18;;;8381:62;-1:-1:-1;;;8459:18:1;;;8452:34;8503:19;;36248:125:0;8128:400:1;36248:125:0;36455:10;36384:20;36438:28;;;:16;:28;;;;;:35;36421:580;36475:5;;36421:580;;36537:10;36502:15;36520:28;;;:16;:28;;;;;36549:5;36553:1;36549;:5;:::i;:::-;36520:35;;;;;;;;:::i;:::-;;;;;;;;;;;36580:14;;36572:138;;-1:-1:-1;;;36572:138:0;;36635:4;36572:138;;;3460:34:1;36659:10:0;3510:18:1;;;3503:43;3562:18;;;3555:34;;;36520:35:0;;-1:-1:-1;;;;;;36580:14:0;;36572:36;;3395:18:1;;36572:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36842:30;36864:7;36842:21;:30::i;:::-;36811:27;;;;:18;:27;;;;;;36793:45;;:15;:45;:::i;:::-;36792:80;;;;:::i;:::-;36759:114;;:12;:114;:::i;:::-;36727:146;;36890:44;36914:10;36926:7;36890:23;:44::i;:::-;36978:11;;;36951:24;;;:15;:24;;;;;;:38;;-1:-1:-1;;;;;;36951:38:0;-1:-1:-1;;;;;36978:11:0;;;36951:38;;;;;;36482:3;;;;:::i;:::-;;;;36421:580;;;;37013:31;37019:10;37031:12;37013:5;:31::i;:::-;36237:815;36208:844::o;38940:446::-;-1:-1:-1;;;;;39048:24:0;;39000:7;39048:24;;;:16;:24;;;;;;;;39020:52;;;;;;;;;;;;;;;;;39000:7;;39020:52;;39048:24;39020:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39083:20;39125:9;39120:227;39144:8;:15;39140:1;:19;39120:227;;;39300:34;39322:8;39331:1;39322:11;;;;;;;;:::i;:::-;;;;;;;39300:21;:34::i;:::-;39265:18;:31;39284:8;39293:1;39284:11;;;;;;;;:::i;:::-;;;;;;;39265:31;;;;;;;;;;;;39247:15;:49;;;;:::i;:::-;39246:88;;;;:::i;:::-;39213:122;;:12;:122;:::i;:::-;39181:154;-1:-1:-1;39161:3:0;;;;:::i;:::-;;;;39120:227;;;-1:-1:-1;39366:12:0;38940:446;-1:-1:-1;;;38940:446:0:o;25836:215::-;14238:10;25924:4;25973:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;25973:34:0;;;;;;;;;;25924:4;;25941:80;;25964:7;;25973:47;;26010:10;;25973:47;:::i;:::-;25941:8;:80::i;32544:91::-;32600:27;14238:10;32620:6;32600:5;:27::i;37060:825::-;37127:20;37169:9;37164:670;37188:8;:15;37184:1;:19;37164:670;;;37283:10;-1:-1:-1;;;;;37251:42:0;:15;:28;37267:8;37276:1;37267:11;;;;;;;;:::i;:::-;;;;;;;;;;;;37251:28;;;;;;;;;;-1:-1:-1;37251:28:0;;-1:-1:-1;;;;;37251:28:0;:42;37225:143;;;;-1:-1:-1;;;37225:143:0;;9910:2:1;37225:143:0;;;9892:21:1;9949:2;9929:18;;;9922:30;9988:34;9968:18;;;9961:62;-1:-1:-1;;;10039:18:1;;;10032:37;10086:19;;37225:143:0;9708:403:1;37225:143:0;37393:14;;37501:11;;-1:-1:-1;;;;;37393:14:0;;;;37385:36;;37448:4;;37472:10;;37501:8;;37510:1;;37501:11;;;;;;:::i;:::-;;;;;;;;;;;37385:142;;-1:-1:-1;;;;;;37385:142:0;;;;;;;-1:-1:-1;;;;;3478:15:1;;;37385:142:0;;;3460:34:1;3530:15;;;;3510:18;;;3503:43;3562:18;;;3555:34;3395:18;;37385:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37663:34;37685:8;37694:1;37685:11;;;;;;;;:::i;37663:34::-;37628:18;:31;37647:8;37656:1;37647:11;;;;;;;;:::i;:::-;;;;;;;37628:31;;;;;;;;;;;;37610:15;:49;;;;:::i;:::-;37609:88;;;;:::i;:::-;37576:122;;:12;:122;:::i;:::-;37544:154;;37715:48;37739:10;37751:8;37760:1;37751:11;;;;;;;;:::i;:::-;;;;;;;37715:23;:48::i;:::-;37811:11;;;;;;;;;-1:-1:-1;;;;;37811:11:0;37780:15;:28;37796:8;37805:1;37796:11;;;;;;;;:::i;:::-;;;;;;;37780:28;;;;;;;;;;;;:42;;;;;-1:-1:-1;;;;;37780:42:0;;;;;-1:-1:-1;;;;;37780:42:0;;;;;;37205:3;;;;;:::i;:::-;;;;37164:670;;;;37846:31;37852:10;37864:12;37846:5;:31::i;:::-;37116:769;37060:825;:::o;39394:384::-;39563:11;;39488:7;39535:24;;;:15;:24;;;;;;39488:7;;-1:-1:-1;;;;;39535:24:0;;;39563:11;;39535:39;;39513:109;;;;-1:-1:-1;;;39513:109:0;;11937:2:1;39513:109:0;;;11919:21:1;11976:2;11956:18;;;11949:30;-1:-1:-1;;;11995:18:1;;;11988:50;12055:18;;39513:109:0;11735:344:1;39513:109:0;39635:21;39677:27;;;:18;:27;;;;;;39659:45;;:15;:45;:::i;:::-;39635:69;;39740:30;39762:7;39740:21;:30::i;:::-;39724:46;;:13;:46;:::i;:::-;39717:53;39394:384;-1:-1:-1;;;39394:384:0:o;34220:162::-;-1:-1:-1;;;;;34350:24:0;;;;;;:16;:24;;;;;;;;;34343:31;;;;;;;;;;;;;;;;;34309:16;;34343:31;;;34350:24;34343:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34220:162;;;:::o;37893:394::-;37974:24;;;;:15;:24;;;;;;-1:-1:-1;;;;;37974:24:0;38002:10;37974:38;37952:118;;;;-1:-1:-1;;;37952:118:0;;7971:2:1;37952:118:0;;;7953:21:1;8010:2;7990:18;;;7983:30;8049:32;8029:18;;;8022:60;8099:18;;37952:118:0;7769:354:1;37952:118:0;38083:138;38103:10;38179:30;38201:7;38179:21;:30::i;:::-;38148:27;;;;:18;:27;;;;;;38130:45;;:15;:45;:::i;:::-;38129:80;;;;:::i;:::-;38083:5;:138::i;:::-;38234:27;;;;:18;:27;;;;;38264:15;38234:45;;37893:394::o;39991:1229::-;40060:7;40096:4;40085:7;:15;40082:58;;40126:14;;40122:18;;:1;:18;:::i;:::-;40115:25;39991:1229;-1:-1:-1;;39991:1229:0:o;40082:58::-;40164:4;40154:7;:14;:33;;;;;40183:4;40172:7;:15;;40154:33;40151:76;;;40213:14;;40209:18;;:1;:18;:::i;40151:76::-;40251:4;40241:7;:14;:33;;;;;40270:4;40259:7;:15;;40241:33;40238:76;;;40300:14;;40296:18;;:1;:18;:::i;40238:76::-;40338:4;40328:7;:14;:33;;;;;40357:4;40346:7;:15;;40328:33;40325:76;;;40387:14;;40383:18;;:1;:18;:::i;40325:76::-;40425:4;40415:7;:14;:33;;;;;40444:4;40433:7;:15;;40415:33;40412:76;;;40474:14;;40470:18;;:1;:18;:::i;40412:76::-;40512:4;40502:7;:14;:33;;;;;40531:4;40520:7;:15;;40502:33;40499:76;;;40561:14;;40557:18;;:1;:18;:::i;40499:76::-;40599:4;40589:7;:14;:33;;;;;40618:4;40607:7;:15;;40589:33;40586:76;;;40648:14;;;40644:18;;;:::i;40586:76::-;40686:4;40676:7;:14;:33;;;;;40705:4;40694:7;:15;;40676:33;40673:76;;;40735:14;;40731:18;;:1;:18;:::i;40673:76::-;40773:4;40763:7;:14;:33;;;;;40792:4;40781:7;:15;;40763:33;40760:77;;;40823:14;;40818:19;;:2;:19;:::i;40760:77::-;40861:4;40851:7;:14;:33;;;;;40880:4;40869:7;:15;;40851:33;40848:77;;;40911:14;;40906:19;;:2;:19;:::i;40848:77::-;40949:4;40939:7;:14;:33;;;;;40968:4;40957:7;:15;;40939:33;40936:77;;;40999:14;;40994:19;;:2;:19;:::i;40936:77::-;41037:4;41027:7;:14;:33;;;;;41056:4;41045:7;:15;;41027:33;41024:78;;;41088:14;;41082:20;;:3;:20;:::i;41024:78::-;41126:4;41116:7;:14;:33;;;;;41134:7;41145:4;41134:15;41116:33;41113:78;;;41177:14;;41171:20;;:3;:20;:::i;15996:94::-;15418:6;;-1:-1:-1;;;;;15418:6:0;14238:10;15565:23;15557:68;;;;-1:-1:-1;;;15557:68:0;;;;;;;:::i;:::-;16061:21:::1;16079:1;16061:9;:21::i;:::-;15996:94::o:0;34075:137::-;15418:6;;-1:-1:-1;;;;;15418:6:0;14238:10;15565:23;15557:68;;;;-1:-1:-1;;;15557:68:0;;;;;;;:::i;:::-;34155:14:::1;:32:::0;;-1:-1:-1;;;;;34155:32:0;::::1;-1:-1:-1::0;;;;;;34155:32:0;;::::1;;::::0;;34075:137;:::o;32954:368::-;33031:24;33058:32;33068:7;14238:10;23986:151;:::i;33058:32::-;33031:59;;33129:6;33109:16;:26;;33101:75;;;;-1:-1:-1;;;33101:75:0;;9505:2:1;33101:75:0;;;9487:21:1;9544:2;9524:18;;;9517:30;9583:34;9563:18;;;9556:62;-1:-1:-1;;;9634:18:1;;;9627:34;9678:19;;33101:75:0;9303:400:1;33101:75:0;33212:58;33221:7;14238:10;33263:6;33244:16;:25;33212:8;:58::i;:::-;33292:22;33298:7;33307:6;33292:5;:22::i;:::-;33020:302;32954:368;;:::o;22336:104::-;22392:13;22425:7;22418:14;;;;;:::i;26554:413::-;14238:10;26647:4;26691:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;26691:34:0;;;;;;;;;;26744:35;;;;26736:85;;;;-1:-1:-1;;;26736:85:0;;12286:2:1;26736:85:0;;;12268:21:1;12325:2;12305:18;;;12298:30;12364:34;12344:18;;;12337:62;-1:-1:-1;;;12415:18:1;;;12408:35;12460:19;;26736:85:0;12084:401:1;26736:85:0;26857:67;14238:10;26880:7;26908:15;26889:16;:34;26857:8;:67::i;:::-;-1:-1:-1;26955:4:0;;26554:413;-1:-1:-1;;;26554:413:0:o;23748:175::-;23834:4;23851:42;14238:10;23875:9;23886:6;23851:9;:42::i;38295:637::-;38378:10;38333:25;38361:28;;;:16;:28;;;;;;;;38333:56;;;;;;;;;;;;;;;;;;;38361:28;;38333:56;;;38361:28;38333:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38400:20;38442:9;38437:444;38461:8;:15;38457:1;:19;38437:444;;;38556:10;-1:-1:-1;;;;;38524:42:0;:15;:28;38540:8;38549:1;38540:11;;;;;;;;:::i;:::-;;;;;;;;;;;;38524:28;;;;;;;;;;-1:-1:-1;38524:28:0;;-1:-1:-1;;;;;38524:28:0;:42;38498:134;;;;-1:-1:-1;;;38498:134:0;;7971:2:1;38498:134:0;;;7953:21:1;8010:2;7990:18;;;7983:30;8049:32;8029:18;;;8022:60;8099:18;;38498:134:0;7769:354:1;38498:134:0;38768:34;38790:8;38799:1;38790:11;;;;;;;;:::i;38768:34::-;38733:18;:31;38752:8;38761:1;38752:11;;;;;;;;:::i;:::-;;;;;;;38733:31;;;;;;;;;;;;38715:15;:49;;;;:::i;:::-;38714:88;;;;:::i;:::-;38681:122;;:12;:122;:::i;:::-;38649:154;;38854:15;38820:18;:31;38839:8;38848:1;38839:11;;;;;;;;:::i;:::-;;;;;;;38820:31;;;;;;;;;;;:49;;;;38478:3;;;;;:::i;:::-;;;;38437:444;;35274:926;35435:17;;35399:15;;35378:10;35361:28;;;;:16;:28;;;;;:35;:53;;35399:15;35361:53;:::i;:::-;:91;;35339:178;;;;-1:-1:-1;;;35339:178:0;;11531:2:1;35339:178:0;;;11513:21:1;11570:2;11550:18;;;11543:30;11609:34;11589:18;;;11582:62;-1:-1:-1;;;11660:18:1;;;11653:35;11705:19;;35339:178:0;11329:401:1;35339:178:0;35535:9;35530:663;35554:8;:15;35550:1;:19;35530:663;;;35625:14;;35649:11;;35665:10;;-1:-1:-1;;;;;35625:14:0;;35617:31;;35649:8;;35658:1;;35649:11;;;;;;:::i;:::-;;;;;;;35617:44;;;;;;;;;;;;;12996:25:1;;12984:2;12969:18;;12850:177;35617:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35617:58:0;;:126;;;;-1:-1:-1;35732:11:0;;35716;;-1:-1:-1;;;;;35732:11:0;;;;35700:15;;35732:11;;35716:8;;35725:1;;35716:11;;;;;;:::i;:::-;;;;;;;;;;;;35700:28;;;;;;;;;;-1:-1:-1;35700:28:0;;-1:-1:-1;;;;;35700:28:0;:43;35617:126;35591:218;;;;-1:-1:-1;;;35591:218:0;;7257:2:1;35591:218:0;;;7239:21:1;7296:2;7276:18;;;7269:30;7335:32;7315:18;;;7308:60;7385:18;;35591:218:0;7055:354:1;35591:218:0;35834:14;;35942:11;;-1:-1:-1;;;;;35834:14:0;;;;35826:36;;35881:10;;35918:4;;35942:8;;35951:1;;35942:11;;;;;;:::i;:::-;;;;;;;;;;;35826:142;;-1:-1:-1;;;;;;35826:142:0;;;;;;;-1:-1:-1;;;;;3478:15:1;;;35826:142:0;;;3460:34:1;3530:15;;;;3510:18;;;3503:43;3562:18;;;3555:34;3395:18;;35826:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36002:10:0;35985:28;;;;:16;:28;;;;;36019:11;;35985:28;;-1:-1:-1;36019:8:0;;-1:-1:-1;36028:1:0;;36019:11;;;;;;:::i;:::-;;;;;;;;;;;;35985:46;;;;;;;-1:-1:-1;35985:46:0;;;;;;;;;;36067:11;;36082:15;;36048:18;;36067:8;;36076:1;;36067:11;;;;;;:::i;:::-;;;;;;;36048:31;;;;;;;;;;;:49;;;;36143:10;36112:15;:28;36128:8;36137:1;36128:11;;;;;;;;:::i;:::-;;;;;;;36112:28;;;;;;;;;;;;:41;;;;;-1:-1:-1;;;;;36112:41:0;;;;;-1:-1:-1;;;;;36112:41:0;;;;;;36168:11;;:13;;;;;;;;;:::i;:::-;;;;;;35571:3;;;;;:::i;:::-;;;;35530:663;;16245:192;15418:6;;-1:-1:-1;;;;;15418:6:0;14238:10;15565:23;15557:68;;;;-1:-1:-1;;;15557:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16334:22:0;::::1;16326:73;;;::::0;-1:-1:-1;;;16326:73:0;;6040:2:1;16326:73:0::1;::::0;::::1;6022:21:1::0;6079:2;6059:18;;;6052:30;6118:34;6098:18;;;6091:62;-1:-1:-1;;;6169:18:1;;;6162:36;6215:19;;16326:73:0::1;5838:402:1::0;16326:73:0::1;16410:19;16420:8;16410:9;:19::i;41228:185::-:0;41313:14;;-1:-1:-1;;;;;41313:14:0;41331:10;41313:28;41305:67;;;;-1:-1:-1;;;41305:67:0;;7616:2:1;41305:67:0;;;7598:21:1;7655:2;7635:18;;;7628:30;7694:28;7674:18;;;7667:56;7740:18;;41305:67:0;7414:350:1;41305:67:0;41383:22;41389:7;41398:6;41383:5;:22::i;30238:380::-;-1:-1:-1;;;;;30374:19:0;;30366:68;;;;-1:-1:-1;;;30366:68:0;;11126:2:1;30366:68:0;;;11108:21:1;11165:2;11145:18;;;11138:30;11204:34;11184:18;;;11177:62;-1:-1:-1;;;11255:18:1;;;11248:34;11299:19;;30366:68:0;10924:400:1;30366:68:0;-1:-1:-1;;;;;30453:21:0;;30445:68;;;;-1:-1:-1;;;30445:68:0;;6447:2:1;30445:68:0;;;6429:21:1;6486:2;6466:18;;;6459:30;6525:34;6505:18;;;6498:62;-1:-1:-1;;;6576:18:1;;;6569:32;6618:19;;30445:68:0;6245:398:1;30445:68:0;-1:-1:-1;;;;;30526:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30578:32;;12996:25:1;;;30578:32:0;;12969:18:1;30578:32:0;;;;;;;30238:380;;;:::o;27457:733::-;-1:-1:-1;;;;;27597:20:0;;27589:70;;;;-1:-1:-1;;;27589:70:0;;10720:2:1;27589:70:0;;;10702:21:1;10759:2;10739:18;;;10732:30;10798:34;10778:18;;;10771:62;-1:-1:-1;;;10849:18:1;;;10842:35;10894:19;;27589:70:0;10518:401:1;27589:70:0;-1:-1:-1;;;;;27678:23:0;;27670:71;;;;-1:-1:-1;;;27670:71:0;;5233:2:1;27670:71:0;;;5215:21:1;5272:2;5252:18;;;5245:30;5311:34;5291:18;;;5284:62;-1:-1:-1;;;5362:18:1;;;5355:33;5405:19;;27670:71:0;5031:399:1;27670:71:0;-1:-1:-1;;;;;27838:17:0;;27814:21;27838:17;;;;;;;;;;;27874:23;;;;27866:74;;;;-1:-1:-1;;;27866:74:0;;6850:2:1;27866:74:0;;;6832:21:1;6889:2;6869:18;;;6862:30;6928:34;6908:18;;;6901:62;-1:-1:-1;;;6979:18:1;;;6972:36;7025:19;;27866:74:0;6648:402:1;27866:74:0;-1:-1:-1;;;;;27976:17:0;;;:9;:17;;;;;;;;;;;27996:22;;;27976:42;;28040:20;;;;;;;;:30;;28012:6;;27976:9;28040:30;;28012:6;;28040:30;:::i;:::-;;;;;;;;28105:9;-1:-1:-1;;;;;28088:35:0;28097:6;-1:-1:-1;;;;;28088:35:0;;28116:6;28088:35;;;;12996:25:1;;12984:2;12969:18;;12850:177;28088:35:0;;;;;;;;27578:612;27457:733;;;:::o;34939:327::-;35030:9;35025:234;-1:-1:-1;;;;;35049:24:0;;;;;;:16;:24;;;;;:31;35045:35;;35025:234;;;-1:-1:-1;;;;;35106:24:0;;;;;;:16;:24;;;;;:27;;35137:7;;35106:24;35131:1;;35106:27;;;;;;:::i;:::-;;;;;;;;;:38;35102:146;;;35215:17;35222:6;35230:1;35215:6;:17::i;:::-;35082:3;;;;:::i;:::-;;;;35025:234;;28477:399;-1:-1:-1;;;;;28561:21:0;;28553:65;;;;-1:-1:-1;;;28553:65:0;;12692:2:1;28553:65:0;;;12674:21:1;12731:2;12711:18;;;12704:30;12770:33;12750:18;;;12743:61;12821:18;;28553:65:0;12490:355:1;28553:65:0;28709:6;28693:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;28726:18:0;;:9;:18;;;;;;;;;;:28;;28748:6;;28726:9;:28;;28748:6;;28726:28;:::i;:::-;;;;-1:-1:-1;;28770:37:0;;12996:25:1;;;-1:-1:-1;;;;;28770:37:0;;;28787:1;;28770:37;;12984:2:1;12969:18;28770:37:0;;;;;;;37116:769;37060:825;:::o;29209:591::-;-1:-1:-1;;;;;29293:21:0;;29285:67;;;;-1:-1:-1;;;29285:67:0;;10318:2:1;29285:67:0;;;10300:21:1;10357:2;10337:18;;;10330:30;10396:34;10376:18;;;10369:62;-1:-1:-1;;;10447:18:1;;;10440:31;10488:19;;29285:67:0;10116:397:1;29285:67:0;-1:-1:-1;;;;;29452:18:0;;29427:22;29452:18;;;;;;;;;;;29489:24;;;;29481:71;;;;-1:-1:-1;;;29481:71:0;;5637:2:1;29481:71:0;;;5619:21:1;5676:2;5656:18;;;5649:30;5715:34;5695:18;;;5688:62;-1:-1:-1;;;5766:18:1;;;5759:32;5808:19;;29481:71:0;5435:398:1;29481:71:0;-1:-1:-1;;;;;29588:18:0;;:9;:18;;;;;;;;;;29609:23;;;29588:44;;29654:12;:22;;29626:6;;29588:9;29654:22;;29626:6;;29654:22;:::i;:::-;;;;-1:-1:-1;;29694:37:0;;12996:25:1;;;29720:1:0;;-1:-1:-1;;;;;29694:37:0;;;;;12984:2:1;12969:18;29694:37:0;;;;;;;33020:302;32954:368;;:::o;16445:173::-;16520:6;;;-1:-1:-1;;;;;16537:17:0;;;-1:-1:-1;;;;;;16537:17:0;;;;;;;16570:40;;16520:6;;;16537:17;16520:6;;16570:40;;16501:16;;16570:40;16490:128;16445:173;:::o;34569:362::-;-1:-1:-1;;;;;34649:24:0;;;;;;:16;:24;;;;;:31;34640:40;;34636:53;;34569:362;;:::o;34636:53::-;34718:5;34701:158;-1:-1:-1;;;;;34729:24:0;;;;;;:16;:24;;;;;:31;:35;;34763:1;;34729:35;:::i;:::-;34725:1;:39;34701:158;;;-1:-1:-1;;;;;34816:24:0;;;;;;:16;:24;;;;;34841:5;:1;34845;34841:5;:::i;:::-;34816:31;;;;;;;;:::i;:::-;;;;;;;;;34786:16;:24;34803:6;-1:-1:-1;;;;;34786:24:0;-1:-1:-1;;;;;34786:24:0;;;;;;;;;;;;34811:1;34786:27;;;;;;;;:::i;:::-;;;;;;;;;;:61;34766:3;;;;:::i;:::-;;;;34701:158;;;-1:-1:-1;;;;;;34869:24:0;;;;;;:16;:24;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34910:11;;:13;;;;;;;;;:::i;:::-;;;;;;34569:362;;:::o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:315::-;1444:6;1452;1505:2;1493:9;1484:7;1480:23;1476:32;1473:52;;;1521:1;1518;1511:12;1473:52;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;1681:2;1666:18;;;;1653:32;;-1:-1:-1;;;1376:315:1:o;1696:1126::-;1780:6;1811:2;1854;1842:9;1833:7;1829:23;1825:32;1822:52;;;1870:1;1867;1860:12;1822:52;1910:9;1897:23;1939:18;1980:2;1972:6;1969:14;1966:34;;;1996:1;1993;1986:12;1966:34;2034:6;2023:9;2019:22;2009:32;;2079:7;2072:4;2068:2;2064:13;2060:27;2050:55;;2101:1;2098;2091:12;2050:55;2137:2;2124:16;2159:2;2155;2152:10;2149:36;;;2165:18;;:::i;:::-;2211:2;2208:1;2204:10;2243:2;2237:9;2306:2;2302:7;2297:2;2293;2289:11;2285:25;2277:6;2273:38;2361:6;2349:10;2346:22;2341:2;2329:10;2326:18;2323:46;2320:72;;;2372:18;;:::i;:::-;2408:2;2401:22;2458:18;;;2492:15;;;;-1:-1:-1;2527:11:1;;;2557;;;2553:20;;2550:33;-1:-1:-1;2547:53:1;;;2596:1;2593;2586:12;2547:53;2618:1;2609:10;;2628:163;2642:2;2639:1;2636:9;2628:163;;;2699:17;;2687:30;;2660:1;2653:9;;;;;2737:12;;;;2769;;2628:163;;;-1:-1:-1;2810:6:1;1696:1126;-1:-1:-1;;;;;;;;1696:1126:1:o;2827:180::-;2886:6;2939:2;2927:9;2918:7;2914:23;2910:32;2907:52;;;2955:1;2952;2945:12;2907:52;-1:-1:-1;2978:23:1;;2827:180;-1:-1:-1;2827:180:1:o;3600:632::-;3771:2;3823:21;;;3893:13;;3796:18;;;3915:22;;;3742:4;;3771:2;3994:15;;;;3968:2;3953:18;;;3742:4;4037:169;4051:6;4048:1;4045:13;4037:169;;;4112:13;;4100:26;;4181:15;;;;4146:12;;;;4073:1;4066:9;4037:169;;;-1:-1:-1;4223:3:1;;3600:632;-1:-1:-1;;;;;;3600:632:1:o;4429:597::-;4541:4;4570:2;4599;4588:9;4581:21;4631:6;4625:13;4674:6;4669:2;4658:9;4654:18;4647:34;4699:1;4709:140;4723:6;4720:1;4717:13;4709:140;;;4818:14;;;4814:23;;4808:30;4784:17;;;4803:2;4780:26;4773:66;4738:10;;4709:140;;;4867:6;4864:1;4861:13;4858:91;;;4937:1;4932:2;4923:6;4912:9;4908:22;4904:31;4897:42;4858:91;-1:-1:-1;5010:2:1;4989:15;-1:-1:-1;;4985:29:1;4970:45;;;;5017:2;4966:54;;4429:597;-1:-1:-1;;;4429:597:1:o;8942:356::-;9144:2;9126:21;;;9163:18;;;9156:30;9222:34;9217:2;9202:18;;9195:62;9289:2;9274:18;;8942:356::o;13221:128::-;13261:3;13292:1;13288:6;13285:1;13282:13;13279:39;;;13298:18;;:::i;:::-;-1:-1:-1;13334:9:1;;13221:128::o;13354:168::-;13394:7;13460:1;13456;13452:6;13448:14;13445:1;13442:21;13437:1;13430:9;13423:17;13419:45;13416:71;;;13467:18;;:::i;:::-;-1:-1:-1;13507:9:1;;13354:168::o;13527:125::-;13567:4;13595:1;13592;13589:8;13586:34;;;13600:18;;:::i;:::-;-1:-1:-1;13637:9:1;;13527:125::o;13657:136::-;13696:3;13724:5;13714:39;;13733:18;;:::i;:::-;-1:-1:-1;;;13769:18:1;;13657:136::o;13798:380::-;13877:1;13873:12;;;;13920;;;13941:61;;13995:4;13987:6;13983:17;13973:27;;13941:61;14048:2;14040:6;14037:14;14017:18;14014:38;14011:161;;;14094:10;14089:3;14085:20;14082:1;14075:31;14129:4;14126:1;14119:15;14157:4;14154:1;14147:15;14011:161;;13798:380;;;:::o;14183:135::-;14222:3;-1:-1:-1;;14243:17:1;;14240:43;;;14263:18;;:::i;:::-;-1:-1:-1;14310:1:1;14299:13;;14183:135::o;14323:127::-;14384:10;14379:3;14375:20;14372:1;14365:31;14415:4;14412:1;14405:15;14439:4;14436:1;14429:15;14455:127;14516:10;14511:3;14507:20;14504:1;14497:31;14547:4;14544:1;14537:15;14571:4;14568:1;14561:15;14587:127;14648:10;14643:3;14639:20;14636:1;14629:31;14679:4;14676:1;14669:15;14703:4;14700:1;14693:15;14719:127;14780:10;14775:3;14771:20;14768:1;14761:31;14811:4;14808:1;14801:15;14835:4;14832:1;14825:15;14851:131;-1:-1:-1;;;;;14926:31:1;;14916:42;;14906:70;;14972:1;14969;14962:12
Swarm Source
ipfs://fa79e7b6fb9795d8c9e5d0fa309dd6d458a51038938637bbce291c51d5b6eeb4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.