Contract Address Details

0x24AACCD73aE036dB1bb9CD279D41BD2675dec737

Contract Name
MintNFT
Creator
0xe01c8d–e085f7 at 0x9b785e–57e5ac
Balance
0 CSB
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
91929270
Contract name:
MintNFT




Optimization enabled
true
Compiler version
v0.8.16+commit.07a7930e




Optimization runs
200
Verified at
2023-03-15T09:30:34.449100Z

contracts/MintNFT.sol

// SPDX-License-Identifier: MIT
// slither-disable-start naming-convention
pragma solidity 0.8.16;
import {NFTBase} from "./base/NFTBase.sol";
import {IMintNFT} from "./interfaces/IMintNFT.sol";
import {IWeb3Entry} from "./interfaces/IWeb3Entry.sol";
import {ErrCallerNotWeb3Entry, ErrNotCharacterOwner} from "./libraries/Error.sol";
import {Events} from "./libraries/Events.sol";
import {ERC721Enumerable} from "./base/ERC721Enumerable.sol";
import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol";
import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";
import {ERC2981} from "@openzeppelin/contracts/token/common/ERC2981.sol";
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import {IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import {
IERC721Enumerable
} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
contract MintNFT is NFTBase, IMintNFT, ERC2981, Initializable {
uint256 internal _characterId;
uint256 internal _noteId;
address internal _web3Entry;
uint256 internal _tokenCounter;
mapping(uint256 => address) internal _originalReceiver;
modifier onlyWeb3Entry() {
if (msg.sender != _web3Entry) revert ErrCallerNotWeb3Entry();
_;
}
modifier onlyOwner() {
if (msg.sender != IERC721(_web3Entry).ownerOf(_characterId)) revert ErrNotCharacterOwner();
_;
}
/// @inheritdoc IMintNFT
function initialize(
uint256 characterId_,
uint256 noteId_,
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @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);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IMintNFT.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
interface IMintNFT {
/**
* @notice Initialize the mint nft.
* @param characterId_ The character ID of the note to initialize.
* @param noteId_ The note ID to initialize.
* @param web3Entry_ The address of web3Entry contract.
* @param name_ The name to set for this NFT.
* @param symbol_ The symbol to set for this NFT.
*/
function initialize(
uint256 characterId_,
uint256 noteId_,
address web3Entry_,
string calldata name_,
string calldata symbol_
) external;
/**
* @notice Mints a note NFT to the specified address.
* This can only be called by web3Entry, and is called upon note.
* @param to The address to mint the NFT to.
* @return uint256 The minted token ID.
*/
function mint(address to) external returns (uint256);
/**
* @notice Changes the royalty percentage of specific token ID for secondary sales.
* Can only be called by character owner of note.
* @param tokenId The token ID to set.
* @param recipient The receive address.
* @param fraction The royalty percentage measured in basis points. Each basis point represents 0.01%.
*/
function setTokenRoyalty(uint256 tokenId, address recipient, uint96 fraction) external;
/**
* @notice Changes the default royalty percentage for secondary sales.
* Can only be called by character owner of note.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/interfaces/IWeb3Entry.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import {DataTypes} from "../libraries/DataTypes.sol";
interface IWeb3Entry {
function initialize(
string calldata name_,
string calldata symbol_,
address linklist_,
address mintNFTImpl_,
address periphery_,
address newbieVilla_
) external;
/**
* This method creates a character with the given parameters to the given address.
*
* @param vars The CreateCharacterData struct containing the following parameters:
* `to`: The address receiving the character.<br>
* `handle`: The handle to set for the character.<br>
* `uri`: The URI to set for the character metadata.<br>
* `linkModule`: The link module to use, can be the zero address.<br>
* `linkModuleInitData`: The link module initialization data, if any.<br>
*/
function createCharacter(
DataTypes.CreateCharacterData calldata vars
) external returns (uint256 characterId);
/**
* @notice Sets new handle for a given character.
* @dev Owner permission only.
* @param characterId The character id to set new handle for.
* @param newHandle New handle to set.
*/
function setHandle(uint256 characterId, string calldata newHandle) external;
/**
* @notice Sets a social token for a given character.
* @dev Owner permission only.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/interfaces/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)
pragma solidity ^0.8.0;
import "../utils/introspection/IERC165.sol";
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/interfaces/IERC2981.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.0;
import "../utils/introspection/IERC165.sol";
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/proxy/utils/Initializable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/Address.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/IERC721.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/common/ERC2981.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)
pragma solidity ^0.8.0;
import "../../interfaces/IERC2981.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
*
* Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
* specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
*
* Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
* fee is specified in basis points by default.
*
* IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
* https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
* voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
*
* _Available since v4.5._
*/
abstract contract ERC2981 is IERC2981, ERC165 {
struct RoyaltyInfo {
address receiver;
uint96 royaltyFraction;
}
RoyaltyInfo private _defaultRoyaltyInfo;
mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @inheritdoc IERC2981
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Strings.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/ERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @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;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/math/Math.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/structs/EnumerableSet.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/base/ERC721.sol

// SPDX-License-Identifier: MIT
// solhint-disable ordering
pragma solidity 0.8.16;
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import {IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import {Context} from "@openzeppelin/contracts/utils/Context.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";
/**
* @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;
// slither-disable-start naming-convention
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/base/ERC721Enumerable.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import {
IERC721Enumerable
} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import {ERC721} from "./ERC721.sol";
import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(
bytes4 interfaceId
) public view virtual override(IERC165, ERC721) returns (bool) {
return
interfaceId == type(IERC721Enumerable).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(
address owner,
uint256 index
) public view virtual override returns (uint256) {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/base/NFTBase.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
import {ERC721} from "./ERC721.sol";
import {ERC721Enumerable} from "./ERC721Enumerable.sol";
import {Events} from "../libraries/Events.sol";
abstract contract NFTBase is ERC721Enumerable {
function _initialize(string calldata name, string calldata symbol) internal {
ERC721.__ERC721_Init(name, symbol);
emit Events.BaseInitialized(name, symbol, block.timestamp);
}
// solhint-disable ordering
function burn(uint256 tokenId) public virtual {
require(_isApprovedOrOwner(msg.sender, tokenId), "NFTBase: NotOwnerOrApproved");
_burn(tokenId);
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/libraries/DataTypes.sol

// SPDX-License-Identifier: MIT
// solhint-disable contract-name-camelcase
pragma solidity 0.8.16;
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
/**
* @title DataTypes
* @notice A standard library of data types.
*/
library DataTypes {
struct MigrateData {
address account;
string handle;
string uri;
address[] toAddresses;
bytes32 linkType;
}
struct CreateCharacterData {
address to;
string handle;
string uri;
address linkModule;
bytes linkModuleInitData;
}
struct createThenLinkCharacterData {
uint256 fromCharacterId;
address to;
bytes32 linkType;
}
struct linkNoteData {
uint256 fromCharacterId;
uint256 toCharacterId;
uint256 toNoteId;
bytes32 linkType;
bytes data;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/libraries/Error.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
/// @dev Character ID not exists
error ErrCharacterNotExists(uint256 characterId);
/// @dev Not owner of address
error ErrNotAddressOwner();
/// @dev Caller is not the owner of character
error ErrNotCharacterOwner();
/// @dev Note has been locked
error ErrNoteLocked();
/// @dev Handle does not exist
error ErrHandleExists();
/// @dev Social token address does not exist
error ErrSocialTokenExists();
/// @dev Handle length too long or too short
error ErrHandleLengthInvalid();
/// @dev Handle contains invalid characters
error ErrHandleContainsInvalidCharacters();
/// @dev Operator has not enough permission for this character
error ErrNotEnoughPermission();
/// @dev Operator has not enough permissions for this note
error ErrNotEnoughPermissionForThisNote();
/// @dev Target address already has primary character
error ErrTargetAlreadyHasPrimaryCharacter();
/// @dev Note has been deleted
error ErrNoteIsDeleted();
/// @dev Note does not exist
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/libraries/Events.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
library Events {
event BaseInitialized(string name, string symbol, uint256 timestamp);
event Web3EntryInitialized(uint256 timestamp);
event LinklistNFTInitialized(uint256 timestamp);
event MintNFTInitialized(uint256 characterId, uint256 noteId, uint256 timestamp);
event CharacterCreated(
uint256 indexed characterId,
address indexed creator,
address indexed to,
string handle,
uint256 timestamp
);
event SetPrimaryCharacterId(
address indexed account,
uint256 indexed characterId,
uint256 indexed oldCharacterId
);
event SetHandle(address indexed account, uint256 indexed characterId, string newHandle);
event SetSocialToken(
address indexed account,
uint256 indexed characterId,
address indexed tokenAddress
);
event GrantOperatorPermissions(
uint256 indexed characterId,
address indexed operator,
uint256 permissionBitMap
);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"error","name":"ErrCallerNotWeb3Entry","inputs":[]},{"type":"error","name":"ErrNotCharacterOwner","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"approved","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteDefaultRoyalty","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getApproved","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}],"name":"getSourceNotePointer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"uint256","name":"characterId_","internalType":"uint256"},{"type":"uint256","name":"noteId_","internalType":"uint256"},{"type":"address","name":"web3Entry_","internalType":"address"},{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}],"name":"mint","inputs":[{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"originalReceiver","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"royaltyInfo","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256"},{"type":"uint256","name":"_salePrice","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDefaultRoyalty","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint96","name":"fraction","internalType":"uint96"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTokenRoyalty","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint96","name":"fraction","internalType":"uint96"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenByIndex","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenOfOwnerByIndex","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"uri","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50612474806100206000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806342966c68116100de57806395d89b4111610097578063b88d4fde11610071578063b88d4fde14610356578063c87b56dd14610369578063d2fe708e1461037c578063e985e9c51461039757600080fd5b806395d89b4114610333578063a22cb4651461033b578063aa1b103f1461034e57600080fd5b806342966c68146102c15780634f6ccce7146102d45780635944c753146102e75780636352211e146102fa5780636a6278421461030d57806370a082311461032057600080fd5b80631a380beb116101305780631a380beb1461021a57806323b872dd146102435780632a55205a146102565780632f745c59146102885780632fd6b8861461029b57806342842e0e146102ae57600080fd5b806301ffc9a71461017857806304634d8d146101a057806306fdde03146101b5578063081812fc146101ca578063095ea7b3146101f557806318160ddd14610208575b600080fd5b61018b610186366004611ad4565b6103d3565b60405190151581526020015b60405180910390f35b6101b36101ae366004611b24565b610419565b005b6101bd6104ce565b6040516101979190611ba9565b6101dd6101d8366004611bbc565b610560565b6040516001600160a01b039091168152602001610197565b6101b3610203366004611bd5565b6105fa565b6010545b604051908152602001610197565b6101dd610228366004611bbc565b6000908152601160205260409020546001600160a01b031690565b6101b3610251366004611c01565b61070f565b610269610264366004611c42565b610740565b604080516001600160a01b039093168352602083019190915201610197565b61020c610296366004611bd5565b6107ee565b6101b36102a9366004611ca6565b610884565b6101b36102bc366004611c01565b610a05565b6101b36102cf366004611bbc565b610a20565b61020c6102e2366004611bbc565b610a82565b6101b36102f5366004611d3c565b610b15565b6101dd610308366004611bbc565b610bc7565b61020c61031b366004611d7a565b610c3e565b61020c61032e366004611d7a565b610cae565b6101bd610d35565b6101b3610349366004611da5565b610d44565b6101b3610d4f565b6101b3610364366004611e77565b610e02565b6101bd610377366004611bbc565b610e3a565b600d54600e5460408051928352602083019190915201610197565b61018b6103a5366004611f26565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60006001600160e01b0319821663780e9d6360e01b148061040457506001600160e01b0319821663152a902d60e11b145b80610413575061041382610ee1565b92915050565b600f54600d546040516331a9108f60e11b81526001600160a01b0390921691636352211e9161044e9160040190815260200190565b602060405180830381865afa15801561046b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048f9190611f5f565b6001600160a01b0316336001600160a01b0316146104c057604051631b0c476f60e11b815260040160405180910390fd5b6104ca8282610f06565b5050565b6060600080546104dd90611f7c565b80601f016020809104026020016040519081016040528092919081815260200182805461050990611f7c565b80156105565780601f1061052b57610100808354040283529160200191610556565b820191906000526020600020905b81548152906001019060200180831161053957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105de5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061060582610bc7565b9050806001600160a01b0316836001600160a01b0316036106725760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105d5565b336001600160a01b038216148061068e575061068e81336103a5565b6107005760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105d5565b61070a8383610fc0565b505050565b610719338261102e565b6107355760405162461bcd60e51b81526004016105d590611fb6565b61070a838383611125565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916107b5575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906107d4906001600160601b03168761201d565b6107de919061203c565b91519350909150505b9250929050565b60006107f983610cae565b821061085b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105d5565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600c54610100900460ff16158080156108a45750600c54600160ff909116105b806108be5750303b1580156108be5750600c5460ff166001145b6109215760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016105d5565b600c805460ff19166001179055801561094457600c805461ff0019166101001790555b610950858585856112cc565b600d889055600e879055600f80546001600160a01b0319166001600160a01b0388161790556040805189815260208101899052428183015290517f6f606e3871b6f24ddc0daa88a8ed8e8761eb9d1474e64322940f858df287de50916060908290030190a180156109fb57600c805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61070a83838360405180602001604052806000815250610e02565b610a2a338261102e565b610a765760405162461bcd60e51b815260206004820152601b60248201527f4e4654426173653a204e6f744f776e65724f72417070726f766564000000000060448201526064016105d5565b610a7f8161131d565b50565b6000610a8d60085490565b8210610af05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105d5565b60088281548110610b0357610b0361205e565b90600052602060002001549050919050565b600f54600d546040516331a9108f60e11b81526001600160a01b0390921691636352211e91610b4a9160040190815260200190565b602060405180830381865afa158015610b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8b9190611f5f565b6001600160a01b0316336001600160a01b031614610bbc57604051631b0c476f60e11b815260040160405180910390fd5b61070a8383836113c4565b6000818152600260205260408120546001600160a01b0316806104135760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105d5565b600f546000906001600160a01b03163314610c6c576040516302b6341b60e41b815260040160405180910390fd5b506010805460010190819055600081815260116020526040902080546001600160a01b0319166001600160a01b038416179055610ca9828261148f565b919050565b60006001600160a01b038216610d195760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105d5565b506001600160a01b031660009081526003602052604090205490565b6060600180546104dd90611f7c565b6104ca3383836115dd565b600f54600d546040516331a9108f60e11b81526001600160a01b0390921691636352211e91610d849160040190815260200190565b602060405180830381865afa158015610da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc59190611f5f565b6001600160a01b0316336001600160a01b031614610df657604051631b0c476f60e11b815260040160405180910390fd5b610e006000600a55565b565b610e0c338361102e565b610e285760405162461bcd60e51b81526004016105d590611fb6565b610e34848484846116ab565b50505050565b6000818152600260205260409020546060906001600160a01b031615610ca957600f54600d54600e546040516301b6923d60e71b8152600481019290925260248201526001600160a01b039091169063db491e8090604401600060405180830381865afa158015610eaf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed791908101906120c4565b6040015192915050565b60006001600160e01b0319821663152a902d60e11b14806104135750610413826116de565b6127106001600160601b0382161115610f315760405162461bcd60e51b81526004016105d59061219b565b6001600160a01b038216610f875760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016105d5565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ff582610bc7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166110a75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105d5565b60006110b283610bc7565b9050806001600160a01b0316846001600160a01b031614806110ed5750836001600160a01b03166110e284610560565b6001600160a01b0316145b8061111d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661113882610bc7565b6001600160a01b03161461119c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105d5565b6001600160a01b0382166111fe5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105d5565b611209838383611703565b611214600082610fc0565b6001600160a01b038316600090815260036020526040812080546001929061123d9084906121e5565b90915550506001600160a01b038216600090815260036020526040812080546001929061126b9084906121f8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6112d8848484846117bb565b7f414cd0b34676984f09a5f76ce9718d4062e50283abe0e7e274a9a5b4e0c99c30848484844260405161130f959493929190612234565b60405180910390a150505050565b600061132882610bc7565b905061133681600084611703565b611341600083610fc0565b6001600160a01b038116600090815260036020526040812080546001929061136a9084906121e5565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6127106001600160601b03821611156113ef5760405162461bcd60e51b81526004016105d59061219b565b6001600160a01b0382166114455760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d6574657273000000000060448201526064016105d5565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600b90529190942093519051909116600160a01b029116179055565b6001600160a01b0382166114e55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105d5565b6000818152600260205260409020546001600160a01b03161561154a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105d5565b61155660008383611703565b6001600160a01b038216600090815260036020526040812080546001929061157f9084906121f8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b03160361163e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105d5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6116b6848484611125565b6116c2848484846117dd565b610e345760405162461bcd60e51b81526004016105d59061226e565b60006001600160e01b0319821663780e9d6360e01b14806104135750610413826118de565b6001600160a01b03831661175e5761175981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611781565b816001600160a01b0316836001600160a01b03161461178157611781838261192e565b6001600160a01b0382166117985761070a816119cb565b826001600160a01b0316826001600160a01b03161461070a5761070a8282611a7a565b60006117c884868361230e565b5060016117d682848361230e565b5050505050565b60006001600160a01b0384163b156118d357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118219033908990889088906004016123ce565b6020604051808303816000875af192505050801561185c575060408051601f3d908101601f191682019092526118599181019061240b565b60015b6118b9573d80801561188a576040519150601f19603f3d011682016040523d82523d6000602084013e61188f565b606091505b5080516000036118b15760405162461bcd60e51b81526004016105d59061226e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061111d565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b148061190f57506001600160e01b03198216635b5e139f60e01b145b8061041357506301ffc9a760e01b6001600160e01b0319831614610413565b6000600161193b84610cae565b61194591906121e5565b600083815260076020526040902054909150808214611998576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906119dd906001906121e5565b60008381526009602052604081205460088054939450909284908110611a0557611a0561205e565b906000526020600020015490508060088381548110611a2657611a2661205e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611a5e57611a5e612428565b6001900381819060005260206000200160009055905550505050565b6000611a8583610cae565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610a7f57600080fd5b600060208284031215611ae657600080fd5b8135611af181611abe565b9392505050565b6001600160a01b0381168114610a7f57600080fd5b80356001600160601b0381168114610ca957600080fd5b60008060408385031215611b3757600080fd5b8235611b4281611af8565b9150611b5060208401611b0d565b90509250929050565b60005b83811015611b74578181015183820152602001611b5c565b50506000910152565b60008151808452611b95816020860160208601611b59565b601f01601f19169290920160200192915050565b602081526000611af16020830184611b7d565b600060208284031215611bce57600080fd5b5035919050565b60008060408385031215611be857600080fd5b8235611bf381611af8565b946020939093013593505050565b600080600060608486031215611c1657600080fd5b8335611c2181611af8565b92506020840135611c3181611af8565b929592945050506040919091013590565b60008060408385031215611c5557600080fd5b50508035926020909101359150565b60008083601f840112611c7657600080fd5b50813567ffffffffffffffff811115611c8e57600080fd5b6020830191508360208285010111156107e757600080fd5b600080600080600080600060a0888a031215611cc157600080fd5b87359650602088013595506040880135611cda81611af8565b9450606088013567ffffffffffffffff80821115611cf757600080fd5b611d038b838c01611c64565b909650945060808a0135915080821115611d1c57600080fd5b50611d298a828b01611c64565b989b979a50959850939692959293505050565b600080600060608486031215611d5157600080fd5b833592506020840135611d6381611af8565b9150611d7160408501611b0d565b90509250925092565b600060208284031215611d8c57600080fd5b8135611af181611af8565b8015158114610a7f57600080fd5b60008060408385031215611db857600080fd5b8235611dc381611af8565b91506020830135611dd381611d97565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715611e1857611e18611dde565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611e4757611e47611dde565b604052919050565b600067ffffffffffffffff821115611e6957611e69611dde565b50601f01601f191660200190565b60008060008060808587031215611e8d57600080fd5b8435611e9881611af8565b93506020850135611ea881611af8565b925060408501359150606085013567ffffffffffffffff811115611ecb57600080fd5b8501601f81018713611edc57600080fd5b8035611eef611eea82611e4f565b611e1e565b818152886020838501011115611f0457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215611f3957600080fd5b8235611f4481611af8565b91506020830135611dd381611af8565b8051610ca981611af8565b600060208284031215611f7157600080fd5b8151611af181611af8565b600181811c90821680611f9057607f821691505b602082108103611fb057634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561203757612037612007565b500290565b60008261205957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600082601f83011261208557600080fd5b8151612093611eea82611e4f565b8181528460208386010111156120a857600080fd5b61111d826020830160208701611b59565b8051610ca981611d97565b6000602082840312156120d657600080fd5b815167ffffffffffffffff808211156120ee57600080fd5b90830190610100828603121561210357600080fd5b61210b611df4565b825181526020830151602082015260408301518281111561212b57600080fd5b61213787828601612074565b60408301525061214960608401611f54565b606082015261215a60808401611f54565b608082015261216b60a08401611f54565b60a082015261217c60c084016120b9565b60c082015261218d60e084016120b9565b60e082015295945050505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b8181038181111561041357610413612007565b8082018082111561041357610413612007565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061224860608301878961220b565b828103602084015261225b81868861220b565b9150508260408301529695505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b601f82111561070a57600081815260208120601f850160051c810160208610156122e75750805b601f850160051c820191505b81811015612306578281556001016122f3565b505050505050565b67ffffffffffffffff83111561232657612326611dde565b61233a836123348354611f7c565b836122c0565b6000601f84116001811461236e57600085156123565750838201355b600019600387901b1c1916600186901b1783556117d6565b600083815260209020601f19861690835b8281101561239f578685013582556020948501946001909201910161237f565b50868210156123bc5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061240190830184611b7d565b9695505050505050565b60006020828403121561241d57600080fd5b8151611af181611abe565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220c80c4d94862952b782f4393643ffeeb0c6c69b3e2cd14639780341c6376c3f0e64736f6c63430008100033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c806342966c68116100de57806395d89b4111610097578063b88d4fde11610071578063b88d4fde14610356578063c87b56dd14610369578063d2fe708e1461037c578063e985e9c51461039757600080fd5b806395d89b4114610333578063a22cb4651461033b578063aa1b103f1461034e57600080fd5b806342966c68146102c15780634f6ccce7146102d45780635944c753146102e75780636352211e146102fa5780636a6278421461030d57806370a082311461032057600080fd5b80631a380beb116101305780631a380beb1461021a57806323b872dd146102435780632a55205a146102565780632f745c59146102885780632fd6b8861461029b57806342842e0e146102ae57600080fd5b806301ffc9a71461017857806304634d8d146101a057806306fdde03146101b5578063081812fc146101ca578063095ea7b3146101f557806318160ddd14610208575b600080fd5b61018b610186366004611ad4565b6103d3565b60405190151581526020015b60405180910390f35b6101b36101ae366004611b24565b610419565b005b6101bd6104ce565b6040516101979190611ba9565b6101dd6101d8366004611bbc565b610560565b6040516001600160a01b039091168152602001610197565b6101b3610203366004611bd5565b6105fa565b6010545b604051908152602001610197565b6101dd610228366004611bbc565b6000908152601160205260409020546001600160a01b031690565b6101b3610251366004611c01565b61070f565b610269610264366004611c42565b610740565b604080516001600160a01b039093168352602083019190915201610197565b61020c610296366004611bd5565b6107ee565b6101b36102a9366004611ca6565b610884565b6101b36102bc366004611c01565b610a05565b6101b36102cf366004611bbc565b610a20565b61020c6102e2366004611bbc565b610a82565b6101b36102f5366004611d3c565b610b15565b6101dd610308366004611bbc565b610bc7565b61020c61031b366004611d7a565b610c3e565b61020c61032e366004611d7a565b610cae565b6101bd610d35565b6101b3610349366004611da5565b610d44565b6101b3610d4f565b6101b3610364366004611e77565b610e02565b6101bd610377366004611bbc565b610e3a565b600d54600e5460408051928352602083019190915201610197565b61018b6103a5366004611f26565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60006001600160e01b0319821663780e9d6360e01b148061040457506001600160e01b0319821663152a902d60e11b145b80610413575061041382610ee1565b92915050565b600f54600d546040516331a9108f60e11b81526001600160a01b0390921691636352211e9161044e9160040190815260200190565b602060405180830381865afa15801561046b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048f9190611f5f565b6001600160a01b0316336001600160a01b0316146104c057604051631b0c476f60e11b815260040160405180910390fd5b6104ca8282610f06565b5050565b6060600080546104dd90611f7c565b80601f016020809104026020016040519081016040528092919081815260200182805461050990611f7c565b80156105565780601f1061052b57610100808354040283529160200191610556565b820191906000526020600020905b81548152906001019060200180831161053957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105de5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061060582610bc7565b9050806001600160a01b0316836001600160a01b0316036106725760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105d5565b336001600160a01b038216148061068e575061068e81336103a5565b6107005760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105d5565b61070a8383610fc0565b505050565b610719338261102e565b6107355760405162461bcd60e51b81526004016105d590611fb6565b61070a838383611125565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916107b5575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906107d4906001600160601b03168761201d565b6107de919061203c565b91519350909150505b9250929050565b60006107f983610cae565b821061085b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105d5565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600c54610100900460ff16158080156108a45750600c54600160ff909116105b806108be5750303b1580156108be5750600c5460ff166001145b6109215760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016105d5565b600c805460ff19166001179055801561094457600c805461ff0019166101001790555b610950858585856112cc565b600d889055600e879055600f80546001600160a01b0319166001600160a01b0388161790556040805189815260208101899052428183015290517f6f606e3871b6f24ddc0daa88a8ed8e8761eb9d1474e64322940f858df287de50916060908290030190a180156109fb57600c805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61070a83838360405180602001604052806000815250610e02565b610a2a338261102e565b610a765760405162461bcd60e51b815260206004820152601b60248201527f4e4654426173653a204e6f744f776e65724f72417070726f766564000000000060448201526064016105d5565b610a7f8161131d565b50565b6000610a8d60085490565b8210610af05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105d5565b60088281548110610b0357610b0361205e565b90600052602060002001549050919050565b600f54600d546040516331a9108f60e11b81526001600160a01b0390921691636352211e91610b4a9160040190815260200190565b602060405180830381865afa158015610b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8b9190611f5f565b6001600160a01b0316336001600160a01b031614610bbc57604051631b0c476f60e11b815260040160405180910390fd5b61070a8383836113c4565b6000818152600260205260408120546001600160a01b0316806104135760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105d5565b600f546000906001600160a01b03163314610c6c576040516302b6341b60e41b815260040160405180910390fd5b506010805460010190819055600081815260116020526040902080546001600160a01b0319166001600160a01b038416179055610ca9828261148f565b919050565b60006001600160a01b038216610d195760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105d5565b506001600160a01b031660009081526003602052604090205490565b6060600180546104dd90611f7c565b6104ca3383836115dd565b600f54600d546040516331a9108f60e11b81526001600160a01b0390921691636352211e91610d849160040190815260200190565b602060405180830381865afa158015610da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc59190611f5f565b6001600160a01b0316336001600160a01b031614610df657604051631b0c476f60e11b815260040160405180910390fd5b610e006000600a55565b565b610e0c338361102e565b610e285760405162461bcd60e51b81526004016105d590611fb6565b610e34848484846116ab565b50505050565b6000818152600260205260409020546060906001600160a01b031615610ca957600f54600d54600e546040516301b6923d60e71b8152600481019290925260248201526001600160a01b039091169063db491e8090604401600060405180830381865afa158015610eaf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed791908101906120c4565b6040015192915050565b60006001600160e01b0319821663152a902d60e11b14806104135750610413826116de565b6127106001600160601b0382161115610f315760405162461bcd60e51b81526004016105d59061219b565b6001600160a01b038216610f875760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016105d5565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ff582610bc7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166110a75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105d5565b60006110b283610bc7565b9050806001600160a01b0316846001600160a01b031614806110ed5750836001600160a01b03166110e284610560565b6001600160a01b0316145b8061111d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661113882610bc7565b6001600160a01b03161461119c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105d5565b6001600160a01b0382166111fe5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105d5565b611209838383611703565b611214600082610fc0565b6001600160a01b038316600090815260036020526040812080546001929061123d9084906121e5565b90915550506001600160a01b038216600090815260036020526040812080546001929061126b9084906121f8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6112d8848484846117bb565b7f414cd0b34676984f09a5f76ce9718d4062e50283abe0e7e274a9a5b4e0c99c30848484844260405161130f959493929190612234565b60405180910390a150505050565b600061132882610bc7565b905061133681600084611703565b611341600083610fc0565b6001600160a01b038116600090815260036020526040812080546001929061136a9084906121e5565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6127106001600160601b03821611156113ef5760405162461bcd60e51b81526004016105d59061219b565b6001600160a01b0382166114455760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d6574657273000000000060448201526064016105d5565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600b90529190942093519051909116600160a01b029116179055565b6001600160a01b0382166114e55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105d5565b6000818152600260205260409020546001600160a01b03161561154a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105d5565b61155660008383611703565b6001600160a01b038216600090815260036020526040812080546001929061157f9084906121f8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b03160361163e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105d5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6116b6848484611125565b6116c2848484846117dd565b610e345760405162461bcd60e51b81526004016105d59061226e565b60006001600160e01b0319821663780e9d6360e01b14806104135750610413826118de565b6001600160a01b03831661175e5761175981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611781565b816001600160a01b0316836001600160a01b03161461178157611781838261192e565b6001600160a01b0382166117985761070a816119cb565b826001600160a01b0316826001600160a01b03161461070a5761070a8282611a7a565b60006117c884868361230e565b5060016117d682848361230e565b5050505050565b60006001600160a01b0384163b156118d357604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118219033908990889088906004016123ce565b6020604051808303816000875af192505050801561185c575060408051601f3d908101601f191682019092526118599181019061240b565b60015b6118b9573d80801561188a576040519150601f19603f3d011682016040523d82523d6000602084013e61188f565b606091505b5080516000036118b15760405162461bcd60e51b81526004016105d59061226e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061111d565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b148061190f57506001600160e01b03198216635b5e139f60e01b145b8061041357506301ffc9a760e01b6001600160e01b0319831614610413565b6000600161193b84610cae565b61194591906121e5565b600083815260076020526040902054909150808214611998576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906119dd906001906121e5565b60008381526009602052604081205460088054939450909284908110611a0557611a0561205e565b906000526020600020015490508060088381548110611a2657611a2661205e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611a5e57611a5e612428565b6001900381819060005260206000200160009055905550505050565b6000611a8583610cae565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610a7f57600080fd5b600060208284031215611ae657600080fd5b8135611af181611abe565b9392505050565b6001600160a01b0381168114610a7f57600080fd5b80356001600160601b0381168114610ca957600080fd5b60008060408385031215611b3757600080fd5b8235611b4281611af8565b9150611b5060208401611b0d565b90509250929050565b60005b83811015611b74578181015183820152602001611b5c565b50506000910152565b60008151808452611b95816020860160208601611b59565b601f01601f19169290920160200192915050565b602081526000611af16020830184611b7d565b600060208284031215611bce57600080fd5b5035919050565b60008060408385031215611be857600080fd5b8235611bf381611af8565b946020939093013593505050565b600080600060608486031215611c1657600080fd5b8335611c2181611af8565b92506020840135611c3181611af8565b929592945050506040919091013590565b60008060408385031215611c5557600080fd5b50508035926020909101359150565b60008083601f840112611c7657600080fd5b50813567ffffffffffffffff811115611c8e57600080fd5b6020830191508360208285010111156107e757600080fd5b600080600080600080600060a0888a031215611cc157600080fd5b87359650602088013595506040880135611cda81611af8565b9450606088013567ffffffffffffffff80821115611cf757600080fd5b611d038b838c01611c64565b909650945060808a0135915080821115611d1c57600080fd5b50611d298a828b01611c64565b989b979a50959850939692959293505050565b600080600060608486031215611d5157600080fd5b833592506020840135611d6381611af8565b9150611d7160408501611b0d565b90509250925092565b600060208284031215611d8c57600080fd5b8135611af181611af8565b8015158114610a7f57600080fd5b60008060408385031215611db857600080fd5b8235611dc381611af8565b91506020830135611dd381611d97565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715611e1857611e18611dde565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611e4757611e47611dde565b604052919050565b600067ffffffffffffffff821115611e6957611e69611dde565b50601f01601f191660200190565b60008060008060808587031215611e8d57600080fd5b8435611e9881611af8565b93506020850135611ea881611af8565b925060408501359150606085013567ffffffffffffffff811115611ecb57600080fd5b8501601f81018713611edc57600080fd5b8035611eef611eea82611e4f565b611e1e565b818152886020838501011115611f0457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215611f3957600080fd5b8235611f4481611af8565b91506020830135611dd381611af8565b8051610ca981611af8565b600060208284031215611f7157600080fd5b8151611af181611af8565b600181811c90821680611f9057607f821691505b602082108103611fb057634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561203757612037612007565b500290565b60008261205957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600082601f83011261208557600080fd5b8151612093611eea82611e4f565b8181528460208386010111156120a857600080fd5b61111d826020830160208701611b59565b8051610ca981611d97565b6000602082840312156120d657600080fd5b815167ffffffffffffffff808211156120ee57600080fd5b90830190610100828603121561210357600080fd5b61210b611df4565b825181526020830151602082015260408301518281111561212b57600080fd5b61213787828601612074565b60408301525061214960608401611f54565b606082015261215a60808401611f54565b608082015261216b60a08401611f54565b60a082015261217c60c084016120b9565b60c082015261218d60e084016120b9565b60e082015295945050505050565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b8181038181111561041357610413612007565b8082018082111561041357610413612007565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061224860608301878961220b565b828103602084015261225b81868861220b565b9150508260408301529695505050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b601f82111561070a57600081815260208120601f850160051c810160208610156122e75750805b601f850160051c820191505b81811015612306578281556001016122f3565b505050505050565b67ffffffffffffffff83111561232657612326611dde565b61233a836123348354611f7c565b836122c0565b6000601f84116001811461236e57600085156123565750838201355b600019600387901b1c1916600186901b1783556117d6565b600083815260209020601f19861690835b8281101561239f578685013582556020948501946001909201910161237f565b50868210156123bc5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061240190830184611b7d565b9695505050505050565b60006020828403121561241d57600080fd5b8151611af181611abe565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220c80c4d94862952b782f4393643ffeeb0c6c69b3e2cd14639780341c6376c3f0e64736f6c63430008100033