Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
4,522,723.35864004629629564 rMC
Holders
205
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
305.691232638888888888 rMCValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
rMutantCoin
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-19 */ // Sources flattened with hardhat v2.8.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @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/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Enumerable.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @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/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @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 @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // 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 generally not needed starting with Solidity 0.8, since 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/math/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/rMutantCoin.sol // contracts/rMutantCoin.sol pragma solidity ^0.8.0; contract rMutantCoin is ERC20Burnable, Ownable { using SafeMath for uint256; IERC721Enumerable public _mpAddress; mapping (uint256 => bool) private _isDemon; mapping (uint256 => bool) private _isMummy; mapping (uint256 => bool) private _isApeZombie; // Sun Oct 17 2021 18:00:00 GMT+0000 - Public Sale date. uint256 constant public _START = 1634493600; // Sat Oct 17 2024 18:00:00 GMT+0000 - 3 years from public sale date. uint256 public _END = 1729188000; // base rate is in ethers 10^18. uint256 public _demonBaseRate = 400 ether; uint256 public _mummyBaseRate = 178 ether; uint256 public _apeZombieBaseRate = 45 ether; uint256 public _otherBaseRate = 2.5 ether; //(((10000 - (9+24+88))*2.5) + (45*88) + (178*24) + (400*9)) * 365 * 3 = 39,999,802 total ~8% of total supply 500M. mapping(uint256 => uint256) public _lastClaimTimestamp; //map tokenId -> timestamp. bool public _yieldRewardEnabled; event RewardClaimed(address indexed user, uint256 reward); constructor(IERC721Enumerable mpAddress) ERC20("rMutantCoin", "rMC") { _yieldRewardEnabled = false; _mpAddress = mpAddress; _mapDemon(); _mapMummy(); _mapApeZombie(); } // Map MPNFT type function _mapDemon() private { _isDemon[17] = true; _isDemon[638] = true; _isDemon[1885] = true; _isDemon[3917] = true; _isDemon[4836] = true; _isDemon[5907] = true; _isDemon[6611] = true; _isDemon[8066] = true; _isDemon[9411] = true; } function _mapMummy() private { _isMummy[39] = true; _isMummy[375] = true; _isMummy[1024] = true; _isMummy[1425] = true; _isMummy[1708] = true; _isMummy[2146] = true; _isMummy[2387] = true; _isMummy[2495] = true; _isMummy[2715] = true; _isMummy[2927] = true; _isMummy[3492] = true; _isMummy[4159] = true; _isMummy[4466] = true; _isMummy[5220] = true; _isMummy[5317] = true; _isMummy[5580] = true; _isMummy[5798] = true; _isMummy[6146] = true; _isMummy[6917] = true; _isMummy[7192] = true; _isMummy[8219] = true; _isMummy[8498] = true; _isMummy[9265] = true; _isMummy[9280] = true; } function _mapApeZombie() private { _isApeZombie[58] = true; _isApeZombie[990] = true; _isApeZombie[1122] = true; _isApeZombie[1193] = true; _isApeZombie[1377] = true; _isApeZombie[1482] = true; _isApeZombie[1530] = true; _isApeZombie[1662] = true; _isApeZombie[1753] = true; _isApeZombie[1892] = true; _isApeZombie[1941] = true; _isApeZombie[2072] = true; _isApeZombie[2138] = true; _isApeZombie[2254] = true; _isApeZombie[2311] = true; _isApeZombie[2334] = true; _isApeZombie[2343] = true; _isApeZombie[2429] = true; _isApeZombie[2488] = true; _isApeZombie[2564] = true; _isApeZombie[2570] = true; _isApeZombie[2685] = true; _isApeZombie[2712] = true; _isApeZombie[2941] = true; _isApeZombie[2970] = true; _isApeZombie[3213] = true; _isApeZombie[3330] = true; _isApeZombie[3395] = true; _isApeZombie[3490] = true; _isApeZombie[3495] = true; _isApeZombie[3611] = true; _isApeZombie[3638] = true; _isApeZombie[3833] = true; _isApeZombie[4474] = true; _isApeZombie[4515] = true; _isApeZombie[4561] = true; _isApeZombie[4749] = true; _isApeZombie[4832] = true; _isApeZombie[4853] = true; _isApeZombie[4877] = true; _isApeZombie[5069] = true; _isApeZombie[5237] = true; _isApeZombie[5256] = true; _isApeZombie[5302] = true; _isApeZombie[5315] = true; _isApeZombie[5339] = true; _isApeZombie[5415] = true; _isApeZombie[5492] = true; _isApeZombie[5576] = true; _isApeZombie[5745] = true; _isApeZombie[5764] = true; _isApeZombie[5946] = true; _isApeZombie[6276] = true; _isApeZombie[6305] = true; _isApeZombie[6298] = true; _isApeZombie[6492] = true; _isApeZombie[6516] = true; _isApeZombie[6587] = true; _isApeZombie[6651] = true; _isApeZombie[6706] = true; _isApeZombie[6786] = true; _isApeZombie[7015] = true; _isApeZombie[7122] = true; _isApeZombie[7128] = true; _isApeZombie[7253] = true; _isApeZombie[7338] = true; _isApeZombie[7459] = true; _isApeZombie[7660] = true; _isApeZombie[7756] = true; _isApeZombie[7913] = true; _isApeZombie[8127] = true; _isApeZombie[8307] = true; _isApeZombie[8386] = true; _isApeZombie[8472] = true; _isApeZombie[8531] = true; _isApeZombie[8553] = true; _isApeZombie[8780] = true; _isApeZombie[8857] = true; _isApeZombie[8909] = true; _isApeZombie[8957] = true; _isApeZombie[9203] = true; _isApeZombie[9368] = true; _isApeZombie[9475] = true; _isApeZombie[9805] = true; _isApeZombie[9839] = true; _isApeZombie[9910] = true; _isApeZombie[9956] = true; _isApeZombie[9998] = true; } // Owner only function setYieldRewardEnabled(bool enabled) public onlyOwner { _yieldRewardEnabled = enabled; } function setMpAddress(IERC721Enumerable mpAddress) public onlyOwner { _mpAddress = mpAddress; } function setEndDate(uint256 endDate) public onlyOwner { _END = endDate; } function setDemonBaseRate(uint256 rate) public onlyOwner { _demonBaseRate = rate; } function setMummyBaseRate(uint256 rate) public onlyOwner { _mummyBaseRate = rate; } function setApeZombieBaseRate(uint256 rate) public onlyOwner { _apeZombieBaseRate = rate; } function setOtherBaseRate(uint256 rate) public onlyOwner { _otherBaseRate = rate; } function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } // Mutant Punks NFT logics function mpTokenBalanceOf(address add) public view returns(uint256) { return _mpAddress.balanceOf(add); } function mpTokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId) { return _mpAddress.tokenOfOwnerByIndex(owner, index); } function checkUnclaimedReward(address from) public view returns(uint256) { uint256 timeNow = Math.min(block.timestamp, _END); uint256 reward = 0; for (uint256 i = 0; i < _mpAddress.balanceOf(from); i++) { uint256 tokenId = _mpAddress.tokenOfOwnerByIndex(from, i); uint256 timeFrom = Math.max(_lastClaimTimestamp[tokenId], _START); if (timeFrom <= timeNow) { uint256 baseRate = _setBaseRate(tokenId); reward += baseRate.mul((timeNow.sub(timeFrom))).div(86400); } } return reward; } function yieldReward() external { require(msg.sender != address(0), "must not call from black hole"); require(_yieldRewardEnabled, "yield reward is not enabled yet"); uint256 timeNow = Math.min(block.timestamp, _END); uint256 reward = 0; for (uint256 i = 0; i < _mpAddress.balanceOf(msg.sender); i++) { uint256 tokenId = _mpAddress.tokenOfOwnerByIndex(msg.sender, i); uint256 timeFrom = Math.max(_lastClaimTimestamp[tokenId], _START); if (timeFrom <= timeNow) { uint256 baseRate = _setBaseRate(tokenId); reward += baseRate.mul((timeNow.sub(timeFrom))).div(86400); _lastClaimTimestamp[tokenId] = timeNow; } } if (reward > 0) { _mint(msg.sender, reward); emit RewardClaimed(msg.sender, reward); } } // private function function _setBaseRate(uint256 tokenId) private view returns(uint256) { uint256 baseRate = _otherBaseRate; if (_isDemon[tokenId]) { baseRate = _demonBaseRate; } else if (_isMummy[tokenId]) { baseRate = _mummyBaseRate; } else if (_isApeZombie[tokenId]) { baseRate = _apeZombieBaseRate; } return baseRate; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC721Enumerable","name":"mpAddress","type":"address"}],"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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardClaimed","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":"_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_apeZombieBaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_demonBaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_lastClaimTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mpAddress","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mummyBaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_otherBaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_yieldRewardEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"from","type":"address"}],"name":"checkUnclaimedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"mpTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"mpTokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setApeZombieBaseRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setDemonBaseRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"endDate","type":"uint256"}],"name":"setEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721Enumerable","name":"mpAddress","type":"address"}],"name":"setMpAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setMummyBaseRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setOtherBaseRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setYieldRewardEnabled","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":"yieldReward","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405263671150a0600a556815af1d78b58c400000600b556809a63f08ea63880000600c55680270801d946c940000600d556722b1c8c1227a0000600e553480156200004c57600080fd5b506040516200316d3803806200316d8339810160408190526200006f91620015e1565b6040518060400160405280600b81526020016a3926baba30b73a21b7b4b760a91b81525060405180604001604052806003815260200162724d4360e81b8152508160039080519060200190620000c79291906200153b565b508051620000dd9060049060208401906200153b565b505050620000fa620000f46200014460201b60201c565b62000148565b6010805460ff19169055600680546001600160a01b0319166001600160a01b038316179055620001296200019a565b6200013362000321565b6200013d6200070f565b506200164e565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60076020527f7fecc9f0b925868a8c62ee842da0498074146a036d84a1041d9b5286786bbbf38054600160ff1991821681179092557f8f70a89ba56a177151b0db4d7b6b447ad507261cbe38a5e579dcd6e96c79bd0a80548216831790557f5150567e90f252d8257be41ac134dc7a4d6663bec1224d870e3e1bd3d95692ef80548216831790557fe92c240365ac2ea0dfa2707b3d42bee3f4b176a63d7a8e0943bb79b4f8a7bed880548216831790557fd2c405eec75f5cb6df741b4848d86e2f4262d6506daf088f97c563cdde82815780548216831790557f367665b1b61c91ff594645fb01830d9506bd0fe290368855e01459a5f8b3834380548216831790557fe4069f32188000ccdf0ac2b0ce52dc37d4781ac327118d57218ef2ac401b907280548216831790557fbb30c16880bd60d393957e9125fa0ffa06ddd309c39d169d16401fb800f537a480548216831790556124c36000527f654c1d630236071b2a963014ec8b8333d1386c292c9359347f50314912dc6ad080549091169091179055565b60086020527f3e6a6cd391bc0a3db861c80bb76944d46c7f5cace8846dd46ea93cd1ca0166648054600160ff1991821681179092557f946c1e72fc26f3539e8f59e5ed359f1e02efd2163bbb41f3a33d751abf91df4580548216831790557f34210cd053ccc57b89e8c9dfcbb74f70e7682a98c9820778f720a389c58f232380548216831790557fe75ec09733842691bab977831c0db7ba8b71689e3aca96fbab0bc45ec4ce20ee80548216831790557f92532f6b34cddc1be479a766e72ac0fa04b244ff5513a5ad7366bea9617798c280548216831790557fbe5c7665a557b81017a0f633e025afe48e99342d93d223126e4efc924a9900cc80548216831790557f6023490259573e256a9fce3a35413ba9c0de39c8b4b6a0d5789ee1d8c9b3f9cd80548216831790557f036e1487e25d7cc152eee57a82db5fe71c1ff12e611bf501f01386766c11e47c80548216831790557f3620962296aaddf94d3c49de309a6e14fc5237c08763d15a3aea0f2e7b01486980548216831790557f3e18727b74eb5bdb9e30028962d3feafe6cc0e72635841930e3f84a9e08a3cc480548216831790557f9807aea9591a2ca0ac75bbbe3f52b98e1753585093cdea5769ff89a1a330141c80548216831790557fbb8310698e1d8995ff7ac7850f27bdb7d8ecb2579e085afab12cb295b4e046a480548216831790557f760c294b0423c6d5df0f27187346ca1956a9a97f8d3288653ecf768c19f7ba5080548216831790557f4eb03458d72e8eddd6455e0477bf42e51fcf3f26a76064faf7397b55694c44b580548216831790557f319a416ccfea3646127cd53bd03a9b4b30095db7160fec4a54aff164e7ebbd2c80548216831790557f6c8b3cea60811e577092d8ea7fcfb8043caa8c7aa3a2c3288a2654348f90c90880548216831790557f90e2c4f793b778c2967e2f458190bb2d260e21c41559852488999d51574cb6a380548216831790557f1ade431f8df47a96fdd30939bf655d433ed23271b8607f47254b1ed5932072d780548216831790557f2e1f79a73bf76df8e2e22e4b648567e73e2a5267e411b54517159aaa78ab21e780548216831790557f7804dab63faa6f6d76cc1ba9e0e2f625400526c57900ba28450ddf08cc60f44980548216831790557fadc9887f3c9260b17989e23fbd5f5ffa4f99cff96e09699ec7ca2d695dc5c2a480548216831790557f415438c5cbf172943408905607779b2e9e07a9955a37b23041de0b25fd8e013880548216831790557f3deb9efa4ac66f3c905dd0adde32a9d2d94486a3a1f4f008033a0a6952dab6b380548216831790556124406000527fcddeb23a669a2f417a00839e9dfd3db91d5a98ad09fb5328fa3f3d3528c4cd5280549091169091179055565b60096020527fa1c3d575985d08bb9f5b2581f8a369dcb618a96554e510eccf0391de41c2e7878054600160ff1991821681179092557fe0afe5d1be517354ead2291a86c1acc70cf7d2c3cdc1a15b1f04d5485d15174080548216831790557f8272ecaead34bc39bc47a4a8ed380806a612990e0aa9bae3d23a081ff7fa26a380548216831790557f5503fed2f73b6efe1a655719bbcb0a7617b46c772c50aa460788f0f14fef6bfd80548216831790557f9b4dd060191a3ded045db3855f95cec0ffeb6188b8368fc8d3380ba0f71e19a280548216831790557f7d4a96cb17a90e62852fe4c289c5bf30ef879b77e066f826adcb2220d2cccaaa80548216831790557fa87b34666e0cef8592da1645dfba9d7cf8117900876de6f979ef6c72d97f205480548216831790557f7f5caa67ca221b7e7ef7a734381e0f0014be0dad9c566383346f4dac3d5d80e480548216831790557f51f5a3b7b92bddf45e6962c3634fbfe926d2ace4b9272a62ea491aaa3eadbf3780548216831790557f9c1559a20dac9736ef60c7beebc04bc58629f06765eea523a07b1669cbaae06980548216831790557f4687377be2ce8315e039728788b79f334595e4812a28269c06a32c6dd5400ba680548216831790557fab730b79f664c3f6decb4dd9616047affe793c7a48dfd3f75f0c4089894ab1e680548216831790557f86513841ec17d4ce56d66a515c8e68cdf4bb524aa55247250c6104a6044c16f380548216831790557f3120ef06e6b303dc5f540653e3cdda5666ab531c8ae9b3ef5a385030fa6827a780548216831790557f341513301e3c4c654e21d44bb87a621603c8b520e71c68d87e2fad615c9a9da580548216831790557f5a69f5cda8087d568baface43afdfabf39f3068e5d593bd8fd977af8906b402380548216831790557ffe3cfe9df34d8474f15e90a3906f9d426d538bc6831de9db06d0e3161087914b80548216831790557fc4655afbc995ee0cb5d5400657e423eb55f0e272a0efd63c0ad148385bcb22e180548216831790557f14cdbe9fc219b3b39ac91e2546783f31d8440ce51d50e61b9ad65830006f4c0980548216831790557f6c7306284977afa6c0d4f3ae9e1edbf88fae5aa34b8da375ffe269503d98711c80548216831790557f4b8868c3fb398193b6581a614c2b5bef677e49152f24621eb7b4af3dbc552a1280548216831790557fb7fdf55d2aae5984c1fc913b21b09ccb6085683113712c96e0fe52b1e23109a780548216831790557f52445887ac89acbf42f323cba5a47df01d7b9b709e4666f4a04817d5ba0067b180548216831790557fd7582a49a2b094b25704a9519da03032721f0bef8cdf5d165725af9d20048c7b80548216831790557f6e62fdc054d5af354160309da9da3fcb2a2a2da6e5c5b1a893147693d528fbdf80548216831790557fa9d63c1fd8258998fb85acddc73dc61fac5136eecefe77feafc3b24ab351220a80548216831790557fe3bb9b5ddbde41aa51975385e63b047a9dda93cb94132e2511f8dcf2857092a580548216831790557fbf0c354954cfabc8ade4c7e5744de38b3f3e27a272ca19f30150a4b6c990252a80548216831790557f98f6b71c2c697261e7807e4a51a35993c37af83ee632b19faf140517351702a580548216831790557f0b48bfff2190623052135c30fdce897c52e1dc6f163f451774582b5596210d9480548216831790557fcebc88b6aed5aca629752eea40a3df07f8712fc624abffa3758562aa4ea7362c80548216831790557fb6b6d3497add73a9a2d05f1dcf0222a72700c3be53261f76ad3c52a39f26304580548216831790557e46882e6b90de2f729253cb28c231656a447550df056a7d7e7e1cb58bdeb26a80548216831790557f1af186d73f0422e209422a914853c52d4598b86142bc8c3a27b173f899b9587880548216831790557ff27d5c8f52643d582b9b4edb475cb9cd5736846fc32e5b9fbc2a4a0bafbad5b080548216831790557f79afe4538d7330fe449d040e6892e98fad05374457c5a8038e6078930480e28380548216831790557fcb5e4bd5e452fe4599129305f59448a04a041d2663ea8b6065978f44878e80df80548216831790557f8dff11b620072bc3cc11d044b13edfc6888f6e6595dee5318dcef77a28b96ff580548216831790557f4ab432f65a4f59e8b3a30e5ce6487855126ce92530a22c2e18434224210304f080548216831790557ed023e601bd75d889e94dd1a9bf71a7b8ed393f480e85e400f6cd0144a2b4b180548216831790557fa6523bf7c711554a54fe70981a42518625fdd1cbaed035b60cbbbde2445882b680548216831790557fbcee07cdc763c32cf9fbe186f4b6169ee545016f6be77b2e91566b6b0a4e6f3380548216831790557fcb9cba35b2e3cf848ea7b51e046b06109daac1e6fc9ed807c00733cb0000ab3080548216831790557f7d18836170f2df38c2f38792c255eba00fa1bb333b6f3d4b2e79ce4885ff8ccb80548216831790557f819945a31f3adfbcd11931b5cd30a637de3c80b468fed09f1c5c217e704a1c3980548216831790557f6d9bd2ea9697b6f72ff67a693e9fc7e527c1134f9f54d9b7cf33c02f87f80b1980548216831790557fc46e238acb5359c640741f47e385bfde6b865b667c774f297d1ce050abb6f37780548216831790557fe29f974a3fbab8192d9929e605297678a9f227d6670aad1ec96d7078fd028bb280548216831790557fc4ced60f73133b447bd058c8a960b784ba9fcbca94d769b1059ae283f88af73f80548216831790557fb2f1d2f7b94b66e4cfaee52e8f7b222bc1c1a8463f7566556d35289994f13f2080548216831790557f88ff98ff429de4852cdf384be50871ebd04cb05a7b35bdb303467bbb8ec3e4dd80548216831790557ff277ef4fd46551d320e0b12040aacdefe42cb5d6532a3ceef831ee954c7b6e4880548216831790557f0aca0f81de529b60bbbc6056c3c156fdf03718da10236483ed64a88e52312fb980548216831790557fe1d62fe63441562abeda092e1b51a06d89e23195e554332450ac6a6978e121b780548216831790557faee0c8d590208ea5705b23fd5a62da7af99b823f22c84c39bfc8823771e95f0b80548216831790557ffc90d7c31cb79f40286a9633c52191f2488085c8b296802278f933e0c1d532c480548216831790557ff28041b2b9e5ab9f990b02204cd6bff4bb692a46a4365a565377866e29c98de880548216831790557fc4f251d69fa0285fd61b050c62cab4c2b23156d39ad763c9b27af009a3e188eb80548216831790557fd1ff72ed0c91a1c0bf374f6a194c0f33d43fe6376989bfb57bf986ea0774b91980548216831790557fd5aaa07d57f5a8b30d3a2b0d6cd20fd341057a6dc1c964fedd718f67da6865df80548216831790557f532191d375f1d732808b3e83fd3e370710ba8ee43d2d691f328ddc0c9fb0fd2c80548216831790557f08edfe1f64acea9c59d6b47e86c53ef6326c6f47829b403ea9d056d8e34cc86c80548216831790557f984c903499f14094d25cf0364f03117f2e38a5ae850ce3cad1278e4023a07cbf80548216831790557fa6c6e99261d296b8659c87bc268613dd74a95274ce0fa829420531173b95f57380548216831790557f7b6542ca6717733b194ffa507a8c753efdb936658de61cac46aa7a19dda5f7ea80548216831790557f287a57d020ffe89ddb955b8da9f13a4200d7faeb54ec6822e8bd5cd993f2f84380548216831790557f21ed7e51b01e71dd02bebdd2c564651a3947529213002df5f2433a4547e353a480548216831790557ffb12793e3f785b4becdf2c4fb3ec1898f21b2cab5e0df3d9ad4932af2d7d7de580548216831790557f524577e1ec22624e67aabb35cd957a92c5a9f66e2f3eb78c9549a1479656682380548216831790557f5508b633234eef21c01fadbcee31efa3ff5e2952c3684149759301d75fa45bbd80548216831790557f9c486c88313e0399153028bc0a8f2d80e9c15cf017927b4251e074fdb41e83ea80548216831790557fcac5fc060829172e0ff2ab2e8e7094b95d7bbbced69bd7431c64f73fbcd6962a80548216831790557f7b6b9a6a8dcdc00f6b81a8523a0a6d94a6980582de3e5b3585a9b46e0e7bd65b80548216831790557f3a6d22d17dbd0ca5c5af8fc87f16230a845e9621e7d76fe6a9451fa50166a51080548216831790557f44018c2658798bee2dbb039fe8901f36dedb6ace5baf8578b463c67ca883f3a280548216831790557fa24d74d5d87fb9cd343421f258c67d5ff2edd9700e78a66cd05eba89aad6554380548216831790557fa7df36e5fdd7b3b3e6d6ed9feda02c58c4885e3070718bcbe8a005fc1c03403c80548216831790557fa510afc1ef21eabc1811338b0f2c00ef0992efdf8ead97d662cf6f454eef544080548216831790557f7fede5dd65ef206ce5c3756b3c6ca3c7e8b7725dec60f423adccb8343a6d9cef80548216831790557faa5dc91cd7ab1c1e9b3ed6438a5199f3f52d8e0e6c8a5cf497114bc5f991446280548216831790557f542a3221e13bea174c6cd972e1dd7ee98befea1ccd07edab140f714139834ffb80548216831790557f877abf167f8fa1fadf5621cc212f23d3b226470b898f297b69319691a6873a4280548216831790557f6a62ef15f476a28672ddcb0191d782f7e1e7c372ca3f42859009eb1d97e2e3af80548216831790557f13476ac025b0dd61d75d2800528eca91879d8520929f14e3452fa1403325c46f80548216831790557f3c7f498a3bcc9033d8bc7cdd5bbdc4ed93e3bcbba49cda0b09a5e5b34d421dde80548216831790557fdb43fd8208391c43e067b07832be2356f15e76690ad6712c94ed65f851dddc6480548216831790557faf3968f163fbed92cca7c76e0edb8a5234208d623206fc6d05fe7a4f5b0a2061805482168317905561270e6000527fe6338930d71bc7922ed7539cba757a1fd998f5aa6d3863c151dd350496d9584480549091169091179055565b828054620015499062001611565b90600052602060002090601f0160209004810192826200156d5760008555620015b8565b82601f106200158857805160ff1916838001178555620015b8565b82800160010185558215620015b8579182015b82811115620015b85782518255916020019190600101906200159b565b50620015c6929150620015ca565b5090565b5b80821115620015c65760008155600101620015cb565b600060208284031215620015f3578081fd5b81516001600160a01b03811681146200160a578182fd5b9392505050565b6002810460018216806200162657607f821691505b602082108114156200164857634e487b7160e01b600052602260045260246000fd5b50919050565b611b0f806200165e6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80637ef928c311610130578063ca525ada116100b8578063eec4846b1161007c578063eec4846b14610449578063f075c51314610451578063f077519414610464578063f2fde38b14610477578063f57d8b761461048a57610227565b8063ca525ada14610400578063cb84fda114610408578063da76d3ce14610410578063dd62ed3e14610423578063e144b8d41461043657610227565b806395d89b41116100ff57806395d89b41146103b757806395f7180d146103bf578063999415e3146103c7578063a457c2d7146103da578063a9059cbb146103ed57610227565b80637ef928c31461037f578063886fa019146103875780638da5cb5b1461038f57806391c80e67146103a457610227565b806339509351116101b3578063684f193711610182578063684f1937146103365780636bd1d0bc1461033e57806370a0823114610351578063715018a61461036457806379cc67901461036c57610227565b806339509351146102f557806340c10f191461030857806342966c681461031b5780634cbfa9a61461032e57610227565b8063216064ba116101fa578063216064ba1461029457806323b872dd146102a757806327aeba1e146102ba578063313ce567146102cd5780633784f000146102e257610227565b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461026a578063213e9cea1461027f575b600080fd5b610234610492565b60405161024191906115b8565b60405180910390f35b61025d610258366004611505565b610524565b60405161024191906115ad565b610272610541565b60405161024191906119d3565b61029261028d366004611550565b610547565b005b6102926102a2366004611530565b610594565b61025d6102b53660046114c5565b6105e6565b6102726102c8366004611471565b610676565b6102d5610818565b60405161024191906119dc565b6102926102f0366004611550565b61081d565b61025d610303366004611505565b610861565b610292610316366004611505565b6108b5565b610292610329366004611550565b610902565b610272610916565b61027261091c565b61027261034c366004611505565b610922565b61027261035f366004611471565b6109ac565b6102926109c7565b61029261037a366004611505565b610a12565b61025d610a65565b610292610a6e565b610397610ca0565b6040516102419190611580565b6102926103b2366004611550565b610caf565b610234610cf3565b610272610d02565b6102726103d5366004611471565b610d08565b61025d6103e8366004611505565b610d8f565b61025d6103fb366004611505565b610e08565b610272610e1c565b610272610e22565b61029261041e366004611471565b610e28565b61027261043136600461148d565b610e89565b610292610444366004611550565b610eb4565b610397610ef8565b61029261045f366004611550565b610f07565b610272610472366004611550565b610f4b565b610292610485366004611471565b610f5d565b610272610fcb565b6060600380546104a190611a58565b80601f01602080910402602001604051908101604052809291908181526020018280546104cd90611a58565b801561051a5780601f106104ef5761010080835404028352916020019161051a565b820191906000526020600020905b8154815290600101906020018083116104fd57829003601f168201915b5050505050905090565b6000610538610531610fd3565b8484610fd7565b50600192915050565b60025490565b61054f610fd3565b6001600160a01b0316610560610ca0565b6001600160a01b03161461058f5760405162461bcd60e51b8152600401610586906117dd565b60405180910390fd5b600e55565b61059c610fd3565b6001600160a01b03166105ad610ca0565b6001600160a01b0316146105d35760405162461bcd60e51b8152600401610586906117dd565b6010805460ff1916911515919091179055565b60006105f384848461108b565b6001600160a01b038416600090815260016020526040812081610614610fd3565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156106575760405162461bcd60e51b815260040161058690611795565b61066b85610663610fd3565b858403610fd7565b506001949350505050565b60008061068542600a546111b5565b90506000805b6006546040516370a0823160e01b81526001600160a01b03909116906370a08231906106bb908890600401611580565b60206040518083038186803b1580156106d357600080fd5b505afa1580156106e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070b9190611568565b81101561081057600654604051632f745c5960e01b81526000916001600160a01b031690632f745c59906107459089908690600401611594565b60206040518083038186803b15801561075d57600080fd5b505afa158015610771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107959190611568565b6000818152600f6020526040812054919250906107b69063616c64a06111cb565b90508481116107fb5760006107ca836111db565b90506107ed620151806107e76107e08986611242565b849061124e565b9061125a565b6107f790866119ea565b9450505b5050808061080890611a93565b91505061068b565b509392505050565b601290565b610825610fd3565b6001600160a01b0316610836610ca0565b6001600160a01b03161461085c5760405162461bcd60e51b8152600401610586906117dd565b600a55565b600061053861086e610fd3565b84846001600061087c610fd3565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108b091906119ea565b610fd7565b6108bd610fd3565b6001600160a01b03166108ce610ca0565b6001600160a01b0316146108f45760405162461bcd60e51b8152600401610586906117dd565b6108fe8282611266565b5050565b61091361090d610fd3565b8261132e565b50565b600c5481565b600a5481565b600654604051632f745c5960e01b81526000916001600160a01b031690632f745c59906109559086908690600401611594565b60206040518083038186803b15801561096d57600080fd5b505afa158015610981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a59190611568565b9392505050565b6001600160a01b031660009081526020819052604090205490565b6109cf610fd3565b6001600160a01b03166109e0610ca0565b6001600160a01b031614610a065760405162461bcd60e51b8152600401610586906117dd565b610a10600061141f565b565b6000610a2083610431610fd3565b905081811015610a425760405162461bcd60e51b815260040161058690611812565b610a5683610a4e610fd3565b848403610fd7565b610a60838361132e565b505050565b60105460ff1681565b33610a8b5760405162461bcd60e51b81526004016105869061175e565b60105460ff16610aad5760405162461bcd60e51b8152600401610586906118dc565b6000610abb42600a546111b5565b90506000805b6006546040516370a0823160e01b81526001600160a01b03909116906370a0823190610af1903390600401611580565b60206040518083038186803b158015610b0957600080fd5b505afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b419190611568565b811015610c4a57600654604051632f745c5960e01b81526000916001600160a01b031690632f745c5990610b7b9033908690600401611594565b60206040518083038186803b158015610b9357600080fd5b505afa158015610ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcb9190611568565b6000818152600f602052604081205491925090610bec9063616c64a06111cb565b9050848111610c35576000610c00836111db565b9050610c16620151806107e76107e08986611242565b610c2090866119ea565b6000848152600f602052604090208790559450505b50508080610c4290611a93565b915050610ac1565b5080156108fe57610c5b3382611266565b336001600160a01b03167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724182604051610c9491906119d3565b60405180910390a25050565b6005546001600160a01b031690565b610cb7610fd3565b6001600160a01b0316610cc8610ca0565b6001600160a01b031614610cee5760405162461bcd60e51b8152600401610586906117dd565b600d55565b6060600480546104a190611a58565b600d5481565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d39908590600401611580565b60206040518083038186803b158015610d5157600080fd5b505afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d899190611568565b92915050565b60008060016000610d9e610fd3565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610dea5760405162461bcd60e51b815260040161058690611957565b610dfe610df5610fd3565b85858403610fd7565b5060019392505050565b6000610538610e15610fd3565b848461108b565b600e5481565b600b5481565b610e30610fd3565b6001600160a01b0316610e41610ca0565b6001600160a01b031614610e675760405162461bcd60e51b8152600401610586906117dd565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610ebc610fd3565b6001600160a01b0316610ecd610ca0565b6001600160a01b031614610ef35760405162461bcd60e51b8152600401610586906117dd565b600c55565b6006546001600160a01b031681565b610f0f610fd3565b6001600160a01b0316610f20610ca0565b6001600160a01b031614610f465760405162461bcd60e51b8152600401610586906117dd565b600b55565b600f6020526000908152604090205481565b610f65610fd3565b6001600160a01b0316610f76610ca0565b6001600160a01b031614610f9c5760405162461bcd60e51b8152600401610586906117dd565b6001600160a01b038116610fc25760405162461bcd60e51b815260040161058690611690565b6109138161141f565b63616c64a081565b3390565b6001600160a01b038316610ffd5760405162461bcd60e51b815260040161058690611913565b6001600160a01b0382166110235760405162461bcd60e51b8152600401610586906116d6565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061107e9085906119d3565b60405180910390a3505050565b6001600160a01b0383166110b15760405162461bcd60e51b815260040161058690611897565b6001600160a01b0382166110d75760405162461bcd60e51b81526004016105869061160b565b6110e2838383610a60565b6001600160a01b0383166000908152602081905260409020548181101561111b5760405162461bcd60e51b815260040161058690611718565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906111529084906119ea565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161119c91906119d3565b60405180910390a36111af848484610a60565b50505050565b60008183106111c457816109a5565b5090919050565b6000818310156111c457816109a5565b600e5460008281526007602052604081205490919060ff16156112015750600b54610d89565b60008381526008602052604090205460ff16156112215750600c54610d89565b60008381526009602052604090205460ff1615610d895750600d5492915050565b60006109a58284611a41565b60006109a58284611a22565b60006109a58284611a02565b6001600160a01b03821661128c5760405162461bcd60e51b81526004016105869061199c565b61129860008383610a60565b80600260008282546112aa91906119ea565b90915550506001600160a01b038216600090815260208190526040812080548392906112d79084906119ea565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061131a9085906119d3565b60405180910390a36108fe60008383610a60565b6001600160a01b0382166113545760405162461bcd60e51b815260040161058690611856565b61136082600083610a60565b6001600160a01b038216600090815260208190526040902054818110156113995760405162461bcd60e51b81526004016105869061164e565b6001600160a01b03831660009081526020819052604081208383039055600280548492906113c8908490611a41565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061140b9086906119d3565b60405180910390a3610a6083600084610a60565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208284031215611482578081fd5b81356109a581611ac4565b6000806040838503121561149f578081fd5b82356114aa81611ac4565b915060208301356114ba81611ac4565b809150509250929050565b6000806000606084860312156114d9578081fd5b83356114e481611ac4565b925060208401356114f481611ac4565b929592945050506040919091013590565b60008060408385031215611517578182fd5b823561152281611ac4565b946020939093013593505050565b600060208284031215611541578081fd5b813580151581146109a5578182fd5b600060208284031215611561578081fd5b5035919050565b600060208284031215611579578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b818110156115e4578581018301518582016040015282016115c8565b818111156115f55783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6020808252601d908201527f6d757374206e6f742063616c6c2066726f6d20626c61636b20686f6c65000000604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604082015263616e636560e01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252601f908201527f7969656c6420726577617264206973206e6f7420656e61626c65642079657400604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b600082198211156119fd576119fd611aae565b500190565b600082611a1d57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611a3c57611a3c611aae565b500290565b600082821015611a5357611a53611aae565b500390565b600281046001821680611a6c57607f821691505b60208210811415611a8d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611aa757611aa7611aae565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461091357600080fdfea2646970667358221220da7a7ad34716661eef8df5eae9dd1ae5d1273eb502558c8213afacacf350f70564736f6c6343000800003300000000000000000000000030975acac70b5d774d6f756acd03a9b90cd4d4f5
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80637ef928c311610130578063ca525ada116100b8578063eec4846b1161007c578063eec4846b14610449578063f075c51314610451578063f077519414610464578063f2fde38b14610477578063f57d8b761461048a57610227565b8063ca525ada14610400578063cb84fda114610408578063da76d3ce14610410578063dd62ed3e14610423578063e144b8d41461043657610227565b806395d89b41116100ff57806395d89b41146103b757806395f7180d146103bf578063999415e3146103c7578063a457c2d7146103da578063a9059cbb146103ed57610227565b80637ef928c31461037f578063886fa019146103875780638da5cb5b1461038f57806391c80e67146103a457610227565b806339509351116101b3578063684f193711610182578063684f1937146103365780636bd1d0bc1461033e57806370a0823114610351578063715018a61461036457806379cc67901461036c57610227565b806339509351146102f557806340c10f191461030857806342966c681461031b5780634cbfa9a61461032e57610227565b8063216064ba116101fa578063216064ba1461029457806323b872dd146102a757806327aeba1e146102ba578063313ce567146102cd5780633784f000146102e257610227565b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461026a578063213e9cea1461027f575b600080fd5b610234610492565b60405161024191906115b8565b60405180910390f35b61025d610258366004611505565b610524565b60405161024191906115ad565b610272610541565b60405161024191906119d3565b61029261028d366004611550565b610547565b005b6102926102a2366004611530565b610594565b61025d6102b53660046114c5565b6105e6565b6102726102c8366004611471565b610676565b6102d5610818565b60405161024191906119dc565b6102926102f0366004611550565b61081d565b61025d610303366004611505565b610861565b610292610316366004611505565b6108b5565b610292610329366004611550565b610902565b610272610916565b61027261091c565b61027261034c366004611505565b610922565b61027261035f366004611471565b6109ac565b6102926109c7565b61029261037a366004611505565b610a12565b61025d610a65565b610292610a6e565b610397610ca0565b6040516102419190611580565b6102926103b2366004611550565b610caf565b610234610cf3565b610272610d02565b6102726103d5366004611471565b610d08565b61025d6103e8366004611505565b610d8f565b61025d6103fb366004611505565b610e08565b610272610e1c565b610272610e22565b61029261041e366004611471565b610e28565b61027261043136600461148d565b610e89565b610292610444366004611550565b610eb4565b610397610ef8565b61029261045f366004611550565b610f07565b610272610472366004611550565b610f4b565b610292610485366004611471565b610f5d565b610272610fcb565b6060600380546104a190611a58565b80601f01602080910402602001604051908101604052809291908181526020018280546104cd90611a58565b801561051a5780601f106104ef5761010080835404028352916020019161051a565b820191906000526020600020905b8154815290600101906020018083116104fd57829003601f168201915b5050505050905090565b6000610538610531610fd3565b8484610fd7565b50600192915050565b60025490565b61054f610fd3565b6001600160a01b0316610560610ca0565b6001600160a01b03161461058f5760405162461bcd60e51b8152600401610586906117dd565b60405180910390fd5b600e55565b61059c610fd3565b6001600160a01b03166105ad610ca0565b6001600160a01b0316146105d35760405162461bcd60e51b8152600401610586906117dd565b6010805460ff1916911515919091179055565b60006105f384848461108b565b6001600160a01b038416600090815260016020526040812081610614610fd3565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156106575760405162461bcd60e51b815260040161058690611795565b61066b85610663610fd3565b858403610fd7565b506001949350505050565b60008061068542600a546111b5565b90506000805b6006546040516370a0823160e01b81526001600160a01b03909116906370a08231906106bb908890600401611580565b60206040518083038186803b1580156106d357600080fd5b505afa1580156106e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070b9190611568565b81101561081057600654604051632f745c5960e01b81526000916001600160a01b031690632f745c59906107459089908690600401611594565b60206040518083038186803b15801561075d57600080fd5b505afa158015610771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107959190611568565b6000818152600f6020526040812054919250906107b69063616c64a06111cb565b90508481116107fb5760006107ca836111db565b90506107ed620151806107e76107e08986611242565b849061124e565b9061125a565b6107f790866119ea565b9450505b5050808061080890611a93565b91505061068b565b509392505050565b601290565b610825610fd3565b6001600160a01b0316610836610ca0565b6001600160a01b03161461085c5760405162461bcd60e51b8152600401610586906117dd565b600a55565b600061053861086e610fd3565b84846001600061087c610fd3565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108b091906119ea565b610fd7565b6108bd610fd3565b6001600160a01b03166108ce610ca0565b6001600160a01b0316146108f45760405162461bcd60e51b8152600401610586906117dd565b6108fe8282611266565b5050565b61091361090d610fd3565b8261132e565b50565b600c5481565b600a5481565b600654604051632f745c5960e01b81526000916001600160a01b031690632f745c59906109559086908690600401611594565b60206040518083038186803b15801561096d57600080fd5b505afa158015610981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a59190611568565b9392505050565b6001600160a01b031660009081526020819052604090205490565b6109cf610fd3565b6001600160a01b03166109e0610ca0565b6001600160a01b031614610a065760405162461bcd60e51b8152600401610586906117dd565b610a10600061141f565b565b6000610a2083610431610fd3565b905081811015610a425760405162461bcd60e51b815260040161058690611812565b610a5683610a4e610fd3565b848403610fd7565b610a60838361132e565b505050565b60105460ff1681565b33610a8b5760405162461bcd60e51b81526004016105869061175e565b60105460ff16610aad5760405162461bcd60e51b8152600401610586906118dc565b6000610abb42600a546111b5565b90506000805b6006546040516370a0823160e01b81526001600160a01b03909116906370a0823190610af1903390600401611580565b60206040518083038186803b158015610b0957600080fd5b505afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b419190611568565b811015610c4a57600654604051632f745c5960e01b81526000916001600160a01b031690632f745c5990610b7b9033908690600401611594565b60206040518083038186803b158015610b9357600080fd5b505afa158015610ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcb9190611568565b6000818152600f602052604081205491925090610bec9063616c64a06111cb565b9050848111610c35576000610c00836111db565b9050610c16620151806107e76107e08986611242565b610c2090866119ea565b6000848152600f602052604090208790559450505b50508080610c4290611a93565b915050610ac1565b5080156108fe57610c5b3382611266565b336001600160a01b03167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724182604051610c9491906119d3565b60405180910390a25050565b6005546001600160a01b031690565b610cb7610fd3565b6001600160a01b0316610cc8610ca0565b6001600160a01b031614610cee5760405162461bcd60e51b8152600401610586906117dd565b600d55565b6060600480546104a190611a58565b600d5481565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610d39908590600401611580565b60206040518083038186803b158015610d5157600080fd5b505afa158015610d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d899190611568565b92915050565b60008060016000610d9e610fd3565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610dea5760405162461bcd60e51b815260040161058690611957565b610dfe610df5610fd3565b85858403610fd7565b5060019392505050565b6000610538610e15610fd3565b848461108b565b600e5481565b600b5481565b610e30610fd3565b6001600160a01b0316610e41610ca0565b6001600160a01b031614610e675760405162461bcd60e51b8152600401610586906117dd565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610ebc610fd3565b6001600160a01b0316610ecd610ca0565b6001600160a01b031614610ef35760405162461bcd60e51b8152600401610586906117dd565b600c55565b6006546001600160a01b031681565b610f0f610fd3565b6001600160a01b0316610f20610ca0565b6001600160a01b031614610f465760405162461bcd60e51b8152600401610586906117dd565b600b55565b600f6020526000908152604090205481565b610f65610fd3565b6001600160a01b0316610f76610ca0565b6001600160a01b031614610f9c5760405162461bcd60e51b8152600401610586906117dd565b6001600160a01b038116610fc25760405162461bcd60e51b815260040161058690611690565b6109138161141f565b63616c64a081565b3390565b6001600160a01b038316610ffd5760405162461bcd60e51b815260040161058690611913565b6001600160a01b0382166110235760405162461bcd60e51b8152600401610586906116d6565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061107e9085906119d3565b60405180910390a3505050565b6001600160a01b0383166110b15760405162461bcd60e51b815260040161058690611897565b6001600160a01b0382166110d75760405162461bcd60e51b81526004016105869061160b565b6110e2838383610a60565b6001600160a01b0383166000908152602081905260409020548181101561111b5760405162461bcd60e51b815260040161058690611718565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906111529084906119ea565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161119c91906119d3565b60405180910390a36111af848484610a60565b50505050565b60008183106111c457816109a5565b5090919050565b6000818310156111c457816109a5565b600e5460008281526007602052604081205490919060ff16156112015750600b54610d89565b60008381526008602052604090205460ff16156112215750600c54610d89565b60008381526009602052604090205460ff1615610d895750600d5492915050565b60006109a58284611a41565b60006109a58284611a22565b60006109a58284611a02565b6001600160a01b03821661128c5760405162461bcd60e51b81526004016105869061199c565b61129860008383610a60565b80600260008282546112aa91906119ea565b90915550506001600160a01b038216600090815260208190526040812080548392906112d79084906119ea565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061131a9085906119d3565b60405180910390a36108fe60008383610a60565b6001600160a01b0382166113545760405162461bcd60e51b815260040161058690611856565b61136082600083610a60565b6001600160a01b038216600090815260208190526040902054818110156113995760405162461bcd60e51b81526004016105869061164e565b6001600160a01b03831660009081526020819052604081208383039055600280548492906113c8908490611a41565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061140b9086906119d3565b60405180910390a3610a6083600084610a60565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208284031215611482578081fd5b81356109a581611ac4565b6000806040838503121561149f578081fd5b82356114aa81611ac4565b915060208301356114ba81611ac4565b809150509250929050565b6000806000606084860312156114d9578081fd5b83356114e481611ac4565b925060208401356114f481611ac4565b929592945050506040919091013590565b60008060408385031215611517578182fd5b823561152281611ac4565b946020939093013593505050565b600060208284031215611541578081fd5b813580151581146109a5578182fd5b600060208284031215611561578081fd5b5035919050565b600060208284031215611579578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b818110156115e4578581018301518582016040015282016115c8565b818111156115f55783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6020808252601d908201527f6d757374206e6f742063616c6c2066726f6d20626c61636b20686f6c65000000604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604082015263616e636560e01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252601f908201527f7969656c6420726577617264206973206e6f7420656e61626c65642079657400604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b600082198211156119fd576119fd611aae565b500190565b600082611a1d57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611a3c57611a3c611aae565b500290565b600082821015611a5357611a53611aae565b500390565b600281046001821680611a6c57607f821691505b60208210811415611a8d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611aa757611aa7611aae565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461091357600080fdfea2646970667358221220da7a7ad34716661eef8df5eae9dd1ae5d1273eb502558c8213afacacf350f70564736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000030975acac70b5d774d6f756acd03a9b90cd4d4f5
-----Decoded View---------------
Arg [0] : mpAddress (address): 0x30975aCac70B5d774D6f756ACd03a9B90CD4D4F5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000030975acac70b5d774d6f756acd03a9b90cd4d4f5
Deployed Bytecode Sourcemap
36104:8824:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13825:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15992:169;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14945:108::-;;;:::i;:::-;;;;;;;:::i;42445:97::-;;;;;;:::i;:::-;;:::i;:::-;;41792:110;;;;;;:::i;:::-;;:::i;16643:492::-;;;;;;:::i;:::-;;:::i;42991:616::-;;;;;;:::i;:::-;;:::i;14787:93::-;;;:::i;:::-;;;;;;;:::i;42027:87::-;;;;;;:::i;:::-;;:::i;17544:215::-;;;;;;:::i;:::-;;:::i;42550:95::-;;;;;;:::i;:::-;;:::i;24360:91::-;;;;;;:::i;:::-;;:::i;36702:41::-;;;:::i;36575:32::-;;;:::i;42814:169::-;;;;;;:::i;:::-;;:::i;15116:127::-;;;;;;:::i;:::-;;:::i;35189:103::-;;;:::i;24770:368::-;;;;;;:::i;:::-;;:::i;37060:31::-;;;:::i;43615:869::-;;;:::i;34538:87::-;;;:::i;:::-;;;;;;;:::i;42332:105::-;;;;;;:::i;:::-;;:::i;14044:104::-;;;:::i;36750:44::-;;;:::i;42687:119::-;;;;;;:::i;:::-;;:::i;18262:413::-;;;;;;:::i;:::-;;:::i;15456:175::-;;;;;;:::i;:::-;;:::i;36801:41::-;;;:::i;36654:::-;;;:::i;41910:109::-;;;;;;:::i;:::-;;:::i;15694:151::-;;;;;;:::i;:::-;;:::i;42227:97::-;;;;;;:::i;:::-;;:::i;36191:35::-;;;:::i;42122:97::-;;;;;;:::i;:::-;;:::i;36969:54::-;;;;;;:::i;:::-;;:::i;35447:201::-;;;;;;:::i;:::-;;:::i;36450:43::-;;;:::i;13825:100::-;13879:13;13912:5;13905:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13825:100;:::o;15992:169::-;16075:4;16092:39;16101:12;:10;:12::i;:::-;16115:7;16124:6;16092:8;:39::i;:::-;-1:-1:-1;16149:4:0;15992:169;;;;:::o;14945:108::-;15033:12;;14945:108;:::o;42445:97::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;;;;;;;;;42513:14:::1;:21:::0;42445:97::o;41792:110::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;41865:19:::1;:29:::0;;-1:-1:-1;;41865:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41792:110::o;16643:492::-;16783:4;16800:36;16810:6;16818:9;16829:6;16800:9;:36::i;:::-;-1:-1:-1;;;;;16876:19:0;;16849:24;16876:19;;;:11;:19;;;;;16849:24;16896:12;:10;:12::i;:::-;-1:-1:-1;;;;;16876:33:0;-1:-1:-1;;;;;16876:33:0;;;;;;;;;;;;;16849:60;;16948:6;16928:16;:26;;16920:79;;;;-1:-1:-1;;;16920:79:0;;;;;;;:::i;:::-;17035:57;17044:6;17052:12;:10;:12::i;:::-;17085:6;17066:16;:25;17035:8;:57::i;:::-;-1:-1:-1;17123:4:0;;16643:492;-1:-1:-1;;;;16643:492:0:o;42991:616::-;43055:7;43075:15;43093:31;43102:15;43119:4;;43093:8;:31::i;:::-;43075:49;;43129:14;43165:9;43160:414;43184:10;;:26;;-1:-1:-1;;;43184:26:0;;-1:-1:-1;;;;;43184:10:0;;;;:20;;:26;;43205:4;;43184:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43180:1;:30;43160:414;;;43250:10;;:39;;-1:-1:-1;;;43250:39:0;;43232:15;;-1:-1:-1;;;;;43250:10:0;;:30;;:39;;43281:4;;43287:1;;43250:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43304:16;43332:28;;;:19;:28;;;;;;43232:57;;-1:-1:-1;43304:16:0;43323:46;;36483:10;43323:8;:46::i;:::-;43304:65;;43402:7;43390:8;:19;43386:177;;43430:16;43449:21;43462:7;43449:12;:21::i;:::-;43430:40;-1:-1:-1;43499:48:0;43541:5;43499:37;43513:21;:7;43525:8;43513:11;:21::i;:::-;43499:8;;:12;:37::i;:::-;:41;;:48::i;:::-;43489:58;;;;:::i;:::-;;;43386:177;;43160:414;;43212:3;;;;;:::i;:::-;;;;43160:414;;;-1:-1:-1;43593:6:0;42991:616;-1:-1:-1;;;42991:616:0:o;14787:93::-;14870:2;14787:93;:::o;42027:87::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;42092:4:::1;:14:::0;42027:87::o;17544:215::-;17632:4;17649:80;17658:12;:10;:12::i;:::-;17672:7;17718:10;17681:11;:25;17693:12;:10;:12::i;:::-;-1:-1:-1;;;;;17681:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;17681:25:0;;;:34;;;;;;;;;;:47;;;;:::i;:::-;17649:8;:80::i;42550:95::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;42620:17:::1;42626:2;42630:6;42620:5;:17::i;:::-;42550:95:::0;;:::o;24360:91::-;24416:27;24422:12;:10;:12::i;:::-;24436:6;24416:5;:27::i;:::-;24360:91;:::o;36702:41::-;;;;:::o;36575:32::-;;;;:::o;42814:169::-;42931:10;;:44;;-1:-1:-1;;;42931:44:0;;42896:15;;-1:-1:-1;;;;;42931:10:0;;:30;;:44;;42962:5;;42969;;42931:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42924:51;42814:169;-1:-1:-1;;;42814:169:0:o;15116:127::-;-1:-1:-1;;;;;15217:18:0;15190:7;15217:18;;;;;;;;;;;;15116:127::o;35189:103::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;35254:30:::1;35281:1;35254:18;:30::i;:::-;35189:103::o:0;24770:368::-;24847:24;24874:32;24884:7;24893:12;:10;:12::i;24874:32::-;24847:59;;24945:6;24925:16;:26;;24917:75;;;;-1:-1:-1;;;24917:75:0;;;;;;;:::i;:::-;25028:58;25037:7;25046:12;:10;:12::i;:::-;25079:6;25060:16;:25;25028:8;:58::i;:::-;25108:22;25114:7;25123:6;25108:5;:22::i;:::-;24770:368;;;:::o;37060:31::-;;;;;;:::o;43615:869::-;43666:10;43658:66;;;;-1:-1:-1;;;43658:66:0;;;;;;;:::i;:::-;43743:19;;;;43735:63;;;;-1:-1:-1;;;43735:63:0;;;;;;;:::i;:::-;43809:15;43827:31;43836:15;43853:4;;43827:8;:31::i;:::-;43809:49;;43863:14;43899:9;43894:483;43918:10;;:32;;-1:-1:-1;;;43918:32:0;;-1:-1:-1;;;;;43918:10:0;;;;:20;;:32;;43939:10;;43918:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43914:1;:36;43894:483;;;43990:10;;:45;;-1:-1:-1;;;43990:45:0;;43972:15;;-1:-1:-1;;;;;43990:10:0;;:30;;:45;;44021:10;;44033:1;;43990:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44050:16;44078:28;;;:19;:28;;;;;;43972:63;;-1:-1:-1;44050:16:0;44069:46;;36483:10;44069:8;:46::i;:::-;44050:65;;44148:7;44136:8;:19;44132:234;;44176:16;44195:21;44208:7;44195:12;:21::i;:::-;44176:40;-1:-1:-1;44245:48:0;44287:5;44245:37;44259:21;:7;44271:8;44259:11;:21::i;44245:48::-;44235:58;;;;:::i;:::-;44312:28;;;;:19;:28;;;;;:38;;;44235:58;-1:-1:-1;;44132:234:0;43894:483;;43952:3;;;;;:::i;:::-;;;;43894:483;;;-1:-1:-1;44387:10:0;;44383:97;;44405:25;44411:10;44423:6;44405:5;:25::i;:::-;44455:10;-1:-1:-1;;;;;44441:33:0;;44467:6;44441:33;;;;;;:::i;:::-;;;;;;;;43615:869;;:::o;34538:87::-;34611:6;;-1:-1:-1;;;;;34611:6:0;34538:87;:::o;42332:105::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;42404:18:::1;:25:::0;42332:105::o;14044:104::-;14100:13;14133:7;14126:14;;;;;:::i;36750:44::-;;;;:::o;42687:119::-;42773:10;;:25;;-1:-1:-1;;;42773:25:0;;42746:7;;-1:-1:-1;;;;;42773:10:0;;:20;;:25;;42794:3;;42773:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42766:32;42687:119;-1:-1:-1;;42687:119:0:o;18262:413::-;18355:4;18372:24;18399:11;:25;18411:12;:10;:12::i;:::-;-1:-1:-1;;;;;18399:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;18399:25:0;;;:34;;;;;;;;;;;-1:-1:-1;18452:35:0;;;;18444:85;;;;-1:-1:-1;;;18444:85:0;;;;;;;:::i;:::-;18565:67;18574:12;:10;:12::i;:::-;18588:7;18616:15;18597:16;:34;18565:8;:67::i;:::-;-1:-1:-1;18663:4:0;;18262:413;-1:-1:-1;;;18262:413:0:o;15456:175::-;15542:4;15559:42;15569:12;:10;:12::i;:::-;15583:9;15594:6;15559:9;:42::i;36801:41::-;;;;:::o;36654:::-;;;;:::o;41910:109::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;41989:10:::1;:22:::0;;-1:-1:-1;;;;;;41989:22:0::1;-1:-1:-1::0;;;;;41989:22:0;;;::::1;::::0;;;::::1;::::0;;41910:109::o;15694:151::-;-1:-1:-1;;;;;15810:18:0;;;15783:7;15810:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15694:151::o;42227:97::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;42295:14:::1;:21:::0;42227:97::o;36191:35::-;;;-1:-1:-1;;;;;36191:35:0;;:::o;42122:97::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;42190:14:::1;:21:::0;42122:97::o;36969:54::-;;;;;;;;;;;;;:::o;35447:201::-;34769:12;:10;:12::i;:::-;-1:-1:-1;;;;;34758:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34758:23:0;;34750:68;;;;-1:-1:-1;;;34750:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35536:22:0;::::1;35528:73;;;;-1:-1:-1::0;;;35528:73:0::1;;;;;;;:::i;:::-;35612:28;35631:8;35612:18;:28::i;36450:43::-:0;36483:10;36450:43;:::o;11474:98::-;11554:10;11474:98;:::o;21946:380::-;-1:-1:-1;;;;;22082:19:0;;22074:68;;;;-1:-1:-1;;;22074:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22161:21:0;;22153:68;;;;-1:-1:-1;;;22153:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22234:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;22286:32;;;;;22264:6;;22286:32;:::i;:::-;;;;;;;;21946:380;;;:::o;19165:733::-;-1:-1:-1;;;;;19305:20:0;;19297:70;;;;-1:-1:-1;;;19297:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19386:23:0;;19378:71;;;;-1:-1:-1;;;19378:71:0;;;;;;;:::i;:::-;19462:47;19483:6;19491:9;19502:6;19462:20;:47::i;:::-;-1:-1:-1;;;;;19546:17:0;;19522:21;19546:17;;;;;;;;;;;19582:23;;;;19574:74;;;;-1:-1:-1;;;19574:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19684:17:0;;;:9;:17;;;;;;;;;;;19704:22;;;19684:42;;19748:20;;;;;;;;:30;;19720:6;;19684:9;19748:30;;19720:6;;19748:30;:::i;:::-;;;;;;;;19813:9;-1:-1:-1;;;;;19796:35:0;19805:6;-1:-1:-1;;;;;19796:35:0;;19824:6;19796:35;;;;;;:::i;:::-;;;;;;;;19844:46;19864:6;19872:9;19883:6;19844:19;:46::i;:::-;19165:733;;;;:::o;32678:106::-;32736:7;32767:1;32763;:5;:13;;32775:1;32763:13;;;-1:-1:-1;32771:1:0;;32678:106;-1:-1:-1;32678:106:0:o;32495:107::-;32553:7;32585:1;32580;:6;;:14;;32593:1;32580:14;;44519:406;44618:14;;44579:7;44649:17;;;:8;:17;;;;;;44579:7;;44618:14;44649:17;;44645:245;;;-1:-1:-1;44694:14:0;;44645:245;;;44730:17;;;;:8;:17;;;;;;;;44726:164;;;-1:-1:-1;44775:14:0;;44726:164;;;44811:21;;;;:12;:21;;;;;;;;44807:83;;;-1:-1:-1;44860:18:0;;44909:8;44519:406;-1:-1:-1;;44519:406:0:o;28396:98::-;28454:7;28481:5;28485:1;28481;:5;:::i;28753:98::-;28811:7;28838:5;28842:1;28838;:5;:::i;29152:98::-;29210:7;29237:5;29241:1;29237;:5;:::i;20185:399::-;-1:-1:-1;;;;;20269:21:0;;20261:65;;;;-1:-1:-1;;;20261:65:0;;;;;;;:::i;:::-;20339:49;20368:1;20372:7;20381:6;20339:20;:49::i;:::-;20417:6;20401:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;20434:18:0;;:9;:18;;;;;;;;;;:28;;20456:6;;20434:9;:28;;20456:6;;20434:28;:::i;:::-;;;;-1:-1:-1;;20478:37:0;;-1:-1:-1;;;;;20478:37:0;;;20495:1;;20478:37;;;;20508:6;;20478:37;:::i;:::-;;;;;;;;20528:48;20556:1;20560:7;20569:6;20528:19;:48::i;20917:591::-;-1:-1:-1;;;;;21001:21:0;;20993:67;;;;-1:-1:-1;;;20993:67:0;;;;;;;:::i;:::-;21073:49;21094:7;21111:1;21115:6;21073:20;:49::i;:::-;-1:-1:-1;;;;;21160:18:0;;21135:22;21160:18;;;;;;;;;;;21197:24;;;;21189:71;;;;-1:-1:-1;;;21189:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21296:18:0;;:9;:18;;;;;;;;;;21317:23;;;21296:44;;21362:12;:22;;21334:6;;21296:9;21362:22;;21334:6;;21362:22;:::i;:::-;;;;-1:-1:-1;;21402:37:0;;21428:1;;-1:-1:-1;;;;;21402:37:0;;;;;;;21432:6;;21402:37;:::i;:::-;;;;;;;;21452:48;21472:7;21489:1;21493:6;21452:19;:48::i;35808:191::-;35901:6;;;-1:-1:-1;;;;;35918:17:0;;;-1:-1:-1;;;;;;35918:17:0;;;;;;;35951:40;;35901:6;;;35918:17;35901:6;;35951:40;;35882:16;;35951:40;35808:191;;:::o;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:402::-;;;407:2;395:9;386:7;382:23;378:32;375:2;;;428:6;420;413:22;375:2;472:9;459:23;491:33;518:5;491:33;:::i;:::-;543:5;-1:-1:-1;600:2:1;585:18;;572:32;613:35;572:32;613:35;:::i;:::-;667:7;657:17;;;365:315;;;;;:::o;685:470::-;;;;831:2;819:9;810:7;806:23;802:32;799:2;;;852:6;844;837:22;799:2;896:9;883:23;915:33;942:5;915:33;:::i;:::-;967:5;-1:-1:-1;1024:2:1;1009:18;;996:32;1037:35;996:32;1037:35;:::i;:::-;789:366;;1091:7;;-1:-1:-1;;;1145:2:1;1130:18;;;;1117:32;;789:366::o;1160:327::-;;;1289:2;1277:9;1268:7;1264:23;1260:32;1257:2;;;1310:6;1302;1295:22;1257:2;1354:9;1341:23;1373:33;1400:5;1373:33;:::i;:::-;1425:5;1477:2;1462:18;;;;1449:32;;-1:-1:-1;;;1247:240:1:o;1492:293::-;;1601:2;1589:9;1580:7;1576:23;1572:32;1569:2;;;1622:6;1614;1607:22;1569:2;1666:9;1653:23;1719:5;1712:13;1705:21;1698:5;1695:32;1685:2;;1746:6;1738;1731:22;2079:190;;2191:2;2179:9;2170:7;2166:23;2162:32;2159:2;;;2212:6;2204;2197:22;2159:2;-1:-1:-1;2240:23:1;;2149:120;-1:-1:-1;2149:120:1:o;2274:194::-;;2397:2;2385:9;2376:7;2372:23;2368:32;2365:2;;;2418:6;2410;2403:22;2365:2;-1:-1:-1;2446:16:1;;2355:113;-1:-1:-1;2355:113:1:o;2473:203::-;-1:-1:-1;;;;;2637:32:1;;;;2619:51;;2607:2;2592:18;;2574:102::o;2681:274::-;-1:-1:-1;;;;;2873:32:1;;;;2855:51;;2937:2;2922:18;;2915:34;2843:2;2828:18;;2810:145::o;2960:187::-;3125:14;;3118:22;3100:41;;3088:2;3073:18;;3055:92::o;3385:603::-;;3526:2;3555;3544:9;3537:21;3587:6;3581:13;3630:6;3625:2;3614:9;3610:18;3603:34;3655:4;3668:140;3682:6;3679:1;3676:13;3668:140;;;3777:14;;;3773:23;;3767:30;3743:17;;;3762:2;3739:26;3732:66;3697:10;;3668:140;;;3826:6;3823:1;3820:13;3817:2;;;3896:4;3891:2;3882:6;3871:9;3867:22;3863:31;3856:45;3817:2;-1:-1:-1;3972:2:1;3951:15;-1:-1:-1;;3947:29:1;3932:45;;;;3979:2;3928:54;;3506:482;-1:-1:-1;;;3506:482:1:o;3993:399::-;4195:2;4177:21;;;4234:2;4214:18;;;4207:30;4273:34;4268:2;4253:18;;4246:62;-1:-1:-1;;;4339:2:1;4324:18;;4317:33;4382:3;4367:19;;4167:225::o;4397:398::-;4599:2;4581:21;;;4638:2;4618:18;;;4611:30;4677:34;4672:2;4657:18;;4650:62;-1:-1:-1;;;4743:2:1;4728:18;;4721:32;4785:3;4770:19;;4571:224::o;4800:402::-;5002:2;4984:21;;;5041:2;5021:18;;;5014:30;5080:34;5075:2;5060:18;;5053:62;-1:-1:-1;;;5146:2:1;5131:18;;5124:36;5192:3;5177:19;;4974:228::o;5207:398::-;5409:2;5391:21;;;5448:2;5428:18;;;5421:30;5487:34;5482:2;5467:18;;5460:62;-1:-1:-1;;;5553:2:1;5538:18;;5531:32;5595:3;5580:19;;5381:224::o;5610:402::-;5812:2;5794:21;;;5851:2;5831:18;;;5824:30;5890:34;5885:2;5870:18;;5863:62;-1:-1:-1;;;5956:2:1;5941:18;;5934:36;6002:3;5987:19;;5784:228::o;6017:353::-;6219:2;6201:21;;;6258:2;6238:18;;;6231:30;6297:31;6292:2;6277:18;;6270:59;6361:2;6346:18;;6191:179::o;6375:404::-;6577:2;6559:21;;;6616:2;6596:18;;;6589:30;6655:34;6650:2;6635:18;;6628:62;-1:-1:-1;;;6721:2:1;6706:18;;6699:38;6769:3;6754:19;;6549:230::o;6784:356::-;6986:2;6968:21;;;7005:18;;;6998:30;7064:34;7059:2;7044:18;;7037:62;7131:2;7116:18;;6958:182::o;7145:400::-;7347:2;7329:21;;;7386:2;7366:18;;;7359:30;7425:34;7420:2;7405:18;;7398:62;-1:-1:-1;;;7491:2:1;7476:18;;7469:34;7535:3;7520:19;;7319:226::o;7550:397::-;7752:2;7734:21;;;7791:2;7771:18;;;7764:30;7830:34;7825:2;7810:18;;7803:62;-1:-1:-1;;;7896:2:1;7881:18;;7874:31;7937:3;7922:19;;7724:223::o;7952:401::-;8154:2;8136:21;;;8193:2;8173:18;;;8166:30;8232:34;8227:2;8212:18;;8205:62;-1:-1:-1;;;8298:2:1;8283:18;;8276:35;8343:3;8328:19;;8126:227::o;8358:355::-;8560:2;8542:21;;;8599:2;8579:18;;;8572:30;8638:33;8633:2;8618:18;;8611:61;8704:2;8689:18;;8532:181::o;8718:400::-;8920:2;8902:21;;;8959:2;8939:18;;;8932:30;8998:34;8993:2;8978:18;;8971:62;-1:-1:-1;;;9064:2:1;9049:18;;9042:34;9108:3;9093:19;;8892:226::o;9123:401::-;9325:2;9307:21;;;9364:2;9344:18;;;9337:30;9403:34;9398:2;9383:18;;9376:62;-1:-1:-1;;;9469:2:1;9454:18;;9447:35;9514:3;9499:19;;9297:227::o;9529:355::-;9731:2;9713:21;;;9770:2;9750:18;;;9743:30;9809:33;9804:2;9789:18;;9782:61;9875:2;9860:18;;9703:181::o;9889:177::-;10035:25;;;10023:2;10008:18;;9990:76::o;10071:184::-;10243:4;10231:17;;;;10213:36;;10201:2;10186:18;;10168:87::o;10260:128::-;;10331:1;10327:6;10324:1;10321:13;10318:2;;;10337:18;;:::i;:::-;-1:-1:-1;10373:9:1;;10308:80::o;10393:217::-;;10459:1;10449:2;;-1:-1:-1;;;10484:31:1;;10538:4;10535:1;10528:15;10566:4;10491:1;10556:15;10449:2;-1:-1:-1;10595:9:1;;10439:171::o;10615:168::-;;10721:1;10717;10713:6;10709:14;10706:1;10703:21;10698:1;10691:9;10684:17;10680:45;10677:2;;;10728:18;;:::i;:::-;-1:-1:-1;10768:9:1;;10667:116::o;10788:125::-;;10856:1;10853;10850:8;10847:2;;;10861:18;;:::i;:::-;-1:-1:-1;10898:9:1;;10837:76::o;10918:380::-;11003:1;10993:12;;11050:1;11040:12;;;11061:2;;11115:4;11107:6;11103:17;11093:27;;11061:2;11168;11160:6;11157:14;11137:18;11134:38;11131:2;;;11214:10;11209:3;11205:20;11202:1;11195:31;11249:4;11246:1;11239:15;11277:4;11274:1;11267:15;11131:2;;10973:325;;;:::o;11303:135::-;;-1:-1:-1;;11363:17:1;;11360:2;;;11383:18;;:::i;:::-;-1:-1:-1;11430:1:1;11419:13;;11350:88::o;11443:127::-;11504:10;11499:3;11495:20;11492:1;11485:31;11535:4;11532:1;11525:15;11559:4;11556:1;11549:15;11575:133;-1:-1:-1;;;;;11652:31:1;;11642:42;;11632:2;;11698:1;11695;11688:12
Swarm Source
ipfs://da7a7ad34716661eef8df5eae9dd1ae5d1273eb502558c8213afacacf350f705
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.