Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 466 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Mint Token | 5371720 | 738 days ago | IN | 0 GLMR | 0.00900673 | ||||
| Mint Token | 5371718 | 738 days ago | IN | 0 GLMR | 0.00922036 | ||||
| Mint NFT | 5371714 | 738 days ago | IN | 0 GLMR | 0.02121853 | ||||
| Mint NFT | 5337841 | 743 days ago | IN | 0 GLMR | 0.02242326 | ||||
| Mint NFT | 5336563 | 743 days ago | IN | 0 GLMR | 0.02513437 | ||||
| Mint NFT | 5334332 | 743 days ago | IN | 0 GLMR | 0.03078507 | ||||
| Mint NFT | 5334141 | 743 days ago | IN | 0 GLMR | 0.03085573 | ||||
| Mint Token | 5332511 | 744 days ago | IN | 0 GLMR | 0.00897181 | ||||
| Mint Token | 5332507 | 744 days ago | IN | 0 GLMR | 0.00917541 | ||||
| Mint NFT | 5332501 | 744 days ago | IN | 0 GLMR | 0.02108203 | ||||
| Mint NFT | 5329827 | 744 days ago | IN | 0 GLMR | 0.02336782 | ||||
| Mint NFT | 5329778 | 744 days ago | IN | 0 GLMR | 0.02356891 | ||||
| Mint Token | 5329731 | 744 days ago | IN | 0 GLMR | 0.00911718 | ||||
| Mint Token | 5329723 | 744 days ago | IN | 0 GLMR | 0.00911721 | ||||
| Mint Token | 5329721 | 744 days ago | IN | 0 GLMR | 0.00912613 | ||||
| Mint NFT | 5329717 | 744 days ago | IN | 0 GLMR | 0.02388642 | ||||
| Mint Token | 5329704 | 744 days ago | IN | 0 GLMR | 0.00913191 | ||||
| Mint NFT | 5329677 | 744 days ago | IN | 0 GLMR | 0.02398925 | ||||
| Mint NFT | 5329646 | 744 days ago | IN | 0 GLMR | 0.02403946 | ||||
| Mint Token | 5329613 | 744 days ago | IN | 0 GLMR | 0.00921553 | ||||
| Mint Token | 5329603 | 744 days ago | IN | 0 GLMR | 0.00921373 | ||||
| Mint Token | 5329578 | 744 days ago | IN | 0 GLMR | 0.00918116 | ||||
| Mint Token | 5329575 | 744 days ago | IN | 0 GLMR | 0.00917646 | ||||
| Mint Token | 5329545 | 744 days ago | IN | 0 GLMR | 0.00918938 | ||||
| Mint NFT | 5329542 | 744 days ago | IN | 0 GLMR | 0.02407553 |
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 3380709 | 1019 days ago | Contract Creation | 0 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
websiteNFT
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2023-04-18
*/
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/utils/Strings.sol
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/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
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/utils/Context.sol
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
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;
}
/**
* @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 {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @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(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _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 Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/token/ERC721/extensions/ERC721URIStorage.sol
pragma solidity ^0.8.0;
/**
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is ERC721 {
using Strings for uint256;
// Optional mapping for token URIs
mapping(uint256 => string) private _tokenURIs;
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = _baseURI();
// If there is no base URI, return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base, _tokenURI));
}
return super.tokenURI(tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual override {
super._burn(tokenId);
if (bytes(_tokenURIs[tokenId]).length != 0) {
delete _tokenURIs[tokenId];
}
}
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/token/ERC20/extensions/IERC20Metadata.sol
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.2.0/contracts/token/ERC20/ERC20.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `sender` to `recipient`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
// File: contracts/ERC721.sol
// SPDX-License-Identifier: MIT
// Developed by @iemwill from flex-IT
// https://laubenheimer.eu
// [email protected]
pragma solidity ^0.8.0;
/**
* The websiteToken contract enables website-token-minting for https://laubenheimer.eu.
*/
contract websiteToken is ERC20 {
address public owner;
constructor() ERC20 ("WebsiteToken", "WT"){
owner = msg.sender;
_mint(owner, 100 * 10 ** 18);
}
function mintToken(address to, uint256 amount) public virtual {
require (msg.sender == owner, "You are not allowed to call this function.");
_mint(to, amount * 10 ** 18);
}
}
/**
* The websiteNFT contract creates one NFT for each visit of a website (https://laubenheimer.eu)
* and creates websiteToken through actions.
*/
contract websiteNFT is ERC721URIStorage {
address owner;
websiteToken public theWebsiteToken;
uint256 public NFTsCount;
mapping(uint256 => uint256) public NFTtoTokenMapping;
constructor() ERC721 ("Website NFT", "WNFT") {
owner = msg.sender;
theWebsiteToken = new websiteToken();
_safeMint(owner, 0);
NFTsCount = 1;
NFTtoTokenMapping[0] = 100;
_setTokenURI(0,"https://laubenheimer.eu/NFTs/0");
}
//NFT-functions
function mintNFT(address to, uint256 tokenId, string memory tokenURI, address initiator) public virtual {
require(msg.sender == owner, "You are not allowed to call this function.");
require(NFTsCount == tokenId, "You don't use the mint queue rules.");
_safeMint(to, tokenId);
approve(initiator, tokenId);
NFTsCount += 1;
mintToken(tokenId, owner, initiator, 10);
_setTokenURI(tokenId, tokenURI);
}
function transferNFTFrom(address from, address to, uint256 tokenId) public virtual {
transferFrom(from, to, tokenId);
}
//Token-functions
function mintToken(uint256 tokenId, address to, address initiator, uint256 amount) public virtual {
require(msg.sender == owner, "You are not allowed to call this function.");
require(tokenId < NFTsCount, "You try to mint token for an tokenId not existing.");
theWebsiteToken.mintToken(to, amount);
theWebsiteToken.approve(initiator, amount * 10 ** 18);
}
function mintToken(uint256 tokenId, address to, uint256 amount) public virtual {
require(msg.sender == owner, "You are not allowed to call this function.");
require(tokenId < NFTsCount, "You try to mint token for an tokenId not existing.");
theWebsiteToken.mintToken(to, amount);
NFTtoTokenMapping[tokenId] += amount;
}
function totalTokenSupply() public view returns(uint256) {
return theWebsiteToken.totalSupply();
}
function transferToken(uint256 tokenId, address recipient, uint256 amount) public virtual {
require(msg.sender == owner, "You are not allowed to call this function.");
require(NFTtoTokenMapping[tokenId] >= amount, "Not enough funds.");
theWebsiteToken.transfer(recipient, amount * 10 ** 18);
NFTtoTokenMapping[tokenId] -= amount;
}
function approveToken(uint256 tokenId, address spender, uint256 amount) public virtual {
require(msg.sender == owner, "You are not allowed to call this function.");
require(NFTtoTokenMapping[tokenId] >= amount, "Not enough funds.");
theWebsiteToken.approve(spender, amount * 10 ** 18);
NFTtoTokenMapping[tokenId] -= amount;
}
function transferTokenFrom(uint256 tokenId, address sender, address recipient, uint256 amount) public virtual {
require(msg.sender == owner, "You are not allowed to call this function.");
require(NFTtoTokenMapping[tokenId] >= amount, "Not enough funds.");
theWebsiteToken.transferFrom(sender, recipient, amount * 10 ** 18);
NFTtoTokenMapping[tokenId] -= amount;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NFTsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"NFTtoTokenMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"address","name":"initiator","type":"address"}],"name":"mintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"theWebsiteToken","outputs":[{"internalType":"contract websiteToken","name":"","type":"address"}],"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":"totalTokenSupply","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferNFTFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTokenFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600b81526a15d9589cda5d194813919560aa1b60208083019182528351808501909452600484526315d3919560e21b908401528151919291620000619160009162000466565b5080516200007790600190602084019062000466565b5050600780546001600160a01b03191633179055506040516200009a90620004f5565b604051809103906000f080158015620000b7573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b03928316179055600754620000e59116600062000162565b60016009556000808052600a602090815260647f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e35560408051808201909152601e81527f68747470733a2f2f6c617562656e6865696d65722e65752f4e4654732f300000918101919091526200015c919062000188565b62000732565b62000184828260405180602001604052806000815250620001e160201b60201c565b5050565b62000193826200021b565b620001bb5760405162461bcd60e51b8152600401620001b2906200064d565b60405180910390fd5b60008281526006602090815260409091208251620001dc9284019062000466565b505050565b620001ed838362000238565b620001fc600084848462000323565b620001dc5760405162461bcd60e51b8152600401620001b290620005c4565b6000908152600260205260409020546001600160a01b0316151590565b6001600160a01b038216620002615760405162461bcd60e51b8152600401620001b2906200069b565b6200026c816200021b565b156200028c5760405162461bcd60e51b8152600401620001b29062000616565b6200029a60008383620001dc565b6001600160a01b0382166000908152600360205260408120805460019290620002c5908490620006d0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600062000344846001600160a01b03166200045c60201b620012cb1760201c565b1562000450576001600160a01b03841663150b7a026200036362000462565b8786866040518563ffffffff1660e01b81526004016200038794939291906200054b565b602060405180830381600087803b158015620003a257600080fd5b505af1925050508015620003d5575060408051601f3d908101601f19168201909252620003d2918101906200051a565b60015b62000435573d80801562000406576040519150601f19603f3d011682016040523d82523d6000602084013e6200040b565b606091505b5080516200042d5760405162461bcd60e51b8152600401620001b290620005c4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000454565b5060015b949350505050565b3b151590565b3390565b8280546200047490620006f5565b90600052602060002090601f016020900481019282620004985760008555620004e3565b82601f10620004b357805160ff1916838001178555620004e3565b82800160010185558215620004e3579182015b82811115620004e3578251825591602001919060010190620004c6565b50620004f192915062000503565b5090565b611227806200325b83390190565b5b80821115620004f1576000815560010162000504565b6000602082840312156200052c578081fd5b81516001600160e01b03198116811462000544578182fd5b9392505050565b600060018060a01b0380871683526020818716818501528560408501526080606085015284519150816080850152825b82811015620005995785810182015185820160a0015281016200057b565b82811115620005ab578360a084870101525b5050601f01601f19169190910160a00195945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60008219821115620006f057634e487b7160e01b81526011600452602481fd5b500190565b6002810460018216806200070a57607f821691505b602082108114156200072c57634e487b7160e01b600052602260045260246000fd5b50919050565b612b1980620007426000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c80638fc9d3f5116100e3578063b88d4fde1161008c578063d07c7d0111610066578063d07c7d0114610334578063dbb5313f14610347578063e985e9c51461035a57610198565b8063b88d4fde146102fb578063c87b56dd1461030e578063cde08c401461032157610198565b8063a22cb465116100bd578063a22cb465146102d8578063b0dc92e5146102eb578063b37009f7146102f357610198565b80638fc9d3f5146102aa57806395d7a02d146102bd57806395d89b41146102d057610198565b806342842e0e1161014557806370a082311161011f57806370a08231146102715780637811a5bf146102845780637b2082131461029757610198565b806342842e0e146102385780636352211e1461024b5780636f45b8aa1461025e57610198565b8063095ea7b311610176578063095ea7b3146101fb5780631ca8b6cb1461021057806323b872dd1461022557610198565b806301ffc9a71461019d57806306fdde03146101c6578063081812fc146101db575b600080fd5b6101b06101ab366004611ff0565b61036d565b6040516101bd91906121f9565b60405180910390f35b6101ce610417565b6040516101bd9190612204565b6101ee6101e9366004612028565b6104a9565b6040516101bd9190612138565b61020e610209366004611f32565b61051c565b005b61021861061c565b6040516101bd91906128c1565b61020e610233366004611e48565b6106c4565b61020e610246366004611e48565b610716565b6101ee610259366004612028565b610731565b61020e61026c366004611f5b565b61078d565b61021861027f366004611dfc565b61087c565b61020e61029236600461209b565b6108f4565b61020e6102a536600461209b565b610a34565b61020e6102b8366004612058565b610b8c565b61020e6102cb366004612058565b610d4b565b6101ce610eb0565b61020e6102e6366004611efc565b610ebf565b610218610ff9565b6101ee610fff565b61020e610309366004611e83565b61101b565b6101ce61031c366004612028565b61106e565b61020e61032f366004611e48565b6111a9565b610218610342366004612028565b6111b4565b61020e61035536600461209b565b6111c6565b6101b0610368366004611e16565b611290565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061040057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061040f575061040f826112d1565b90505b919050565b60606000805461042690612976565b80601f016020809104026020016040519081016040528092919081815260200182805461045290612976565b801561049f5780601f106104745761010080835404028352916020019161049f565b820191906000526020600020905b81548152906001019060200180831161048257829003601f168201915b5050505050905090565b60006104b48261131b565b6104f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906126f0565b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061052782610731565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561058f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612807565b8073ffffffffffffffffffffffffffffffffffffffff166105ae611345565b73ffffffffffffffffffffffffffffffffffffffff1614806105d757506105d781610368611345565b61060d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea9061248d565b6106178383611349565b505050565b600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf9190612040565b905090565b6106d56106cf611345565b826113e9565b61070b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612864565b6106178383836114b4565b6106178383836040518060200160405280600081525061101b565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff168061040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612547565b60075473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b8260095414610819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612693565b610823848461167b565b61082d818461051c565b60016009600082825461084091906128ca565b909155505060075461086c90849073ffffffffffffffffffffffffffffffffffffffff1683600a610b8c565b6108768383611699565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff82166108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906124ea565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60075473ffffffffffffffffffffffffffffffffffffffff163314610945576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6009548310610980576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea9061239c565b6008546040517f79c6506800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906379c65068906109d890859085906004016121d3565b600060405180830381600087803b1580156109f257600080fd5b505af1158015610a06573d6000803e3d6000fd5b5050506000848152600a602052604081208054849350909190610a2a9084906128ca565b9091555050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610a85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6000838152600a6020526040902054811115610acd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612456565b60085473ffffffffffffffffffffffffffffffffffffffff1663095ea7b383610afe84670de0b6b3a76400006128f6565b6040518363ffffffff1660e01b8152600401610b1b9291906121d3565b602060405180830381600087803b158015610b3557600080fd5b505af1158015610b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6d9190611fd4565b506000838152600a602052604081208054839290610a2a908490612933565b60075473ffffffffffffffffffffffffffffffffffffffff163314610bdd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6009548410610c18576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea9061239c565b6008546040517f79c6506800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906379c6506890610c7090869085906004016121d3565b600060405180830381600087803b158015610c8a57600080fd5b505af1158015610c9e573d6000803e3d6000fd5b505060085473ffffffffffffffffffffffffffffffffffffffff16915063095ea7b3905083610cd584670de0b6b3a76400006128f6565b6040518363ffffffff1660e01b8152600401610cf29291906121d3565b602060405180830381600087803b158015610d0c57600080fd5b505af1158015610d20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d449190611fd4565b5050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610d9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6000848152600a6020526040902054811115610de4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612456565b60085473ffffffffffffffffffffffffffffffffffffffff166323b872dd8484610e1685670de0b6b3a76400006128f6565b6040518463ffffffff1660e01b8152600401610e3493929190612159565b602060405180830381600087803b158015610e4e57600080fd5b505af1158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190611fd4565b506000848152600a602052604081208054839290610ea5908490612933565b909155505050505050565b60606001805461042690612976565b610ec7611345565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f2c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612365565b8060056000610f39611345565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001692151592909217909155610fa8611345565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fed91906121f9565b60405180910390a35050565b60095481565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b61102c611026611345565b836113e9565b611062576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612864565b610876848484846116f7565b60606110798261131b565b6110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612636565b600082815260066020526040812080546110c890612976565b80601f01602080910402602001604051908101604052809291908181526020018280546110f490612976565b80156111415780601f1061111657610100808354040283529160200191611141565b820191906000526020600020905b81548152906001019060200180831161112457829003601f168201915b505050505090506000611152611744565b905080516000141561116657509050610412565b815115611198578082604051602001611180929190612109565b60405160208183030381529060405292505050610412565b6111a184611756565b949350505050565b6106178383836106c4565b600a6020526000908152604090205481565b60075473ffffffffffffffffffffffffffffffffffffffff163314611217576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6000838152600a602052604090205481111561125f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612456565b60085473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83610afe84670de0b6b3a76400006128f6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b3b151590565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b3390565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906113a382610731565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113f48261131b565b61142a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906123f9565b600061143583610731565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114a457508373ffffffffffffffffffffffffffffffffffffffff1661148c846104a9565b73ffffffffffffffffffffffffffffffffffffffff16145b806111a157506111a18185611290565b8273ffffffffffffffffffffffffffffffffffffffff166114d482610731565b73ffffffffffffffffffffffffffffffffffffffff1614611521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea9061274d565b73ffffffffffffffffffffffffffffffffffffffff821661156e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612308565b611579838383610617565b611584600082611349565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081208054600192906115ba908490612933565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906115f59084906128ca565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116958282604051806020016040528060008152506117f3565b5050565b6116a28261131b565b6116d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906125a4565b6000828152600660209081526040909120825161061792840190611cb1565b6117028484846114b4565b61170e84848484611840565b610876576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612274565b60408051602081019091526000815290565b60606117618261131b565b611797576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906127aa565b60006117a1611744565b905060008151116117c157604051806020016040528060008152506117ec565b806117cb846119de565b6040516020016117dc929190612109565b6040516020818303038152906040525b9392505050565b6117fd8383611b5f565b61180a6000848484611840565b610617576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612274565b60006118618473ffffffffffffffffffffffffffffffffffffffff166112cb565b156119d3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261188a611345565b8786866040518563ffffffff1660e01b81526004016118ac949392919061218a565b602060405180830381600087803b1580156118c657600080fd5b505af1925050508015611914575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526119119181019061200c565b60015b611988573d808015611942576040519150601f19603f3d011682016040523d82523d6000602084013e611947565b606091505b508051611980576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612274565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506111a1565b506001949350505050565b606081611a1f575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610412565b8160005b8115611a495780611a33816129ca565b9150611a429050600a836128e2565b9150611a23565b60008167ffffffffffffffff811115611a8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ab5576020820181803683370190505b5090505b84156111a157611aca600183612933565b9150611ad7600a86612a03565b611ae29060306128ca565b60f81b818381518110611b1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611b58600a866128e2565b9450611ab9565b73ffffffffffffffffffffffffffffffffffffffff8216611bac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612601565b611bb58161131b565b15611bec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906122d1565b611bf860008383610617565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290611c2e9084906128ca565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611cbd90612976565b90600052602060002090601f016020900481019282611cdf5760008555611d25565b82601f10611cf857805160ff1916838001178555611d25565b82800160010185558215611d25579182015b82811115611d25578251825591602001919060010190611d0a565b50611d31929150611d35565b5090565b5b80821115611d315760008155600101611d36565b600067ffffffffffffffff80841115611d6557611d65612a75565b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8701168201018181108382111715611da757611da7612a75565b604052848152915081838501861015611dbf57600080fd5b8484602083013760006020868301015250509392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461041257600080fd5b600060208284031215611e0d578081fd5b6117ec82611dd8565b60008060408385031215611e28578081fd5b611e3183611dd8565b9150611e3f60208401611dd8565b90509250929050565b600080600060608486031215611e5c578081fd5b611e6584611dd8565b9250611e7360208501611dd8565b9150604084013590509250925092565b60008060008060808587031215611e98578081fd5b611ea185611dd8565b9350611eaf60208601611dd8565b925060408501359150606085013567ffffffffffffffff811115611ed1578182fd5b8501601f81018713611ee1578182fd5b611ef087823560208401611d4a565b91505092959194509250565b60008060408385031215611f0e578182fd5b611f1783611dd8565b91506020830135611f2781612aa4565b809150509250929050565b60008060408385031215611f44578182fd5b611f4d83611dd8565b946020939093013593505050565b60008060008060808587031215611f70578384fd5b611f7985611dd8565b935060208501359250604085013567ffffffffffffffff811115611f9b578283fd5b8501601f81018713611fab578283fd5b611fba87823560208401611d4a565b925050611fc960608601611dd8565b905092959194509250565b600060208284031215611fe5578081fd5b81516117ec81612aa4565b600060208284031215612001578081fd5b81356117ec81612ab5565b60006020828403121561201d578081fd5b81516117ec81612ab5565b600060208284031215612039578081fd5b5035919050565b600060208284031215612051578081fd5b5051919050565b6000806000806080858703121561206d578182fd5b8435935061207d60208601611dd8565b925061208b60408601611dd8565b9396929550929360600135925050565b6000806000606084860312156120af578081fd5b83359250611e7360208501611dd8565b600081518084526120d781602086016020860161294a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000835161211b81846020880161294a565b83519083019061212f81836020880161294a565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526121c960808301846120bf565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b6000602082526117ec60208301846120bf565b6020808252602a908201527f596f7520617265206e6f7420616c6c6f77656420746f2063616c6c207468697360408201527f2066756e6374696f6e2e00000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526032908201527f596f752074727920746f206d696e7420746f6b656e20666f7220616e20746f6b60408201527f656e4964206e6f74206578697374696e672e0000000000000000000000000000606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f4e6f7420656e6f7567682066756e64732e000000000000000000000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560408201527f726f206164647265737300000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201527f6578697374656e7420746f6b656e000000000000000000000000000000000000606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f722060408201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000606082015260800190565b60208082526023908201527f596f7520646f6e27742075736520746865206d696e742071756575652072756c60408201527f65732e0000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b90815260200190565b600082198211156128dd576128dd612a17565b500190565b6000826128f1576128f1612a46565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561292e5761292e612a17565b500290565b60008282101561294557612945612a17565b500390565b60005b8381101561296557818101518382015260200161294d565b838111156108765750506000910152565b60028104600182168061298a57607f821691505b602082108114156129c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129fc576129fc612a17565b5060010190565b600082612a1257612a12612a46565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114612ab257600080fd5b50565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612ab257600080fdfea2646970667358221220a5fe1cbbdcaaf850ce6309e4b8774fa10ac88b01c2a84e2f2bdadf1f1efa32df64736f6c6343000800003360806040523480156200001157600080fd5b50604080518082018252600c81526b2bb2b139b4ba32aa37b5b2b760a11b60208083019182528351808501909452600284526115d560f21b908401528151919291620000609160039162000198565b5080516200007690600490602084019062000198565b5050600580546001600160a01b031916331790819055620000ab91506001600160a01b031668056bc75e2d63100000620000b1565b620002e0565b6001600160a01b038216620000e35760405162461bcd60e51b8152600401620000da906200023e565b60405180910390fd5b620000f16000838362000193565b80600260008282546200010591906200027e565b90915550506001600160a01b03821660009081526020819052604081208054839290620001349084906200027e565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200017990859062000275565b60405180910390a36200018f6000838362000193565b5050565b505050565b828054620001a690620002a3565b90600052602060002090601f016020900481019282620001ca576000855562000215565b82601f10620001e557805160ff191683800117855562000215565b8280016001018555821562000215579182015b8281111562000215578251825591602001919060010190620001f8565b506200022392915062000227565b5090565b5b8082111562000223576000815560010162000228565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b600082198211156200029e57634e487b7160e01b81526011600452602481fd5b500190565b600281046001821680620002b857607f821691505b60208210811415620002da57634e487b7160e01b600052602260045260246000fd5b50919050565b610f3780620002f06000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806370a082311161008c57806395d89b411161006657806395d89b41146101af578063a457c2d7146101b7578063a9059cbb146101ca578063dd62ed3e146101dd576100df565b806370a082311461017257806379c65068146101855780638da5cb5b1461019a576100df565b806323b872dd116100bd57806323b872dd14610137578063313ce5671461014a578063395093511461015f576100df565b806306fdde03146100e4578063095ea7b31461010257806318160ddd14610122575b600080fd5b6100ec6101f0565b6040516100f99190610a82565b60405180910390f35b610115610110366004610a2d565b610282565b6040516100f99190610a77565b61012a61029f565b6040516100f99190610e12565b6101156101453660046109f2565b6102a5565b61015261037f565b6040516100f99190610e1b565b61011561016d366004610a2d565b610384565b61012a61018036600461099f565b6103e5565b610198610193366004610a2d565b610411565b005b6101a2610481565b6040516100f99190610a56565b6100ec61049d565b6101156101c5366004610a2d565b6104ac565b6101156101d8366004610a2d565b61054c565b61012a6101eb3660046109c0565b610560565b6060600380546101ff90610e7e565b80601f016020809104026020016040519081016040528092919081815260200182805461022b90610e7e565b80156102785780601f1061024d57610100808354040283529160200191610278565b820191906000526020600020905b81548152906001019060200180831161025b57829003601f168201915b5050505050905090565b600061029661028f610598565b848461059c565b50600192915050565b60025490565b60006102b28484846106ab565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600160205260408120816102e0610598565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035790610c67565b60405180910390fd5b6103748561036c610598565b85840361059c565b506001949350505050565b601290565b6000610296610391610598565b84846001600061039f610598565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918b16815292529020546103e09190610e29565b61059c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020545b919050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610462576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035790610b50565b61047d8261047883670de0b6b3a7640000610e41565b610871565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546101ff90610e7e565b600080600160006104bb610598565b73ffffffffffffffffffffffffffffffffffffffff9081168252602080830193909352604091820160009081209188168152925290205490508281101561052e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035790610d7e565b610542610539610598565b8585840361059c565b5060019392505050565b6000610296610559610598565b84846106ab565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b3390565b73ffffffffffffffffffffffffffffffffffffffff83166105e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035790610d21565b73ffffffffffffffffffffffffffffffffffffffff8216610636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035790610bad565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061069e908590610e12565b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166106f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035790610cc4565b73ffffffffffffffffffffffffffffffffffffffff8216610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035790610af3565b610750838383610976565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156107b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035790610c0a565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152602081905260408082208585039055918516815290812080548492906107f4908490610e29565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108589190610e12565b60405180910390a361086b848484610976565b50505050565b73ffffffffffffffffffffffffffffffffffffffff82166108be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035790610ddb565b6108ca60008383610976565b80600260008282546108dc9190610e29565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610916908490610e29565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610966908590610e12565b60405180910390a361047d600083835b505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461040c57600080fd5b6000602082840312156109b0578081fd5b6109b98261097b565b9392505050565b600080604083850312156109d2578081fd5b6109db8361097b565b91506109e96020840161097b565b90509250929050565b600080600060608486031215610a06578081fd5b610a0f8461097b565b9250610a1d6020850161097b565b9150604084013590509250925092565b60008060408385031215610a3f578182fd5b610a488361097b565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b6000602080835283518082850152825b81811015610aae57858101830151858201604001528201610a92565b81811115610abf5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f596f7520617265206e6f7420616c6c6f77656420746f2063616c6c207468697360408201527f2066756e6374696f6e2e00000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260408201527f616c616e63650000000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160408201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760408201527f207a65726f000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b60008219821115610e3c57610e3c610ed2565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e7957610e79610ed2565b500290565b600281046001821680610e9257607f821691505b60208210811415610ecc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220c0e98e65c873842f242546418b29b9b54e4641c9756e3c8601bebf6caba65eeb64736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101985760003560e01c80638fc9d3f5116100e3578063b88d4fde1161008c578063d07c7d0111610066578063d07c7d0114610334578063dbb5313f14610347578063e985e9c51461035a57610198565b8063b88d4fde146102fb578063c87b56dd1461030e578063cde08c401461032157610198565b8063a22cb465116100bd578063a22cb465146102d8578063b0dc92e5146102eb578063b37009f7146102f357610198565b80638fc9d3f5146102aa57806395d7a02d146102bd57806395d89b41146102d057610198565b806342842e0e1161014557806370a082311161011f57806370a08231146102715780637811a5bf146102845780637b2082131461029757610198565b806342842e0e146102385780636352211e1461024b5780636f45b8aa1461025e57610198565b8063095ea7b311610176578063095ea7b3146101fb5780631ca8b6cb1461021057806323b872dd1461022557610198565b806301ffc9a71461019d57806306fdde03146101c6578063081812fc146101db575b600080fd5b6101b06101ab366004611ff0565b61036d565b6040516101bd91906121f9565b60405180910390f35b6101ce610417565b6040516101bd9190612204565b6101ee6101e9366004612028565b6104a9565b6040516101bd9190612138565b61020e610209366004611f32565b61051c565b005b61021861061c565b6040516101bd91906128c1565b61020e610233366004611e48565b6106c4565b61020e610246366004611e48565b610716565b6101ee610259366004612028565b610731565b61020e61026c366004611f5b565b61078d565b61021861027f366004611dfc565b61087c565b61020e61029236600461209b565b6108f4565b61020e6102a536600461209b565b610a34565b61020e6102b8366004612058565b610b8c565b61020e6102cb366004612058565b610d4b565b6101ce610eb0565b61020e6102e6366004611efc565b610ebf565b610218610ff9565b6101ee610fff565b61020e610309366004611e83565b61101b565b6101ce61031c366004612028565b61106e565b61020e61032f366004611e48565b6111a9565b610218610342366004612028565b6111b4565b61020e61035536600461209b565b6111c6565b6101b0610368366004611e16565b611290565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061040057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061040f575061040f826112d1565b90505b919050565b60606000805461042690612976565b80601f016020809104026020016040519081016040528092919081815260200182805461045290612976565b801561049f5780601f106104745761010080835404028352916020019161049f565b820191906000526020600020905b81548152906001019060200180831161048257829003601f168201915b5050505050905090565b60006104b48261131b565b6104f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906126f0565b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061052782610731565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561058f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612807565b8073ffffffffffffffffffffffffffffffffffffffff166105ae611345565b73ffffffffffffffffffffffffffffffffffffffff1614806105d757506105d781610368611345565b61060d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea9061248d565b6106178383611349565b505050565b600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf9190612040565b905090565b6106d56106cf611345565b826113e9565b61070b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612864565b6106178383836114b4565b6106178383836040518060200160405280600081525061101b565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff168061040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612547565b60075473ffffffffffffffffffffffffffffffffffffffff1633146107de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b8260095414610819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612693565b610823848461167b565b61082d818461051c565b60016009600082825461084091906128ca565b909155505060075461086c90849073ffffffffffffffffffffffffffffffffffffffff1683600a610b8c565b6108768383611699565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff82166108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906124ea565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60075473ffffffffffffffffffffffffffffffffffffffff163314610945576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6009548310610980576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea9061239c565b6008546040517f79c6506800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906379c65068906109d890859085906004016121d3565b600060405180830381600087803b1580156109f257600080fd5b505af1158015610a06573d6000803e3d6000fd5b5050506000848152600a602052604081208054849350909190610a2a9084906128ca565b9091555050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610a85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6000838152600a6020526040902054811115610acd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612456565b60085473ffffffffffffffffffffffffffffffffffffffff1663095ea7b383610afe84670de0b6b3a76400006128f6565b6040518363ffffffff1660e01b8152600401610b1b9291906121d3565b602060405180830381600087803b158015610b3557600080fd5b505af1158015610b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6d9190611fd4565b506000838152600a602052604081208054839290610a2a908490612933565b60075473ffffffffffffffffffffffffffffffffffffffff163314610bdd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6009548410610c18576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea9061239c565b6008546040517f79c6506800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906379c6506890610c7090869085906004016121d3565b600060405180830381600087803b158015610c8a57600080fd5b505af1158015610c9e573d6000803e3d6000fd5b505060085473ffffffffffffffffffffffffffffffffffffffff16915063095ea7b3905083610cd584670de0b6b3a76400006128f6565b6040518363ffffffff1660e01b8152600401610cf29291906121d3565b602060405180830381600087803b158015610d0c57600080fd5b505af1158015610d20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d449190611fd4565b5050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610d9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6000848152600a6020526040902054811115610de4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612456565b60085473ffffffffffffffffffffffffffffffffffffffff166323b872dd8484610e1685670de0b6b3a76400006128f6565b6040518463ffffffff1660e01b8152600401610e3493929190612159565b602060405180830381600087803b158015610e4e57600080fd5b505af1158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190611fd4565b506000848152600a602052604081208054839290610ea5908490612933565b909155505050505050565b60606001805461042690612976565b610ec7611345565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f2c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612365565b8060056000610f39611345565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001692151592909217909155610fa8611345565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fed91906121f9565b60405180910390a35050565b60095481565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b61102c611026611345565b836113e9565b611062576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612864565b610876848484846116f7565b60606110798261131b565b6110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612636565b600082815260066020526040812080546110c890612976565b80601f01602080910402602001604051908101604052809291908181526020018280546110f490612976565b80156111415780601f1061111657610100808354040283529160200191611141565b820191906000526020600020905b81548152906001019060200180831161112457829003601f168201915b505050505090506000611152611744565b905080516000141561116657509050610412565b815115611198578082604051602001611180929190612109565b60405160208183030381529060405292505050610412565b6111a184611756565b949350505050565b6106178383836106c4565b600a6020526000908152604090205481565b60075473ffffffffffffffffffffffffffffffffffffffff163314611217576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612217565b6000838152600a602052604090205481111561125f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612456565b60085473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83610afe84670de0b6b3a76400006128f6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b3b151590565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b3390565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906113a382610731565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113f48261131b565b61142a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906123f9565b600061143583610731565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806114a457508373ffffffffffffffffffffffffffffffffffffffff1661148c846104a9565b73ffffffffffffffffffffffffffffffffffffffff16145b806111a157506111a18185611290565b8273ffffffffffffffffffffffffffffffffffffffff166114d482610731565b73ffffffffffffffffffffffffffffffffffffffff1614611521576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea9061274d565b73ffffffffffffffffffffffffffffffffffffffff821661156e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612308565b611579838383610617565b611584600082611349565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081208054600192906115ba908490612933565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906115f59084906128ca565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116958282604051806020016040528060008152506117f3565b5050565b6116a28261131b565b6116d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906125a4565b6000828152600660209081526040909120825161061792840190611cb1565b6117028484846114b4565b61170e84848484611840565b610876576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612274565b60408051602081019091526000815290565b60606117618261131b565b611797576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906127aa565b60006117a1611744565b905060008151116117c157604051806020016040528060008152506117ec565b806117cb846119de565b6040516020016117dc929190612109565b6040516020818303038152906040525b9392505050565b6117fd8383611b5f565b61180a6000848484611840565b610617576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612274565b60006118618473ffffffffffffffffffffffffffffffffffffffff166112cb565b156119d3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261188a611345565b8786866040518563ffffffff1660e01b81526004016118ac949392919061218a565b602060405180830381600087803b1580156118c657600080fd5b505af1925050508015611914575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526119119181019061200c565b60015b611988573d808015611942576040519150601f19603f3d011682016040523d82523d6000602084013e611947565b606091505b508051611980576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612274565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506111a1565b506001949350505050565b606081611a1f575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610412565b8160005b8115611a495780611a33816129ca565b9150611a429050600a836128e2565b9150611a23565b60008167ffffffffffffffff811115611a8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ab5576020820181803683370190505b5090505b84156111a157611aca600183612933565b9150611ad7600a86612a03565b611ae29060306128ca565b60f81b818381518110611b1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611b58600a866128e2565b9450611ab9565b73ffffffffffffffffffffffffffffffffffffffff8216611bac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea90612601565b611bb58161131b565b15611bec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ea906122d1565b611bf860008383610617565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290611c2e9084906128ca565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611cbd90612976565b90600052602060002090601f016020900481019282611cdf5760008555611d25565b82601f10611cf857805160ff1916838001178555611d25565b82800160010185558215611d25579182015b82811115611d25578251825591602001919060010190611d0a565b50611d31929150611d35565b5090565b5b80821115611d315760008155600101611d36565b600067ffffffffffffffff80841115611d6557611d65612a75565b60405160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8701168201018181108382111715611da757611da7612a75565b604052848152915081838501861015611dbf57600080fd5b8484602083013760006020868301015250509392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461041257600080fd5b600060208284031215611e0d578081fd5b6117ec82611dd8565b60008060408385031215611e28578081fd5b611e3183611dd8565b9150611e3f60208401611dd8565b90509250929050565b600080600060608486031215611e5c578081fd5b611e6584611dd8565b9250611e7360208501611dd8565b9150604084013590509250925092565b60008060008060808587031215611e98578081fd5b611ea185611dd8565b9350611eaf60208601611dd8565b925060408501359150606085013567ffffffffffffffff811115611ed1578182fd5b8501601f81018713611ee1578182fd5b611ef087823560208401611d4a565b91505092959194509250565b60008060408385031215611f0e578182fd5b611f1783611dd8565b91506020830135611f2781612aa4565b809150509250929050565b60008060408385031215611f44578182fd5b611f4d83611dd8565b946020939093013593505050565b60008060008060808587031215611f70578384fd5b611f7985611dd8565b935060208501359250604085013567ffffffffffffffff811115611f9b578283fd5b8501601f81018713611fab578283fd5b611fba87823560208401611d4a565b925050611fc960608601611dd8565b905092959194509250565b600060208284031215611fe5578081fd5b81516117ec81612aa4565b600060208284031215612001578081fd5b81356117ec81612ab5565b60006020828403121561201d578081fd5b81516117ec81612ab5565b600060208284031215612039578081fd5b5035919050565b600060208284031215612051578081fd5b5051919050565b6000806000806080858703121561206d578182fd5b8435935061207d60208601611dd8565b925061208b60408601611dd8565b9396929550929360600135925050565b6000806000606084860312156120af578081fd5b83359250611e7360208501611dd8565b600081518084526120d781602086016020860161294a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000835161211b81846020880161294a565b83519083019061212f81836020880161294a565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526121c960808301846120bf565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b6000602082526117ec60208301846120bf565b6020808252602a908201527f596f7520617265206e6f7420616c6c6f77656420746f2063616c6c207468697360408201527f2066756e6374696f6e2e00000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526032908201527f596f752074727920746f206d696e7420746f6b656e20666f7220616e20746f6b60408201527f656e4964206e6f74206578697374696e672e0000000000000000000000000000606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f4e6f7420656e6f7567682066756e64732e000000000000000000000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560408201527f726f206164647265737300000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201527f6578697374656e7420746f6b656e000000000000000000000000000000000000606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f722060408201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000606082015260800190565b60208082526023908201527f596f7520646f6e27742075736520746865206d696e742071756575652072756c60408201527f65732e0000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560408201527f7200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b90815260200190565b600082198211156128dd576128dd612a17565b500190565b6000826128f1576128f1612a46565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561292e5761292e612a17565b500290565b60008282101561294557612945612a17565b500390565b60005b8381101561296557818101518382015260200161294d565b838111156108765750506000910152565b60028104600182168061298a57607f821691505b602082108114156129c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129fc576129fc612a17565b5060010190565b600082612a1257612a12612a46565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8015158114612ab257600080fd5b50565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612ab257600080fdfea2646970667358221220a5fe1cbbdcaaf850ce6309e4b8774fa10ac88b01c2a84e2f2bdadf1f1efa32df64736f6c63430008000033
Deployed Bytecode Sourcemap
51505:2997:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20904:305;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21849:100;;;:::i;:::-;;;;;;;:::i;23408:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22931:411::-;;;;;;:::i;:::-;;:::i;:::-;;53293:106;;;:::i;:::-;;;;;;;:::i;24298:339::-;;;;;;:::i;:::-;;:::i;24708:185::-;;;;;;:::i;:::-;;:::i;21543:239::-;;;;;;:::i;:::-;;:::i;51974:435::-;;;;;;:::i;:::-;;:::i;21273:208::-;;;;;;:::i;:::-;;:::i;52947:342::-;;;;;;:::i;:::-;;:::i;53761:348::-;;;;;;:::i;:::-;;:::i;52565:378::-;;;;;;:::i;:::-;;:::i;54113:386::-;;;;;;:::i;:::-;;:::i;22018:104::-;;;:::i;23701:295::-;;;;;;:::i;:::-;;:::i;51610:24::-;;;:::i;51568:35::-;;;:::i;24964:328::-;;;;;;:::i;:::-;;:::i;33514:679::-;;;;;;:::i;:::-;;:::i;52413:127::-;;;;;;:::i;:::-;;:::i;51639:52::-;;;;;;:::i;:::-;;:::i;53403:354::-;;;;;;:::i;:::-;;:::i;24067:164::-;;;;;;:::i;:::-;;:::i;20904:305::-;21006:4;21043:40;;;21058:25;21043:40;;:105;;-1:-1:-1;21100:48:0;;;21115:33;21100:48;21043:105;:158;;;;21165:36;21189:11;21165:23;:36::i;:::-;21023:178;;20904:305;;;;:::o;21849:100::-;21903:13;21936:5;21929:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21849:100;:::o;23408:221::-;23484:7;23512:16;23520:7;23512;:16::i;:::-;23504:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;23597:24:0;;;;:15;:24;;;;;;;;;23408:221::o;22931:411::-;23012:13;23028:23;23043:7;23028:14;:23::i;:::-;23012:39;;23076:5;23070:11;;:2;:11;;;;23062:57;;;;;;;;;;;;:::i;:::-;23170:5;23154:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23179:37;23196:5;23203:12;:10;:12::i;23179:37::-;23132:168;;;;;;;;;;;;:::i;:::-;23313:21;23322:2;23326:7;23313:8;:21::i;:::-;22931:411;;;:::o;53293:106::-;53364:15;;:29;;;;;;;;53341:7;;53364:15;;;:27;;:29;;;;;;;;;;;;;;:15;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53357:36;;53293:106;:::o;24298:339::-;24493:41;24512:12;:10;:12::i;:::-;24526:7;24493:18;:41::i;:::-;24485:103;;;;;;;;;;;;:::i;:::-;24601:28;24611:4;24617:2;24621:7;24601:9;:28::i;24708:185::-;24846:39;24863:4;24869:2;24873:7;24846:39;;;;;;;;;;;;:16;:39::i;21543:239::-;21615:7;21651:16;;;:7;:16;;;;;;;;21686:19;21678:73;;;;;;;;;;;;:::i;51974:435::-;52107:5;;;;52093:10;:19;52085:74;;;;;;;;;;;;:::i;:::-;52187:7;52174:9;;:20;52166:68;;;;;;;;;;;;:::i;:::-;52241:22;52251:2;52255:7;52241:9;:22::i;:::-;52270:27;52278:9;52289:7;52270;:27::i;:::-;52317:1;52304:9;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;;52344:5:0;;52325:40;;52335:7;;52344:5;;52351:9;52362:2;52325:9;:40::i;:::-;52372:31;52385:7;52394:8;52372:12;:31::i;:::-;51974:435;;;;:::o;21273:208::-;21345:7;21373:19;;;21365:74;;;;;;;;;;;;:::i;:::-;-1:-1:-1;21457:16:0;;;;;;:9;:16;;;;;;;21273:208::o;52947:342::-;53055:5;;;;53041:10;:19;53033:74;;;;;;;;;;;;:::i;:::-;53132:9;;53122:7;:19;53114:82;;;;;;;;;;;;:::i;:::-;53203:15;;:37;;;;;:15;;;;;:25;;:37;;53229:2;;53233:6;;53203:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53247:26:0;;;;:17;:26;;;;;:36;;53277:6;;-1:-1:-1;53247:26:0;;;:36;;53277:6;;53247:36;:::i;:::-;;;;-1:-1:-1;;;;;52947:342:0:o;53761:348::-;53877:5;;;;53863:10;:19;53855:74;;;;;;;;;;;;:::i;:::-;53944:26;;;;:17;:26;;;;;;:36;-1:-1:-1;53944:36:0;53936:66;;;;;;;;;;;;:::i;:::-;54009:15;;;;:23;54033:7;54042:17;:6;54051:8;54042:17;:::i;:::-;54009:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;54067:26:0;;;;:17;:26;;;;;:36;;54097:6;;54067:26;:36;;54097:6;;54067:36;:::i;52565:378::-;52692:5;;;;52678:10;:19;52670:74;;;;;;;;;;;;:::i;:::-;52769:9;;52759:7;:19;52751:82;;;;;;;;;;;;:::i;:::-;52840:15;;:37;;;;;:15;;;;;:25;;:37;;52866:2;;52870:6;;52840:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52884:15:0;;;;;-1:-1:-1;52884:23:0;;-1:-1:-1;52908:9:0;52919:17;:6;52928:8;52919:17;:::i;:::-;52884:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52565:378;;;;:::o;54113:386::-;54252:5;;;;54238:10;:19;54230:74;;;;;;;;;;;;:::i;:::-;54319:26;;;;:17;:26;;;;;;:36;-1:-1:-1;54319:36:0;54311:66;;;;;;;;;;;;:::i;:::-;54384:15;;;;:28;54413:6;54421:9;54432:17;:6;54441:8;54432:17;:::i;:::-;54384:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;54457:26:0;;;;:17;:26;;;;;:36;;54487:6;;54457:26;:36;;54487:6;;54457:36;:::i;:::-;;;;-1:-1:-1;;;;;;54113:386:0:o;22018:104::-;22074:13;22107:7;22100:14;;;;;:::i;23701:295::-;23816:12;:10;:12::i;:::-;23804:24;;:8;:24;;;;23796:62;;;;;;;;;;;;:::i;:::-;23916:8;23871:18;:32;23890:12;:10;:12::i;:::-;23871:32;;;;;;;;;;;;;;;;;;-1:-1:-1;23871:32:0;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;;23955:12;:10;:12::i;:::-;23940:48;;;23979:8;23940:48;;;;;;:::i;:::-;;;;;;;;23701:295;;:::o;51610:24::-;;;;:::o;51568:35::-;;;;;;:::o;24964:328::-;25139:41;25158:12;:10;:12::i;:::-;25172:7;25139:18;:41::i;:::-;25131:103;;;;;;;;;;;;:::i;:::-;25245:39;25259:4;25265:2;25269:7;25278:5;25245:13;:39::i;33514:679::-;33587:13;33621:16;33629:7;33621;:16::i;:::-;33613:78;;;;;;;;;;;;:::i;:::-;33704:23;33730:19;;;:10;:19;;;;;33704:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33760:18;33781:10;:8;:10::i;:::-;33760:31;;33873:4;33867:18;33889:1;33867:23;33863:72;;;-1:-1:-1;33914:9:0;-1:-1:-1;33907:16:0;;33863:72;34039:23;;:27;34035:108;;34114:4;34120:9;34097:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34083:48;;;;;;34035:108;34162:23;34177:7;34162:14;:23::i;:::-;34155:30;33514:679;-1:-1:-1;;;;33514:679:0:o;52413:127::-;52503:31;52516:4;52522:2;52526:7;52503:12;:31::i;51639:52::-;;;;;;;;;;;;;:::o;53403:354::-;53522:5;;;;53508:10;:19;53500:74;;;;;;;;;;;;:::i;:::-;53589:26;;;;:17;:26;;;;;;:36;-1:-1:-1;53589:36:0;53581:66;;;;;;;;;;;;:::i;:::-;53654:15;;;;:24;53679:9;53690:17;:6;53699:8;53690:17;:::i;24067:164::-;24188:25;;;;24164:4;24188:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24067:164::o;2942:387::-;3265:20;3313:8;;;2942:387::o;12824:157::-;12933:40;;;12948:25;12933:40;12824:157;;;:::o;26802:127::-;26867:4;26891:16;;;:7;:16;;;;;;:30;:16;:30;;;26802:127::o;19305:98::-;19385:10;19305:98;:::o;30784:174::-;30859:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;30913:23;30859:24;30913:14;:23::i;:::-;30904:46;;;;;;;;;;;;30784:174;;:::o;27096:348::-;27189:4;27214:16;27222:7;27214;:16::i;:::-;27206:73;;;;;;;;;;;;:::i;:::-;27290:13;27306:23;27321:7;27306:14;:23::i;:::-;27290:39;;27359:5;27348:16;;:7;:16;;;:51;;;;27392:7;27368:31;;:20;27380:7;27368:11;:20::i;:::-;:31;;;27348:51;:87;;;;27403:32;27420:5;27427:7;27403:16;:32::i;30088:578::-;30247:4;30220:31;;:23;30235:7;30220:14;:23::i;:::-;:31;;;30212:85;;;;;;;;;;;;:::i;:::-;30316:16;;;30308:65;;;;;;;;;;;;:::i;:::-;30386:39;30407:4;30413:2;30417:7;30386:20;:39::i;:::-;30490:29;30507:1;30511:7;30490:8;:29::i;:::-;30532:15;;;;;;;:9;:15;;;;;:20;;30551:1;;30532:15;:20;;30551:1;;30532:20;:::i;:::-;;;;-1:-1:-1;;30563:13:0;;;;;;;:9;:13;;;;;:18;;30580:1;;30563:13;:18;;30580:1;;30563:18;:::i;:::-;;;;-1:-1:-1;;30592:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;30631:27;;30592:16;;30631:27;;;;;;;30088:578;;;:::o;27786:110::-;27862:26;27872:2;27876:7;27862:26;;;;;;;;;;;;:9;:26::i;:::-;27786:110;;:::o;34349:217::-;34449:16;34457:7;34449;:16::i;:::-;34441:75;;;;;;;;;;;;:::i;:::-;34527:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;26174:315::-;26331:28;26341:4;26347:2;26351:7;26331:9;:28::i;:::-;26378:48;26401:4;26407:2;26411:7;26420:5;26378:22;:48::i;:::-;26370:111;;;;;;;;;;;;:::i;22775:94::-;22852:9;;;;;;;;;-1:-1:-1;22852:9:0;;22775:94;:::o;22193:334::-;22266:13;22300:16;22308:7;22300;:16::i;:::-;22292:76;;;;;;;;;;;;:::i;:::-;22381:21;22405:10;:8;:10::i;:::-;22381:34;;22457:1;22439:7;22433:21;:25;:86;;;;;;;;;;;;;;;;;22485:7;22494:18;:7;:16;:18::i;:::-;22468:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22433:86;22426:93;22193:334;-1:-1:-1;;;22193:334:0:o;28123:321::-;28253:18;28259:2;28263:7;28253:5;:18::i;:::-;28304:54;28335:1;28339:2;28343:7;28352:5;28304:22;:54::i;:::-;28282:154;;;;;;;;;;;;:::i;31523:803::-;31678:4;31699:15;:2;:13;;;:15::i;:::-;31695:624;;;31751:2;31735:36;;;31772:12;:10;:12::i;:::-;31786:4;31792:7;31801:5;31735:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31735:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31731:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31981:13:0;;31977:272;;32024:60;;;;;;;;;;:::i;31977:272::-;32199:6;32193:13;32184:6;32180:2;32176:15;32169:38;31731:533;31858:55;;31868:45;31858:55;;-1:-1:-1;31851:62:0;;31695:624;-1:-1:-1;32303:4:0;31523:803;;;;;;:::o;364:723::-;420:13;641:10;637:53;;-1:-1:-1;668:10:0;;;;;;;;;;;;;;;;;;;637:53;715:5;700:12;756:78;763:9;;756:78;;789:8;;;;:::i;:::-;;-1:-1:-1;812:10:0;;-1:-1:-1;820:2:0;812:10;;:::i;:::-;;;756:78;;;844:19;876:6;866:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;866:17:0;;844:39;;894:154;901:10;;894:154;;928:11;938:1;928:11;;:::i;:::-;;-1:-1:-1;997:10:0;1005:2;997:5;:10;:::i;:::-;984:24;;:2;:24;:::i;:::-;971:39;;954:6;961;954:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;1025:11:0;1034:2;1025:11;;:::i;:::-;;;894:154;;28780:382;28860:16;;;28852:61;;;;;;;;;;;;:::i;:::-;28933:16;28941:7;28933;:16::i;:::-;28932:17;28924:58;;;;;;;;;;;;:::i;:::-;28995:45;29024:1;29028:2;29032:7;28995:20;:45::i;:::-;29053:13;;;;;;;:9;:13;;;;;:18;;29070:1;;29053:13;:18;;29070:1;;29053:18;:::i;:::-;;;;-1:-1:-1;;29082:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;29121:33;;29082:16;;;29121:33;;29082:16;;29121:33;28780:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:666:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;345:4;275:66;268:4;260:6;256:17;252:90;244:6;240:103;236:114;400:6;388:10;385:22;380:2;368:10;365:18;362:46;359:2;;;411:18;;:::i;:::-;447:2;440:22;495;;;480:6;-1:-1:-1;480:6:1;532:16;;;529:25;-1:-1:-1;526:2:1;;;567:1;564;557:12;526:2;617:6;612:3;605:4;597:6;593:17;580:44;672:1;665:4;656:6;648;644:19;640:30;633:41;;;90:590;;;;;:::o;685:198::-;755:20;;815:42;804:54;;794:65;;784:2;;873:1;870;863:12;888:198;;1000:2;988:9;979:7;975:23;971:32;968:2;;;1021:6;1013;1006:22;968:2;1049:31;1070:9;1049:31;:::i;1091:274::-;;;1220:2;1208:9;1199:7;1195:23;1191:32;1188:2;;;1241:6;1233;1226:22;1188:2;1269:31;1290:9;1269:31;:::i;:::-;1259:41;;1319:40;1355:2;1344:9;1340:18;1319:40;:::i;:::-;1309:50;;1178:187;;;;;:::o;1370:342::-;;;;1516:2;1504:9;1495:7;1491:23;1487:32;1484:2;;;1537:6;1529;1522:22;1484:2;1565:31;1586:9;1565:31;:::i;:::-;1555:41;;1615:40;1651:2;1640:9;1636:18;1615:40;:::i;:::-;1605:50;;1702:2;1691:9;1687:18;1674:32;1664:42;;1474:238;;;;;:::o;1717:702::-;;;;;1889:3;1877:9;1868:7;1864:23;1860:33;1857:2;;;1911:6;1903;1896:22;1857:2;1939:31;1960:9;1939:31;:::i;:::-;1929:41;;1989:40;2025:2;2014:9;2010:18;1989:40;:::i;:::-;1979:50;;2076:2;2065:9;2061:18;2048:32;2038:42;;2131:2;2120:9;2116:18;2103:32;2158:18;2150:6;2147:30;2144:2;;;2195:6;2187;2180:22;2144:2;2223:22;;2276:4;2268:13;;2264:27;-1:-1:-1;2254:2:1;;2310:6;2302;2295:22;2254:2;2338:75;2405:7;2400:2;2387:16;2382:2;2378;2374:11;2338:75;:::i;:::-;2328:85;;;1847:572;;;;;;;:::o;2424:329::-;;;2550:2;2538:9;2529:7;2525:23;2521:32;2518:2;;;2571:6;2563;2556:22;2518:2;2599:31;2620:9;2599:31;:::i;:::-;2589:41;;2680:2;2669:9;2665:18;2652:32;2693:30;2717:5;2693:30;:::i;:::-;2742:5;2732:15;;;2508:245;;;;;:::o;2758:266::-;;;2887:2;2875:9;2866:7;2862:23;2858:32;2855:2;;;2908:6;2900;2893:22;2855:2;2936:31;2957:9;2936:31;:::i;:::-;2926:41;3014:2;2999:18;;;;2986:32;;-1:-1:-1;;;2845:179:1:o;3029:703::-;;;;;3202:3;3190:9;3181:7;3177:23;3173:33;3170:2;;;3224:6;3216;3209:22;3170:2;3252:31;3273:9;3252:31;:::i;:::-;3242:41;;3330:2;3319:9;3315:18;3302:32;3292:42;;3385:2;3374:9;3370:18;3357:32;3412:18;3404:6;3401:30;3398:2;;;3449:6;3441;3434:22;3398:2;3477:22;;3530:4;3522:13;;3518:27;-1:-1:-1;3508:2:1;;3564:6;3556;3549:22;3508:2;3592:75;3659:7;3654:2;3641:16;3636:2;3632;3628:11;3592:75;:::i;:::-;3582:85;;;3686:40;3722:2;3711:9;3707:18;3686:40;:::i;:::-;3676:50;;3160:572;;;;;;;:::o;3737:257::-;;3857:2;3845:9;3836:7;3832:23;3828:32;3825:2;;;3878:6;3870;3863:22;3825:2;3915:9;3909:16;3934:30;3958:5;3934:30;:::i;3999:257::-;;4110:2;4098:9;4089:7;4085:23;4081:32;4078:2;;;4131:6;4123;4116:22;4078:2;4175:9;4162:23;4194:32;4220:5;4194:32;:::i;4261:261::-;;4383:2;4371:9;4362:7;4358:23;4354:32;4351:2;;;4404:6;4396;4389:22;4351:2;4441:9;4435:16;4460:32;4486:5;4460:32;:::i;4527:190::-;;4639:2;4627:9;4618:7;4614:23;4610:32;4607:2;;;4660:6;4652;4645:22;4607:2;-1:-1:-1;4688:23:1;;4597:120;-1:-1:-1;4597:120:1:o;4722:194::-;;4845:2;4833:9;4824:7;4820:23;4816:32;4813:2;;;4866:6;4858;4851:22;4813:2;-1:-1:-1;4894:16:1;;4803:113;-1:-1:-1;4803:113:1:o;4921:411::-;;;;;5084:3;5072:9;5063:7;5059:23;5055:33;5052:2;;;5106:6;5098;5091:22;5052:2;5147:9;5134:23;5124:33;;5176:40;5212:2;5201:9;5197:18;5176:40;:::i;:::-;5166:50;;5235:40;5271:2;5260:9;5256:18;5235:40;:::i;:::-;5042:290;;;;-1:-1:-1;5225:50:1;;5322:2;5307:18;5294:32;;-1:-1:-1;;5042:290:1:o;5337:334::-;;;;5483:2;5471:9;5462:7;5458:23;5454:32;5451:2;;;5504:6;5496;5489:22;5451:2;5545:9;5532:23;5522:33;;5574:40;5610:2;5599:9;5595:18;5574:40;:::i;5676:318::-;;5757:5;5751:12;5784:6;5779:3;5772:19;5800:63;5856:6;5849:4;5844:3;5840:14;5833:4;5826:5;5822:16;5800:63;:::i;:::-;5908:2;5896:15;5913:66;5892:88;5883:98;;;;5983:4;5879:109;;5727:267;-1:-1:-1;;5727:267:1:o;5999:470::-;;6216:6;6210:13;6232:53;6278:6;6273:3;6266:4;6258:6;6254:17;6232:53;:::i;:::-;6348:13;;6307:16;;;;6370:57;6348:13;6307:16;6404:4;6392:17;;6370:57;:::i;:::-;6443:20;;6186:283;-1:-1:-1;;;;6186:283:1:o;6474:226::-;6650:42;6638:55;;;;6620:74;;6608:2;6593:18;;6575:125::o;6705:398::-;6917:42;6986:15;;;6968:34;;7038:15;;;;7033:2;7018:18;;7011:43;7085:2;7070:18;;7063:34;;;;6895:2;6880:18;;6862:241::o;7108:513::-;;7331:42;7412:2;7404:6;7400:15;7389:9;7382:34;7464:2;7456:6;7452:15;7447:2;7436:9;7432:18;7425:43;;7504:6;7499:2;7488:9;7484:18;7477:34;7547:3;7542:2;7531:9;7527:18;7520:31;7568:47;7610:3;7599:9;7595:19;7587:6;7568:47;:::i;:::-;7560:55;7311:310;-1:-1:-1;;;;;;7311:310:1:o;7626:297::-;7830:42;7818:55;;;;7800:74;;7905:2;7890:18;;7883:34;7788:2;7773:18;;7755:168::o;7928:187::-;8093:14;;8086:22;8068:41;;8056:2;8041:18;;8023:92::o;8372:221::-;;8521:2;8510:9;8503:21;8541:46;8583:2;8572:9;8568:18;8560:6;8541:46;:::i;8598:406::-;8800:2;8782:21;;;8839:2;8819:18;;;8812:30;8878:34;8873:2;8858:18;;8851:62;8949:12;8944:2;8929:18;;8922:40;8994:3;8979:19;;8772:232::o;9009:414::-;9211:2;9193:21;;;9250:2;9230:18;;;9223:30;9289:34;9284:2;9269:18;;9262:62;9360:20;9355:2;9340:18;;9333:48;9413:3;9398:19;;9183:240::o;9428:352::-;9630:2;9612:21;;;9669:2;9649:18;;;9642:30;9708;9703:2;9688:18;;9681:58;9771:2;9756:18;;9602:178::o;9785:400::-;9987:2;9969:21;;;10026:2;10006:18;;;9999:30;10065:34;10060:2;10045:18;;10038:62;10136:6;10131:2;10116:18;;10109:34;10175:3;10160:19;;9959:226::o;10190:349::-;10392:2;10374:21;;;10431:2;10411:18;;;10404:30;10470:27;10465:2;10450:18;;10443:55;10530:2;10515:18;;10364:175::o;10544:414::-;10746:2;10728:21;;;10785:2;10765:18;;;10758:30;10824:34;10819:2;10804:18;;10797:62;10895:20;10890:2;10875:18;;10868:48;10948:3;10933:19;;10718:240::o;10963:408::-;11165:2;11147:21;;;11204:2;11184:18;;;11177:30;11243:34;11238:2;11223:18;;11216:62;11314:14;11309:2;11294:18;;11287:42;11361:3;11346:19;;11137:234::o;11376:341::-;11578:2;11560:21;;;11617:2;11597:18;;;11590:30;11656:19;11651:2;11636:18;;11629:47;11708:2;11693:18;;11550:167::o;11722:420::-;11924:2;11906:21;;;11963:2;11943:18;;;11936:30;12002:34;11997:2;11982:18;;11975:62;12073:26;12068:2;12053:18;;12046:54;12132:3;12117:19;;11896:246::o;12147:406::-;12349:2;12331:21;;;12388:2;12368:18;;;12361:30;12427:34;12422:2;12407:18;;12400:62;12498:12;12493:2;12478:18;;12471:40;12543:3;12528:19;;12321:232::o;12558:405::-;12760:2;12742:21;;;12799:2;12779:18;;;12772:30;12838:34;12833:2;12818:18;;12811:62;12909:11;12904:2;12889:18;;12882:39;12953:3;12938:19;;12732:231::o;12968:410::-;13170:2;13152:21;;;13209:2;13189:18;;;13182:30;13248:34;13243:2;13228:18;;13221:62;13319:16;13314:2;13299:18;;13292:44;13368:3;13353:19;;13142:236::o;13383:356::-;13585:2;13567:21;;;13604:18;;;13597:30;13663:34;13658:2;13643:18;;13636:62;13730:2;13715:18;;13557:182::o;13744:413::-;13946:2;13928:21;;;13985:2;13965:18;;;13958:30;14024:34;14019:2;14004:18;;13997:62;14095:19;14090:2;14075:18;;14068:47;14147:3;14132:19;;13918:239::o;14162:399::-;14364:2;14346:21;;;14403:2;14383:18;;;14376:30;14442:34;14437:2;14422:18;;14415:62;14513:5;14508:2;14493:18;;14486:33;14551:3;14536:19;;14336:225::o;14566:408::-;14768:2;14750:21;;;14807:2;14787:18;;;14780:30;14846:34;14841:2;14826:18;;14819:62;14917:14;14912:2;14897:18;;14890:42;14964:3;14949:19;;14740:234::o;14979:405::-;15181:2;15163:21;;;15220:2;15200:18;;;15193:30;15259:34;15254:2;15239:18;;15232:62;15330:11;15325:2;15310:18;;15303:39;15374:3;15359:19;;15153:231::o;15389:411::-;15591:2;15573:21;;;15630:2;15610:18;;;15603:30;15669:34;15664:2;15649:18;;15642:62;15740:17;15735:2;15720:18;;15713:45;15790:3;15775:19;;15563:237::o;15805:397::-;16007:2;15989:21;;;16046:2;16026:18;;;16019:30;16085:34;16080:2;16065:18;;16058:62;16156:3;16151:2;16136:18;;16129:31;16192:3;16177:19;;15979:223::o;16207:413::-;16409:2;16391:21;;;16448:2;16428:18;;;16421:30;16487:34;16482:2;16467:18;;16460:62;16558:19;16553:2;16538:18;;16531:47;16610:3;16595:19;;16381:239::o;16625:177::-;16771:25;;;16759:2;16744:18;;16726:76::o;16807:128::-;;16878:1;16874:6;16871:1;16868:13;16865:2;;;16884:18;;:::i;:::-;-1:-1:-1;16920:9:1;;16855:80::o;16940:120::-;;17006:1;16996:2;;17011:18;;:::i;:::-;-1:-1:-1;17045:9:1;;16986:74::o;17065:228::-;;17231:1;17163:66;17159:74;17156:1;17153:81;17148:1;17141:9;17134:17;17130:105;17127:2;;;17238:18;;:::i;:::-;-1:-1:-1;17278:9:1;;17117:176::o;17298:125::-;;17366:1;17363;17360:8;17357:2;;;17371:18;;:::i;:::-;-1:-1:-1;17408:9:1;;17347:76::o;17428:258::-;17500:1;17510:113;17524:6;17521:1;17518:13;17510:113;;;17600:11;;;17594:18;17581:11;;;17574:39;17546:2;17539:10;17510:113;;;17641:6;17638:1;17635:13;17632:2;;;-1:-1:-1;;17676:1:1;17658:16;;17651:27;17481:205::o;17691:437::-;17776:1;17766:12;;17823:1;17813:12;;;17834:2;;17888:4;17880:6;17876:17;17866:27;;17834:2;17941;17933:6;17930:14;17910:18;17907:38;17904:2;;;17978:77;17975:1;17968:88;18079:4;18076:1;18069:15;18107:4;18104:1;18097:15;17904:2;;17746:382;;;:::o;18133:195::-;;18203:66;18196:5;18193:77;18190:2;;;18273:18;;:::i;:::-;-1:-1:-1;18320:1:1;18309:13;;18180:148::o;18333:112::-;;18391:1;18381:2;;18396:18;;:::i;:::-;-1:-1:-1;18430:9:1;;18371:74::o;18450:184::-;18502:77;18499:1;18492:88;18599:4;18596:1;18589:15;18623:4;18620:1;18613:15;18639:184;18691:77;18688:1;18681:88;18788:4;18785:1;18778:15;18812:4;18809:1;18802:15;18828:184;18880:77;18877:1;18870:88;18977:4;18974:1;18967:15;19001:4;18998:1;18991:15;19017:120;19105:5;19098:13;19091:21;19084:5;19081:32;19071:2;;19127:1;19124;19117:12;19071:2;19061:76;:::o;19142:179::-;19229:66;19222:5;19218:78;19211:5;19208:89;19198:2;;19311:1;19308;19301:12
Swarm Source
ipfs://c0e98e65c873842f242546418b29b9b54e4641c9756e3c8601bebf6caba65eeb
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.