ERC-721
NFT
Overview
Max Total Supply
1,111 AHMC
Holders
420
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
16 AHMCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AHMC
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-04 */ // SPDX-License-Identifier: MIT 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; } } 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + _totalReleased; uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account]; require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] = _released[account] + payment; _totalReleased = _totalReleased + payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } 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); } 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; } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } 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 no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /************************* * @author: Squeebo * * @license: BSD-3-Clause * **************************/ contract Delegated is Ownable{ mapping(address => bool) internal _delegates; constructor(){ _delegates[owner()] = true; } modifier onlyDelegates { require(_delegates[msg.sender], "Invalid delegate" ); _; } //onlyOwner function isDelegate( address addr ) external view onlyOwner returns ( bool ){ return _delegates[addr]; } function setDelegate( address addr, bool isDelegate_ ) external onlyOwner{ _delegates[addr] = isDelegate_; } } pragma solidity ^0.8.0; /************************* * @author: Squeebo * * @license: BSD-3-Clause * **************************/ abstract contract ERC721B is Context, ERC165, IERC721, IERC721Metadata { using Address for address; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address address[] internal _owners; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); uint count = 0; uint length = _owners.length; for( uint i = 0; i < length; ++i ){ if( owner == _owners[i] ){ ++count; } } delete length; return count; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721B.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721B.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _owners.push(to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721B.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _owners[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721B.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721B.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` 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 tokenId ) internal virtual {} } pragma solidity ^0.8.0; /************************* * @author: Squeebo * * @license: BSD-3-Clause * **************************/ /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721EnumerableB is ERC721B, IERC721Enumerable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721B) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { require(index < ERC721B.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); uint count; uint length = _owners.length; for( uint i; i < length; ++i ){ if( owner == _owners[i] ){ if( count == index ){ delete count; delete length; return i; } else ++count; } } delete count; delete length; require(false, "ERC721Enumerable: owner index out of bounds"); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _owners.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721EnumerableB.totalSupply(), "ERC721Enumerable: global index out of bounds"); return index; } } pragma solidity ^0.8.0; /**************************************** * @author: Squeebo * * @team: X-11 * **************************************** * Blimpie-ERC721 provides low-gas * * mints + transfers * ****************************************/ contract AHMC is Delegated, ERC721EnumerableB, PaymentSplitter { using Strings for uint; uint public MAX_SUPPLY = 1111; bool public isActive = false; uint public maxOrder = 11; uint public price = 0.11 ether; string private _baseTokenURI = ''; string private _tokenURISuffix = ''; mapping(address => uint[]) private _balances; address[] private addressList = [ 0x13d86B7a637B9378d3646FA50De24e4e8fd78393, 0xB7edf3Cbb58ecb74BdE6298294c7AAb339F3cE4a ]; uint[] private shareList = [ 84, 16 ]; constructor() Delegated() ERC721B("APE HARMONY MONSTER CLUB", "AHMC") PaymentSplitter(addressList, shareList) { } //external fallback() external payable {} function mint( uint quantity ) external payable { require( isActive, "Sale is not active" ); require( quantity <= maxOrder, "Order too big" ); require( msg.value >= price * quantity, "Ether sent is not correct" ); uint256 supply = totalSupply(); require( supply + quantity <= MAX_SUPPLY, "Mint/order exceeds supply" ); for(uint i = 0; i < quantity; ++i){ _safeMint( msg.sender, supply++, "" ); } } //external delegated function gift(uint[] calldata quantity, address[] calldata recipient) external onlyDelegates{ require(quantity.length == recipient.length, "Must provide equal quantities and recipients" ); uint totalQuantity = 0; uint256 supply = totalSupply(); for(uint i = 0; i < quantity.length; ++i){ totalQuantity += quantity[i]; } require( supply + totalQuantity <= MAX_SUPPLY, "Mint/order exceeds supply" ); delete totalQuantity; for(uint i = 0; i < recipient.length; ++i){ for(uint j = 0; j < quantity[i]; ++j){ _safeMint( recipient[i], supply++, "Sent with love" ); } } } function setActive(bool isActive_) external onlyDelegates{ if( isActive != isActive_ ) isActive = isActive_; } function setMaxOrder(uint maxOrder_) external onlyDelegates{ if( maxOrder != maxOrder_ ) maxOrder = maxOrder_; } function setPrice(uint price_ ) external onlyDelegates{ if( price != price_ ) price = price_; } function setBaseURI(string calldata _newBaseURI, string calldata _newSuffix) external onlyDelegates{ _baseTokenURI = _newBaseURI; _tokenURISuffix = _newSuffix; } //external owner function setMaxSupply(uint maxSupply) external onlyOwner{ if( MAX_SUPPLY != maxSupply ){ require(maxSupply >= totalSupply(), "Specified supply is lower than current balance" ); MAX_SUPPLY = maxSupply; } } //public function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner].length; } function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { require(index < ERC721B.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _balances[owner][index]; } function tokenURI(uint tokenId) external view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), _tokenURISuffix)); } //internal function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override virtual { address zero = address(0); if( from != zero || to == zero ){ //find this token and remove it uint length = _balances[from].length; for( uint i; i < length; ++i ){ if( _balances[from][i] == tokenId ){ _balances[from][i] = _balances[from][length - 1]; _balances[from].pop(); break; } } delete length; } if( from == zero || to != zero ){ _balances[to].push( tokenId ); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive_","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"},{"internalType":"string","name":"_newSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxOrder_","type":"uint256"}],"name":"setMaxOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610457600c55600d805460ff19169055600b600e55670186cc6acd4b0000600f5560a06040819052600060808190526200003c91601091620005e6565b506040805160208101918290526000908190526200005d91601191620005e6565b50604080518082019091527313d86b7a637b9378d3646fa50de24e4e8fd78393815273b7edf3cbb58ecb74bde6298294c7aab339f3ce4a6020820152620000a990601390600262000675565b50604080518082019091526054815260106020820152620000cf906014906002620006cd565b50348015620000dd57600080fd5b5060138054806020026020016040519081016040528092919081815260200182805480156200013657602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000117575b505050505060148054806020026020016040519081016040528092919081815260200182805480156200018957602002820191906000526020600020905b81548152602001906001019080831162000174575b50505050506040518060400160405280601881526020017f415045204841524d4f4e59204d4f4e5354455220434c554200000000000000008152506040518060400160405280600481526020016341484d4360e01b815250620001fb620001f5620003a460201b60201c565b620003a8565b6001806000620002136000546001600160a01b031690565b6001600160a01b03168152602080820192909252604001600020805460ff1916921515929092179091558251620002519160029190850190620005e6565b50805162000267906003906020840190620005e6565b5050508051825114620002dc5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b60008251116200032f5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620002d3565b60005b82518110156200039b576200038683828151811062000355576200035562000727565b602002602001015183838151811062000372576200037262000727565b6020026020010151620003f860201b60201c565b80620003928162000753565b91505062000332565b505050620007c9565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620004655760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620002d3565b60008111620004b75760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620002d3565b6001600160a01b03821660009081526009602052604090205415620005335760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620002d3565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03841690811790915560009081526009602052604090208190556007546200059d90829062000771565b600755604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b828054620005f4906200078c565b90600052602060002090601f01602090048101928262000618576000855562000663565b82601f106200063357805160ff191683800117855562000663565b8280016001018555821562000663579182015b828111156200066357825182559160200191906001019062000646565b506200067192915062000710565b5090565b82805482825590600052602060002090810192821562000663579160200282015b828111156200066357825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000696565b82805482825590600052602060002090810192821562000663579160200282015b8281111562000663578251829060ff16905591602001919060010190620006ee565b5b8082111562000671576000815560010162000711565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156200076a576200076a6200073d565b5060010190565b600082198211156200078757620007876200073d565b500190565b600181811c90821680620007a157607f821691505b60208210811415620007c357634e487b7160e01b600052602260045260246000fd5b50919050565b6129a480620007d96000396000f3fe6080604052600436106102105760003560e01c806370a0823111610117578063a0712d68116100a5578063ce7c2ac21161006c578063ce7c2ac21461066f578063dde3d313146106a5578063e33b7de3146106c5578063e985e9c5146106da578063f2fde38b1461072357005b8063a0712d68146105dc578063a22cb465146105ef578063acec338a1461060f578063b88d4fde1461062f578063c87b56dd1461064f57005b806391b7f5ed116100e957806391b7f5ed1461053b57806395d89b411461055b57806396ea3a47146105705780639852595c14610590578063a035b1fe146105c657005b806370a08231146104c8578063715018a6146104e85780638b83209b146104fd5780638da5cb5b1461051d57005b806323b872dd1161019f5780634a994eef116101665780634a994eef146104285780634f6ccce7146104485780636352211e146104685780636790a9de146104885780636f8b44b0146104a857005b806323b872dd1461039d5780632f745c59146103bd57806332cb6b0c146103dd5780633a98ef39146103f357806342842e0e1461040857005b8063081812fc116101e3578063081812fc146102f6578063095ea7b31461032e57806318160ddd1461034e578063191655871461036357806322f3e2d41461038357005b80624510261461025b57806301ffc9a71461028457806306fdde03146102b457806307779627146102d657005b36610259577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b005b34801561026757600080fd5b50610271600e5481565b6040519081526020015b60405180910390f35b34801561029057600080fd5b506102a461029f3660046121a7565b610743565b604051901515815260200161027b565b3480156102c057600080fd5b506102c961076e565b60405161027b9190612223565b3480156102e257600080fd5b506102a46102f136600461224b565b610800565b34801561030257600080fd5b50610316610311366004612268565b610857565b6040516001600160a01b03909116815260200161027b565b34801561033a57600080fd5b50610259610349366004612281565b6108df565b34801561035a57600080fd5b50600454610271565b34801561036f57600080fd5b5061025961037e36600461224b565b6109f5565b34801561038f57600080fd5b50600d546102a49060ff1681565b3480156103a957600080fd5b506102596103b83660046122ad565b610bc6565b3480156103c957600080fd5b506102716103d8366004612281565b610bf7565b3480156103e957600080fd5b50610271600c5481565b3480156103ff57600080fd5b50600754610271565b34801561041457600080fd5b506102596104233660046122ad565b610ca1565b34801561043457600080fd5b506102596104433660046122fe565b610cbc565b34801561045457600080fd5b50610271610463366004612268565b610d11565b34801561047457600080fd5b50610316610483366004612268565b610d83565b34801561049457600080fd5b506102596104a336600461237c565b610e0f565b3480156104b457600080fd5b506102596104c3366004612268565b610e5e565b3480156104d457600080fd5b506102716104e336600461224b565b610f03565b3480156104f457600080fd5b50610259610f47565b34801561050957600080fd5b50610316610518366004612268565b610f7d565b34801561052957600080fd5b506000546001600160a01b0316610316565b34801561054757600080fd5b50610259610556366004612268565b610fad565b34801561056757600080fd5b506102c9610fea565b34801561057c57600080fd5b5061025961058b36600461242d565b610ff9565b34801561059c57600080fd5b506102716105ab36600461224b565b6001600160a01b03166000908152600a602052604090205490565b3480156105d257600080fd5b50610271600f5481565b6102596105ea366004612268565b6111f1565b3480156105fb57600080fd5b5061025961060a3660046122fe565b61137c565b34801561061b57600080fd5b5061025961062a36600461248d565b611441565b34801561063b57600080fd5b5061025961064a3660046124be565b611493565b34801561065b57600080fd5b506102c961066a366004612268565b6114cb565b34801561067b57600080fd5b5061027161068a36600461224b565b6001600160a01b031660009081526009602052604090205490565b3480156106b157600080fd5b506102596106c0366004612268565b61156f565b3480156106d157600080fd5b50600854610271565b3480156106e657600080fd5b506102a46106f536600461259e565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561072f57600080fd5b5061025961073e36600461224b565b6115ac565b60006001600160e01b0319821663780e9d6360e01b1480610768575061076882611644565b92915050565b60606002805461077d906125d7565b80601f01602080910402602001604051908101604052809291908181526020018280546107a9906125d7565b80156107f65780601f106107cb576101008083540402835291602001916107f6565b820191906000526020600020905b8154815290600101906020018083116107d957829003601f168201915b5050505050905090565b600080546001600160a01b031633146108345760405162461bcd60e51b815260040161082b90612612565b60405180910390fd5b506001600160a01b03811660009081526001602052604090205460ff165b919050565b600061086282611694565b6108c35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082b565b506000908152600560205260409020546001600160a01b031690565b60006108ea82610d83565b9050806001600160a01b0316836001600160a01b031614156109585760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161082b565b336001600160a01b0382161480610974575061097481336106f5565b6109e65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161082b565b6109f083836116de565b505050565b6001600160a01b038116600090815260096020526040902054610a695760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b606482015260840161082b565b600060085447610a79919061265d565b6001600160a01b0383166000908152600a60209081526040808320546007546009909352908320549394509192610ab09085612675565b610aba91906126aa565b610ac491906126be565b905080610b275760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b606482015260840161082b565b6001600160a01b0383166000908152600a6020526040902054610b4b90829061265d565b6001600160a01b0384166000908152600a6020526040902055600854610b7290829061265d565b600855610b7f838261174c565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610bd03382611865565b610bec5760405162461bcd60e51b815260040161082b906126d5565b6109f083838361194f565b6000610c0283611ab0565b8210610c645760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161082b565b6001600160a01b0383166000908152601260205260409020805483908110610c8e57610c8e612726565b9060005260206000200154905092915050565b6109f083838360405180602001604052806000815250611493565b6000546001600160a01b03163314610ce65760405162461bcd60e51b815260040161082b90612612565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6000610d1c60045490565b8210610d7f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161082b565b5090565b60008060048381548110610d9957610d99612726565b6000918252602090912001546001600160a01b03169050806107685760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161082b565b3360009081526001602052604090205460ff16610e3e5760405162461bcd60e51b815260040161082b9061273c565b610e4a60108585612101565b50610e5760118383612101565b5050505050565b6000546001600160a01b03163314610e885760405162461bcd60e51b815260040161082b90612612565b80600c5414610f0057600454811015610efa5760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b606482015260840161082b565b600c8190555b50565b60006001600160a01b038216610f2b5760405162461bcd60e51b815260040161082b90612766565b506001600160a01b031660009081526012602052604090205490565b6000546001600160a01b03163314610f715760405162461bcd60e51b815260040161082b90612612565b610f7b6000611b3f565b565b6000600b8281548110610f9257610f92612726565b6000918252602090912001546001600160a01b031692915050565b3360009081526001602052604090205460ff16610fdc5760405162461bcd60e51b815260040161082b9061273c565b80600f5414610f0057600f55565b60606003805461077d906125d7565b3360009081526001602052604090205460ff166110285760405162461bcd60e51b815260040161082b9061273c565b82811461108c5760405162461bcd60e51b815260206004820152602c60248201527f4d7573742070726f7669646520657175616c207175616e74697469657320616e60448201526b6420726563697069656e747360a01b606482015260840161082b565b60008061109860045490565b905060005b858110156110db578686828181106110b7576110b7612726565b90506020020135836110c9919061265d565b92506110d4816127b0565b905061109d565b50600c546110e9838361265d565b11156111335760405162461bcd60e51b81526020600482015260196024820152784d696e742f6f72646572206578636565647320737570706c7960381b604482015260640161082b565b6000915060005b838110156111e85760005b87878381811061115757611157612726565b905060200201358110156111d7576111c786868481811061117a5761117a612726565b905060200201602081019061118f919061224b565b84611199816127b0565b95506040518060400160405280600e81526020016d53656e742077697468206c6f766560901b815250611b8f565b6111d0816127b0565b9050611145565b506111e1816127b0565b905061113a565b50505050505050565b600d5460ff166112385760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b604482015260640161082b565b600e5481111561127a5760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b604482015260640161082b565b80600f546112889190612675565b3410156112d75760405162461bcd60e51b815260206004820152601960248201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604482015260640161082b565b60006112e260045490565b600c549091506112f2838361265d565b111561133c5760405162461bcd60e51b81526020600482015260196024820152784d696e742f6f72646572206578636565647320737570706c7960381b604482015260640161082b565b60005b828110156109f05761136c3383611355816127b0565b945060405180602001604052806000815250611b8f565b611375816127b0565b905061133f565b6001600160a01b0382163314156113d55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161082b565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526001602052604090205460ff166114705760405162461bcd60e51b815260040161082b9061273c565b600d5460ff16151581151514610f0057600d805482151560ff1990911617905550565b61149d3383611865565b6114b95760405162461bcd60e51b815260040161082b906126d5565b6114c584848484611bc2565b50505050565b60606114d682611694565b61153a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161082b565b601061154583611bf5565b601160405160200161155993929190612865565b6040516020818303038152906040529050919050565b3360009081526001602052604090205460ff1661159e5760405162461bcd60e51b815260040161082b9061273c565b80600e5414610f0057600e55565b6000546001600160a01b031633146115d65760405162461bcd60e51b815260040161082b90612612565b6001600160a01b03811661163b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082b565b610f0081611b3f565b60006001600160e01b031982166380ac58cd60e01b148061167557506001600160e01b03198216635b5e139f60e01b145b8061076857506301ffc9a760e01b6001600160e01b0319831614610768565b60045460009082108015610768575060006001600160a01b0316600483815481106116c1576116c1612726565b6000918252602090912001546001600160a01b0316141592915050565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061171382610d83565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8047101561179c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161082b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117e9576040519150601f19603f3d011682016040523d82523d6000602084013e6117ee565b606091505b50509050806109f05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161082b565b600061187082611694565b6118d15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082b565b60006118dc83610d83565b9050806001600160a01b0316846001600160a01b031614806119175750836001600160a01b031661190c84610857565b6001600160a01b0316145b8061194757506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661196282610d83565b6001600160a01b0316146119ca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161082b565b6001600160a01b038216611a2c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161082b565b611a37838383611cf3565b611a426000826116de565b8160048281548110611a5657611a56612726565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006001600160a01b038216611ad85760405162461bcd60e51b815260040161082b90612766565b600454600090815b81811015611b365760048181548110611afb57611afb612726565b6000918252602090912001546001600160a01b0386811691161415611b2657611b23836127b0565b92505b611b2f816127b0565b9050611ae0565b50909392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611b998383611ec0565b611ba66000848484611ff4565b6109f05760405162461bcd60e51b815260040161082b90612898565b611bcd84848461194f565b611bd984848484611ff4565b6114c55760405162461bcd60e51b815260040161082b90612898565b606081611c195750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c435780611c2d816127b0565b9150611c3c9050600a836126aa565b9150611c1d565b60008167ffffffffffffffff811115611c5e57611c5e6124a8565b6040519080825280601f01601f191660200182016040528015611c88576020820181803683370190505b5090505b841561194757611c9d6001836126be565b9150611caa600a866128ea565b611cb590603061265d565b60f81b818381518110611cca57611cca612726565b60200101906001600160f81b031916908160001a905350611cec600a866126aa565b9450611c8c565b60006001600160a01b038416151580611d1d5750806001600160a01b0316836001600160a01b0316145b15611e5a576001600160a01b038416600090815260126020526040812054905b81811015611e57576001600160a01b0386166000908152601260205260409020805485919083908110611d7257611d72612726565b90600052602060002001541415611e47576001600160a01b0386166000908152601260205260409020611da66001846126be565b81548110611db657611db6612726565b906000526020600020015460126000886001600160a01b03166001600160a01b031681526020019081526020016000208281548110611df757611df7612726565b60009182526020808320909101929092556001600160a01b0388168152601290915260409020805480611e2c57611e2c6128fe565b60019003818190600052602060002001600090559055611e57565b611e50816127b0565b9050611d3d565b50505b806001600160a01b0316846001600160a01b03161480611e8c5750806001600160a01b0316836001600160a01b031614155b156114c557506001600160a01b03919091166000908152601260209081526040822080546001810182559083529120015550565b6001600160a01b038216611f165760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161082b565b611f1f81611694565b15611f6c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161082b565b611f7860008383611cf3565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156120f657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612038903390899088908890600401612914565b602060405180830381600087803b15801561205257600080fd5b505af1925050508015612082575060408051601f3d908101601f1916820190925261207f91810190612951565b60015b6120dc573d8080156120b0576040519150601f19603f3d011682016040523d82523d6000602084013e6120b5565b606091505b5080516120d45760405162461bcd60e51b815260040161082b90612898565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611947565b506001949350505050565b82805461210d906125d7565b90600052602060002090601f01602090048101928261212f5760008555612175565b82601f106121485782800160ff19823516178555612175565b82800160010185558215612175579182015b8281111561217557823582559160200191906001019061215a565b50610d7f9291505b80821115610d7f576000815560010161217d565b6001600160e01b031981168114610f0057600080fd5b6000602082840312156121b957600080fd5b81356121c481612191565b9392505050565b60005b838110156121e65781810151838201526020016121ce565b838111156114c55750506000910152565b6000815180845261220f8160208601602086016121cb565b601f01601f19169290920160200192915050565b6020815260006121c460208301846121f7565b6001600160a01b0381168114610f0057600080fd5b60006020828403121561225d57600080fd5b81356121c481612236565b60006020828403121561227a57600080fd5b5035919050565b6000806040838503121561229457600080fd5b823561229f81612236565b946020939093013593505050565b6000806000606084860312156122c257600080fd5b83356122cd81612236565b925060208401356122dd81612236565b929592945050506040919091013590565b8035801515811461085257600080fd5b6000806040838503121561231157600080fd5b823561231c81612236565b915061232a602084016122ee565b90509250929050565b60008083601f84011261234557600080fd5b50813567ffffffffffffffff81111561235d57600080fd5b60208301915083602082850101111561237557600080fd5b9250929050565b6000806000806040858703121561239257600080fd5b843567ffffffffffffffff808211156123aa57600080fd5b6123b688838901612333565b909650945060208701359150808211156123cf57600080fd5b506123dc87828801612333565b95989497509550505050565b60008083601f8401126123fa57600080fd5b50813567ffffffffffffffff81111561241257600080fd5b6020830191508360208260051b850101111561237557600080fd5b6000806000806040858703121561244357600080fd5b843567ffffffffffffffff8082111561245b57600080fd5b612467888389016123e8565b9096509450602087013591508082111561248057600080fd5b506123dc878288016123e8565b60006020828403121561249f57600080fd5b6121c4826122ee565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156124d457600080fd5b84356124df81612236565b935060208501356124ef81612236565b925060408501359150606085013567ffffffffffffffff8082111561251357600080fd5b818701915087601f83011261252757600080fd5b813581811115612539576125396124a8565b604051601f8201601f19908116603f01168101908382118183101715612561576125616124a8565b816040528281528a602084870101111561257a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156125b157600080fd5b82356125bc81612236565b915060208301356125cc81612236565b809150509250929050565b600181811c908216806125eb57607f821691505b6020821081141561260c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561267057612670612647565b500190565b600081600019048311821515161561268f5761268f612647565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826126b9576126b9612694565b500490565b6000828210156126d0576126d0612647565b500390565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526010908201526f496e76616c69642064656c656761746560801b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60006000198214156127c4576127c4612647565b5060010190565b8054600090600181811c90808316806127e557607f831692505b602080841082141561280757634e487b7160e01b600052602260045260246000fd5b81801561281b576001811461282c57612859565b60ff19861689528489019650612859565b60008881526020902060005b868110156128515781548b820152908501908301612838565b505084890196505b50505050505092915050565b600061287182866127cb565b84516128818183602089016121cb565b61288d818301866127cb565b979650505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826128f9576128f9612694565b500690565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612947908301846121f7565b9695505050505050565b60006020828403121561296357600080fd5b81516121c48161219156fea2646970667358221220ee62004517fbc7983d1fde1d7e43c2c8676eddf1bd413907df1bdabb4fe50c0564736f6c63430008090033
Deployed Bytecode
0x6080604052600436106102105760003560e01c806370a0823111610117578063a0712d68116100a5578063ce7c2ac21161006c578063ce7c2ac21461066f578063dde3d313146106a5578063e33b7de3146106c5578063e985e9c5146106da578063f2fde38b1461072357005b8063a0712d68146105dc578063a22cb465146105ef578063acec338a1461060f578063b88d4fde1461062f578063c87b56dd1461064f57005b806391b7f5ed116100e957806391b7f5ed1461053b57806395d89b411461055b57806396ea3a47146105705780639852595c14610590578063a035b1fe146105c657005b806370a08231146104c8578063715018a6146104e85780638b83209b146104fd5780638da5cb5b1461051d57005b806323b872dd1161019f5780634a994eef116101665780634a994eef146104285780634f6ccce7146104485780636352211e146104685780636790a9de146104885780636f8b44b0146104a857005b806323b872dd1461039d5780632f745c59146103bd57806332cb6b0c146103dd5780633a98ef39146103f357806342842e0e1461040857005b8063081812fc116101e3578063081812fc146102f6578063095ea7b31461032e57806318160ddd1461034e578063191655871461036357806322f3e2d41461038357005b80624510261461025b57806301ffc9a71461028457806306fdde03146102b457806307779627146102d657005b36610259577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b005b34801561026757600080fd5b50610271600e5481565b6040519081526020015b60405180910390f35b34801561029057600080fd5b506102a461029f3660046121a7565b610743565b604051901515815260200161027b565b3480156102c057600080fd5b506102c961076e565b60405161027b9190612223565b3480156102e257600080fd5b506102a46102f136600461224b565b610800565b34801561030257600080fd5b50610316610311366004612268565b610857565b6040516001600160a01b03909116815260200161027b565b34801561033a57600080fd5b50610259610349366004612281565b6108df565b34801561035a57600080fd5b50600454610271565b34801561036f57600080fd5b5061025961037e36600461224b565b6109f5565b34801561038f57600080fd5b50600d546102a49060ff1681565b3480156103a957600080fd5b506102596103b83660046122ad565b610bc6565b3480156103c957600080fd5b506102716103d8366004612281565b610bf7565b3480156103e957600080fd5b50610271600c5481565b3480156103ff57600080fd5b50600754610271565b34801561041457600080fd5b506102596104233660046122ad565b610ca1565b34801561043457600080fd5b506102596104433660046122fe565b610cbc565b34801561045457600080fd5b50610271610463366004612268565b610d11565b34801561047457600080fd5b50610316610483366004612268565b610d83565b34801561049457600080fd5b506102596104a336600461237c565b610e0f565b3480156104b457600080fd5b506102596104c3366004612268565b610e5e565b3480156104d457600080fd5b506102716104e336600461224b565b610f03565b3480156104f457600080fd5b50610259610f47565b34801561050957600080fd5b50610316610518366004612268565b610f7d565b34801561052957600080fd5b506000546001600160a01b0316610316565b34801561054757600080fd5b50610259610556366004612268565b610fad565b34801561056757600080fd5b506102c9610fea565b34801561057c57600080fd5b5061025961058b36600461242d565b610ff9565b34801561059c57600080fd5b506102716105ab36600461224b565b6001600160a01b03166000908152600a602052604090205490565b3480156105d257600080fd5b50610271600f5481565b6102596105ea366004612268565b6111f1565b3480156105fb57600080fd5b5061025961060a3660046122fe565b61137c565b34801561061b57600080fd5b5061025961062a36600461248d565b611441565b34801561063b57600080fd5b5061025961064a3660046124be565b611493565b34801561065b57600080fd5b506102c961066a366004612268565b6114cb565b34801561067b57600080fd5b5061027161068a36600461224b565b6001600160a01b031660009081526009602052604090205490565b3480156106b157600080fd5b506102596106c0366004612268565b61156f565b3480156106d157600080fd5b50600854610271565b3480156106e657600080fd5b506102a46106f536600461259e565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561072f57600080fd5b5061025961073e36600461224b565b6115ac565b60006001600160e01b0319821663780e9d6360e01b1480610768575061076882611644565b92915050565b60606002805461077d906125d7565b80601f01602080910402602001604051908101604052809291908181526020018280546107a9906125d7565b80156107f65780601f106107cb576101008083540402835291602001916107f6565b820191906000526020600020905b8154815290600101906020018083116107d957829003601f168201915b5050505050905090565b600080546001600160a01b031633146108345760405162461bcd60e51b815260040161082b90612612565b60405180910390fd5b506001600160a01b03811660009081526001602052604090205460ff165b919050565b600061086282611694565b6108c35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082b565b506000908152600560205260409020546001600160a01b031690565b60006108ea82610d83565b9050806001600160a01b0316836001600160a01b031614156109585760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161082b565b336001600160a01b0382161480610974575061097481336106f5565b6109e65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161082b565b6109f083836116de565b505050565b6001600160a01b038116600090815260096020526040902054610a695760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b606482015260840161082b565b600060085447610a79919061265d565b6001600160a01b0383166000908152600a60209081526040808320546007546009909352908320549394509192610ab09085612675565b610aba91906126aa565b610ac491906126be565b905080610b275760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b606482015260840161082b565b6001600160a01b0383166000908152600a6020526040902054610b4b90829061265d565b6001600160a01b0384166000908152600a6020526040902055600854610b7290829061265d565b600855610b7f838261174c565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610bd03382611865565b610bec5760405162461bcd60e51b815260040161082b906126d5565b6109f083838361194f565b6000610c0283611ab0565b8210610c645760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161082b565b6001600160a01b0383166000908152601260205260409020805483908110610c8e57610c8e612726565b9060005260206000200154905092915050565b6109f083838360405180602001604052806000815250611493565b6000546001600160a01b03163314610ce65760405162461bcd60e51b815260040161082b90612612565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6000610d1c60045490565b8210610d7f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161082b565b5090565b60008060048381548110610d9957610d99612726565b6000918252602090912001546001600160a01b03169050806107685760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161082b565b3360009081526001602052604090205460ff16610e3e5760405162461bcd60e51b815260040161082b9061273c565b610e4a60108585612101565b50610e5760118383612101565b5050505050565b6000546001600160a01b03163314610e885760405162461bcd60e51b815260040161082b90612612565b80600c5414610f0057600454811015610efa5760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b606482015260840161082b565b600c8190555b50565b60006001600160a01b038216610f2b5760405162461bcd60e51b815260040161082b90612766565b506001600160a01b031660009081526012602052604090205490565b6000546001600160a01b03163314610f715760405162461bcd60e51b815260040161082b90612612565b610f7b6000611b3f565b565b6000600b8281548110610f9257610f92612726565b6000918252602090912001546001600160a01b031692915050565b3360009081526001602052604090205460ff16610fdc5760405162461bcd60e51b815260040161082b9061273c565b80600f5414610f0057600f55565b60606003805461077d906125d7565b3360009081526001602052604090205460ff166110285760405162461bcd60e51b815260040161082b9061273c565b82811461108c5760405162461bcd60e51b815260206004820152602c60248201527f4d7573742070726f7669646520657175616c207175616e74697469657320616e60448201526b6420726563697069656e747360a01b606482015260840161082b565b60008061109860045490565b905060005b858110156110db578686828181106110b7576110b7612726565b90506020020135836110c9919061265d565b92506110d4816127b0565b905061109d565b50600c546110e9838361265d565b11156111335760405162461bcd60e51b81526020600482015260196024820152784d696e742f6f72646572206578636565647320737570706c7960381b604482015260640161082b565b6000915060005b838110156111e85760005b87878381811061115757611157612726565b905060200201358110156111d7576111c786868481811061117a5761117a612726565b905060200201602081019061118f919061224b565b84611199816127b0565b95506040518060400160405280600e81526020016d53656e742077697468206c6f766560901b815250611b8f565b6111d0816127b0565b9050611145565b506111e1816127b0565b905061113a565b50505050505050565b600d5460ff166112385760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742061637469766560701b604482015260640161082b565b600e5481111561127a5760405162461bcd60e51b815260206004820152600d60248201526c4f7264657220746f6f2062696760981b604482015260640161082b565b80600f546112889190612675565b3410156112d75760405162461bcd60e51b815260206004820152601960248201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604482015260640161082b565b60006112e260045490565b600c549091506112f2838361265d565b111561133c5760405162461bcd60e51b81526020600482015260196024820152784d696e742f6f72646572206578636565647320737570706c7960381b604482015260640161082b565b60005b828110156109f05761136c3383611355816127b0565b945060405180602001604052806000815250611b8f565b611375816127b0565b905061133f565b6001600160a01b0382163314156113d55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161082b565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526001602052604090205460ff166114705760405162461bcd60e51b815260040161082b9061273c565b600d5460ff16151581151514610f0057600d805482151560ff1990911617905550565b61149d3383611865565b6114b95760405162461bcd60e51b815260040161082b906126d5565b6114c584848484611bc2565b50505050565b60606114d682611694565b61153a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161082b565b601061154583611bf5565b601160405160200161155993929190612865565b6040516020818303038152906040529050919050565b3360009081526001602052604090205460ff1661159e5760405162461bcd60e51b815260040161082b9061273c565b80600e5414610f0057600e55565b6000546001600160a01b031633146115d65760405162461bcd60e51b815260040161082b90612612565b6001600160a01b03811661163b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082b565b610f0081611b3f565b60006001600160e01b031982166380ac58cd60e01b148061167557506001600160e01b03198216635b5e139f60e01b145b8061076857506301ffc9a760e01b6001600160e01b0319831614610768565b60045460009082108015610768575060006001600160a01b0316600483815481106116c1576116c1612726565b6000918252602090912001546001600160a01b0316141592915050565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061171382610d83565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8047101561179c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161082b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117e9576040519150601f19603f3d011682016040523d82523d6000602084013e6117ee565b606091505b50509050806109f05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161082b565b600061187082611694565b6118d15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082b565b60006118dc83610d83565b9050806001600160a01b0316846001600160a01b031614806119175750836001600160a01b031661190c84610857565b6001600160a01b0316145b8061194757506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661196282610d83565b6001600160a01b0316146119ca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161082b565b6001600160a01b038216611a2c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161082b565b611a37838383611cf3565b611a426000826116de565b8160048281548110611a5657611a56612726565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b60006001600160a01b038216611ad85760405162461bcd60e51b815260040161082b90612766565b600454600090815b81811015611b365760048181548110611afb57611afb612726565b6000918252602090912001546001600160a01b0386811691161415611b2657611b23836127b0565b92505b611b2f816127b0565b9050611ae0565b50909392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611b998383611ec0565b611ba66000848484611ff4565b6109f05760405162461bcd60e51b815260040161082b90612898565b611bcd84848461194f565b611bd984848484611ff4565b6114c55760405162461bcd60e51b815260040161082b90612898565b606081611c195750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c435780611c2d816127b0565b9150611c3c9050600a836126aa565b9150611c1d565b60008167ffffffffffffffff811115611c5e57611c5e6124a8565b6040519080825280601f01601f191660200182016040528015611c88576020820181803683370190505b5090505b841561194757611c9d6001836126be565b9150611caa600a866128ea565b611cb590603061265d565b60f81b818381518110611cca57611cca612726565b60200101906001600160f81b031916908160001a905350611cec600a866126aa565b9450611c8c565b60006001600160a01b038416151580611d1d5750806001600160a01b0316836001600160a01b0316145b15611e5a576001600160a01b038416600090815260126020526040812054905b81811015611e57576001600160a01b0386166000908152601260205260409020805485919083908110611d7257611d72612726565b90600052602060002001541415611e47576001600160a01b0386166000908152601260205260409020611da66001846126be565b81548110611db657611db6612726565b906000526020600020015460126000886001600160a01b03166001600160a01b031681526020019081526020016000208281548110611df757611df7612726565b60009182526020808320909101929092556001600160a01b0388168152601290915260409020805480611e2c57611e2c6128fe565b60019003818190600052602060002001600090559055611e57565b611e50816127b0565b9050611d3d565b50505b806001600160a01b0316846001600160a01b03161480611e8c5750806001600160a01b0316836001600160a01b031614155b156114c557506001600160a01b03919091166000908152601260209081526040822080546001810182559083529120015550565b6001600160a01b038216611f165760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161082b565b611f1f81611694565b15611f6c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161082b565b611f7860008383611cf3565b6004805460018101825560009182527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b156120f657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612038903390899088908890600401612914565b602060405180830381600087803b15801561205257600080fd5b505af1925050508015612082575060408051601f3d908101601f1916820190925261207f91810190612951565b60015b6120dc573d8080156120b0576040519150601f19603f3d011682016040523d82523d6000602084013e6120b5565b606091505b5080516120d45760405162461bcd60e51b815260040161082b90612898565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611947565b506001949350505050565b82805461210d906125d7565b90600052602060002090601f01602090048101928261212f5760008555612175565b82601f106121485782800160ff19823516178555612175565b82800160010185558215612175579182015b8281111561217557823582559160200191906001019061215a565b50610d7f9291505b80821115610d7f576000815560010161217d565b6001600160e01b031981168114610f0057600080fd5b6000602082840312156121b957600080fd5b81356121c481612191565b9392505050565b60005b838110156121e65781810151838201526020016121ce565b838111156114c55750506000910152565b6000815180845261220f8160208601602086016121cb565b601f01601f19169290920160200192915050565b6020815260006121c460208301846121f7565b6001600160a01b0381168114610f0057600080fd5b60006020828403121561225d57600080fd5b81356121c481612236565b60006020828403121561227a57600080fd5b5035919050565b6000806040838503121561229457600080fd5b823561229f81612236565b946020939093013593505050565b6000806000606084860312156122c257600080fd5b83356122cd81612236565b925060208401356122dd81612236565b929592945050506040919091013590565b8035801515811461085257600080fd5b6000806040838503121561231157600080fd5b823561231c81612236565b915061232a602084016122ee565b90509250929050565b60008083601f84011261234557600080fd5b50813567ffffffffffffffff81111561235d57600080fd5b60208301915083602082850101111561237557600080fd5b9250929050565b6000806000806040858703121561239257600080fd5b843567ffffffffffffffff808211156123aa57600080fd5b6123b688838901612333565b909650945060208701359150808211156123cf57600080fd5b506123dc87828801612333565b95989497509550505050565b60008083601f8401126123fa57600080fd5b50813567ffffffffffffffff81111561241257600080fd5b6020830191508360208260051b850101111561237557600080fd5b6000806000806040858703121561244357600080fd5b843567ffffffffffffffff8082111561245b57600080fd5b612467888389016123e8565b9096509450602087013591508082111561248057600080fd5b506123dc878288016123e8565b60006020828403121561249f57600080fd5b6121c4826122ee565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156124d457600080fd5b84356124df81612236565b935060208501356124ef81612236565b925060408501359150606085013567ffffffffffffffff8082111561251357600080fd5b818701915087601f83011261252757600080fd5b813581811115612539576125396124a8565b604051601f8201601f19908116603f01168101908382118183101715612561576125616124a8565b816040528281528a602084870101111561257a57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156125b157600080fd5b82356125bc81612236565b915060208301356125cc81612236565b809150509250929050565b600181811c908216806125eb57607f821691505b6020821081141561260c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561267057612670612647565b500190565b600081600019048311821515161561268f5761268f612647565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826126b9576126b9612694565b500490565b6000828210156126d0576126d0612647565b500390565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526010908201526f496e76616c69642064656c656761746560801b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60006000198214156127c4576127c4612647565b5060010190565b8054600090600181811c90808316806127e557607f831692505b602080841082141561280757634e487b7160e01b600052602260045260246000fd5b81801561281b576001811461282c57612859565b60ff19861689528489019650612859565b60008881526020902060005b868110156128515781548b820152908501908301612838565b505084890196505b50505050505092915050565b600061287182866127cb565b84516128818183602089016121cb565b61288d818301866127cb565b979650505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826128f9576128f9612694565b500690565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612947908301846121f7565b9695505050505050565b60006020828403121561296357600080fd5b81516121c48161219156fea2646970667358221220ee62004517fbc7983d1fde1d7e43c2c8676eddf1bd413907df1bdabb4fe50c0564736f6c63430008090033
Deployed Bytecode Sourcemap
49348:4144:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5614:40;682:10;5614:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;5644:9:0;270:2:1;255:18;;248:34;161:18;5614:40:0;;;;;;;49348:4144;;;49516:27;;;;;;;;;;;;;;;;;;;439:25:1;;;427:2;412:18;49516:27:0;;;;;;;;47493:225;;;;;;;;;;-1:-1:-1;47493:225:0;;;;;:::i;:::-;;:::i;:::-;;;1026:14:1;;1019:22;1001:41;;989:2;974:18;47493:225:0;861:187:1;36665:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34290:112::-;;;;;;;;;;-1:-1:-1;34290:112:0;;;;;:::i;:::-;;:::i;37478:221::-;;;;;;;;;;-1:-1:-1;37478:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2541:32:1;;;2523:51;;2511:2;2496:18;37478:221:0;2377:203:1;37000:412:0;;;;;;;;;;-1:-1:-1;37000:412:0;;;;;:::i;:::-;;:::i;48601:110::-;;;;;;;;;;-1:-1:-1;48689:7:0;:14;48601:110;;6820:613;;;;;;;;;;-1:-1:-1;6820:613:0;;;;;:::i;:::-;;:::i;49481:30::-;;;;;;;;;;-1:-1:-1;49481:30:0;;;;;;;;38370:339;;;;;;;;;;-1:-1:-1;38370:339:0;;;;;:::i;:::-;;:::i;52324:252::-;;;;;;;;;;-1:-1:-1;52324:252:0;;;;;:::i;:::-;;:::i;49445:29::-;;;;;;;;;;;;;;;;5745:91;;;;;;;;;;-1:-1:-1;5816:12:0;;5745:91;;38780:185;;;;;;;;;;-1:-1:-1;38780:185:0;;;;;:::i;:::-;;:::i;34408:116::-;;;;;;;;;;-1:-1:-1;34408:116:0;;;;;:::i;:::-;;:::i;48788:222::-;;;;;;;;;;-1:-1:-1;48788:222:0;;;;;:::i;:::-;;:::i;36359:239::-;;;;;;;;;;-1:-1:-1;36359:239:0;;;;;:::i;:::-;;:::i;51660:174::-;;;;;;;;;;-1:-1:-1;51660:174:0;;;;;:::i;:::-;;:::i;51862:231::-;;;;;;;;;;-1:-1:-1;51862:231:0;;;;;:::i;:::-;;:::i;52113:205::-;;;;;;;;;;-1:-1:-1;52113:205:0;;;;;:::i;:::-;;:::i;2404:94::-;;;;;;;;;;;;;:::i;6520:100::-;;;;;;;;;;-1:-1:-1;6520:100:0;;;;;:::i;:::-;;:::i;1753:87::-;;;;;;;;;;-1:-1:-1;1799:7:0;1826:6;-1:-1:-1;;;;;1826:6:0;1753:87;;51544:110;;;;;;;;;;-1:-1:-1;51544:110:0;;;;;:::i;:::-;;:::i;36834:104::-;;;;;;;;;;;;;:::i;50629:645::-;;;;;;;;;;-1:-1:-1;50629:645:0;;;;;:::i;:::-;;:::i;6320:109::-;;;;;;;;;;-1:-1:-1;6320:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;6403:18:0;6376:7;6403:18;;;:9;:18;;;;;;;6320:109;49548:35;;;;;;;;;;;;;;;;50106:493;;;;;;:::i;:::-;;:::i;37771:295::-;;;;;;;;;;-1:-1:-1;37771:295:0;;;;;:::i;:::-;;:::i;51280:125::-;;;;;;;;;;-1:-1:-1;51280:125:0;;;;;:::i;:::-;;:::i;39036:328::-;;;;;;;;;;-1:-1:-1;39036:328:0;;;;;:::i;:::-;;:::i;52582:266::-;;;;;;;;;;-1:-1:-1;52582:266:0;;;;;:::i;:::-;;:::i;6116:105::-;;;;;;;;;;-1:-1:-1;6116:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;6197:16:0;6170:7;6197:16;;;:7;:16;;;;;;;6116:105;51411:127;;;;;;;;;;-1:-1:-1;51411:127:0;;;;;:::i;:::-;;:::i;5930:95::-;;;;;;;;;;-1:-1:-1;6003:14:0;;5930:95;;38137:164;;;;;;;;;;-1:-1:-1;38137:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;38258:25:0;;;38234:4;38258:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38137:164;2653:192;;;;;;;;;;-1:-1:-1;2653:192:0;;;;;:::i;:::-;;:::i;47493:225::-;47596:4;-1:-1:-1;;;;;;47620:50:0;;-1:-1:-1;;;47620:50:0;;:90;;;47674:36;47698:11;47674:23;:36::i;:::-;47613:97;47493:225;-1:-1:-1;;47493:225:0:o;36665:100::-;36719:13;36752:5;36745:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36665:100;:::o;34290:112::-;34360:4;1826:6;;-1:-1:-1;;;;;1826:6:0;682:10;1973:23;1965:68;;;;-1:-1:-1;;;1965:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;;34380:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;::::1;;2044:1;34290:112:::0;;;:::o;37478:221::-;37554:7;37582:16;37590:7;37582;:16::i;:::-;37574:73;;;;-1:-1:-1;;;37574:73:0;;9269:2:1;37574:73:0;;;9251:21:1;9308:2;9288:18;;;9281:30;9347:34;9327:18;;;9320:62;-1:-1:-1;;;9398:18:1;;;9391:42;9450:19;;37574:73:0;9067:408:1;37574:73:0;-1:-1:-1;37667:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37667:24:0;;37478:221::o;37000:412::-;37081:13;37097:24;37113:7;37097:15;:24::i;:::-;37081:40;;37146:5;-1:-1:-1;;;;;37140:11:0;:2;-1:-1:-1;;;;;37140:11:0;;;37132:57;;;;-1:-1:-1;;;37132:57:0;;9682:2:1;37132:57:0;;;9664:21:1;9721:2;9701:18;;;9694:30;9760:34;9740:18;;;9733:62;-1:-1:-1;;;9811:18:1;;;9804:31;9852:19;;37132:57:0;9480:397:1;37132:57:0;682:10;-1:-1:-1;;;;;37224:21:0;;;;:62;;-1:-1:-1;37249:37:0;37266:5;682:10;38137:164;:::i;37249:37::-;37202:168;;;;-1:-1:-1;;;37202:168:0;;10084:2:1;37202:168:0;;;10066:21:1;10123:2;10103:18;;;10096:30;10162:34;10142:18;;;10135:62;10233:26;10213:18;;;10206:54;10277:19;;37202:168:0;9882:420:1;37202:168:0;37383:21;37392:2;37396:7;37383:8;:21::i;:::-;37070:342;37000:412;;:::o;6820:613::-;-1:-1:-1;;;;;6896:16:0;;6915:1;6896:16;;;:7;:16;;;;;;6888:71;;;;-1:-1:-1;;;6888:71:0;;10509:2:1;6888:71:0;;;10491:21:1;10548:2;10528:18;;;10521:30;10587:34;10567:18;;;10560:62;-1:-1:-1;;;10638:18:1;;;10631:36;10684:19;;6888:71:0;10307:402:1;6888:71:0;6972:21;7020:14;;6996:21;:38;;;;:::i;:::-;-1:-1:-1;;;;;7115:18:0;;7045:15;7115:18;;;:9;:18;;;;;;;;;7100:12;;7080:7;:16;;;;;;;6972:62;;-1:-1:-1;7045:15:0;;7064:32;;6972:62;7064:32;:::i;:::-;7063:49;;;;:::i;:::-;:70;;;;:::i;:::-;7045:88;-1:-1:-1;7154:12:0;7146:68;;;;-1:-1:-1;;;7146:68:0;;11741:2:1;7146:68:0;;;11723:21:1;11780:2;11760:18;;;11753:30;11819:34;11799:18;;;11792:62;-1:-1:-1;;;11870:18:1;;;11863:41;11921:19;;7146:68:0;11539:407:1;7146:68:0;-1:-1:-1;;;;;7248:18:0;;;;;;:9;:18;;;;;;:28;;7269:7;;7248:28;:::i;:::-;-1:-1:-1;;;;;7227:18:0;;;;;;:9;:18;;;;;:49;7304:14;;:24;;7321:7;;7304:24;:::i;:::-;7287:14;:41;7341:35;7359:7;7368;7341:17;:35::i;:::-;7392:33;;;-1:-1:-1;;;;;206:32:1;;188:51;;270:2;255:18;;248:34;;;7392:33:0;;161:18:1;7392:33:0;;;;;;;6877:556;;6820:613;:::o;38370:339::-;38565:41;682:10;38598:7;38565:18;:41::i;:::-;38557:103;;;;-1:-1:-1;;;38557:103:0;;;;;;;:::i;:::-;38673:28;38683:4;38689:2;38693:7;38673:9;:28::i;52324:252::-;52421:15;52461:24;52479:5;52461:17;:24::i;:::-;52453:5;:32;52445:88;;;;-1:-1:-1;;;52445:88:0;;12858:2:1;52445:88:0;;;12840:21:1;12897:2;12877:18;;;12870:30;12936:34;12916:18;;;12909:62;-1:-1:-1;;;12987:18:1;;;12980:41;13038:19;;52445:88:0;12656:407:1;52445:88:0;-1:-1:-1;;;;;52547:16:0;;;;;;:9;:16;;;;;:23;;52564:5;;52547:23;;;;;;:::i;:::-;;;;;;;;;52540:30;;52324:252;;;;:::o;38780:185::-;38918:39;38935:4;38941:2;38945:7;38918:39;;;;;;;;;;;;:16;:39::i;34408:116::-;1799:7;1826:6;-1:-1:-1;;;;;1826:6:0;682:10;1973:23;1965:68;;;;-1:-1:-1;;;1965:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34488:16:0;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:30;;-1:-1:-1;;34488:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34408:116::o;48788:222::-;48863:7;48899:31;48689:7;:14;;48601:110;48899:31;48891:5;:39;48883:96;;;;-1:-1:-1;;;48883:96:0;;13402:2:1;48883:96:0;;;13384:21:1;13441:2;13421:18;;;13414:30;13480:34;13460:18;;;13453:62;-1:-1:-1;;;13531:18:1;;;13524:42;13583:19;;48883:96:0;13200:408:1;48883:96:0;-1:-1:-1;48997:5:0;48788:222::o;36359:239::-;36431:7;36451:13;36467:7;36475;36467:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36467:16:0;;-1:-1:-1;36502:19:0;36494:73;;;;-1:-1:-1;;;36494:73:0;;13815:2:1;36494:73:0;;;13797:21:1;13854:2;13834:18;;;13827:30;13893:34;13873:18;;;13866:62;-1:-1:-1;;;13944:18:1;;;13937:39;13993:19;;36494:73:0;13613:405:1;51660:174:0;34222:10;34211:22;;;;:10;:22;;;;;;;;34203:52;;;;-1:-1:-1;;;34203:52:0;;;;;;;:::i;:::-;51766:27:::1;:13;51782:11:::0;;51766:27:::1;:::i;:::-;-1:-1:-1::0;51800:28:0::1;:15;51818:10:::0;;51800:28:::1;:::i;:::-;;51660:174:::0;;;;:::o;51862:231::-;1799:7;1826:6;-1:-1:-1;;;;;1826:6:0;682:10;1973:23;1965:68;;;;-1:-1:-1;;;1965:68:0;;;;;;;:::i;:::-;51943:9:::1;51929:10;;:23;51925:163;;48689:7:::0;:14;51971:9:::1;:26;;51963:86;;;::::0;-1:-1:-1;;;51963:86:0;;14570:2:1;51963:86:0::1;::::0;::::1;14552:21:1::0;14609:2;14589:18;;;14582:30;14648:34;14628:18;;;14621:62;-1:-1:-1;;;14699:18:1;;;14692:44;14753:19;;51963:86:0::1;14368:410:1::0;51963:86:0::1;52058:10;:22:::0;;;51925:163:::1;51862:231:::0;:::o;52113:205::-;52185:7;-1:-1:-1;;;;;52209:19:0;;52201:74;;;;-1:-1:-1;;;52201:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;52289:16:0;;;;;:9;:16;;;;;:23;;52113:205::o;2404:94::-;1799:7;1826:6;-1:-1:-1;;;;;1826:6:0;682:10;1973:23;1965:68;;;;-1:-1:-1;;;1965:68:0;;;;;;;:::i;:::-;2469:21:::1;2487:1;2469:9;:21::i;:::-;2404:94::o:0;6520:100::-;6571:7;6598;6606:5;6598:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;6598:14:0;;6520:100;-1:-1:-1;;6520:100:0:o;51544:110::-;34222:10;34211:22;;;;:10;:22;;;;;;;;34203:52;;;;-1:-1:-1;;;34203:52:0;;;;;;;:::i;:::-;51618:6:::1;51609:5;;:15;51605:43;;51634:5;:14:::0;51544:110::o;36834:104::-;36890:13;36923:7;36916:14;;;;;:::i;50629:645::-;34222:10;34211:22;;;;:10;:22;;;;;;;;34203:52;;;;-1:-1:-1;;;34203:52:0;;;;;;;:::i;:::-;50736:35;;::::1;50728:93;;;::::0;-1:-1:-1;;;50728:93:0;;15396:2:1;50728:93:0::1;::::0;::::1;15378:21:1::0;15435:2;15415:18;;;15408:30;15474:34;15454:18;;;15447:62;-1:-1:-1;;;15525:18:1;;;15518:42;15577:19;;50728:93:0::1;15194:408:1::0;50728:93:0::1;50830:18;50859:14:::0;50876:13:::1;48689:7:::0;:14;;48601:110;50876:13:::1;50859:30;;50900:6;50896:86;50912:19:::0;;::::1;50896:86;;;50963:8;;50972:1;50963:11;;;;;;;:::i;:::-;;;;;;;50946:28;;;;;:::i;:::-;::::0;-1:-1:-1;50933:3:0::1;::::0;::::1;:::i;:::-;;;50896:86;;;-1:-1:-1::0;51023:10:0::1;::::0;50997:22:::1;51006:13:::0;50997:6;:22:::1;:::i;:::-;:36;;50988:76;;;::::0;-1:-1:-1;;;50988:76:0;;15949:2:1;50988:76:0::1;::::0;::::1;15931:21:1::0;15988:2;15968:18;;;15961:30;-1:-1:-1;;;16007:18:1;;;16000:55;16072:18;;50988:76:0::1;15747:349:1::0;50988:76:0::1;51071:20;;;51104:6;51100:169;51116:20:::0;;::::1;51100:169;;;51155:6;51151:111;51171:8;;51180:1;51171:11;;;;;;;:::i;:::-;;;;;;;51167:1;:15;51151:111;;;51199:53;51210:9;;51220:1;51210:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;51224:8:::0;::::1;::::0;::::1;:::i;:::-;;;51199:53;;;;;;;;;;;;;-1:-1:-1::0;;;51199:53:0::1;;::::0;:9:::1;:53::i;:::-;51184:3;::::0;::::1;:::i;:::-;;;51151:111;;;-1:-1:-1::0;51138:3:0::1;::::0;::::1;:::i;:::-;;;51100:169;;;;50721:553;;50629:645:::0;;;;:::o;50106:493::-;50170:8;;;;50161:69;;;;-1:-1:-1;;;50161:69:0;;16303:2:1;50161:69:0;;;16285:21:1;16342:2;16322:18;;;16315:30;-1:-1:-1;;;16361:18:1;;;16354:48;16419:18;;50161:69:0;16101:342:1;50161:69:0;50258:8;;50246;:20;;50237:69;;;;-1:-1:-1;;;50237:69:0;;16650:2:1;50237:69:0;;;16632:21:1;16689:2;16669:18;;;16662:30;-1:-1:-1;;;16708:18:1;;;16701:43;16761:18;;50237:69:0;16448:337:1;50237:69:0;50343:8;50335:5;;:16;;;;:::i;:::-;50322:9;:29;;50313:69;;;;-1:-1:-1;;;50313:69:0;;16992:2:1;50313:69:0;;;16974:21:1;17031:2;17011:18;;;17004:30;17070:27;17050:18;;;17043:55;17115:18;;50313:69:0;16790:349:1;50313:69:0;50391:14;50408:13;48689:7;:14;;48601:110;50408:13;50458:10;;50391:30;;-1:-1:-1;50437:17:0;50446:8;50391:30;50437:17;:::i;:::-;:31;;50428:71;;;;-1:-1:-1;;;50428:71:0;;15949:2:1;50428:71:0;;;15931:21:1;15988:2;15968:18;;;15961:30;-1:-1:-1;;;16007:18:1;;;16000:55;16072:18;;50428:71:0;15747:349:1;50428:71:0;50510:6;50506:88;50526:8;50522:1;:12;50506:88;;;50549:37;50560:10;50572:8;;;;:::i;:::-;;;50549:37;;;;;;;;;;;;:9;:37::i;:::-;50536:3;;;:::i;:::-;;;50506:88;;37771:295;-1:-1:-1;;;;;37874:24:0;;682:10;37874:24;;37866:62;;;;-1:-1:-1;;;37866:62:0;;17346:2:1;37866:62:0;;;17328:21:1;17385:2;17365:18;;;17358:30;17424:27;17404:18;;;17397:55;17469:18;;37866:62:0;17144:349:1;37866:62:0;682:10;37941:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37941:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37941:53:0;;;;;;;;;;38010:48;;1001:41:1;;;37941:42:0;;682:10;38010:48;;974:18:1;38010:48:0;;;;;;;37771:295;;:::o;51280:125::-;34222:10;34211:22;;;;:10;:22;;;;;;;;34203:52;;;;-1:-1:-1;;;34203:52:0;;;;;;;:::i;:::-;51348:8:::1;::::0;::::1;;:21;;::::0;::::1;;;51344:55;;51379:8;:20:::0;;;::::1;;-1:-1:-1::0;;51379:20:0;;::::1;;::::0;;51280:125;:::o;39036:328::-;39211:41;682:10;39244:7;39211:18;:41::i;:::-;39203:103;;;;-1:-1:-1;;;39203:103:0;;;;;;;:::i;:::-;39317:39;39331:4;39337:2;39341:7;39350:5;39317:13;:39::i;:::-;39036:328;;;;:::o;52582:266::-;52654:13;52684:16;52692:7;52684;:16::i;:::-;52676:76;;;;-1:-1:-1;;;52676:76:0;;17700:2:1;52676:76:0;;;17682:21:1;17739:2;17719:18;;;17712:30;17778:34;17758:18;;;17751:62;-1:-1:-1;;;17829:18:1;;;17822:45;17884:19;;52676:76:0;17498:411:1;52676:76:0;52790:13;52805:18;:7;:16;:18::i;:::-;52825:15;52773:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52759:83;;52582:266;;;:::o;51411:127::-;34222:10;34211:22;;;;:10;:22;;;;;;;;34203:52;;;;-1:-1:-1;;;34203:52:0;;;;;;;:::i;:::-;51493:9:::1;51481:8;;:21;51477:55;;51512:8;:20:::0;51411:127::o;2653:192::-;1799:7;1826:6;-1:-1:-1;;;;;1826:6:0;682:10;1973:23;1965:68;;;;-1:-1:-1;;;1965:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2742:22:0;::::1;2734:73;;;::::0;-1:-1:-1;;;2734:73:0;;19681:2:1;2734:73:0::1;::::0;::::1;19663:21:1::0;19720:2;19700:18;;;19693:30;19759:34;19739:18;;;19732:62;-1:-1:-1;;;19810:18:1;;;19803:36;19856:19;;2734:73:0::1;19479:402:1::0;2734:73:0::1;2818:19;2828:8;2818:9;:19::i;35510:305::-:0;35612:4;-1:-1:-1;;;;;;35649:40:0;;-1:-1:-1;;;35649:40:0;;:105;;-1:-1:-1;;;;;;;35706:48:0;;-1:-1:-1;;;35706:48:0;35649:105;:158;;;-1:-1:-1;;;;;;;;;;26940:40:0;;;35771:36;26831:157;40874:155;40973:7;:14;40939:4;;40963:24;;:58;;;;;41019:1;-1:-1:-1;;;;;40991:30:0;:7;40999;40991:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;40991:16:0;:30;;40956:65;40874:155;-1:-1:-1;;40874:155:0:o;44763:175::-;44838:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;44838:29:0;-1:-1:-1;;;;;44838:29:0;;;;;;;;:24;;44892;44838;44892:15;:24::i;:::-;-1:-1:-1;;;;;44883:47:0;;;;;;;;;;;44763:175;;:::o;18085:317::-;18200:6;18175:21;:31;;18167:73;;;;-1:-1:-1;;;18167:73:0;;20088:2:1;18167:73:0;;;20070:21:1;20127:2;20107:18;;;20100:30;20166:31;20146:18;;;20139:59;20215:18;;18167:73:0;19886:353:1;18167:73:0;18254:12;18272:9;-1:-1:-1;;;;;18272:14:0;18294:6;18272:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18253:52;;;18324:7;18316:78;;;;-1:-1:-1;;;18316:78:0;;20656:2:1;18316:78:0;;;20638:21:1;20695:2;20675:18;;;20668:30;20734:34;20714:18;;;20707:62;20805:28;20785:18;;;20778:56;20851:19;;18316:78:0;20454:422:1;41196:349:0;41289:4;41314:16;41322:7;41314;:16::i;:::-;41306:73;;;;-1:-1:-1;;;41306:73:0;;21083:2:1;41306:73:0;;;21065:21:1;21122:2;21102:18;;;21095:30;21161:34;21141:18;;;21134:62;-1:-1:-1;;;21212:18:1;;;21205:42;21264:19;;41306:73:0;20881:408:1;41306:73:0;41390:13;41406:24;41422:7;41406:15;:24::i;:::-;41390:40;;41460:5;-1:-1:-1;;;;;41449:16:0;:7;-1:-1:-1;;;;;41449:16:0;;:51;;;;41493:7;-1:-1:-1;;;;;41469:31:0;:20;41481:7;41469:11;:20::i;:::-;-1:-1:-1;;;;;41469:31:0;;41449:51;:87;;;-1:-1:-1;;;;;;38258:25:0;;;38234:4;38258:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;41504:32;41441:96;41196:349;-1:-1:-1;;;;41196:349:0:o;44128:517::-;44288:4;-1:-1:-1;;;;;44260:32:0;:24;44276:7;44260:15;:24::i;:::-;-1:-1:-1;;;;;44260:32:0;;44252:86;;;;-1:-1:-1;;;44252:86:0;;21496:2:1;44252:86:0;;;21478:21:1;21535:2;21515:18;;;21508:30;21574:34;21554:18;;;21547:62;-1:-1:-1;;;21625:18:1;;;21618:39;21674:19;;44252:86:0;21294:405:1;44252:86:0;-1:-1:-1;;;;;44357:16:0;;44349:65;;;;-1:-1:-1;;;44349:65:0;;21906:2:1;44349:65:0;;;21888:21:1;21945:2;21925:18;;;21918:30;21984:34;21964:18;;;21957:62;-1:-1:-1;;;22035:18:1;;;22028:34;22079:19;;44349:65:0;21704:400:1;44349:65:0;44427:39;44448:4;44454:2;44458:7;44427:20;:39::i;:::-;44531:29;44548:1;44552:7;44531:8;:29::i;:::-;44590:2;44571:7;44579;44571:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;44571:21:0;-1:-1:-1;;;;;44571:21:0;;;;;;44610:27;;44629:7;;44610:27;;;;;;;;;;44571:16;44610:27;44128:517;;;:::o;35879:418::-;35951:7;-1:-1:-1;;;;;35979:19:0;;35971:74;;;;-1:-1:-1;;;35971:74:0;;;;;;;:::i;:::-;36097:7;:14;36058:10;;;36122:119;36143:6;36139:1;:10;36122:119;;;36182:7;36190:1;36182:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36173:19:0;;;36182:10;;36173:19;36169:61;;;36209:7;;;:::i;:::-;;;36169:61;36151:3;;;:::i;:::-;;;36122:119;;;-1:-1:-1;36284:5:0;;35879:418;-1:-1:-1;;;35879:418:0:o;2853:173::-;2909:16;2928:6;;-1:-1:-1;;;;;2945:17:0;;;-1:-1:-1;;;;;;2945:17:0;;;;;;2978:40;;2928:6;;;;;;;2978:40;;2909:16;2978:40;2898:128;2853:173;:::o;42226:321::-;42356:18;42362:2;42366:7;42356:5;:18::i;:::-;42407:54;42438:1;42442:2;42446:7;42455:5;42407:22;:54::i;:::-;42385:154;;;;-1:-1:-1;;;42385:154:0;;;;;;;:::i;40246:315::-;40403:28;40413:4;40419:2;40423:7;40403:9;:28::i;:::-;40450:48;40473:4;40479:2;40483:7;40492:5;40450:22;:48::i;:::-;40442:111;;;;-1:-1:-1;;;40442:111:0;;;;;;;:::i;24347:723::-;24403:13;24624:10;24620:53;;-1:-1:-1;;24651:10:0;;;;;;;;;;;;-1:-1:-1;;;24651:10:0;;;;;24347:723::o;24620:53::-;24698:5;24683:12;24739:78;24746:9;;24739:78;;24772:8;;;;:::i;:::-;;-1:-1:-1;24795:10:0;;-1:-1:-1;24803:2:0;24795:10;;:::i;:::-;;;24739:78;;;24827:19;24859:6;24849:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24849:17:0;;24827:39;;24877:154;24884:10;;24877:154;;24911:11;24921:1;24911:11;;:::i;:::-;;-1:-1:-1;24980:10:0;24988:2;24980:5;:10;:::i;:::-;24967:24;;:2;:24;:::i;:::-;24954:39;;24937:6;24944;24937:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;24937:56:0;;;;;;;;-1:-1:-1;25008:11:0;25017:2;25008:11;;:::i;:::-;;;24877:154;;52870:619;53002:12;-1:-1:-1;;;;;53038:12:0;;;;;:26;;;53060:4;-1:-1:-1;;;;;53054:10:0;:2;-1:-1:-1;;;;;53054:10:0;;53038:26;53034:364;;;-1:-1:-1;;;;;53128:15:0;;53114:11;53128:15;;;:9;:15;;;;;:22;;53159:210;53176:6;53172:1;:10;53159:210;;;-1:-1:-1;;;;;53204:15:0;;;;;;:9;:15;;;;;:18;;53226:7;;53204:15;53220:1;;53204:18;;;;;;:::i;:::-;;;;;;;;;:29;53200:160;;;-1:-1:-1;;;;;53269:15:0;;;;;;:9;:15;;;;;53285:10;53294:1;53285:6;:10;:::i;:::-;53269:27;;;;;;;;:::i;:::-;;;;;;;;;53248:9;:15;53258:4;-1:-1:-1;;;;;53248:15:0;-1:-1:-1;;;;;53248:15:0;;;;;;;;;;;;53264:1;53248:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:48;;;;-1:-1:-1;;;;;53309:15:0;;;;:9;:15;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;53343:5;;53200:160;53184:3;;;:::i;:::-;;;53159:210;;;-1:-1:-1;;53034:364:0;53418:4;-1:-1:-1;;;;;53410:12:0;:4;-1:-1:-1;;;;;53410:12:0;;:26;;;;53432:4;-1:-1:-1;;;;;53426:10:0;:2;-1:-1:-1;;;;;53426:10:0;;;53410:26;53406:78;;;-1:-1:-1;;;;;;53447:13:0;;;;;;;;:9;:13;;;;;;;:29;;;;;;;;;;;;;;-1:-1:-1;52870:619:0:o;42883:346::-;-1:-1:-1;;;;;42963:16:0;;42955:61;;;;-1:-1:-1;;;42955:61:0;;22979:2:1;42955:61:0;;;22961:21:1;;;22998:18;;;22991:30;23057:34;23037:18;;;23030:62;23109:18;;42955:61:0;22777:356:1;42955:61:0;43036:16;43044:7;43036;:16::i;:::-;43035:17;43027:58;;;;-1:-1:-1;;;43027:58:0;;23340:2:1;43027:58:0;;;23322:21:1;23379:2;23359:18;;;23352:30;23418;23398:18;;;23391:58;23466:18;;43027:58:0;23138:352:1;43027:58:0;43098:45;43127:1;43131:2;43135:7;43098:20;:45::i;:::-;43154:7;:16;;;;;;;-1:-1:-1;43154:16:0;;;;;;;-1:-1:-1;;;;;;43154:16:0;-1:-1:-1;;;;;43154:16:0;;;;;;;;43188:33;;43213:7;;-1:-1:-1;43188:33:0;;-1:-1:-1;;43188:33:0;42883:346;;:::o;45505:799::-;45660:4;-1:-1:-1;;;;;45681:13:0;;17086:20;17134:8;45677:620;;45717:72;;-1:-1:-1;;;45717:72:0;;-1:-1:-1;;;;;45717:36:0;;;;;:72;;682:10;;45768:4;;45774:7;;45783:5;;45717:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45717:72:0;;;;;;;;-1:-1:-1;;45717:72:0;;;;;;;;;;;;:::i;:::-;;;45713:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45959:13:0;;45955:272;;46002:60;;-1:-1:-1;;;46002:60:0;;;;;;;:::i;45955:272::-;46177:6;46171:13;46162:6;46158:2;46154:15;46147:38;45713:529;-1:-1:-1;;;;;;45840:51:0;-1:-1:-1;;;45840:51:0;;-1:-1:-1;45833:58:0;;45677:620;-1:-1:-1;46281:4:0;45505:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;475:131:1;-1:-1:-1;;;;;;549:32:1;;539:43;;529:71;;596:1;593;586:12;611:245;669:6;722:2;710:9;701:7;697:23;693:32;690:52;;;738:1;735;728:12;690:52;777:9;764:23;796:30;820:5;796:30;:::i;:::-;845:5;611:245;-1:-1:-1;;;611:245:1:o;1053:258::-;1125:1;1135:113;1149:6;1146:1;1143:13;1135:113;;;1225:11;;;1219:18;1206:11;;;1199:39;1171:2;1164:10;1135:113;;;1266:6;1263:1;1260:13;1257:48;;;-1:-1:-1;;1301:1:1;1283:16;;1276:27;1053:258::o;1316:::-;1358:3;1396:5;1390:12;1423:6;1418:3;1411:19;1439:63;1495:6;1488:4;1483:3;1479:14;1472:4;1465:5;1461:16;1439:63;:::i;:::-;1556:2;1535:15;-1:-1:-1;;1531:29:1;1522:39;;;;1563:4;1518:50;;1316:258;-1:-1:-1;;1316:258:1:o;1579:220::-;1728:2;1717:9;1710:21;1691:4;1748:45;1789:2;1778:9;1774:18;1766:6;1748:45;:::i;1804:131::-;-1:-1:-1;;;;;1879:31:1;;1869:42;;1859:70;;1925:1;1922;1915:12;1940:247;1999:6;2052:2;2040:9;2031:7;2027:23;2023:32;2020:52;;;2068:1;2065;2058:12;2020:52;2107:9;2094:23;2126:31;2151:5;2126:31;:::i;2192:180::-;2251:6;2304:2;2292:9;2283:7;2279:23;2275:32;2272:52;;;2320:1;2317;2310:12;2272:52;-1:-1:-1;2343:23:1;;2192:180;-1:-1:-1;2192:180:1:o;2585:315::-;2653:6;2661;2714:2;2702:9;2693:7;2689:23;2685:32;2682:52;;;2730:1;2727;2720:12;2682:52;2769:9;2756:23;2788:31;2813:5;2788:31;:::i;:::-;2838:5;2890:2;2875:18;;;;2862:32;;-1:-1:-1;;;2585:315:1:o;3165:456::-;3242:6;3250;3258;3311:2;3299:9;3290:7;3286:23;3282:32;3279:52;;;3327:1;3324;3317:12;3279:52;3366:9;3353:23;3385:31;3410:5;3385:31;:::i;:::-;3435:5;-1:-1:-1;3492:2:1;3477:18;;3464:32;3505:33;3464:32;3505:33;:::i;:::-;3165:456;;3557:7;;-1:-1:-1;;;3611:2:1;3596:18;;;;3583:32;;3165:456::o;3626:160::-;3691:20;;3747:13;;3740:21;3730:32;;3720:60;;3776:1;3773;3766:12;3791:315;3856:6;3864;3917:2;3905:9;3896:7;3892:23;3888:32;3885:52;;;3933:1;3930;3923:12;3885:52;3972:9;3959:23;3991:31;4016:5;3991:31;:::i;:::-;4041:5;-1:-1:-1;4065:35:1;4096:2;4081:18;;4065:35;:::i;:::-;4055:45;;3791:315;;;;;:::o;4111:348::-;4163:8;4173:6;4227:3;4220:4;4212:6;4208:17;4204:27;4194:55;;4245:1;4242;4235:12;4194:55;-1:-1:-1;4268:20:1;;4311:18;4300:30;;4297:50;;;4343:1;4340;4333:12;4297:50;4380:4;4372:6;4368:17;4356:29;;4432:3;4425:4;4416:6;4408;4404:19;4400:30;4397:39;4394:59;;;4449:1;4446;4439:12;4394:59;4111:348;;;;;:::o;4464:721::-;4556:6;4564;4572;4580;4633:2;4621:9;4612:7;4608:23;4604:32;4601:52;;;4649:1;4646;4639:12;4601:52;4689:9;4676:23;4718:18;4759:2;4751:6;4748:14;4745:34;;;4775:1;4772;4765:12;4745:34;4814:59;4865:7;4856:6;4845:9;4841:22;4814:59;:::i;:::-;4892:8;;-1:-1:-1;4788:85:1;-1:-1:-1;4980:2:1;4965:18;;4952:32;;-1:-1:-1;4996:16:1;;;4993:36;;;5025:1;5022;5015:12;4993:36;;5064:61;5117:7;5106:8;5095:9;5091:24;5064:61;:::i;:::-;4464:721;;;;-1:-1:-1;5144:8:1;-1:-1:-1;;;;4464:721:1:o;5190:367::-;5253:8;5263:6;5317:3;5310:4;5302:6;5298:17;5294:27;5284:55;;5335:1;5332;5325:12;5284:55;-1:-1:-1;5358:20:1;;5401:18;5390:30;;5387:50;;;5433:1;5430;5423:12;5387:50;5470:4;5462:6;5458:17;5446:29;;5530:3;5523:4;5513:6;5510:1;5506:14;5498:6;5494:27;5490:38;5487:47;5484:67;;;5547:1;5544;5537:12;5562:773;5684:6;5692;5700;5708;5761:2;5749:9;5740:7;5736:23;5732:32;5729:52;;;5777:1;5774;5767:12;5729:52;5817:9;5804:23;5846:18;5887:2;5879:6;5876:14;5873:34;;;5903:1;5900;5893:12;5873:34;5942:70;6004:7;5995:6;5984:9;5980:22;5942:70;:::i;:::-;6031:8;;-1:-1:-1;5916:96:1;-1:-1:-1;6119:2:1;6104:18;;6091:32;;-1:-1:-1;6135:16:1;;;6132:36;;;6164:1;6161;6154:12;6132:36;;6203:72;6267:7;6256:8;6245:9;6241:24;6203:72;:::i;6340:180::-;6396:6;6449:2;6437:9;6428:7;6424:23;6420:32;6417:52;;;6465:1;6462;6455:12;6417:52;6488:26;6504:9;6488:26;:::i;6525:127::-;6586:10;6581:3;6577:20;6574:1;6567:31;6617:4;6614:1;6607:15;6641:4;6638:1;6631:15;6657:1266;6752:6;6760;6768;6776;6829:3;6817:9;6808:7;6804:23;6800:33;6797:53;;;6846:1;6843;6836:12;6797:53;6885:9;6872:23;6904:31;6929:5;6904:31;:::i;:::-;6954:5;-1:-1:-1;7011:2:1;6996:18;;6983:32;7024:33;6983:32;7024:33;:::i;:::-;7076:7;-1:-1:-1;7130:2:1;7115:18;;7102:32;;-1:-1:-1;7185:2:1;7170:18;;7157:32;7208:18;7238:14;;;7235:34;;;7265:1;7262;7255:12;7235:34;7303:6;7292:9;7288:22;7278:32;;7348:7;7341:4;7337:2;7333:13;7329:27;7319:55;;7370:1;7367;7360:12;7319:55;7406:2;7393:16;7428:2;7424;7421:10;7418:36;;;7434:18;;:::i;:::-;7509:2;7503:9;7477:2;7563:13;;-1:-1:-1;;7559:22:1;;;7583:2;7555:31;7551:40;7539:53;;;7607:18;;;7627:22;;;7604:46;7601:72;;;7653:18;;:::i;:::-;7693:10;7689:2;7682:22;7728:2;7720:6;7713:18;7768:7;7763:2;7758;7754;7750:11;7746:20;7743:33;7740:53;;;7789:1;7786;7779:12;7740:53;7845:2;7840;7836;7832:11;7827:2;7819:6;7815:15;7802:46;7890:1;7885:2;7880;7872:6;7868:15;7864:24;7857:35;7911:6;7901:16;;;;;;;6657:1266;;;;;;;:::o;7928:388::-;7996:6;8004;8057:2;8045:9;8036:7;8032:23;8028:32;8025:52;;;8073:1;8070;8063:12;8025:52;8112:9;8099:23;8131:31;8156:5;8131:31;:::i;:::-;8181:5;-1:-1:-1;8238:2:1;8223:18;;8210:32;8251:33;8210:32;8251:33;:::i;:::-;8303:7;8293:17;;;7928:388;;;;;:::o;8321:380::-;8400:1;8396:12;;;;8443;;;8464:61;;8518:4;8510:6;8506:17;8496:27;;8464:61;8571:2;8563:6;8560:14;8540:18;8537:38;8534:161;;;8617:10;8612:3;8608:20;8605:1;8598:31;8652:4;8649:1;8642:15;8680:4;8677:1;8670:15;8534:161;;8321:380;;;:::o;8706:356::-;8908:2;8890:21;;;8927:18;;;8920:30;8986:34;8981:2;8966:18;;8959:62;9053:2;9038:18;;8706:356::o;10714:127::-;10775:10;10770:3;10766:20;10763:1;10756:31;10806:4;10803:1;10796:15;10830:4;10827:1;10820:15;10846:128;10886:3;10917:1;10913:6;10910:1;10907:13;10904:39;;;10923:18;;:::i;:::-;-1:-1:-1;10959:9:1;;10846:128::o;10979:168::-;11019:7;11085:1;11081;11077:6;11073:14;11070:1;11067:21;11062:1;11055:9;11048:17;11044:45;11041:71;;;11092:18;;:::i;:::-;-1:-1:-1;11132:9:1;;10979:168::o;11152:127::-;11213:10;11208:3;11204:20;11201:1;11194:31;11244:4;11241:1;11234:15;11268:4;11265:1;11258:15;11284:120;11324:1;11350;11340:35;;11355:18;;:::i;:::-;-1:-1:-1;11389:9:1;;11284:120::o;11409:125::-;11449:4;11477:1;11474;11471:8;11468:34;;;11482:18;;:::i;:::-;-1:-1:-1;11519:9:1;;11409:125::o;12238:413::-;12440:2;12422:21;;;12479:2;12459:18;;;12452:30;12518:34;12513:2;12498:18;;12491:62;-1:-1:-1;;;12584:2:1;12569:18;;12562:47;12641:3;12626:19;;12238:413::o;13068:127::-;13129:10;13124:3;13120:20;13117:1;13110:31;13160:4;13157:1;13150:15;13184:4;13181:1;13174:15;14023:340;14225:2;14207:21;;;14264:2;14244:18;;;14237:30;-1:-1:-1;;;14298:2:1;14283:18;;14276:46;14354:2;14339:18;;14023:340::o;14783:406::-;14985:2;14967:21;;;15024:2;15004:18;;;14997:30;15063:34;15058:2;15043:18;;15036:62;-1:-1:-1;;;15129:2:1;15114:18;;15107:40;15179:3;15164:19;;14783:406::o;15607:135::-;15646:3;-1:-1:-1;;15667:17:1;;15664:43;;;15687:18;;:::i;:::-;-1:-1:-1;15734:1:1;15723:13;;15607:135::o;18040:973::-;18125:12;;18090:3;;18180:1;18200:18;;;;18253;;;;18280:61;;18334:4;18326:6;18322:17;18312:27;;18280:61;18360:2;18408;18400:6;18397:14;18377:18;18374:38;18371:161;;;18454:10;18449:3;18445:20;18442:1;18435:31;18489:4;18486:1;18479:15;18517:4;18514:1;18507:15;18371:161;18548:18;18575:104;;;;18693:1;18688:319;;;;18541:466;;18575:104;-1:-1:-1;;18608:24:1;;18596:37;;18653:16;;;;-1:-1:-1;18575:104:1;;18688:319;17987:1;17980:14;;;18024:4;18011:18;;18782:1;18796:165;18810:6;18807:1;18804:13;18796:165;;;18888:14;;18875:11;;;18868:35;18931:16;;;;18825:10;;18796:165;;;18800:3;;18990:6;18985:3;18981:16;18974:23;;18541:466;;;;;;;18040:973;;;;:::o;19018:456::-;19239:3;19267:38;19301:3;19293:6;19267:38;:::i;:::-;19334:6;19328:13;19350:52;19395:6;19391:2;19384:4;19376:6;19372:17;19350:52;:::i;:::-;19418:50;19460:6;19456:2;19452:15;19444:6;19418:50;:::i;:::-;19411:57;19018:456;-1:-1:-1;;;;;;;19018:456:1:o;22109:414::-;22311:2;22293:21;;;22350:2;22330:18;;;22323:30;22389:34;22384:2;22369:18;;22362:62;-1:-1:-1;;;22455:2:1;22440:18;;22433:48;22513:3;22498:19;;22109:414::o;22528:112::-;22560:1;22586;22576:35;;22591:18;;:::i;:::-;-1:-1:-1;22625:9:1;;22528:112::o;22645:127::-;22706:10;22701:3;22697:20;22694:1;22687:31;22737:4;22734:1;22727:15;22761:4;22758:1;22751:15;23495:489;-1:-1:-1;;;;;23764:15:1;;;23746:34;;23816:15;;23811:2;23796:18;;23789:43;23863:2;23848:18;;23841:34;;;23911:3;23906:2;23891:18;;23884:31;;;23689:4;;23932:46;;23958:19;;23950:6;23932:46;:::i;:::-;23924:54;23495:489;-1:-1:-1;;;;;;23495:489:1:o;23989:249::-;24058:6;24111:2;24099:9;24090:7;24086:23;24082:32;24079:52;;;24127:1;24124;24117:12;24079:52;24159:9;24153:16;24178:30;24202:5;24178:30;:::i
Swarm Source
ipfs://ee62004517fbc7983d1fde1d7e43c2c8676eddf1bd413907df1bdabb4fe50c05
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.