ERC-721
Overview
Max Total Supply
4,012 FFMP
Holders
1,156
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 FFMPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FlyPass
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-06 */ // File: Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(msg.sender); } /** * @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() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) 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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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); } } } } // File: PaymentSplitter.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) 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. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter { 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(msg.sender, 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 = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @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_); } } // File: IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) 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); } // File: IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) 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; } } // File: IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) 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); } // File: ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) /** * Minimalist iteration of the OpenZeppelin ERC721 Contract. Consolidates functionality, * abandons before and after token transfer hooks, and eliminates unnecessary features * which are not officially part of the standard. * * Some changes made to variable visibility to minimize overrides in main contract. */ pragma solidity ^0.8.0; contract ERC721 is ERC165, IERC721, IERC721Metadata { using Address for address; // Token Index uint256 _tokenIndex; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) public _owners; // Mapping owner address to token count mapping(address => uint256) public _balances; // Mapping owner address to minted count mapping(address => uint256) public _minted; // 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; // Freeze event for metadata event PermanentURI(string _value, uint256 indexed _id); /** * @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); } function totalSupply() public view returns (uint256) { return _tokenIndex; } /** * @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"); return _balances[owner]; } /** * @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; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return ""; } /** * @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 = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), "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 { _setApprovalForAll(msg.sender, operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function _exists(uint256 tokenId) internal view virtual returns (bool) { return _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 = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } // OpenZeppelin _mint function overriden to support quantity. This reduces // writes to storage and simplifies code. // // Flag added to allow selection between "safe" and "unsafe" mint with one // function. function _mint(address to, uint256 quantity, uint256 safeMint, bytes memory data) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); // Reading tokenIndex into memory, and then updating // balances and stored index one time is more gas // efficient. uint256 mintIndex = _tokenIndex; _minted[to] += quantity; _tokenIndex += quantity; // Mint new tokens. for (uint256 i = 0; i < quantity; i++) { mintIndex++; _owners[mintIndex] = to; emit Transfer(address(0), to, mintIndex); emit PermanentURI("https://frenlyflyz.io/ffmp-token-metadata/", mintIndex); if (safeMint == 1) { require( _checkOnERC721Received(address(0), to, mintIndex, data), "ERC721: transfer to non ERC721Receiver implementer" ); } } } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, 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(msg.sender, 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 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(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, 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(msg.sender, 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; } } } // File: ECDSA.sol pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: FrenlyFlyz.sol pragma solidity ^0.8.0; contract OwnableDelegateProxy { } contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } contract FlyPass is ERC721, Ownable, PaymentSplitter { // Libraries using ECDSA for bytes32; bool _stopMint; // Define critical mint parameters uint256 _walletLimit; uint256 _mintPrice; uint256 _startingBlock; uint256 _maxSupply; address _devWallet; address _openSea = 0xa5409ec958C83C3f309868babACA7c86DCB077c1; address[] foundingFlyz = [ 0xeE24c06ae9469E29Fc0107048C2B4e806970ecdA, 0x7d6F7FB391CD36BAde7baa7465581d9826a8D97D, 0x665C5C08465E7c52DCD869a5998E11D8A6CdE361, 0x9A665fb3fFB5906F47C438716D1E009767F96BBD, 0x60916B17F8B0B9194baa5eCA43b7E1583b99A714, 0xDAcb094be451A45D6C54fB18Eed1931D04F5793c, 0xc2DfCFa2Bf1C871cB5af60b7eFBd95864984129D, 0x155a3b74c26955Ca5174500A8f83947d7793bDd2, 0xbB599fbd3BB5ce9326EA50dE38D09D5B946B24C1 ]; uint256[] foundingShares = [ 27, 20, 15, 15, 5, 5, 5, 5, 3 ]; // Constructor constructor (address devWallet) ERC721("FLY Pass", "FFMP") PaymentSplitter(foundingFlyz,foundingShares) { _devWallet = devWallet; } // Strictly for UI purposes. function maxSupply(uint256 startingBlock, uint256 currentBlock) internal view returns (uint256) { uint256 currentMaxSupply; if (startingBlock > currentBlock || _stopMint) { return 0; } else { uint256 blocksElapsed = currentBlock - startingBlock; if (blocksElapsed < 5760) { currentMaxSupply = 2858; } else if (blocksElapsed < 7200) { currentMaxSupply = 8888; } else if (blocksElapsed < 8640) { currentMaxSupply = 7888; } else if (blocksElapsed < 10080) { currentMaxSupply = 6888; } else if (blocksElapsed < 11520) { currentMaxSupply = 5888; } else if (blocksElapsed < 12960) { currentMaxSupply = 4888; } else if (blocksElapsed < 14400) { currentMaxSupply = 3888; } else if (blocksElapsed < 15840) { currentMaxSupply = 2888; } else if (blocksElapsed < 17280) { currentMaxSupply = 1888; } else { currentMaxSupply = 0; } return totalSupply() < currentMaxSupply ? currentMaxSupply : totalSupply(); } } function getMaxSupply() public view returns (uint256) { return maxSupply(_startingBlock, block.number); } function contractURI() public pure returns (string memory) { return "https://frenlyflyz.io/ffmp-collection-metadata/"; } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "Doesn't exist!"); return "ipfs://QmQrcFTeEWWMr5QRzGUT7KqGFotLbsHscRV2HV5SEpuE3z"; } // Free OS Listings function isApprovedForAll( address owner, address operator ) public view override(ERC721) returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(_openSea); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return ERC721.isApprovedForAll(owner, operator); } // To save on gas fees, we write new balances to _minted mapping at mint time. // On first transfer from account with non-zero _minted value, we copy _minted // to _balances. Likewise on first transfer to a non-zero minted value. We write // 10 to the minted count to prevent any further mints, and to signal that // balances have been synchronized with minted quantity. function _transfer( address from, address to, uint256 tokenId ) internal virtual override (ERC721) { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); if (_minted[from] != 0 && _minted[from] != 10) { _balances[from] += _minted[from]; _minted[from] = 10; } // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } function balanceOf(address owner) public view virtual override(ERC721) returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); if (_minted[owner] != 10) { return _balances[owner] + _minted[owner]; } else { return _balances[owner]; } } // Expected starting block is 14149694 function startMint(uint256 startingBlock) public onlyOwner { require(totalSupply() == 0, "Cannot restart mint!"); // We mint to dev wallet so we don't need to implement safe mint, which // causes more problems than not. Tokens will be transferred to gnosis // asap. _mint(_devWallet, 188, 1, ""); _startingBlock = startingBlock; } function stopMint() public onlyOwner { _stopMint = true; } function mint(uint256 rawQuantity, uint256 mintType, bytes memory signature) public payable { // No total supply check on FL mint, since supply is artificially limited // to ensure FL members can obtain a maximum of 2500 NFTs in total. Supply // constraints achieved cryptographically by restricting entries on fly // and og lists. // // Passes acquired on secondary markets will count against total wallet // limit. See overridden balanceOf for comments and operation of wallet // limiting mechanic. // // Limit wallets and ensure sale has started. require( (block.number > _startingBlock) && maxSupply(_startingBlock, block.number) > 0 && (7 > balanceOf(msg.sender) + rawQuantity), "Mint Not Allowed!"); bytes32 hash = keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(msg.sender, mintType, rawQuantity))) ); // Values hard coded to reduce SLOAD. require( hash.recover(signature) == 0x87A7219276164F5740302c24f5D709830f4Ed91F, "Mint not signed!"); uint256 quantity; // Mint type restriction will be imposed by WL administration system. After 24 // hours, OG and Fly pass do not benefit from reduced price, 5 + 1 benefit, or // the supply check bypass. require(0 <= mintType && mintType <= 3, "Hmm"); if (mintType == 0) { require(msg.value >= rawQuantity * 0.04 ether, "Not enough eth"); quantity = rawQuantity; // Strict supply check imposed on public mint. require((maxSupply(_startingBlock, block.number) > totalSupply() + quantity), "Not enough Supply"); } else if (mintType == 1) { require(msg.value >= rawQuantity * 0.03 ether, "Not enough eth"); // Credit one additional mint if paid for five quantity = rawQuantity == 5 ? 6 : rawQuantity; } else if (mintType == 2) { require(msg.value >= rawQuantity * 0.025 ether, "Not enough eth"); // Credit one additional mint if paid for five quantity = rawQuantity == 5 ? 6 : rawQuantity; } _mint(msg.sender, quantity, 0, ""); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"devWallet","type":"address"}],"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":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"PermanentURI","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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_owners","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rawQuantity","type":"uint256"},{"internalType":"uint256","name":"mintType","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"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":[{"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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"uint256","name":"startingBlock","type":"uint256"}],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMint","outputs":[],"stateMutability":"nonpayable","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":"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
601480546001600160a01b03191673a5409ec958c83c3f309868babaca7c86dcb077c11790556101a060405273ee24c06ae9469e29fc0107048c2b4e806970ecda6080908152737d6f7fb391cd36bade7baa7465581d9826a8d97d60a05273665c5c08465e7c52dcd869a5998e11d8a6cde36160c052739a665fb3ffb5906f47c438716d1e009767f96bbd60e0527360916b17f8b0b9194baa5eca43b7e1583b99a7146101005273dacb094be451a45d6c54fb18eed1931d04f5793c6101205273c2dfcfa2bf1c871cb5af60b7efbd95864984129d6101405273155a3b74c26955ca5174500a8f83947d7793bdd26101605273bb599fbd3bb5ce9326ea50de38d09d5b946b24c1610180526200011a90601590600962000669565b506040805161012081018252601b815260146020820152600f918101829052606081019190915260056080820181905260a0820181905260c0820181905260e0820152600361010082015262000175906016906009620006d3565b503480156200018357600080fd5b50604051620032a3380380620032a3833981016040819052620001a691620007aa565b6015805480602002602001604051908101604052809291908181526020018280548015620001fe57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620001df575b505050505060168054806020026020016040519081016040528092919081815260200182805480156200025157602002820191906000526020600020905b8154815260200190600101908083116200023c575b50506040805180820182526008815267464c59205061737360c01b602080830191825283518085019094526004845263046464d560e41b908401528151919550919350620002a492506001919062000716565b508051620002ba90600290602084019062000716565b505050620002ce336200042960201b60201c565b8051825114620003405760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620003935760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000337565b60005b8251811015620003ff57620003ea838281518110620003b957620003b9620007dc565b6020026020010151838381518110620003d657620003d6620007dc565b60200260200101516200047b60201b60201c565b80620003f68162000808565b91505062000396565b5050601380546001600160a01b0319166001600160a01b039390931692909217909155506200087e565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004e85760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000337565b600081116200053a5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000337565b6001600160a01b0382166000908152600b602052604090205415620005b65760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000337565b600d8054600181019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384169081179091556000908152600b602052604090208190556009546200062090829062000826565b600955604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b828054828255906000526020600020908101928215620006c1579160200282015b82811115620006c157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200068a565b50620006cf92915062000793565b5090565b828054828255906000526020600020908101928215620006c1579160200282015b82811115620006c1578251829060ff16905591602001919060010190620006f4565b828054620007249062000841565b90600052602060002090601f016020900481019282620007485760008555620006c1565b82601f106200076357805160ff1916838001178555620006c1565b82800160010185558215620006c1579182015b82811115620006c157825182559160200191906001019062000776565b5b80821115620006cf576000815560010162000794565b600060208284031215620007bd57600080fd5b81516001600160a01b0381168114620007d557600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156200081f576200081f620007f2565b5060010190565b600082198211156200083c576200083c620007f2565b500190565b600181811c908216806200085657607f821691505b602082108114156200087857634e487b7160e01b600052602260045260246000fd5b50919050565b612a15806200088e6000396000f3fe6080604052600436106101dc5760003560e01c80637de77ecc11610102578063c87b56dd11610095578063e8a3d48511610064578063e8a3d485146105bb578063e985e9c5146105d0578063f1bf9a37146105f0578063f2fde38b1461061057600080fd5b8063c87b56dd1461053b578063ce7c2ac21461055b578063d558296514610591578063e33b7de3146105a657600080fd5b80639852595c116100d15780639852595c1461048f578063992924a6146104c5578063a22cb465146104fb578063b88d4fde1461051b57600080fd5b80637de77ecc1461040f5780638b83209b1461043c5780638da5cb5b1461045c57806395d89b411461047a57600080fd5b806323b872dd1161017a5780636352211e116101495780636352211e1461038d5780636ebcf607146103ad57806370a08231146103da578063715018a6146103fa57600080fd5b806323b872dd146103235780633a98ef391461034357806342842e0e146103585780634c0f38c21461037857600080fd5b806308dc9f42116101b657806308dc9f42146102af578063095ea7b3146102c457806318160ddd146102e4578063191655871461030357600080fd5b806301ffc9a71461022057806306fdde0314610255578063081812fc1461027757600080fd5b3661021b57604080513381523460208201527f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770910160405180910390a1005b600080fd5b34801561022c57600080fd5b5061024061023b3660046124f6565b610630565b60405190151581526020015b60405180910390f35b34801561026157600080fd5b5061026a6106cd565b60405161024c9190612567565b34801561028357600080fd5b5061029761029236600461257a565b61075f565b6040516001600160a01b03909116815260200161024c565b6102c26102bd366004612636565b6107f9565b005b3480156102d057600080fd5b506102c26102df36600461269b565b610bb0565b3480156102f057600080fd5b506000545b60405190815260200161024c565b34801561030f57600080fd5b506102c261031e3660046126c7565b610ce2565b34801561032f57600080fd5b506102c261033e3660046126e4565b610ebc565b34801561034f57600080fd5b506009546102f5565b34801561036457600080fd5b506102c26103733660046126e4565b610f43565b34801561038457600080fd5b506102f5610f5e565b34801561039957600080fd5b506102976103a836600461257a565b610f71565b3480156103b957600080fd5b506102f56103c83660046126c7565b60046020526000908152604090205481565b3480156103e657600080fd5b506102f56103f53660046126c7565b610ffc565b34801561040657600080fd5b506102c26110e5565b34801561041b57600080fd5b506102f561042a3660046126c7565b60056020526000908152604090205481565b34801561044857600080fd5b5061029761045736600461257a565b61115a565b34801561046857600080fd5b506008546001600160a01b0316610297565b34801561048657600080fd5b5061026a61118a565b34801561049b57600080fd5b506102f56104aa3660046126c7565b6001600160a01b03166000908152600c602052604090205490565b3480156104d157600080fd5b506102976104e036600461257a565b6003602052600090815260409020546001600160a01b031681565b34801561050757600080fd5b506102c2610516366004612725565b611199565b34801561052757600080fd5b506102c2610536366004612763565b6111a8565b34801561054757600080fd5b5061026a61055636600461257a565b611236565b34801561056757600080fd5b506102f56105763660046126c7565b6001600160a01b03166000908152600b602052604090205490565b34801561059d57600080fd5b506102c26112bc565b3480156105b257600080fd5b50600a546102f5565b3480156105c757600080fd5b5061026a611334565b3480156105dc57600080fd5b506102406105eb3660046127cf565b611354565b3480156105fc57600080fd5b506102c261060b36600461257a565b61142e565b34801561061c57600080fd5b506102c261062b3660046126c7565b611517565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061069357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106c757507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6060600180546106dc906127fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610708906127fd565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166107dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b601154431180156108155750600061081360115443611608565b115b801561083457508261082633610ffc565b610830919061284e565b6007115b6108805760405162461bcd60e51b815260206004820152601160248201527f4d696e74204e6f7420416c6c6f7765642100000000000000000000000000000060448201526064016107d4565b6040516bffffffffffffffffffffffff193360601b166020820152603481018390526054810184905260009060740160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181529190528051602090910120905061091c8183611713565b6001600160a01b03167387a7219276164f5740302c24f5d709830f4ed91f6001600160a01b0316146109905760405162461bcd60e51b815260206004820152601060248201527f4d696e74206e6f74207369676e6564210000000000000000000000000000000060448201526064016107d4565b600060038411156109e35760405162461bcd60e51b815260206004820152600360248201527f486d6d000000000000000000000000000000000000000000000000000000000060448201526064016107d4565b83610aad576109f985668e1bc9bf040000612866565b341015610a395760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b60448201526064016107d4565b508380610a4560005490565b610a4f919061284e565b610a5b60115443611608565b11610aa85760405162461bcd60e51b815260206004820152601160248201527f4e6f7420656e6f75676820537570706c7900000000000000000000000000000060448201526064016107d4565b610b8d565b8360011415610b1f57610ac785666a94d74f430000612866565b341015610b075760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b60448201526064016107d4565b84600514610b155784610b18565b60065b9050610b8d565b8360021415610b8d57610b39856658d15e17628000612866565b341015610b795760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b60448201526064016107d4565b84600514610b875784610b8a565b60065b90505b610ba93382600060405180602001604052806000815250611737565b5050505050565b6000610bbb82610f71565b9050806001600160a01b0316836001600160a01b03161415610c455760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016107d4565b336001600160a01b0382161480610c615750610c618133611354565b610cd35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107d4565b610cdd8383611975565b505050565b6001600160a01b0381166000908152600b6020526040902054610d6d5760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f736861726573000000000000000000000000000000000000000000000000000060648201526084016107d4565b6000610d78600a5490565b610d82904761284e565b90506000610daf8383610daa866001600160a01b03166000908152600c602052604090205490565b6119f0565b905080610e245760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e7400000000000000000000000000000000000000000060648201526084016107d4565b6001600160a01b0383166000908152600c602052604081208054839290610e4c90849061284e565b9250508190555080600a6000828254610e65919061284e565b90915550610e7590508382611a2e565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610ec63382611b47565b610f385760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107d4565b610cdd838383611c16565b610cdd838383604051806020016040528060008152506111a8565b6000610f6c60115443611608565b905090565b6000818152600360205260408120546001600160a01b0316806106c75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016107d4565b60006001600160a01b03821661107a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016107d4565b6001600160a01b038216600090815260056020526040902054600a146110c9576001600160a01b0382166000908152600560209081526040808320546004909252909120546106c7919061284e565b506001600160a01b031660009081526004602052604090205490565b336110f86008546001600160a01b031690565b6001600160a01b03161461114e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d4565b6111586000611e8b565b565b6000600d828154811061116f5761116f612885565b6000918252602090912001546001600160a01b031692915050565b6060600280546106dc906127fd565b6111a4338383611eea565b5050565b6111b23383611b47565b6112245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107d4565b61123084848484611fb9565b50505050565b6000818152600360205260409020546060906001600160a01b031661129d5760405162461bcd60e51b815260206004820152600e60248201527f446f65736e27742065786973742100000000000000000000000000000000000060448201526064016107d4565b6040518060600160405280603581526020016129ab6035913992915050565b336112cf6008546001600160a01b031690565b6001600160a01b0316146113255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d4565b600e805460ff19166001179055565b60606040518060600160405280602f815260200161297c602f9139905090565b6014546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e3919061289b565b6001600160a01b031614156113fc5760019150506106c7565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b336114416008546001600160a01b031690565b6001600160a01b0316146114975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d4565b600054156114e75760405162461bcd60e51b815260206004820152601460248201527f43616e6e6f742072657374617274206d696e742100000000000000000000000060448201526064016107d4565b601354604080516020810190915260008152611512916001600160a01b03169060bc90600190611737565b601155565b3361152a6008546001600160a01b031690565b6001600160a01b0316146115805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d4565b6001600160a01b0381166115fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107d4565b61160581611e8b565b50565b6000808284118061161b5750600e5460ff165b1561162a5760009150506106c7565b600061163685856128b8565b905061168081101561164c57610b2a91506116f1565b611c20811015611660576122b891506116f1565b6121c081101561167457611ed091506116f1565b61276081101561168857611ae891506116f1565b612d0081101561169c5761170091506116f1565b6132a08110156116b05761131891506116f1565b6138408110156116c457610f3091506116f1565b613de08110156116d857610b4891506116f1565b6143808110156116ec5761076091506116f1565b600091505b816116fb60005490565b106117085760005461170a565b815b925050506106c7565b60008060006117228585612037565b9150915061172f816120a7565b509392505050565b6001600160a01b03841661178d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107d4565b600080546001600160a01b03861682526005602052604082208054919286926117b790849061284e565b92505081905550836000808282546117cf919061284e565b90915550600090505b8481101561196d57816117ea816128cf565b600081815260036020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038c169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4817fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b556572076040516118d6906020808252602a908201527f68747470733a2f2f6672656e6c79666c797a2e696f2f66666d702d746f6b656e60408201527f2d6d657461646174612f00000000000000000000000000000000000000000000606082015260800190565b60405180910390a2836001141561195b576118f46000878486612262565b61195b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107d4565b80611965816128cf565b9150506117d8565b505050505050565b6000818152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906119b782610f71565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6009546001600160a01b0384166000908152600b602052604081205490918391611a1a9086612866565b611a2491906128ea565b61142691906128b8565b80471015611a7e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107d4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611acb576040519150601f19603f3d011682016040523d82523d6000602084013e611ad0565b606091505b5050905080610cdd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107d4565b6000818152600360205260408120546001600160a01b0316611bc05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107d4565b6000611bcb83610f71565b9050806001600160a01b0316846001600160a01b03161480611c065750836001600160a01b0316611bfb8461075f565b6001600160a01b0316145b8061142657506114268185611354565b826001600160a01b0316611c2982610f71565b6001600160a01b031614611ca55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016107d4565b6001600160a01b038216611d205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107d4565b6001600160a01b03831660009081526005602052604090205415801590611d6057506001600160a01b038316600090815260056020526040902054600a14155b15611dbb576001600160a01b03831660009081526005602090815260408083205460049092528220805491929091611d9990849061284e565b90915550506001600160a01b0383166000908152600560205260409020600a90555b611dc6600082611975565b6001600160a01b0383166000908152600460205260408120805460019290611def9084906128b8565b90915550506001600160a01b0382166000908152600460205260408120805460019290611e1d90849061284e565b9091555050600081815260036020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611f4c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107d4565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611fc4848484611c16565b611fd084848484612262565b6112305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107d4565b60008082516041141561206e5760208301516040840151606085015160001a612062878285856123ab565b945094505050506120a0565b825160401415612098576020830151604084015161208d868383612498565b9350935050506120a0565b506000905060025b9250929050565b60008160048111156120bb576120bb61290c565b14156120c45750565b60018160048111156120d8576120d861290c565b14156121265760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107d4565b600281600481111561213a5761213a61290c565b14156121885760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107d4565b600381600481111561219c5761219c61290c565b14156121f55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016107d4565b60048160048111156122095761220961290c565b14156116055760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016107d4565b60006001600160a01b0384163b156123a057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122a6903390899088908890600401612922565b6020604051808303816000875af19250505080156122e1575060408051601f3d908101601f191682019092526122de9181019061295e565b60015b612386573d80801561230f576040519150601f19603f3d011682016040523d82523d6000602084013e612314565b606091505b50805161237e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107d4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611426565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156123e2575060009050600361248f565b8460ff16601b141580156123fa57508460ff16601c14155b1561240b575060009050600461248f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561245f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166124885760006001925092505061248f565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016124d2878288856123ab565b935093505050935093915050565b6001600160e01b03198116811461160557600080fd5b60006020828403121561250857600080fd5b8135612513816124e0565b9392505050565b6000815180845260005b8181101561254057602081850181015186830182015201612524565b81811115612552576000602083870101525b50601f01601f19169290920160200192915050565b602081526000612513602083018461251a565b60006020828403121561258c57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126125ba57600080fd5b813567ffffffffffffffff808211156125d5576125d5612593565b604051601f8301601f19908116603f011681019082821181831017156125fd576125fd612593565b8160405283815286602085880101111561261657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561264b57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561267057600080fd5b61267c868287016125a9565b9150509250925092565b6001600160a01b038116811461160557600080fd5b600080604083850312156126ae57600080fd5b82356126b981612686565b946020939093013593505050565b6000602082840312156126d957600080fd5b813561251381612686565b6000806000606084860312156126f957600080fd5b833561270481612686565b9250602084013561271481612686565b929592945050506040919091013590565b6000806040838503121561273857600080fd5b823561274381612686565b91506020830135801515811461275857600080fd5b809150509250929050565b6000806000806080858703121561277957600080fd5b843561278481612686565b9350602085013561279481612686565b925060408501359150606085013567ffffffffffffffff8111156127b757600080fd5b6127c3878288016125a9565b91505092959194509250565b600080604083850312156127e257600080fd5b82356127ed81612686565b9150602083013561275881612686565b600181811c9082168061281157607f821691505b6020821081141561283257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561286157612861612838565b500190565b600081600019048311821515161561288057612880612838565b500290565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156128ad57600080fd5b815161251381612686565b6000828210156128ca576128ca612838565b500390565b60006000198214156128e3576128e3612838565b5060010190565b60008261290757634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fd5b60006001600160a01b03808716835280861660208401525083604083015260806060830152612954608083018461251a565b9695505050505050565b60006020828403121561297057600080fd5b8151612513816124e056fe68747470733a2f2f6672656e6c79666c797a2e696f2f66666d702d636f6c6c656374696f6e2d6d657461646174612f697066733a2f2f516d5172634654654557574d723551527a475554374b7147466f744c62734873635256324856355345707545337aa264697066735822122043ef281fd0255492a4c990ee64d972d89bddb81770ba0dd2901a9fe4ccd1ff2664736f6c634300080b0033000000000000000000000000665c5c08465e7c52dcd869a5998e11d8a6cde361
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c80637de77ecc11610102578063c87b56dd11610095578063e8a3d48511610064578063e8a3d485146105bb578063e985e9c5146105d0578063f1bf9a37146105f0578063f2fde38b1461061057600080fd5b8063c87b56dd1461053b578063ce7c2ac21461055b578063d558296514610591578063e33b7de3146105a657600080fd5b80639852595c116100d15780639852595c1461048f578063992924a6146104c5578063a22cb465146104fb578063b88d4fde1461051b57600080fd5b80637de77ecc1461040f5780638b83209b1461043c5780638da5cb5b1461045c57806395d89b411461047a57600080fd5b806323b872dd1161017a5780636352211e116101495780636352211e1461038d5780636ebcf607146103ad57806370a08231146103da578063715018a6146103fa57600080fd5b806323b872dd146103235780633a98ef391461034357806342842e0e146103585780634c0f38c21461037857600080fd5b806308dc9f42116101b657806308dc9f42146102af578063095ea7b3146102c457806318160ddd146102e4578063191655871461030357600080fd5b806301ffc9a71461022057806306fdde0314610255578063081812fc1461027757600080fd5b3661021b57604080513381523460208201527f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770910160405180910390a1005b600080fd5b34801561022c57600080fd5b5061024061023b3660046124f6565b610630565b60405190151581526020015b60405180910390f35b34801561026157600080fd5b5061026a6106cd565b60405161024c9190612567565b34801561028357600080fd5b5061029761029236600461257a565b61075f565b6040516001600160a01b03909116815260200161024c565b6102c26102bd366004612636565b6107f9565b005b3480156102d057600080fd5b506102c26102df36600461269b565b610bb0565b3480156102f057600080fd5b506000545b60405190815260200161024c565b34801561030f57600080fd5b506102c261031e3660046126c7565b610ce2565b34801561032f57600080fd5b506102c261033e3660046126e4565b610ebc565b34801561034f57600080fd5b506009546102f5565b34801561036457600080fd5b506102c26103733660046126e4565b610f43565b34801561038457600080fd5b506102f5610f5e565b34801561039957600080fd5b506102976103a836600461257a565b610f71565b3480156103b957600080fd5b506102f56103c83660046126c7565b60046020526000908152604090205481565b3480156103e657600080fd5b506102f56103f53660046126c7565b610ffc565b34801561040657600080fd5b506102c26110e5565b34801561041b57600080fd5b506102f561042a3660046126c7565b60056020526000908152604090205481565b34801561044857600080fd5b5061029761045736600461257a565b61115a565b34801561046857600080fd5b506008546001600160a01b0316610297565b34801561048657600080fd5b5061026a61118a565b34801561049b57600080fd5b506102f56104aa3660046126c7565b6001600160a01b03166000908152600c602052604090205490565b3480156104d157600080fd5b506102976104e036600461257a565b6003602052600090815260409020546001600160a01b031681565b34801561050757600080fd5b506102c2610516366004612725565b611199565b34801561052757600080fd5b506102c2610536366004612763565b6111a8565b34801561054757600080fd5b5061026a61055636600461257a565b611236565b34801561056757600080fd5b506102f56105763660046126c7565b6001600160a01b03166000908152600b602052604090205490565b34801561059d57600080fd5b506102c26112bc565b3480156105b257600080fd5b50600a546102f5565b3480156105c757600080fd5b5061026a611334565b3480156105dc57600080fd5b506102406105eb3660046127cf565b611354565b3480156105fc57600080fd5b506102c261060b36600461257a565b61142e565b34801561061c57600080fd5b506102c261062b3660046126c7565b611517565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061069357506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106c757507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6060600180546106dc906127fd565b80601f0160208091040260200160405190810160405280929190818152602001828054610708906127fd565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166107dd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b601154431180156108155750600061081360115443611608565b115b801561083457508261082633610ffc565b610830919061284e565b6007115b6108805760405162461bcd60e51b815260206004820152601160248201527f4d696e74204e6f7420416c6c6f7765642100000000000000000000000000000060448201526064016107d4565b6040516bffffffffffffffffffffffff193360601b166020820152603481018390526054810184905260009060740160408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f198184030181529190528051602090910120905061091c8183611713565b6001600160a01b03167387a7219276164f5740302c24f5d709830f4ed91f6001600160a01b0316146109905760405162461bcd60e51b815260206004820152601060248201527f4d696e74206e6f74207369676e6564210000000000000000000000000000000060448201526064016107d4565b600060038411156109e35760405162461bcd60e51b815260206004820152600360248201527f486d6d000000000000000000000000000000000000000000000000000000000060448201526064016107d4565b83610aad576109f985668e1bc9bf040000612866565b341015610a395760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b60448201526064016107d4565b508380610a4560005490565b610a4f919061284e565b610a5b60115443611608565b11610aa85760405162461bcd60e51b815260206004820152601160248201527f4e6f7420656e6f75676820537570706c7900000000000000000000000000000060448201526064016107d4565b610b8d565b8360011415610b1f57610ac785666a94d74f430000612866565b341015610b075760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b60448201526064016107d4565b84600514610b155784610b18565b60065b9050610b8d565b8360021415610b8d57610b39856658d15e17628000612866565b341015610b795760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced040cae8d60931b60448201526064016107d4565b84600514610b875784610b8a565b60065b90505b610ba93382600060405180602001604052806000815250611737565b5050505050565b6000610bbb82610f71565b9050806001600160a01b0316836001600160a01b03161415610c455760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016107d4565b336001600160a01b0382161480610c615750610c618133611354565b610cd35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107d4565b610cdd8383611975565b505050565b6001600160a01b0381166000908152600b6020526040902054610d6d5760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201527f736861726573000000000000000000000000000000000000000000000000000060648201526084016107d4565b6000610d78600a5490565b610d82904761284e565b90506000610daf8383610daa866001600160a01b03166000908152600c602052604090205490565b6119f0565b905080610e245760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201527f647565207061796d656e7400000000000000000000000000000000000000000060648201526084016107d4565b6001600160a01b0383166000908152600c602052604081208054839290610e4c90849061284e565b9250508190555080600a6000828254610e65919061284e565b90915550610e7590508382611a2e565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610ec63382611b47565b610f385760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107d4565b610cdd838383611c16565b610cdd838383604051806020016040528060008152506111a8565b6000610f6c60115443611608565b905090565b6000818152600360205260408120546001600160a01b0316806106c75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016107d4565b60006001600160a01b03821661107a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016107d4565b6001600160a01b038216600090815260056020526040902054600a146110c9576001600160a01b0382166000908152600560209081526040808320546004909252909120546106c7919061284e565b506001600160a01b031660009081526004602052604090205490565b336110f86008546001600160a01b031690565b6001600160a01b03161461114e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d4565b6111586000611e8b565b565b6000600d828154811061116f5761116f612885565b6000918252602090912001546001600160a01b031692915050565b6060600280546106dc906127fd565b6111a4338383611eea565b5050565b6111b23383611b47565b6112245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107d4565b61123084848484611fb9565b50505050565b6000818152600360205260409020546060906001600160a01b031661129d5760405162461bcd60e51b815260206004820152600e60248201527f446f65736e27742065786973742100000000000000000000000000000000000060448201526064016107d4565b6040518060600160405280603581526020016129ab6035913992915050565b336112cf6008546001600160a01b031690565b6001600160a01b0316146113255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d4565b600e805460ff19166001179055565b60606040518060600160405280602f815260200161297c602f9139905090565b6014546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e3919061289b565b6001600160a01b031614156113fc5760019150506106c7565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b336114416008546001600160a01b031690565b6001600160a01b0316146114975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d4565b600054156114e75760405162461bcd60e51b815260206004820152601460248201527f43616e6e6f742072657374617274206d696e742100000000000000000000000060448201526064016107d4565b601354604080516020810190915260008152611512916001600160a01b03169060bc90600190611737565b601155565b3361152a6008546001600160a01b031690565b6001600160a01b0316146115805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d4565b6001600160a01b0381166115fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107d4565b61160581611e8b565b50565b6000808284118061161b5750600e5460ff165b1561162a5760009150506106c7565b600061163685856128b8565b905061168081101561164c57610b2a91506116f1565b611c20811015611660576122b891506116f1565b6121c081101561167457611ed091506116f1565b61276081101561168857611ae891506116f1565b612d0081101561169c5761170091506116f1565b6132a08110156116b05761131891506116f1565b6138408110156116c457610f3091506116f1565b613de08110156116d857610b4891506116f1565b6143808110156116ec5761076091506116f1565b600091505b816116fb60005490565b106117085760005461170a565b815b925050506106c7565b60008060006117228585612037565b9150915061172f816120a7565b509392505050565b6001600160a01b03841661178d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107d4565b600080546001600160a01b03861682526005602052604082208054919286926117b790849061284e565b92505081905550836000808282546117cf919061284e565b90915550600090505b8481101561196d57816117ea816128cf565b600081815260036020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038c169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4817fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b556572076040516118d6906020808252602a908201527f68747470733a2f2f6672656e6c79666c797a2e696f2f66666d702d746f6b656e60408201527f2d6d657461646174612f00000000000000000000000000000000000000000000606082015260800190565b60405180910390a2836001141561195b576118f46000878486612262565b61195b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107d4565b80611965816128cf565b9150506117d8565b505050505050565b6000818152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906119b782610f71565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6009546001600160a01b0384166000908152600b602052604081205490918391611a1a9086612866565b611a2491906128ea565b61142691906128b8565b80471015611a7e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107d4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611acb576040519150601f19603f3d011682016040523d82523d6000602084013e611ad0565b606091505b5050905080610cdd5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107d4565b6000818152600360205260408120546001600160a01b0316611bc05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107d4565b6000611bcb83610f71565b9050806001600160a01b0316846001600160a01b03161480611c065750836001600160a01b0316611bfb8461075f565b6001600160a01b0316145b8061142657506114268185611354565b826001600160a01b0316611c2982610f71565b6001600160a01b031614611ca55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016107d4565b6001600160a01b038216611d205760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107d4565b6001600160a01b03831660009081526005602052604090205415801590611d6057506001600160a01b038316600090815260056020526040902054600a14155b15611dbb576001600160a01b03831660009081526005602090815260408083205460049092528220805491929091611d9990849061284e565b90915550506001600160a01b0383166000908152600560205260409020600a90555b611dc6600082611975565b6001600160a01b0383166000908152600460205260408120805460019290611def9084906128b8565b90915550506001600160a01b0382166000908152600460205260408120805460019290611e1d90849061284e565b9091555050600081815260036020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611f4c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107d4565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611fc4848484611c16565b611fd084848484612262565b6112305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107d4565b60008082516041141561206e5760208301516040840151606085015160001a612062878285856123ab565b945094505050506120a0565b825160401415612098576020830151604084015161208d868383612498565b9350935050506120a0565b506000905060025b9250929050565b60008160048111156120bb576120bb61290c565b14156120c45750565b60018160048111156120d8576120d861290c565b14156121265760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107d4565b600281600481111561213a5761213a61290c565b14156121885760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107d4565b600381600481111561219c5761219c61290c565b14156121f55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016107d4565b60048160048111156122095761220961290c565b14156116055760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016107d4565b60006001600160a01b0384163b156123a057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122a6903390899088908890600401612922565b6020604051808303816000875af19250505080156122e1575060408051601f3d908101601f191682019092526122de9181019061295e565b60015b612386573d80801561230f576040519150601f19603f3d011682016040523d82523d6000602084013e612314565b606091505b50805161237e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016107d4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611426565b506001949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156123e2575060009050600361248f565b8460ff16601b141580156123fa57508460ff16601c14155b1561240b575060009050600461248f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561245f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166124885760006001925092505061248f565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016124d2878288856123ab565b935093505050935093915050565b6001600160e01b03198116811461160557600080fd5b60006020828403121561250857600080fd5b8135612513816124e0565b9392505050565b6000815180845260005b8181101561254057602081850181015186830182015201612524565b81811115612552576000602083870101525b50601f01601f19169290920160200192915050565b602081526000612513602083018461251a565b60006020828403121561258c57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126125ba57600080fd5b813567ffffffffffffffff808211156125d5576125d5612593565b604051601f8301601f19908116603f011681019082821181831017156125fd576125fd612593565b8160405283815286602085880101111561261657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561264b57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561267057600080fd5b61267c868287016125a9565b9150509250925092565b6001600160a01b038116811461160557600080fd5b600080604083850312156126ae57600080fd5b82356126b981612686565b946020939093013593505050565b6000602082840312156126d957600080fd5b813561251381612686565b6000806000606084860312156126f957600080fd5b833561270481612686565b9250602084013561271481612686565b929592945050506040919091013590565b6000806040838503121561273857600080fd5b823561274381612686565b91506020830135801515811461275857600080fd5b809150509250929050565b6000806000806080858703121561277957600080fd5b843561278481612686565b9350602085013561279481612686565b925060408501359150606085013567ffffffffffffffff8111156127b757600080fd5b6127c3878288016125a9565b91505092959194509250565b600080604083850312156127e257600080fd5b82356127ed81612686565b9150602083013561275881612686565b600181811c9082168061281157607f821691505b6020821081141561283257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561286157612861612838565b500190565b600081600019048311821515161561288057612880612838565b500290565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156128ad57600080fd5b815161251381612686565b6000828210156128ca576128ca612838565b500390565b60006000198214156128e3576128e3612838565b5060010190565b60008261290757634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fd5b60006001600160a01b03808716835280861660208401525083604083015260806060830152612954608083018461251a565b9695505050505050565b60006020828403121561297057600080fd5b8151612513816124e056fe68747470733a2f2f6672656e6c79666c797a2e696f2f66666d702d636f6c6c656374696f6e2d6d657461646174612f697066733a2f2f516d5172634654654557574d723551527a475554374b7147466f744c62734873635256324856355345707545337aa264697066735822122043ef281fd0255492a4c990ee64d972d89bddb81770ba0dd2901a9fe4ccd1ff2664736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000665c5c08465e7c52dcd869a5998e11d8a6cde361
-----Decoded View---------------
Arg [0] : devWallet (address): 0x665C5C08465E7c52DCD869a5998E11D8A6CdE361
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000665c5c08465e7c52dcd869a5998e11d8a6cde361
Deployed Bytecode Sourcemap
45861:8028:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13915:38;;;13931:10;188:74:1;;13943:9:0;293:2:1;278:18;;271:34;13915:38:0;;161:18:1;13915:38:0;;;;;;;45861:8028;;;;;26853:305;;;;;;;;;;-1:-1:-1;26853:305:0;;;;;:::i;:::-;;:::i;:::-;;;913:14:1;;906:22;888:41;;876:2;861:18;26853:305:0;;;;;;;;28107:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28915:221::-;;;;;;;;;;-1:-1:-1;28915:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1991:55:1;;;1973:74;;1961:2;1946:18;28915:221:0;1827:226:1;51404:2482:0;;;;;;:::i;:::-;;:::i;:::-;;28442:407;;;;;;;;;;-1:-1:-1;28442:407:0;;;;;:::i;:::-;;:::i;27166:90::-;;;;;;;;;;-1:-1:-1;27210:7:0;27237:11;27166:90;;;4056:25:1;;;4044:2;4029:18;27166:90:0;3910:177:1;15119:566:0;;;;;;;;;;-1:-1:-1;15119:566:0;;;;;:::i;:::-;;:::i;32289:337::-;;;;;;;;;;-1:-1:-1;32289:337:0;;;;;:::i;:::-;;:::i;14044:91::-;;;;;;;;;;-1:-1:-1;14115:12:0;;14044:91;;32697:185;;;;;;;;;;-1:-1:-1;32697:185:0;;;;;:::i;:::-;;:::i;48439:119::-;;;;;;;;;;;;;:::i;27590:239::-;;;;;;;;;;-1:-1:-1;27590:239:0;;;;;:::i;:::-;;:::i;26063:44::-;;;;;;;;;;-1:-1:-1;26063:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;50534:341;;;;;;;;;;-1:-1:-1;50534:341:0;;;;;:::i;:::-;;:::i;1665:103::-;;;;;;;;;;;;;:::i;26162:42::-;;;;;;;;;;-1:-1:-1;26162:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;14819:100;;;;;;;;;;-1:-1:-1;14819:100:0;;;;;:::i;:::-;;:::i;1016:87::-;;;;;;;;;;-1:-1:-1;1089:6:0;;-1:-1:-1;;;;;1089:6:0;1016:87;;28276:104;;;;;;;;;;;;;:::i;14619:109::-;;;;;;;;;;-1:-1:-1;14619:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;14702:18:0;14675:7;14702:18;;;:9;:18;;;;;;;14619:109;25967:42;;;;;;;;;;-1:-1:-1;25967:42:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;25967:42:0;;;29208:153;;;;;;;;;;-1:-1:-1;29208:153:0;;;;;:::i;:::-;;:::i;32953:326::-;;;;;;;;;;-1:-1:-1;32953:326:0;;;;;:::i;:::-;;:::i;48708:223::-;;;;;;;;;;-1:-1:-1;48708:223:0;;;;;:::i;:::-;;:::i;14415:105::-;;;;;;;;;;-1:-1:-1;14415:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;14496:16:0;14469:7;14496:16;;;:7;:16;;;;;;;14415:105;51324:72;;;;;;;;;;;;;:::i;14229:95::-;;;;;;;;;;-1:-1:-1;14302:14:0;;14229:95;;48566:134;;;;;;;;;;;;;:::i;48964:467::-;;;;;;;;;;-1:-1:-1;48964:467:0;;;;;:::i;:::-;;:::i;50927:389::-;;;;;;;;;;-1:-1:-1;50927:389:0;;;;;:::i;:::-;;:::i;1923:201::-;;;;;;;;;;-1:-1:-1;1923:201:0;;;;;:::i;:::-;;:::i;26853:305::-;26955:4;-1:-1:-1;;;;;;26992:40:0;;27007:25;26992:40;;:105;;-1:-1:-1;;;;;;;27049:48:0;;27064:33;27049:48;26992:105;:158;;;-1:-1:-1;19595:25:0;-1:-1:-1;;;;;;19580:40:0;;;27114:36;26972:178;26853:305;-1:-1:-1;;26853:305:0:o;28107:100::-;28161:13;28194:5;28187:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28107:100;:::o;28915:221::-;28991:7;29693:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29693:16:0;29011:73;;;;-1:-1:-1;;;29011:73:0;;7193:2:1;29011:73:0;;;7175:21:1;7232:2;7212:18;;;7205:30;7271:34;7251:18;;;7244:62;-1:-1:-1;;;7322:18:1;;;7315:42;7374:19;;29011:73:0;;;;;;;;;-1:-1:-1;29104:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29104:24:0;;28915:221::o;51404:2482::-;52091:14;;52076:12;:29;52075:91;;;;;52165:1;52123:39;52133:14;;52149:12;52123:9;:39::i;:::-;:43;52075:91;:149;;;;;52212:11;52188:21;52198:10;52188:9;:21::i;:::-;:35;;;;:::i;:::-;52184:1;:39;52075:149;52053:210;;;;-1:-1:-1;;;52053:210:0;;7928:2:1;52053:210:0;;;7910:21:1;7967:2;7947:18;;;7940:30;8006:19;7986:18;;;7979:47;8043:18;;52053:210:0;7726:341:1;52053:210:0;52391:51;;-1:-1:-1;;52408:10:0;8277:2:1;8273:15;8269:53;52391:51:0;;;8257:66:1;8339:12;;;8332:28;;;8376:12;;;8369:28;;;52276:12:0;;8413::1;;52391:51:0;;;-1:-1:-1;;52391:51:0;;;;;;;;;;52381:62;;52391:51;52381:62;;;;8678:66:1;52301:143:0;;;8666:79:1;;;;8761:12;;;8754:28;8798:12;;52301:143:0;;;-1:-1:-1;;52301:143:0;;;;;;;;;52291:166;;52301:143;52291:166;;;;;-1:-1:-1;52539:23:0;52291:166;52552:9;52539:12;:23::i;:::-;-1:-1:-1;;;;;52539:69:0;52566:42;-1:-1:-1;;;;;52539:69:0;;52517:129;;;;-1:-1:-1;;;52517:129:0;;9023:2:1;52517:129:0;;;9005:21:1;9062:2;9042:18;;;9035:30;9101:18;9081;;;9074:46;9137:18;;52517:129:0;8821:340:1;52517:129:0;52659:16;52938:1;52926:8;:13;;52901:59;;;;-1:-1:-1;;;52901:59:0;;9368:2:1;52901:59:0;;;9350:21:1;9407:1;9387:18;;;9380:29;9445:5;9425:18;;;9418:33;9468:18;;52901:59:0;9166:326:1;52901:59:0;52975:13;52971:861;;53026:24;:11;53040:10;53026:24;:::i;:::-;53013:9;:37;;53005:81;;;;-1:-1:-1;;;53005:81:0;;9872:2:1;53005:81:0;;;9854:21:1;9911:2;9891:18;;;9884:30;-1:-1:-1;;;9930:18:1;;;9923:44;9984:18;;53005:81:0;9670:338:1;53005:81:0;-1:-1:-1;53112:11:0;;53249:13;27210:7;27237:11;;27166:90;53249:13;:24;;;;:::i;:::-;53207:39;53217:14;;53233:12;53207:9;:39::i;:::-;:66;53198:115;;;;-1:-1:-1;;;53198:115:0;;10215:2:1;53198:115:0;;;10197:21:1;10254:2;10234:18;;;10227:30;10293:19;10273:18;;;10266:47;10330:18;;53198:115:0;10013:341:1;53198:115:0;52971:861;;;53335:8;53347:1;53335:13;53331:501;;;53386:24;:11;53400:10;53386:24;:::i;:::-;53373:9;:37;;53365:81;;;;-1:-1:-1;;;53365:81:0;;9872:2:1;53365:81:0;;;9854:21:1;9911:2;9891:18;;;9884:30;-1:-1:-1;;;9930:18:1;;;9923:44;9984:18;;53365:81:0;9670:338:1;53365:81:0;53532:11;53547:1;53532:16;:34;;53555:11;53532:34;;;53551:1;53532:34;53521:45;;53331:501;;;53588:8;53600:1;53588:13;53584:248;;;53639:25;:11;53653;53639:25;:::i;:::-;53626:9;:38;;53618:82;;;;-1:-1:-1;;;53618:82:0;;9872:2:1;53618:82:0;;;9854:21:1;9911:2;9891:18;;;9884:30;-1:-1:-1;;;9930:18:1;;;9923:44;9984:18;;53618:82:0;9670:338:1;53618:82:0;53786:11;53801:1;53786:16;:34;;53809:11;53786:34;;;53805:1;53786:34;53775:45;;53584:248;53844:34;53850:10;53862:8;53872:1;53844:34;;;;;;;;;;;;:5;:34::i;:::-;51496:2390;;51404:2482;;;:::o;28442:407::-;28523:13;28539:23;28554:7;28539:14;:23::i;:::-;28523:39;;28587:5;-1:-1:-1;;;;;28581:11:0;:2;-1:-1:-1;;;;;28581:11:0;;;28573:57;;;;-1:-1:-1;;;28573:57:0;;10561:2:1;28573:57:0;;;10543:21:1;10600:2;10580:18;;;10573:30;10639:34;10619:18;;;10612:62;10710:3;10690:18;;;10683:31;10731:19;;28573:57:0;10359:397:1;28573:57:0;28665:10;-1:-1:-1;;;;;28665:19:0;;;;:58;;;28688:35;28705:5;28712:10;28688:16;:35::i;:::-;28643:164;;;;-1:-1:-1;;;28643:164:0;;10963:2:1;28643:164:0;;;10945:21:1;11002:2;10982:18;;;10975:30;11041:34;11021:18;;;11014:62;11112:26;11092:18;;;11085:54;11156:19;;28643:164:0;10761:420:1;28643:164:0;28820:21;28829:2;28833:7;28820:8;:21::i;:::-;28512:337;28442:407;;:::o;15119:566::-;-1:-1:-1;;;;;15195:16:0;;15214:1;15195:16;;;:7;:16;;;;;;15187:71;;;;-1:-1:-1;;;15187:71:0;;11388:2:1;15187:71:0;;;11370:21:1;11427:2;11407:18;;;11400:30;11466:34;11446:18;;;11439:62;11537:8;11517:18;;;11510:36;11563:19;;15187:71:0;11186:402:1;15187:71:0;15271:21;15319:15;14302:14;;;14229:95;15319:15;15295:39;;:21;:39;:::i;:::-;15271:63;;15345:15;15363:58;15379:7;15388:13;15403:17;15412:7;-1:-1:-1;;;;;14702:18:0;14675:7;14702:18;;;:9;:18;;;;;;;14619:109;15403:17;15363:15;:58::i;:::-;15345:76;-1:-1:-1;15442:12:0;15434:68;;;;-1:-1:-1;;;15434:68:0;;11795:2:1;15434:68:0;;;11777:21:1;11834:2;11814:18;;;11807:30;11873:34;11853:18;;;11846:62;11944:13;11924:18;;;11917:41;11975:19;;15434:68:0;11593:407:1;15434:68:0;-1:-1:-1;;;;;15515:18:0;;;;;;:9;:18;;;;;:29;;15537:7;;15515:18;:29;;15537:7;;15515:29;:::i;:::-;;;;;;;;15573:7;15555:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;15593:35:0;;-1:-1:-1;15611:7:0;15620;15593:17;:35::i;:::-;15644:33;;;-1:-1:-1;;;;;206:55:1;;188:74;;293:2;278:18;;271:34;;;15644:33:0;;161:18:1;15644:33:0;;;;;;;15176:509;;15119:566;:::o;32289:337::-;32484:39;32503:10;32515:7;32484:18;:39::i;:::-;32476:101;;;;-1:-1:-1;;;32476:101:0;;12517:2:1;32476:101:0;;;12499:21:1;12556:2;12536:18;;;12529:30;12595:34;12575:18;;;12568:62;12666:19;12646:18;;;12639:47;12703:19;;32476:101:0;12315:413:1;32476:101:0;32590:28;32600:4;32606:2;32610:7;32590:9;:28::i;32697:185::-;32835:39;32852:4;32858:2;32862:7;32835:39;;;;;;;;;;;;:16;:39::i;48439:119::-;48484:7;48511:39;48521:14;;48537:12;48511:9;:39::i;:::-;48504:46;;48439:119;:::o;27590:239::-;27662:7;27698:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27698:16:0;27733:19;27725:73;;;;-1:-1:-1;;;27725:73:0;;12935:2:1;27725:73:0;;;12917:21:1;12974:2;12954:18;;;12947:30;13013:34;12993:18;;;12986:62;13084:11;13064:18;;;13057:39;13113:19;;27725:73:0;12733:405:1;50534:341:0;50614:7;-1:-1:-1;;;;;50642:19:0;;50634:74;;;;-1:-1:-1;;;50634:74:0;;13345:2:1;50634:74:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:34;13403:18;;;13396:62;13494:12;13474:18;;;13467:40;13524:19;;50634:74:0;13143:406:1;50634:74:0;-1:-1:-1;;;;;50723:14:0;;;;;;:7;:14;;;;;;50741:2;50723:20;50719:149;;-1:-1:-1;;;;;50786:14:0;;;;;;:7;:14;;;;;;;;;50767:9;:16;;;;;;;:33;;50786:14;50767:33;:::i;50719:149::-;-1:-1:-1;;;;;;50840:16:0;;;;;:9;:16;;;;;;;50534:341::o;1665:103::-;1247:10;1236:7;1089:6;;-1:-1:-1;;;;;1089:6:0;;1016:87;1236:7;-1:-1:-1;;;;;1236:21:0;;1228:66;;;;-1:-1:-1;;;1228:66:0;;13756:2:1;1228:66:0;;;13738:21:1;;;13775:18;;;13768:30;13834:34;13814:18;;;13807:62;13886:18;;1228:66:0;13554:356:1;1228:66:0;1730:30:::1;1757:1;1730:18;:30::i;:::-;1665:103::o:0;14819:100::-;14870:7;14897;14905:5;14897:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;14897:14:0;;14819:100;-1:-1:-1;;14819:100:0:o;28276:104::-;28332:13;28365:7;28358:14;;;;;:::i;29208:153::-;29303:50;29322:10;29334:8;29344;29303:18;:50::i;:::-;29208:153;;:::o;32953:326::-;33128:39;33147:10;33159:7;33128:18;:39::i;:::-;33120:101;;;;-1:-1:-1;;;33120:101:0;;12517:2:1;33120:101:0;;;12499:21:1;12556:2;12536:18;;;12529:30;12595:34;12575:18;;;12568:62;12666:19;12646:18;;;12639:47;12703:19;;33120:101:0;12315:413:1;33120:101:0;33232:39;33246:4;33252:2;33256:7;33265:5;33232:13;:39::i;:::-;32953:326;;;;:::o;48708:223::-;29669:4;29693:16;;;:7;:16;;;;;;48781:13;;-1:-1:-1;;;;;29693:16:0;48807:43;;;;-1:-1:-1;;;48807:43:0;;14306:2:1;48807:43:0;;;14288:21:1;14345:2;14325:18;;;14318:30;14384:16;14364:18;;;14357:44;14418:18;;48807:43:0;14104:338:1;48807:43:0;48861:62;;;;;;;;;;;;;;;;;;48708:223;-1:-1:-1;;48708:223:0:o;51324:72::-;1247:10;1236:7;1089:6;;-1:-1:-1;;;;;1089:6:0;;1016:87;1236:7;-1:-1:-1;;;;;1236:21:0;;1228:66;;;;-1:-1:-1;;;1228:66:0;;13756:2:1;1228:66:0;;;13738:21:1;;;13775:18;;;13768:30;13834:34;13814:18;;;13807:62;13886:18;;1228:66:0;13554:356:1;1228:66:0;51372:9:::1;:16:::0;;-1:-1:-1;;51372:16:0::1;51384:4;51372:16;::::0;;51324:72::o;48566:134::-;48610:13;48636:56;;;;;;;;;;;;;;;;;;;48566:134;:::o;48964:467::-;49251:8;;49283:28;;;;;-1:-1:-1;;;;;1991:55:1;;;49283:28:0;;;1973:74:1;49122:4:0;;49251:8;;;49275:49;;;;49251:8;;49283:21;;1946:18:1;;49283:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49275:49:0;;49271:93;;;49348:4;49341:11;;;;;49271:93;-1:-1:-1;;;;;29553:25:0;;;29529:4;29553:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;49383:40;49376:47;48964:467;-1:-1:-1;;;;48964:467:0:o;50927:389::-;1247:10;1236:7;1089:6;;-1:-1:-1;;;;;1089:6:0;;1016:87;1236:7;-1:-1:-1;;;;;1236:21:0;;1228:66;;;;-1:-1:-1;;;1228:66:0;;13756:2:1;1228:66:0;;;13738:21:1;;;13775:18;;;13768:30;13834:34;13814:18;;;13807:62;13886:18;;1228:66:0;13554:356:1;1228:66:0;27210:7;27237:11;51005:18;50997:51:::1;;;::::0;-1:-1:-1;;;50997:51:0;;14934:2:1;50997:51:0::1;::::0;::::1;14916:21:1::0;14973:2;14953:18;;;14946:30;15012:22;14992:18;;;14985:50;15052:18;;50997:51:0::1;14732:344:1::0;50997:51:0::1;51244:10;::::0;51238:29:::1;::::0;;::::1;::::0;::::1;::::0;;;51244:10:::1;51238:29:::0;;::::1;::::0;-1:-1:-1;;;;;51244:10:0::1;::::0;51256:3:::1;::::0;51244:10;;51238:5:::1;:29::i;:::-;51278:14;:30:::0;50927:389::o;1923:201::-;1247:10;1236:7;1089:6;;-1:-1:-1;;;;;1089:6:0;;1016:87;1236:7;-1:-1:-1;;;;;1236:21:0;;1228:66;;;;-1:-1:-1;;;1228:66:0;;13756:2:1;1228:66:0;;;13738:21:1;;;13775:18;;;13768:30;13834:34;13814:18;;;13807:62;13886:18;;1228:66:0;13554:356:1;1228:66:0;-1:-1:-1;;;;;2012:22:0;::::1;2004:73;;;::::0;-1:-1:-1;;;2004:73:0;;15283:2:1;2004:73:0::1;::::0;::::1;15265:21:1::0;15322:2;15302:18;;;15295:30;15361:34;15341:18;;;15334:62;15432:8;15412:18;;;15405:36;15458:19;;2004:73:0::1;15081:402:1::0;2004:73:0::1;2088:28;2107:8;2088:18;:28::i;:::-;1923:201:::0;:::o;47139:1292::-;47226:7;47246:24;47301:12;47285:13;:28;:41;;;-1:-1:-1;47317:9:0;;;;47285:41;47281:1143;;;47350:1;47343:8;;;;;47281:1143;47384:21;47408:28;47423:13;47408:12;:28;:::i;:::-;47384:52;;47471:4;47455:13;:20;47451:871;;;47515:4;47496:23;;47451:871;;;47561:4;47545:13;:20;47541:781;;;47605:4;47586:23;;47541:781;;;47651:4;47635:13;:20;47631:691;;;47695:4;47676:23;;47631:691;;;47741:5;47725:13;:21;47721:601;;;47786:4;47767:23;;47721:601;;;47832:5;47816:13;:21;47812:510;;;47877:4;47858:23;;47812:510;;;47923:5;47907:13;:21;47903:419;;;47968:4;47949:23;;47903:419;;;48014:5;47998:13;:21;47994:328;;;48059:4;48040:23;;47994:328;;;48105:5;48089:13;:21;48085:237;;;48150:4;48131:23;;48085:237;;;48196:5;48180:13;:21;48176:146;;;48241:4;48222:23;;48176:146;;;48305:1;48286:20;;48176:146;48361:16;48345:13;27210:7;27237:11;;27166:90;48345:13;:32;:67;;27210:7;27237:11;48345:67;;;48380:16;48345:67;48338:74;;;;;;40996:231;41074:7;41095:17;41114:18;41136:27;41147:4;41153:9;41136:10;:27::i;:::-;41094:69;;;;41174:18;41186:5;41174:11;:18::i;:::-;-1:-1:-1;41210:9:0;40996:231;-1:-1:-1;;;40996:231:0:o;31238:984::-;-1:-1:-1;;;;;31356:16:0;;31348:61;;;;-1:-1:-1;;;31348:61:0;;15820:2:1;31348:61:0;;;15802:21:1;;;15839:18;;;15832:30;15898:34;15878:18;;;15871:62;15950:18;;31348:61:0;15618:356:1;31348:61:0;31566:17;31586:11;;-1:-1:-1;;;;;31608:11:0;;;;:7;:11;;;;;:23;;31586:11;;31623:8;;31608:23;;31623:8;;31608:23;:::i;:::-;;;;;;;;31657:8;31642:11;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;31712:9:0;;-1:-1:-1;31707:508:0;31731:8;31727:1;:12;31707:508;;;31761:11;;;;:::i;:::-;31787:18;;;;:7;:18;;;;;;:23;;-1:-1:-1;;31787:23:0;-1:-1:-1;;;;;31787:23:0;;;;;;;;31830:35;;31787:18;;-1:-1:-1;31787:18:0;;-1:-1:-1;31787:23:0;31830:35;;31787:18;;31830:35;31944:9;31885:69;;;;;16321:2:1;16303:21;;;16360:2;16340:18;;;16333:30;16399:34;16394:2;16379:18;;16372:62;16470:12;16465:2;16450:18;;16443:40;16515:3;16500:19;;16119:406;31885:69:0;;;;;;;;31975:8;31987:1;31975:13;31971:233;;;32039:55;32070:1;32074:2;32078:9;32089:4;32039:22;:55::i;:::-;32009:179;;;;-1:-1:-1;;;32009:179:0;;16732:2:1;32009:179:0;;;16714:21:1;16771:2;16751:18;;;16744:30;16810:34;16790:18;;;16783:62;-1:-1:-1;;;16861:18:1;;;16854:48;16919:19;;32009:179:0;16530:414:1;32009:179:0;31741:3;;;;:::i;:::-;;;;31707:508;;;;31337:885;31238:984;;;;:::o;30364:174::-;30439:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;30439:29:0;-1:-1:-1;;;;;30439:29:0;;;;;;;;:24;;30493:23;30439:24;30493:14;:23::i;:::-;-1:-1:-1;;;;;30484:46:0;;;;;;;;;;;30364:174;;:::o;15863:248::-;16073:12;;-1:-1:-1;;;;;16053:16:0;;16009:7;16053:16;;;:7;:16;;;;;;16009:7;;16088:15;;16037:32;;:13;:32;:::i;:::-;16036:49;;;;:::i;:::-;:67;;;;:::i;4931:317::-;5046:6;5021:21;:31;;5013:73;;;;-1:-1:-1;;;5013:73:0;;17430:2:1;5013:73:0;;;17412:21:1;17469:2;17449:18;;;17442:30;17508:31;17488:18;;;17481:59;17557:18;;5013:73:0;17228:353:1;5013:73:0;5100:12;5118:9;-1:-1:-1;;;;;5118:14:0;5140:6;5118:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5099:52;;;5170:7;5162:78;;;;-1:-1:-1;;;5162:78:0;;17998:2:1;5162:78:0;;;17980:21:1;18037:2;18017:18;;;18010:30;18076:34;18056:18;;;18049:62;18147:28;18127:18;;;18120:56;18193:19;;5162:78:0;17796:422:1;29898:348:0;29991:4;29693:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29693:16:0;30008:73;;;;-1:-1:-1;;;30008:73:0;;18425:2:1;30008:73:0;;;18407:21:1;18464:2;18444:18;;;18437:30;18503:34;18483:18;;;18476:62;-1:-1:-1;;;18554:18:1;;;18547:42;18606:19;;30008:73:0;18223:408:1;30008:73:0;30092:13;30108:23;30123:7;30108:14;:23::i;:::-;30092:39;;30161:5;-1:-1:-1;;;;;30150:16:0;:7;-1:-1:-1;;;;;30150:16:0;;:51;;;;30194:7;-1:-1:-1;;;;;30170:31:0;:20;30182:7;30170:11;:20::i;:::-;-1:-1:-1;;;;;30170:31:0;;30150:51;:87;;;;30205:32;30222:5;30229:7;30205:16;:32::i;49835:691::-;50012:4;-1:-1:-1;;;;;49985:31:0;:23;50000:7;49985:14;:23::i;:::-;-1:-1:-1;;;;;49985:31:0;;49977:81;;;;-1:-1:-1;;;49977:81:0;;18838:2:1;49977:81:0;;;18820:21:1;18877:2;18857:18;;;18850:30;18916:34;18896:18;;;18889:62;18987:7;18967:18;;;18960:35;19012:19;;49977:81:0;18636:401:1;49977:81:0;-1:-1:-1;;;;;50077:16:0;;50069:65;;;;-1:-1:-1;;;50069:65:0;;19244:2:1;50069:65:0;;;19226:21:1;19283:2;19263:18;;;19256:30;19322:34;19302:18;;;19295:62;19393:6;19373:18;;;19366:34;19417:19;;50069:65:0;19042:400:1;50069:65:0;-1:-1:-1;;;;;50151:13:0;;;;;;:7;:13;;;;;;:18;;;;:41;;-1:-1:-1;;;;;;50173:13:0;;;;;;:7;:13;;;;;;50190:2;50173:19;;50151:41;50147:139;;;-1:-1:-1;;;;;50228:13:0;;;;;;:7;:13;;;;;;;;;50209:9;:15;;;;;:32;;50228:13;;50209:15;;:32;;50228:13;;50209:32;:::i;:::-;;;;-1:-1:-1;;;;;;;50256:13:0;;;;;;:7;:13;;;;;50272:2;50256:18;;50147:139;50350:29;50367:1;50371:7;50350:8;:29::i;:::-;-1:-1:-1;;;;;50392:15:0;;;;;;:9;:15;;;;;:20;;50411:1;;50392:15;:20;;50411:1;;50392:20;:::i;:::-;;;;-1:-1:-1;;;;;;;50423:13:0;;;;;;:9;:13;;;;;:18;;50440:1;;50423:13;:18;;50440:1;;50423:18;:::i;:::-;;;;-1:-1:-1;;50452:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;50452:21:0;-1:-1:-1;;;;;50452:21:0;;;;;;;;;50491:27;;50452:16;;50491:27;;;;;;;49835:691;;;:::o;2284:191::-;2377:6;;;-1:-1:-1;;;;;2394:17:0;;;-1:-1:-1;;2394:17:0;;;;;;;2427:40;;2377:6;;;2394:17;2377:6;;2427:40;;2358:16;;2427:40;2347:128;2284:191;:::o;30680:315::-;30835:8;-1:-1:-1;;;;;30826:17:0;:5;-1:-1:-1;;;;;30826:17:0;;;30818:55;;;;-1:-1:-1;;;30818:55:0;;19649:2:1;30818:55:0;;;19631:21:1;19688:2;19668:18;;;19661:30;19727:27;19707:18;;;19700:55;19772:18;;30818:55:0;19447:349:1;30818:55:0;-1:-1:-1;;;;;30884:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;30884:46:0;;;;;;;;;;30946:41;;888::1;;;30946::0;;861:18:1;30946:41:0;;;;;;;30680:315;;;:::o;34161:::-;34318:28;34328:4;34334:2;34338:7;34318:9;:28::i;:::-;34365:48;34388:4;34394:2;34398:7;34407:5;34365:22;:48::i;:::-;34357:111;;;;-1:-1:-1;;;34357:111:0;;16732:2:1;34357:111:0;;;16714:21:1;16771:2;16751:18;;;16744:30;16810:34;16790:18;;;16783:62;-1:-1:-1;;;16861:18:1;;;16854:48;16919:19;;34357:111:0;16530:414:1;38886:1308:0;38967:7;38976:12;39201:9;:16;39221:2;39201:22;39197:990;;;39497:4;39482:20;;39476:27;39547:4;39532:20;;39526:27;39605:4;39590:20;;39584:27;39240:9;39576:36;39648:25;39659:4;39576:36;39476:27;39526;39648:10;:25::i;:::-;39641:32;;;;;;;;;39197:990;39695:9;:16;39715:2;39695:22;39691:496;;;39970:4;39955:20;;39949:27;40021:4;40006:20;;40000:27;40063:23;40074:4;39949:27;40000;40063:10;:23::i;:::-;40056:30;;;;;;;;39691:496;-1:-1:-1;40135:1:0;;-1:-1:-1;40139:35:0;39691:496;38886:1308;;;;;:::o;37157:643::-;37235:20;37226:5;:29;;;;;;;;:::i;:::-;;37222:571;;;37157:643;:::o;37222:571::-;37333:29;37324:5;:38;;;;;;;;:::i;:::-;;37320:473;;;37379:34;;-1:-1:-1;;;37379:34:0;;20192:2:1;37379:34:0;;;20174:21:1;20231:2;20211:18;;;20204:30;20270:26;20250:18;;;20243:54;20314:18;;37379:34:0;19990:348:1;37320:473:0;37444:35;37435:5;:44;;;;;;;;:::i;:::-;;37431:362;;;37496:41;;-1:-1:-1;;;37496:41:0;;20545:2:1;37496:41:0;;;20527:21:1;20584:2;20564:18;;;20557:30;20623:33;20603:18;;;20596:61;20674:18;;37496:41:0;20343:355:1;37431:362:0;37568:30;37559:5;:39;;;;;;;;:::i;:::-;;37555:238;;;37615:44;;-1:-1:-1;;;37615:44:0;;20905:2:1;37615:44:0;;;20887:21:1;20944:2;20924:18;;;20917:30;20983:34;20963:18;;;20956:62;-1:-1:-1;;;21034:18:1;;;21027:32;21076:19;;37615:44:0;20703:398:1;37555:238:0;37690:30;37681:5;:39;;;;;;;;:::i;:::-;;37677:116;;;37737:44;;-1:-1:-1;;;37737:44:0;;21308:2:1;37737:44:0;;;21290:21:1;21347:2;21327:18;;;21320:30;21386:34;21366:18;;;21359:62;-1:-1:-1;;;21437:18:1;;;21430:32;21479:19;;37737:44:0;21106:398:1;35900:797:0;36055:4;-1:-1:-1;;;;;36076:13:0;;3965:19;:23;36072:618;;36112:70;;-1:-1:-1;;;36112:70:0;;-1:-1:-1;;;;;36112:36:0;;;;;:70;;36149:10;;36161:4;;36167:7;;36176:5;;36112:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36112:70:0;;;;;;;;-1:-1:-1;;36112:70:0;;;;;;;;;;;;:::i;:::-;;;36108:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36352:13:0;;36348:272;;36395:60;;-1:-1:-1;;;36395:60:0;;16732:2:1;36395:60:0;;;16714:21:1;16771:2;16751:18;;;16744:30;16810:34;16790:18;;;16783:62;-1:-1:-1;;;16861:18:1;;;16854:48;16919:19;;36395:60:0;16530:414:1;36348:272:0;36570:6;36564:13;36555:6;36551:2;36547:15;36540:38;36108:527;-1:-1:-1;;;;;;36233:51:0;-1:-1:-1;;;36233:51:0;;-1:-1:-1;36226:58:0;;36072:618;-1:-1:-1;36674:4:0;35900:797;;;;;;:::o;42495:1632::-;42626:7;;43560:66;43547:79;;43543:163;;;-1:-1:-1;43659:1:0;;-1:-1:-1;43663:30:0;43643:51;;43543:163;43720:1;:7;;43725:2;43720:7;;:18;;;;;43731:1;:7;;43736:2;43731:7;;43720:18;43716:102;;;-1:-1:-1;43771:1:0;;-1:-1:-1;43775:30:0;43755:51;;43716:102;43932:24;;;43915:14;43932:24;;;;;;;;;22507:25:1;;;22580:4;22568:17;;22548:18;;;22541:45;;;;22602:18;;;22595:34;;;22645:18;;;22638:34;;;43932:24:0;;22479:19:1;;43932:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43932:24:0;;-1:-1:-1;;43932:24:0;;;-1:-1:-1;;;;;;;43971:20:0;;43967:103;;44024:1;44028:29;44008:50;;;;;;;43967:103;44090:6;-1:-1:-1;44098:20:0;;-1:-1:-1;42495:1632:0;;;;;;;;:::o;41490:391::-;41604:7;;41713:66;41705:75;;41807:3;41803:12;;;41817:2;41799:21;41848:25;41859:4;41799:21;41868:1;41705:75;41848:10;:25::i;:::-;41841:32;;;;;;41490:391;;;;;;:::o;316:177:1:-;-1:-1:-1;;;;;;394:5:1;390:78;383:5;380:89;370:117;;483:1;480;473:12;498:245;556:6;609:2;597:9;588:7;584:23;580:32;577:52;;;625:1;622;615:12;577:52;664:9;651:23;683:30;707:5;683:30;:::i;:::-;732:5;498:245;-1:-1:-1;;;498:245:1:o;940:472::-;982:3;1020:5;1014:12;1047:6;1042:3;1035:19;1072:1;1082:162;1096:6;1093:1;1090:13;1082:162;;;1158:4;1214:13;;;1210:22;;1204:29;1186:11;;;1182:20;;1175:59;1111:12;1082:162;;;1262:6;1259:1;1256:13;1253:87;;;1328:1;1321:4;1312:6;1307:3;1303:16;1299:27;1292:38;1253:87;-1:-1:-1;1394:2:1;1373:15;-1:-1:-1;;1369:29:1;1360:39;;;;1401:4;1356:50;;940:472;-1:-1:-1;;940:472:1:o;1417:220::-;1566:2;1555:9;1548:21;1529:4;1586:45;1627:2;1616:9;1612:18;1604:6;1586:45;:::i;1642:180::-;1701:6;1754:2;1742:9;1733:7;1729:23;1725:32;1722:52;;;1770:1;1767;1760:12;1722:52;-1:-1:-1;1793:23:1;;1642:180;-1:-1:-1;1642:180:1:o;2058:184::-;-1:-1:-1;;;2107:1:1;2100:88;2207:4;2204:1;2197:15;2231:4;2228:1;2221:15;2247:718;2289:5;2342:3;2335:4;2327:6;2323:17;2319:27;2309:55;;2360:1;2357;2350:12;2309:55;2396:6;2383:20;2422:18;2459:2;2455;2452:10;2449:36;;;2465:18;;:::i;:::-;2540:2;2534:9;2508:2;2594:13;;-1:-1:-1;;2590:22:1;;;2614:2;2586:31;2582:40;2570:53;;;2638:18;;;2658:22;;;2635:46;2632:72;;;2684:18;;:::i;:::-;2724:10;2720:2;2713:22;2759:2;2751:6;2744:18;2805:3;2798:4;2793:2;2785:6;2781:15;2777:26;2774:35;2771:55;;;2822:1;2819;2812:12;2771:55;2886:2;2879:4;2871:6;2867:17;2860:4;2852:6;2848:17;2835:54;2933:1;2926:4;2921:2;2913:6;2909:15;2905:26;2898:37;2953:6;2944:15;;;;;;2247:718;;;;:::o;2970:456::-;3056:6;3064;3072;3125:2;3113:9;3104:7;3100:23;3096:32;3093:52;;;3141:1;3138;3131:12;3093:52;3177:9;3164:23;3154:33;;3234:2;3223:9;3219:18;3206:32;3196:42;;3289:2;3278:9;3274:18;3261:32;3316:18;3308:6;3305:30;3302:50;;;3348:1;3345;3338:12;3302:50;3371:49;3412:7;3403:6;3392:9;3388:22;3371:49;:::i;:::-;3361:59;;;2970:456;;;;;:::o;3431:154::-;-1:-1:-1;;;;;3510:5:1;3506:54;3499:5;3496:65;3486:93;;3575:1;3572;3565:12;3590:315;3658:6;3666;3719:2;3707:9;3698:7;3694:23;3690:32;3687:52;;;3735:1;3732;3725:12;3687:52;3774:9;3761:23;3793:31;3818:5;3793:31;:::i;:::-;3843:5;3895:2;3880:18;;;;3867:32;;-1:-1:-1;;;3590:315:1:o;4092:255::-;4159:6;4212:2;4200:9;4191:7;4187:23;4183:32;4180:52;;;4228:1;4225;4218:12;4180:52;4267:9;4254:23;4286:31;4311:5;4286:31;:::i;4352:456::-;4429:6;4437;4445;4498:2;4486:9;4477:7;4473:23;4469:32;4466:52;;;4514:1;4511;4504:12;4466:52;4553:9;4540:23;4572:31;4597:5;4572:31;:::i;:::-;4622:5;-1:-1:-1;4679:2:1;4664:18;;4651:32;4692:33;4651:32;4692:33;:::i;:::-;4352:456;;4744:7;;-1:-1:-1;;;4798:2:1;4783:18;;;;4770:32;;4352:456::o;5065:416::-;5130:6;5138;5191:2;5179:9;5170:7;5166:23;5162:32;5159:52;;;5207:1;5204;5197:12;5159:52;5246:9;5233:23;5265:31;5290:5;5265:31;:::i;:::-;5315:5;-1:-1:-1;5372:2:1;5357:18;;5344:32;5414:15;;5407:23;5395:36;;5385:64;;5445:1;5442;5435:12;5385:64;5468:7;5458:17;;;5065:416;;;;;:::o;5486:665::-;5581:6;5589;5597;5605;5658:3;5646:9;5637:7;5633:23;5629:33;5626:53;;;5675:1;5672;5665:12;5626:53;5714:9;5701:23;5733:31;5758:5;5733:31;:::i;:::-;5783:5;-1:-1:-1;5840:2:1;5825:18;;5812:32;5853:33;5812:32;5853:33;:::i;:::-;5905:7;-1:-1:-1;5959:2:1;5944:18;;5931:32;;-1:-1:-1;6014:2:1;5999:18;;5986:32;6041:18;6030:30;;6027:50;;;6073:1;6070;6063:12;6027:50;6096:49;6137:7;6128:6;6117:9;6113:22;6096:49;:::i;:::-;6086:59;;;5486:665;;;;;;;:::o;6156:388::-;6224:6;6232;6285:2;6273:9;6264:7;6260:23;6256:32;6253:52;;;6301:1;6298;6291:12;6253:52;6340:9;6327:23;6359:31;6384:5;6359:31;:::i;:::-;6409:5;-1:-1:-1;6466:2:1;6451:18;;6438:32;6479:33;6438:32;6479:33;:::i;6549:437::-;6628:1;6624:12;;;;6671;;;6692:61;;6746:4;6738:6;6734:17;6724:27;;6692:61;6799:2;6791:6;6788:14;6768:18;6765:38;6762:218;;;-1:-1:-1;;;6833:1:1;6826:88;6937:4;6934:1;6927:15;6965:4;6962:1;6955:15;6762:218;;6549:437;;;:::o;7404:184::-;-1:-1:-1;;;7453:1:1;7446:88;7553:4;7550:1;7543:15;7577:4;7574:1;7567:15;7593:128;7633:3;7664:1;7660:6;7657:1;7654:13;7651:39;;;7670:18;;:::i;:::-;-1:-1:-1;7706:9:1;;7593:128::o;9497:168::-;9537:7;9603:1;9599;9595:6;9591:14;9588:1;9585:21;9580:1;9573:9;9566:17;9562:45;9559:71;;;9610:18;;:::i;:::-;-1:-1:-1;9650:9:1;;9497:168::o;13915:184::-;-1:-1:-1;;;13964:1:1;13957:88;14064:4;14061:1;14054:15;14088:4;14085:1;14078:15;14447:280;14546:6;14599:2;14587:9;14578:7;14574:23;14570:32;14567:52;;;14615:1;14612;14605:12;14567:52;14647:9;14641:16;14666:31;14691:5;14666:31;:::i;15488:125::-;15528:4;15556:1;15553;15550:8;15547:34;;;15561:18;;:::i;:::-;-1:-1:-1;15598:9:1;;15488:125::o;15979:135::-;16018:3;-1:-1:-1;;16039:17:1;;16036:43;;;16059:18;;:::i;:::-;-1:-1:-1;16106:1:1;16095:13;;15979:135::o;16949:274::-;16989:1;17015;17005:189;;-1:-1:-1;;;17047:1:1;17040:88;17151:4;17148:1;17141:15;17179:4;17176:1;17169:15;17005:189;-1:-1:-1;17208:9:1;;16949:274::o;19801:184::-;-1:-1:-1;;;19850:1:1;19843:88;19950:4;19947:1;19940:15;19974:4;19971:1;19964:15;21509:512;21703:4;-1:-1:-1;;;;;21813:2:1;21805:6;21801:15;21790:9;21783:34;21865:2;21857:6;21853:15;21848:2;21837:9;21833:18;21826:43;;21905:6;21900:2;21889:9;21885:18;21878:34;21948:3;21943:2;21932:9;21928:18;21921:31;21969:46;22010:3;21999:9;21995:19;21987:6;21969:46;:::i;:::-;21961:54;21509:512;-1:-1:-1;;;;;;21509:512:1:o;22026:249::-;22095:6;22148:2;22136:9;22127:7;22123:23;22119:32;22116:52;;;22164:1;22161;22154:12;22116:52;22196:9;22190:16;22215:30;22239:5;22215:30;:::i
Swarm Source
ipfs://43ef281fd0255492a4c990ee64d972d89bddb81770ba0dd2901a9fe4ccd1ff26
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.