Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 13,689 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 36396069 | 2 hrs ago | IN | 0 ETH | 0.00000565 | ||||
| Mint | 36375992 | 5 hrs ago | IN | 0.0117 ETH | 0.0000105 | ||||
| Mint | 36374628 | 5 hrs ago | IN | 0.0117 ETH | 0.00001015 | ||||
| Mint | 36371226 | 5 hrs ago | IN | 0.0117 ETH | 0.0000093 | ||||
| Set Approval For... | 36346453 | 9 hrs ago | IN | 0 ETH | 0.00000444 | ||||
| Mint | 36331801 | 11 hrs ago | IN | 0.0117 ETH | 0.0000093 | ||||
| Mint | 36323562 | 12 hrs ago | IN | 0.0117 ETH | 0.00001051 | ||||
| Mint | 36270540 | 19 hrs ago | IN | 0.00325 ETH | 0.00001054 | ||||
| Mint | 36269600 | 19 hrs ago | IN | 0.0078 ETH | 0.00000704 | ||||
| Mint | 36269024 | 20 hrs ago | IN | 0.0078 ETH | 0.00000936 | ||||
| Mint | 36268267 | 20 hrs ago | IN | 0.0078 ETH | 0.00001026 | ||||
| Set Approval For... | 36265266 | 20 hrs ago | IN | 0 ETH | 0.00000566 | ||||
| Mint | 36261563 | 21 hrs ago | IN | 0.0078 ETH | 0.00000834 | ||||
| Mint | 36258869 | 21 hrs ago | IN | 0.0078 ETH | 0.00001056 | ||||
| Mint | 36257204 | 21 hrs ago | IN | 0.0078 ETH | 0.00001023 | ||||
| Mint | 36252040 | 22 hrs ago | IN | 0.0078 ETH | 0.00001025 | ||||
| Mint | 36250351 | 22 hrs ago | IN | 0.0078 ETH | 0.00000835 | ||||
| Mint | 36247601 | 23 hrs ago | IN | 0.0078 ETH | 0.00000836 | ||||
| Mint | 36244749 | 23 hrs ago | IN | 0.00975 ETH | 0.00001054 | ||||
| Mint | 36242892 | 23 hrs ago | IN | 0.0078 ETH | 0.0000102 | ||||
| Mint | 36239985 | 24 hrs ago | IN | 0.0078 ETH | 0.00000933 | ||||
| Mint | 36236023 | 25 hrs ago | IN | 0.0078 ETH | 0.00000932 | ||||
| Mint | 36232937 | 25 hrs ago | IN | 0.0078 ETH | 0.00001017 | ||||
| Mint | 36166029 | 36 hrs ago | IN | 0.0078 ETH | 0.0000105 | ||||
| Mint | 36158603 | 38 hrs ago | IN | 0.0078 ETH | 0.0000105 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 36375992 | 5 hrs ago | 0.0117 ETH | ||||
| 36375992 | 5 hrs ago | 0.0117 ETH | ||||
| 36374628 | 5 hrs ago | 0.0117 ETH | ||||
| 36374628 | 5 hrs ago | 0.0117 ETH | ||||
| 36371226 | 5 hrs ago | 0.0117 ETH | ||||
| 36371226 | 5 hrs ago | 0.0117 ETH | ||||
| 36331801 | 11 hrs ago | 0.0117 ETH | ||||
| 36331801 | 11 hrs ago | 0.0117 ETH | ||||
| 36323562 | 12 hrs ago | 0.0117 ETH | ||||
| 36323562 | 12 hrs ago | 0.0117 ETH | ||||
| 36270540 | 19 hrs ago | 0.00325 ETH | ||||
| 36270540 | 19 hrs ago | 0.00325 ETH | ||||
| 36269600 | 19 hrs ago | 0.0078 ETH | ||||
| 36269600 | 19 hrs ago | 0.0078 ETH | ||||
| 36269024 | 20 hrs ago | 0.0078 ETH | ||||
| 36269024 | 20 hrs ago | 0.0078 ETH | ||||
| 36268267 | 20 hrs ago | 0.0078 ETH | ||||
| 36268267 | 20 hrs ago | 0.0078 ETH | ||||
| 36261563 | 21 hrs ago | 0.0078 ETH | ||||
| 36261563 | 21 hrs ago | 0.0078 ETH | ||||
| 36258869 | 21 hrs ago | 0.0078 ETH | ||||
| 36258869 | 21 hrs ago | 0.0078 ETH | ||||
| 36257204 | 21 hrs ago | 0.0078 ETH | ||||
| 36257204 | 21 hrs ago | 0.0078 ETH | ||||
| 36252040 | 22 hrs ago | 0.0078 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
LimitedCollection
Compiler Version
v0.8.24+commit.e11b9ed9
ZkSolc Version
v1.5.15
Optimization Enabled:
Yes with Mode 3
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
import "./data/MintTicket.sol";
import "./signature/MintTicketSignatureVerification.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/token/common/ERC2981.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract LimitedCollection is ERC2981, ERC721URIStorage, Ownable, MintTicketSigantureVerification {
struct TokenURIDefinition {
uint256 tokenId;
string tokenURI;
}
error MintNotAllowed();
error InvalidTicket();
error CannotMintZeroTokens();
error InsufficientValue();
error TooHighValue();
error NoMoreTokens();
error AmountExceeded();
error ContractEmpty();
error WithdrawalFailed();
error TransferFailed();
uint256 public totalSupply;
bool public isMintEnabled;
string internal baseTokenURI;
address public ticketSigner;
address public treasury;
constructor(
string memory _name,
string memory _symbol,
address _royaltyReceiver,
uint96 _feeNumerator, // 100 percents is 10 000 value in feeNumenator
address _ticketSigner,
address _treasury
) ERC721(_name, _symbol) Ownable(msg.sender) {
totalSupply = 0;
isMintEnabled = false;
ticketSigner = _ticketSigner;
treasury = _treasury;
_setDefaultRoyalty(_royaltyReceiver, _feeNumerator);
}
function mint(MintTicket memory _ticket, bytes memory _signature) public payable {
address sender = _msgSender();
if(!isMintEnabled) revert MintNotAllowed();
if(address(this) != _ticket.nft) revert InvalidTicket();
if(sender != _ticket.minter) revert InvalidTicket();
if(!verify(_ticket, _signature, ticketSigner)) revert InvalidTicket();
if(msg.value < _ticket.price) revert InsufficientValue();
if(msg.value > _ticket.price) revert TooHighValue();
totalSupply++;
_safeMint(sender, _ticket.id);
_setTokenURI(_ticket.id, _ticket.uri);
(bool success, ) = treasury.call{value: _ticket.price}("");
if (!success) revert TransferFailed();
}
function setIsMintEnabled(bool _isMintEnabled) public onlyOwner {
isMintEnabled = _isMintEnabled;
}
function setDefaultRoyalty(address _reciever, uint96 _centiPercents) public onlyOwner {
_setDefaultRoyalty(_reciever, _centiPercents);
}
function setTreasury(address _treasury) public onlyOwner {
treasury = _treasury;
}
function setBaseTokenURI(string calldata _baseTokenURI) public onlyOwner {
baseTokenURI = _baseTokenURI;
}
function _baseURI() internal view virtual override returns (string memory) {
return baseTokenURI;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
return ERC721URIStorage.tokenURI(tokenId);
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC2981, ERC721URIStorage) returns (bool) {
return ERC2981.supportsInterface(interfaceId) || ERC721URIStorage.supportsInterface(interfaceId);
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
struct MintTicket {
address nft;
address minter;
uint256 deadline;
uint256 id;
uint256 price;
string uri;
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
import "../data/MintTicket.sol";
import "@openzeppelin/contracts/utils/cryptography/EIP712.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
contract MintTicketSigantureVerification is EIP712 {
using ECDSA for bytes32;
bytes32 public constant MINT_TICKET_TYPEHASH = keccak256("MintTicket(address nft,address minter,uint256 deadline,uint256 id,uint256 price,string uri)");
constructor() EIP712("ElympicsMintTicket", "1") {}
function verify(
MintTicket memory ticket,
bytes memory signature,
address signer
) public view returns (bool) {
bool signerMatches = recoverSignerOfMintTicket(ticket, signature) == signer;
bool isDeadlineValid = ticket.deadline >= block.timestamp;
return signerMatches && isDeadlineValid;
}
function recoverSignerOfMintTicket(
MintTicket memory ticket,
bytes memory signature
) public view returns (address) {
return _hashTypedDataV4(keccak256(encode(ticket))).recover(signature);
}
function encode(
MintTicket memory _ticket
) public pure returns (bytes memory) {
return abi.encode(
MINT_TICKET_TYPEHASH,
_ticket.nft,
_ticket.minter,
_ticket.deadline,
_ticket.id,
_ticket.price,
keccak256(bytes(_ticket.uri))
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol)
pragma solidity ^0.8.20;
import {IERC2981} from "../../interfaces/IERC2981.sol";
import {IERC165, ERC165} from "../../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.
*/
abstract contract ERC2981 is IERC2981, ERC165 {
struct RoyaltyInfo {
address receiver;
uint96 royaltyFraction;
}
RoyaltyInfo private _defaultRoyaltyInfo;
mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo;
/**
* @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1).
*/
error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator);
/**
* @dev The default royalty receiver is invalid.
*/
error ERC2981InvalidDefaultRoyaltyReceiver(address receiver);
/**
* @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1).
*/
error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator);
/**
* @dev The royalty receiver for `tokenId` is invalid.
*/
error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver);
/**
* @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
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) {
RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];
if (royalty.receiver == address(0)) {
royalty = _defaultRoyaltyInfo;
}
uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();
return (royalty.receiver, royaltyAmount);
}
/**
* @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
* fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
* override.
*/
function _feeDenominator() internal pure virtual returns (uint96) {
return 10000;
}
/**
* @dev Sets the royalty information that all ids in this contract will default to.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
uint256 denominator = _feeDenominator();
if (feeNumerator > denominator) {
// Royalty fee will exceed the sale price
revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator);
}
if (receiver == address(0)) {
revert ERC2981InvalidDefaultRoyaltyReceiver(address(0));
}
_defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Removes default royalty information.
*/
function _deleteDefaultRoyalty() internal virtual {
delete _defaultRoyaltyInfo;
}
/**
* @dev Sets the royalty information for a specific token id, overriding the global default.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
uint256 denominator = _feeDenominator();
if (feeNumerator > denominator) {
// Royalty fee will exceed the sale price
revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator);
}
if (receiver == address(0)) {
revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0));
}
_tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Resets royalty information for the token id back to the global default.
*/
function _resetTokenRoyalty(uint256 tokenId) internal virtual {
delete _tokenRoyaltyInfo[tokenId];
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)
pragma solidity ^0.8.20;
import {ERC721} from "../ERC721.sol";
import {Strings} from "../../../utils/Strings.sol";
import {IERC4906} from "../../../interfaces/IERC4906.sol";
import {IERC165} from "../../../interfaces/IERC165.sol";
/**
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is IERC4906, ERC721 {
using Strings for uint256;
// Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only
// defines events and does not include any external function.
bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);
// Optional mapping for token URIs
mapping(uint256 tokenId => string) private _tokenURIs;
/**
* @dev See {IERC165-supportsInterface}
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) {
return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireOwned(tokenId);
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 string.concat).
if (bytes(_tokenURI).length > 0) {
return string.concat(base, _tokenURI);
}
return super.tokenURI(tokenId);
}
/**
* @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
*
* Emits {MetadataUpdate}.
*/
function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
_tokenURIs[tokenId] = _tokenURI;
emit MetadataUpdate(tokenId);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.20;
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS
}
/**
* @dev The signature derives the `address(0)`.
*/
error ECDSAInvalidSignature();
/**
* @dev The signature has an invalid length.
*/
error ECDSAInvalidSignatureLength(uint256 length);
/**
* @dev The signature has an S value that is in the upper half order.
*/
error ECDSAInvalidSignatureS(bytes32 s);
/**
* @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not
* return address(0) without also returning an error description. Errors are documented using an enum (error type)
* and a bytes32 providing additional information about the error.
*
* If no error is returned, then the address can be used for verification purposes.
*
* The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
/// @solidity memory-safe-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
_throwError(error, errorArg);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*/
function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {
unchecked {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
// We do not check for an overflow here since the shift operation results in 0 or 1.
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*/
function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
_throwError(error, errorArg);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError, bytes32) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS, s);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature, bytes32(0));
}
return (signer, RecoverError.NoError, bytes32(0));
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);
_throwError(error, errorArg);
return recovered;
}
/**
* @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.
*/
function _throwError(RecoverError error, bytes32 errorArg) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert ECDSAInvalidSignature();
} else if (error == RecoverError.InvalidSignatureLength) {
revert ECDSAInvalidSignatureLength(uint256(errorArg));
} else if (error == RecoverError.InvalidSignatureS) {
revert ECDSAInvalidSignatureS(errorArg);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/EIP712.sol)
pragma solidity ^0.8.20;
import {MessageHashUtils} from "./MessageHashUtils.sol";
import {ShortStrings, ShortString} from "../ShortStrings.sol";
import {IERC5267} from "../../interfaces/IERC5267.sol";
/**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
*
* The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose
* encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract
* does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to
* produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.
*
* This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
* ({_hashTypedDataV4}).
*
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
* the chain id to protect against replay attacks on an eventual fork of the chain.
*
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
*
* NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain
* separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the
* separator from the immutable values, which is cheaper than accessing a cached version in cold storage.
*
* @custom:oz-upgrades-unsafe-allow state-variable-immutable
*/
abstract contract EIP712 is IERC5267 {
using ShortStrings for *;
bytes32 private constant TYPE_HASH =
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
// Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
// invalidate the cached domain separator if the chain id changes.
bytes32 private immutable _cachedDomainSeparator;
uint256 private immutable _cachedChainId;
address private immutable _cachedThis;
bytes32 private immutable _hashedName;
bytes32 private immutable _hashedVersion;
ShortString private immutable _name;
ShortString private immutable _version;
string private _nameFallback;
string private _versionFallback;
/**
* @dev Initializes the domain separator and parameter caches.
*
* The meaning of `name` and `version` is specified in
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
*
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
* - `version`: the current major version of the signing domain.
*
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
* contract upgrade].
*/
constructor(string memory name, string memory version) {
_name = name.toShortStringWithFallback(_nameFallback);
_version = version.toShortStringWithFallback(_versionFallback);
_hashedName = keccak256(bytes(name));
_hashedVersion = keccak256(bytes(version));
_cachedChainId = block.chainid;
_cachedDomainSeparator = _buildDomainSeparator();
_cachedThis = address(this);
}
/**
* @dev Returns the domain separator for the current chain.
*/
function _domainSeparatorV4() internal view returns (bytes32) {
if (address(this) == _cachedThis && block.chainid == _cachedChainId) {
return _cachedDomainSeparator;
} else {
return _buildDomainSeparator();
}
}
function _buildDomainSeparator() private view returns (bytes32) {
return keccak256(abi.encode(TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));
}
/**
* @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
* function returns the hash of the fully encoded EIP712 message for this domain.
*
* This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
*
* ```solidity
* bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
* keccak256("Mail(address to,string contents)"),
* mailTo,
* keccak256(bytes(mailContents))
* )));
* address signer = ECDSA.recover(digest, signature);
* ```
*/
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);
}
/**
* @dev See {IERC-5267}.
*/
function eip712Domain()
public
view
virtual
returns (
bytes1 fields,
string memory name,
string memory version,
uint256 chainId,
address verifyingContract,
bytes32 salt,
uint256[] memory extensions
)
{
return (
hex"0f", // 01111
_EIP712Name(),
_EIP712Version(),
block.chainid,
address(this),
bytes32(0),
new uint256[](0)
);
}
/**
* @dev The name parameter for the EIP712 domain.
*
* NOTE: By default this function reads _name which is an immutable value.
* It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
*/
// solhint-disable-next-line func-name-mixedcase
function _EIP712Name() internal view returns (string memory) {
return _name.toStringWithFallback(_nameFallback);
}
/**
* @dev The version parameter for the EIP712 domain.
*
* NOTE: By default this function reads _version which is an immutable value.
* It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
*/
// solhint-disable-next-line func-name-mixedcase
function _EIP712Version() internal view returns (string memory) {
return _version.toStringWithFallback(_versionFallback);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../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.
*/
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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./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);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
import {IERC721} from "./IERC721.sol";
/// @title EIP-721 Metadata Update Extension
interface IERC4906 is IERC165, IERC721 {
/// @dev This event emits when the metadata of a token is changed.
/// So that the third-party platforms such as NFT market could
/// timely update the images and related attributes of the NFT.
event MetadataUpdate(uint256 _tokenId);
/// @dev This event emits when the metadata of a range of tokens is changed.
/// So that the third-party platforms such as NFT market could
/// timely update the images and related attributes of the NFTs.
event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.20;
import {IERC721} from "./IERC721.sol";
import {IERC721Receiver} from "./IERC721Receiver.sol";
import {IERC721Metadata} from "./extensions/IERC721Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {Strings} from "../../utils/Strings.sol";
import {IERC165, ERC165} from "../../utils/introspection/ERC165.sol";
import {IERC721Errors} from "../../interfaces/draft-IERC6093.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}.
*/
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
mapping(uint256 tokenId => address) private _owners;
mapping(address owner => uint256) private _balances;
mapping(uint256 tokenId => address) private _tokenApprovals;
mapping(address owner => mapping(address operator => 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 returns (uint256) {
if (owner == address(0)) {
revert ERC721InvalidOwner(address(0));
}
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual returns (address) {
return _requireOwned(tokenId);
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
_requireOwned(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string.concat(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 overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual {
_approve(to, tokenId, _msgSender());
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual returns (address) {
_requireOwned(tokenId);
return _getApproved(tokenId);
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(address from, address to, uint256 tokenId) public virtual {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
// Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists
// (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.
address previousOwner = _update(to, tokenId, _msgSender());
if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) public {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {
transferFrom(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
*
* IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the
* core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances
* consistent with ownership. The invariant to preserve is that for any address `a` the value returned by
* `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.
*/
function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
return _owners[tokenId];
}
/**
* @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
*/
function _getApproved(uint256 tokenId) internal view virtual returns (address) {
return _tokenApprovals[tokenId];
}
/**
* @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
* particular (ignoring whether it is owned by `owner`).
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {
return
spender != address(0) &&
(owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);
}
/**
* @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.
* Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets
* the `spender` for the specific `tokenId`.
*
* WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this
* assumption.
*/
function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {
if (!_isAuthorized(owner, spender, tokenId)) {
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else {
revert ERC721InsufficientApproval(spender, tokenId);
}
}
}
/**
* @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
*
* NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that
* a uint256 would ever overflow from increments when these increments are bounded to uint128 values.
*
* WARNING: Increasing an account's balance using this function tends to be paired with an override of the
* {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership
* remain consistent with one another.
*/
function _increaseBalance(address account, uint128 value) internal virtual {
unchecked {
_balances[account] += value;
}
}
/**
* @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner
* (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that
* `auth` is either the owner of the token, or approved to operate on the token (by the owner).
*
* Emits a {Transfer} event.
*
* NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.
*/
function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {
address from = _ownerOf(tokenId);
// Perform (optional) operator check
if (auth != address(0)) {
_checkAuthorized(from, auth, tokenId);
}
// Execute the update
if (from != address(0)) {
// Clear approval. No need to re-authorize or emit the Approval event
_approve(address(0), tokenId, address(0), false);
unchecked {
_balances[from] -= 1;
}
}
if (to != address(0)) {
unchecked {
_balances[to] += 1;
}
}
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
return from;
}
/**
* @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 {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner != address(0)) {
revert ERC721InvalidSender(address(0));
}
}
/**
* @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.
*
* 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 {
_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);
_checkOnERC721Received(address(0), to, tokenId, data);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal {
address previousOwner = _update(address(0), tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(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 {
if (to == address(0)) {
revert ERC721InvalidReceiver(address(0));
}
address previousOwner = _update(to, tokenId, address(0));
if (previousOwner == address(0)) {
revert ERC721NonexistentToken(tokenId);
} else if (previousOwner != from) {
revert ERC721IncorrectOwner(from, tokenId, previousOwner);
}
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients
* are aware of the ERC721 standard 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 like {safeTransferFrom} in the sense that it invokes
* {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `tokenId` token must exist and be owned by `from`.
* - `to` cannot be the zero address.
* - `from` cannot be the zero address.
* - 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) internal {
_safeTransfer(from, to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
_transfer(from, to, tokenId);
_checkOnERC721Received(from, to, tokenId, data);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is
* either the owner of the token, or approved to operate on all tokens held by this owner.
*
* Emits an {Approval} event.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address to, uint256 tokenId, address auth) internal {
_approve(to, tokenId, auth, true);
}
/**
* @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not
* emitted in the context of transfers.
*/
function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {
// Avoid reading the owner unless necessary
if (emitEvent || auth != address(0)) {
address owner = _requireOwned(tokenId);
// We do not use _isAuthorized because single-token approvals should not be able to call approve
if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {
revert ERC721InvalidApprover(auth);
}
if (emitEvent) {
emit Approval(owner, to, tokenId);
}
}
_tokenApprovals[tokenId] = to;
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Requirements:
* - operator can't be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
if (operator == address(0)) {
revert ERC721InvalidOperator(operator);
}
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
* Returns the owner.
*
* Overrides to ownership logic should be done to {_ownerOf}.
*/
function _requireOwned(uint256 tokenId) internal view returns (address) {
address owner = _ownerOf(tokenId);
if (owner == address(0)) {
revert ERC721NonexistentToken(tokenId);
}
return owner;
}
/**
* @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
* recipient doesn't accept the token transfer. 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
*/
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
if (to.code.length > 0) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
if (retval != IERC721Receiver.onERC721Received.selector) {
revert ERC721InvalidReceiver(to);
}
} catch (bytes memory reason) {
if (reason.length == 0) {
revert ERC721InvalidReceiver(to);
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
pragma solidity ^0.8.20;
import {Math} from "./math/Math.sol";
import {SignedMath} from "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/
error StringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @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), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
uint256 localValue = value;
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_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
* representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../utils/introspection/IERC165.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)
pragma solidity ^0.8.20;
interface IERC5267 {
/**
* @dev MAY be emitted to signal that the domain could have changed.
*/
event EIP712DomainChanged();
/**
* @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
* signature.
*/
function eip712Domain()
external
view
returns (
bytes1 fields,
string memory name,
string memory version,
uint256 chainId,
address verifyingContract,
bytes32 salt,
uint256[] memory extensions
);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ShortStrings.sol)
pragma solidity ^0.8.20;
import {StorageSlot} from "./StorageSlot.sol";
// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
// | length | 0x BB |
type ShortString is bytes32;
/**
* @dev This library provides functions to convert short memory strings
* into a `ShortString` type that can be used as an immutable variable.
*
* Strings of arbitrary length can be optimized using this library if
* they are short enough (up to 31 bytes) by packing them with their
* length (1 byte) in a single EVM word (32 bytes). Additionally, a
* fallback mechanism can be used for every other case.
*
* Usage example:
*
* ```solidity
* contract Named {
* using ShortStrings for *;
*
* ShortString private immutable _name;
* string private _nameFallback;
*
* constructor(string memory contractName) {
* _name = contractName.toShortStringWithFallback(_nameFallback);
* }
*
* function name() external view returns (string memory) {
* return _name.toStringWithFallback(_nameFallback);
* }
* }
* ```
*/
library ShortStrings {
// Used as an identifier for strings longer than 31 bytes.
bytes32 private constant FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;
error StringTooLong(string str);
error InvalidShortString();
/**
* @dev Encode a string of at most 31 chars into a `ShortString`.
*
* This will trigger a `StringTooLong` error is the input string is too long.
*/
function toShortString(string memory str) internal pure returns (ShortString) {
bytes memory bstr = bytes(str);
if (bstr.length > 31) {
revert StringTooLong(str);
}
return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));
}
/**
* @dev Decode a `ShortString` back to a "normal" string.
*/
function toString(ShortString sstr) internal pure returns (string memory) {
uint256 len = byteLength(sstr);
// using `new string(len)` would work locally but is not memory safe.
string memory str = new string(32);
/// @solidity memory-safe-assembly
assembly {
mstore(str, len)
mstore(add(str, 0x20), sstr)
}
return str;
}
/**
* @dev Return the length of a `ShortString`.
*/
function byteLength(ShortString sstr) internal pure returns (uint256) {
uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;
if (result > 31) {
revert InvalidShortString();
}
return result;
}
/**
* @dev Encode a string into a `ShortString`, or write it to storage if it is too long.
*/
function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {
if (bytes(value).length < 32) {
return toShortString(value);
} else {
StorageSlot.getStringSlot(store).value = value;
return ShortString.wrap(FALLBACK_SENTINEL);
}
}
/**
* @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.
*/
function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {
if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
return toString(value);
} else {
return store;
}
}
/**
* @dev Return the length of a string that was encoded to `ShortString` or written to storage using
* {setWithFallback}.
*
* WARNING: This will return the "byte length" of the string. This may not reflect the actual length in terms of
* actual characters as the UTF-8 encoding of a single character can span over multiple bytes.
*/
function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {
if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
return byteLength(value);
} else {
return bytes(store).length;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol)
pragma solidity ^0.8.20;
import {Strings} from "../Strings.sol";
/**
* @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.
*
* The library provides methods for generating a hash of a message that conforms to the
* https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]
* specifications.
*/
library MessageHashUtils {
/**
* @dev Returns the keccak256 digest of an EIP-191 signed data with version
* `0x45` (`personal_sign` messages).
*
* The digest is calculated by prefixing a bytes32 `messageHash` with
* `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the
* hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
*
* NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with
* keccak256, although any bytes32 value can be safely used because the final digest will
* be re-hashed.
*
* See {ECDSA-recover}.
*/
function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash
mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix
digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)
}
}
/**
* @dev Returns the keccak256 digest of an EIP-191 signed data with version
* `0x45` (`personal_sign` messages).
*
* The digest is calculated by prefixing an arbitrary `message` with
* `"\x19Ethereum Signed Message:\n" + len(message)` and hashing the result. It corresponds with the
* hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
*
* See {ECDSA-recover}.
*/
function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {
return
keccak256(bytes.concat("\x19Ethereum Signed Message:\n", bytes(Strings.toString(message.length)), message));
}
/**
* @dev Returns the keccak256 digest of an EIP-191 signed data with version
* `0x00` (data with intended validator).
*
* The digest is calculated by prefixing an arbitrary `data` with `"\x19\x00"` and the intended
* `validator` address. Then hashing the result.
*
* See {ECDSA-recover}.
*/
function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(hex"19_00", validator, data));
}
/**
* @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`).
*
* The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with
* `\x19\x01` and hashing the result. It corresponds to the hash signed by the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.
*
* See {ECDSA-recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(ptr, hex"19_01")
mstore(add(ptr, 0x02), domainSeparator)
mstore(add(ptr, 0x22), structHash)
digest := keccak256(ptr, 0x42)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)
pragma solidity ^0.8.20;
import {IERC721} from "../token/ERC721/IERC721.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Muldiv operation overflow.
*/
error MathOverflowedMulDiv();
enum Rounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds towards infinity instead
* of rounding towards zero.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
// Guarantee the same behavior as in a regular Solidity division.
return a / b;
}
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
* denominator == 0.
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
* Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0 = x * y; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator.
// Always >= 1. See https://cs.stackexchange.com/q/138556/92363.
uint256 twos = denominator & (0 - denominator);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
// works in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
* towards zero.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../../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);
/**
* @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;
/**
* @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* 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 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 address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.20;
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.20;
import {IERC721} from "../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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
pragma solidity ^0.8.20;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```solidity
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(newImplementation.code.length > 0);
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*/
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
struct StringSlot {
string value;
}
struct BytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` with member `value` located at `slot`.
*/
function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/
function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
/**
* @dev Returns an `BytesSlot` with member `value` located at `slot`.
*/
function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/
function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
}{
"viaIR": true,
"optimizer": {
"enabled": true,
"mode": "3"
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"abi"
]
}
},
"detectMissingLibraries": false,
"forceEVMLA": false,
"enableEraVMExtensions": false,
"codegen": "yul",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"},{"internalType":"address","name":"_ticketSigner","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountExceeded","type":"error"},{"inputs":[],"name":"CannotMintZeroTokens","type":"error"},{"inputs":[],"name":"ContractEmpty","type":"error"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[],"name":"InsufficientValue","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[],"name":"InvalidTicket","type":"error"},{"inputs":[],"name":"MintNotAllowed","type":"error"},{"inputs":[],"name":"NoMoreTokens","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"inputs":[],"name":"TooHighValue","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"WithdrawalFailed","type":"error"},{"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":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"MINT_TICKET_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct MintTicket","name":"_ticket","type":"tuple"}],"name":"encode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","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":[],"name":"isMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct MintTicket","name":"_ticket","type":"tuple"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct MintTicket","name":"ticket","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoverSignerOfMintTicket","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reciever","type":"address"},{"internalType":"uint96","name":"_centiPercents","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isMintEnabled","type":"bool"}],"name":"setIsMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","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":"ticketSigner","outputs":[{"internalType":"address","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct MintTicket","name":"ticket","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010005613ffec5004cfcc7b1d26e92357ba4f3dc8aac0eed64034c6e2af399820000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000bd9abe473fd2189b2d9a9806b9e4927f922aa88800000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000397f862360869b23d765e138132303601ff0437d0000000000000000000000002ecc328147a5f4c453dfb5320d5b279978763068000000000000000000000000000000000000000000000000000000000000000b50656e677520436c61736800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025043000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0002000000000002000c00000000000200010000000103550000006003100270000004c40030019d000004c4033001970000000100200190000000330000c13d0000008004000039000000400040043f000000040030008c000000540000413d000000000201043b000000e002200270000004e90020009c000001030000a13d000004ea0020009c0000014c0000213d000004f60020009c000001890000213d000004fc0020009c000001e70000213d000004ff0020009c000002610000613d000005000020009c000000540000c13d0000000001000416000000000001004b000000540000c13d0000000901000039000000000201041a000004cc032001970000000005000411000000000053004b000004870000c13d000004d602200197000000000021041b0000000001000414000004c40010009c000004c401008041000000c001100210000004d7011001c70000800d020000390000000303000039000004d8040000410000000006000019130b13010000040f0000000100200190000000540000613d00000000010000190000130c0001042e0000016004000039000000400040043f0000000002000416000000000002004b000000540000c13d0000001f02300039000004c5022001970000016002200039000000400020043f0000001f0530018f000004c6063001980000016002600039000000450000613d000000000701034f000000007807043c0000000004840436000000000024004b000000410000c13d000000000005004b000000520000613d000000000161034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000c00030008c000000560000813d00000000010000190000130d00010430000001600600043d000004c70060009c000000540000213d0000001f01600039000000000031004b000000540000813d00000160016000390000000005010433000004c80050009c000008590000813d0000001f01500039000004c9011001970000003f01100039000004ca02100197000000400100043d0000000002210019000000000012004b00000000040000390000000104004039000004c70020009c000008590000213d0000000100400190000008590000c13d0000016004300039000000400020043f000000000251043600000180066000390000000007650019000000000047004b000000540000213d000000000005004b0000007e0000613d000000000700001900000000082700190000000009670019000000000909043300000000009804350000002007700039000000000057004b000000770000413d00000000055200190000000000050435000001800500043d000004c70050009c000000540000213d0000001f06500039000000000036004b0000000003000019000004cb03008041000004cb06600197000000000006004b0000000007000019000004cb07004041000004cb0060009c000000000703c019000000000007004b000000540000c13d00000160035000390000000003030433000004c70030009c000008590000213d0000001f06300039000004c9066001970000003f06600039000004ca06600197000000400800043d0000000006680019000000000086004b00000000070000390000000107004039000004c70060009c000008590000213d0000000100700190000008590000c13d000000400060043f000b00000008001d0000000006380436000c00000006001d00000180055000390000000006530019000000000046004b000000540000213d000000000003004b0000000c08000029000000b30000613d000000000400001900000000068400190000000007540019000000000707043300000000007604350000002004400039000000000034004b000000ac0000413d00000000033800190000000000030435000001a00300043d000a00000003001d000004cc0030009c000000540000213d000001c00300043d000900000003001d000004cd0030009c000000540000213d000001e00300043d000800000003001d000004cc0030009c000000540000213d000002000300043d000700000003001d000004cc0030009c000000540000213d000000400300043d000600000003001d000004ce0030009c000008590000213d00000006040000290000004003400039000000400030043f00000012030000390000000004340436000004cf03000041000400000004001d0000000000340435000000400300043d000500000003001d000004ce0030009c000008590000213d00000005040000290000004003400039000000400030043f00000001030000390000000004340436000004d003000041000300000004001d00000000003404350000000004010433000004c70040009c000008590000213d0000000203000039000000000503041a000000010650019000000001055002700000007f0550618f0000001f0050008c00000000070000390000000107002039000000000067004b0000033b0000c13d000000200050008c000000fb0000413d000000000030043f0000001f064000390000000506600270000004d10660009a000000200040008c000004d2060040410000001f055000390000000505500270000004d10550009a000000000056004b000000fb0000813d000000000006041b0000000106600039000000000056004b000000f70000413d0000001f0040008c000008300000a13d000000000030043f000004d3064001980000083b0000c13d0000002005000039000004d202000041000008470000013d000005010020009c0000016f0000a13d000005020020009c000001a90000213d000005080020009c000002450000213d0000050b0020009c000003570000613d0000050c0020009c000000540000c13d0000000002000416000000000002004b000000540000c13d000000440030008c000000540000413d0000002402100370000000000202043b000c00000002001d0000000401100370000000000101043b000000000010043f0000000101000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000400300043d000004ce0030009c000008590000213d000000000101043b0000004002300039000000400020043f000000000101041a0000002004300039000000a0021002700000000000240435000004cc0110019800000000001304350000013b0000c13d000000400300043d000004ce0030009c000008590000213d0000004001300039000000400010043f0000002001300039000000000400041a000000a0024002700000000000210435000004cc0140019700000000001304350000000c0400002900000000034200a9000000000004004b000001420000613d00000000044300d9000000000042004b000006360000c13d000027100230011a000000400300043d000000200430003900000000002404350000000000130435000004c40030009c000004c403008041000000400130021000000541011001c70000130c0001042e000004eb0020009c000001940000213d000004f10020009c000001f20000213d000004f40020009c0000026e0000613d000004f50020009c000000540000c13d0000000002000416000000000002004b000000540000c13d000000840030008c000000540000413d0000000402100370000000000202043b000c00000002001d000004cc0020009c000000540000213d0000002402100370000000000202043b000b00000002001d000004cc0020009c000000540000213d0000006402100370000000000202043b000004c70020009c000000540000213d0000004401100370000000000101043b000a00000001001d00000004012000390000000002030019130b0c6f0000040f000900000001001d0000036c0000013d0000050d0020009c000001c10000a13d0000050e0020009c000002110000213d000005110020009c000002730000613d000005120020009c000000540000c13d0000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000401100370000000000101043b000c00000001001d130b12030000040f0000000c01000029000000000010043f0000000601000039000000200010043f00000040020000390000000001000019130b12ec0000040f000000000101041a000002cb0000013d000004f70020009c0000021d0000213d000004fa0020009c000002920000613d000004fb0020009c000000540000c13d0000000001000416000000000001004b000000540000c13d0000000901000039000003c90000013d000004ec0020009c000002370000213d000004ef0020009c000002c50000613d000004f00020009c000000540000c13d0000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000401100370000000000101043b000c00000001001d000004cc0010009c000000540000213d130b11f20000040f0000001001000039000000000201041a000004d602200197000001bd0000013d000005030020009c000002540000213d000005060020009c0000035f0000613d000005070020009c000000540000c13d0000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000401100370000000000101043b000c00000001001d000000010010008c000000540000213d130b11f20000040f0000000d01000039000000000201041a0000054d022001970000000c022001af000000000021041b00000000010000190000130c0001042e000005130020009c000003ce0000613d000005140020009c000003770000613d000005150020009c000000540000c13d0000000002000416000000000002004b000000540000c13d000000440030008c000000540000413d0000000402100370000000000202043b000004cc0020009c000000540000213d0000002401100370000000000101043b000c00000001001d000004cd0010009c000000540000213d00000000030200190000000901000039000000000101041a000004cc021001970000000001000411000000000012004b0000053f0000c13d0000000c01000029000004cd01100197000027110010008c000005e20000413d000004e602000041000000800020043f000000840010043f0000271001000039000000a40010043f00000544010000410000130d00010430000004fd0020009c000002d30000613d000004fe0020009c000000540000c13d0000000001000416000000000001004b000000540000c13d0000053d01000041000000800010043f0000052a010000410000130c0001042e000004f20020009c000002e50000613d000004f30020009c000000540000c13d0000000002000416000000000002004b000000540000c13d000000440030008c000000540000413d0000000402100370000000000202043b000004cc0020009c000000540000213d0000002401100370000000000101043b000c00000001001d000004cc0010009c000000540000213d000000000020043f0000000701000039000000200010043f00000040020000390000000001000019130b12ec0000040f0000000c02000029000000000020043f000000200010043f00000000010000190000004002000039130b12ec0000040f0000024d0000013d0000050f0020009c000003050000613d000005100020009c000000540000c13d0000000001000416000000000001004b000000540000c13d0000000c01000039000000000101041a000000800010043f0000052a010000410000130c0001042e000004f80020009c0000032d0000613d000004f90020009c000000540000c13d0000000002000416000000000002004b000000540000c13d000000440030008c000000540000413d0000000402100370000000000202043b000c00000002001d000004cc0020009c000000540000213d0000002401100370000000000101043b000000000001004b0000000002000039000000010200c039000b00000002001d000000010010008c000000540000213d0000000c0000006b000005440000c13d0000053701000041000003530000013d000004ed0020009c000003410000613d000004ee0020009c000000540000c13d000c00000004001d0000000001030019130b0cdd0000040f0000000d03000039000000000303041a000000ff003001900000046c0000c13d000000400100043d0000052602000041000004810000013d000005090020009c000003880000613d0000050a0020009c000000540000c13d0000000001000416000000000001004b000000540000c13d0000000d01000039000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f0000052a010000410000130c0001042e000005040020009c000003c50000613d000005050020009c000000540000c13d0000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000401100370000000000101043b130b12030000040f000002cc0000013d0000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000401100370000000000101043b000004cc0010009c000000540000213d000000000001004b000004a00000c13d0000053e01000041000003530000013d0000000001000416000000000001004b000000540000c13d0000000f01000039000003c90000013d0000000001000416000000000001004b000000540000c13d0000000203000039000000000203041a000000010420019000000001012002700000007f0110618f0000001f0010008c00000000050000390000000105002039000000000525013f00000001005001900000033b0000c13d000000800010043f000000000004004b000004940000613d000000000030043f000000000001004b000004920000613d000004d20200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000014004b000002890000413d000005210000013d0000000001000416000000000001004b000000540000c13d0000053901000041000000000010044300000000010004120000000400100443000000a00100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f000000010020019000000b310000613d000000000201043b0000000001000415000000ff0020008c0000049a0000c13d0000000a05000039000000000405041a000000010640019000000001024002700000007f0220618f0000001f0020008c00000000030000390000000103002039000000000343013f00000001003001900000033b0000c13d000000400800043d0000000003280436000000000006004b0000059e0000613d000000000050043f000000000002004b0000000004000019000005a30000613d000004da0500004100000000040000190000000006430019000000000705041a000000000076043500000001055000390000002004400039000000000024004b000002bd0000413d000005a30000013d0000000001000416000000000001004b000000540000c13d0000000001030019130b0cdd0000040f130b105f0000040f000004cc01100197000000400200043d0000000000120435000004c40020009c000004c402008041000000400120021000000529011001c70000130c0001042e0000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000401100370000000000101043b000004c70010009c000000540000213d00000004011000390000000002030019130b0bf90000040f130b10150000040f0000002002000039000000400300043d000c00000003001d00000000022304360000052a0000013d0000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000401100370000000000201043b0000000001000415000b00000001001d000c00000002001d000000000020043f0000000401000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000101041a000004cc00100198000004a70000c13d000000400100043d0000053502000041000000000021043500000004021000390000000c03000029000003270000013d0000000002000416000000000002004b000000540000c13d000000440030008c000000540000413d0000000402100370000000000202043b000c00000002001d000004cc0020009c000000540000213d0000002401100370000000000101043b000b00000001001d000000000010043f0000000401000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000101041a000004cc05100198000004ed0000c13d000000400100043d0000053502000041000000000021043500000004021000390000000b030000290000000000320435000004c40010009c000004c4010080410000004001100210000004e5011001c70000130d000104300000000001000416000000000001004b000000540000c13d0000000303000039000000000203041a000000010420019000000001012002700000007f0110618f0000001f0010008c00000000050000390000000105002039000000000525013f00000001005001900000048c0000613d0000054001000041000000000010043f0000002201000039000000040010043f000004e5010000410000130d000104300000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000401100370000000000601043b000004cc0060009c000000540000213d0000000901000039000000000201041a000004cc032001970000000005000411000000000053004b000004870000c13d000000000006004b000005750000c13d000004e801000041000000800010043f000000840000043f00000528010000410000130d000104300000000001000416000000000001004b000000540000c13d0000000001030019130b0ccb0000040f130b0f3a0000040f00000000010000190000130c0001042e0000000001000416000000000001004b000000540000c13d0000000001030019130b0ccb0000040f000c00000001001d000b00000002001d000a00000003001d000000400100043d000900000001001d130b0bdc0000040f000000090100002900000000000104350000000c010000290000000b020000290000000a03000029130b0f3a0000040f0000000c010000290000000b020000290000000a030000290000000904000029130b12230000040f00000000010000190000130c0001042e0000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000401100370000000000201043b0000051f00200198000000540000c13d0000000101000039000005450020009c000004e00000213d000005480020009c000004e90000613d000005490020009c000004e90000613d000004e40000013d0000000002000416000000000002004b000000540000c13d000000240030008c000000540000413d0000000402100370000000000402043b000004c70040009c000000540000213d0000002302400039000000000032004b000000540000813d0000000405400039000000000251034f000000000202043b000004c70020009c000000540000213d00000024044000390000000006240019000000000036004b000000540000213d0000000903000039000000000303041a000004cc063001970000000003000411000000000036004b000005e60000c13d0000000e03000039000000000703041a000000010070019000000001067002700000007f0660618f0000001f0060008c00000000080000390000000108002039000000000778013f00000001007001900000033b0000c13d000000200060008c000003be0000413d0000001f0720003900000005077002700000053f0770009a000000200020008c0000052b070040410000001f0660003900000005066002700000053f0660009a000000000067004b000003be0000813d000000000007041b0000000107700039000000000067004b000003ba0000413d0000001f0020008c0000063c0000a13d000004d306200198000006600000c13d0000052b0500004100000000070000190000066a0000013d0000000001000416000000000001004b000000540000c13d0000001001000039000000000101041a000004cc01100197000000800010043f0000052a010000410000130c0001042e0000000002000416000000000002004b000000540000c13d000000640030008c000000540000413d0000000402100370000000000202043b000004c70020009c000000540000213d000000040420003900000000024300490000054b0020009c000000540000213d000000c00020008c000000540000413d0000014002000039000000400020043f000000000541034f000000000505043b000004cc0050009c000000540000213d000000800050043f0000002005400039000000000651034f000000000606043b000004cc0060009c000000540000213d000000a00060043f0000002006500039000000000661034f000000000606043b000000c00060043f0000004006500039000000000661034f000000000606043b000000e00060043f0000006006500039000000000661034f000000000606043b000001000060043f0000008005500039000000000551034f000000000505043b000004c70050009c000000540000213d00000000044500190000001f05400039000000000035004b000000540000813d000000000541034f000000000505043b000004c70050009c000008590000213d0000001f06500039000004c9066001970000054c0060009c000008590000213d00000020044000390000003f06600039000004c9066001970000014006600039000000400060043f000001400050043f0000000006450019000000000036004b000000540000213d000000000741034f0000054e085001980000001f0950018f00000160068000390000041b0000613d000001600a000039000000000b07034f00000000bc0b043c000000000aca043600000000006a004b000004170000c13d000000000009004b000004280000613d000000000787034f0000000308900210000000000906043300000000098901cf000000000989022f000000000707043b0000010008800089000000000787022f00000000078701cf000000000797019f000000000076043500000160055000390000000000050435000001200020043f0000002402100370000000000602043b000004c70060009c000000540000213d0000002302600039000000000032004b000000540000813d0000000407600039000000000271034f000000000502043b000004c70050009c000008590000213d0000001f02500039000004c9022001970000003f02200039000004ca08200197000000400200043d0000000008820019000000000028004b00000000090000390000000109004039000004c70080009c000008590000213d0000000100900190000008590000c13d0000002409600039000000400080043f00000000065204360000000008950019000000000038004b000000540000213d0000002003700039000000000731034f0000054e045001980000001f0850018f0000000003460019000004560000613d000000000907034f000000000a060019000000009b09043c000000000aba043600000000003a004b000004520000c13d000000000008004b000004630000613d000000000447034f0000000307800210000000000803043300000000087801cf000000000878022f000000000404043b0000010007700089000000000474022f00000000047401cf000000000484019f0000000000430435000000000356001900000000000304350000004401100370000000000301043b000004cc0030009c000000540000213d0000008001000039130b0d8b0000040f000002cc0000013d0000000003010433000004cc043001970000000003000410000000000043004b0000047f0000c13d00000020031000390000000003030433000004cc043001970000000003000411000000000043004b0000047f0000c13d0000000f03000039000000000303041a000004cc03300197000b00000001001d130b0d8b0000040f0000000b02000029000000000001004b000005810000c13d000000400100043d00000525020000410000000000210435000004c40010009c000004c401008041000000400110021000000522011001c70000130d000104300000052701000041000000800010043f000000840050043f00000528010000410000130d00010430000000800010043f000000000004004b000004940000613d000000000030043f000000000001004b000005170000c13d000000a001000039000005220000013d0000054d02200197000000a00020043f000000000001004b000000c001000039000000a001006039000005220000013d000000ff0320018f000000200030008c000005350000413d000000400100043d0000053b02000041000004810000013d000000000010043f0000000501000039000000200010043f00000040020000390000000001000019130b12ec0000040f000002190000013d0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000201041a000000010320019000000001052002700000007f0550618f0000001f0050008c00000000040000390000000104002039000000000424013f00000001004001900000033b0000c13d000000400900043d0000000008590436000000000003004b000005ef0000613d000800000005001d000900000009001d000a00000008001d000000000010043f0000000001000414000004c40010009c000004c401008041000000c001100210000004d5011001c70000801002000039130b13060000040f0000000100200190000000540000613d0000000805000029000000000005004b00000000020000190000000a080000290000000909000029000005f40000613d000000000101043b00000000020000190000000003280019000000000401041a000000000043043500000001011000390000002002200039000000000052004b000004d80000413d000005f40000013d000005460020009c000004e90000613d000005470020009c000004e90000613d000005480020009c000000000100003900000001010060390000054a0020009c00000001011061bf000000010110018f000000800010043f0000052a010000410000130c0001042e0000000001000411000000000001004b000005890000613d000000000015004b000005890000613d000a00000005001d000000000050043f0000000701000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000101041a000000ff001001900000000a050000290000000003000411000005890000c13d000000400100043d000005420200004100000000002104350000000402100039000003270000013d000005380200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000014004b000005190000413d000000c001300039000000800210008a0000008001000039130b0be70000040f0000002001000039000000400200043d000c00000002001d00000000021204360000008001000039130b0cb90000040f0000000c020000290000000001210049000004c40010009c000004c4010080410000006001100210000004c40020009c000004c4020080410000004002200210000000000121019f0000130c0001042e000000400500043d000004ce0050009c000008590000213d0000004004500039000000400040043f00000020045000390000000000240435000c00000005001d0000000000350435000005af0000013d0000052702000041000000800020043f000000840010043f00000528010000410000130d000104300000000001000411000000000010043f0000000701000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000201041a0000054d022001970000000b03000029000000000232019f000000000021041b000000400100043d0000000000310435000004c40010009c000004c40100804100000040011002100000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f000004d5011001c70000800d020000390000000303000039000005360400004100000000050004110000000c060000290000002e0000013d000004d602200197000000000262019f000000000021041b0000000001000414000004c40010009c000004c401008041000000c001100210000004d7011001c70000800d020000390000000303000039000004d8040000410000002e0000013d000000800320003900000000010304330000000002000416000000000012004b000005eb0000813d000000400100043d0000052402000041000004810000013d0000000001000414000004c40010009c000004c401008041000000c001100210000004d7011001c70000800d02000039000000040300003900000543040000410000000c060000290000000b07000029130b13010000040f0000000100200190000000540000613d0000000b01000029000000000010043f0000000601000039000000200010043f00000040020000390000000001000019130b12ec0000040f000001a60000013d0000054d044001970000000000430435000000000002004b000000200400003900000000040060390000003f024000390000054e032001970000000002830019000000000032004b00000000030000390000000103004039000004c70020009c000008590000213d0000000100300190000008590000c13d000c00000008001d000000400020043f0000000002000415000000000121004900000000010000020000053901000041000000000010044300000000010004120000000400100443000000c00100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f000000010020019000000b310000613d000000000301043b0000000002000415000000ff0030008c0000061c0000c13d0000000b06000039000000000506041a000000010750019000000001035002700000007f0330618f0000001f0030008c00000000010000390000000101002039000000000151013f00000001001001900000033b0000c13d000000400100043d0000000004310436000000000007004b0000067b0000613d000000000060043f000000000003004b0000000005000019000006800000613d000004dd0600004100000000050000190000000007540019000000000806041a000000000087043500000001066000390000002005500039000000000035004b000005da0000413d000006800000013d000000000003004b000006280000c13d000004e401000041000003530000013d0000052701000041000000800010043f000000840030043f00000528010000410000130d00010430000006310000a13d000000400100043d0000052302000041000004810000013d0000054d012001970000000000180435000000000005004b000000200200003900000000020060390000003f012000390000054e011001970000000002910019000000000012004b00000000010000390000000101004039000004c70020009c000008590000213d0000000100100190000008590000c13d000000400020043f0000000e01000039000000000401041a000000010540019000000001014002700000007f0110618f0000001f0010008c00000000030000390000000103002039000000000343013f00000001003001900000033b0000c13d0000000003120436000000000005004b000006ee0000613d0000000e04000039000000000040043f000000000001004b0000000004000019000006f30000613d0000052b0500004100000000040000190000000006340019000000000705041a000000000076043500000001055000390000002004400039000000000014004b000006140000413d000006f30000013d000000ff0430018f0000001f0040008c0000049d0000213d000000400100043d000004ce0010009c000008590000213d0000004005100039000000400050043f0000002005100039000000000035043500000000004104350000068b0000013d000b00000003001d0000008001000039130b0bd10000040f0000000c01000029000000a0011002100000000b011001af000000000010041b00000000010000190000130c0001042e000a00000003001d0000000c01000039000000000201041a000000010220003a000006480000c13d0000054001000041000000000010043f0000001101000039000000040010043f000004e5010000410000130d00010430000000000002004b0000000004000019000006420000613d0000002004500039000000000141034f000000000401043b00000003012002100000054f0110027f0000054f01100167000000000414016f0000000101200210000006770000013d000000000021041b000000400100043d000900000001001d000005160010009c000008590000213d0000000b010000290000006001100039000700000001001d0000000001010433000800000001001d00000009020000290000002001200039000600000001001d000000400010043f00000000000204350000000001000411000000000001004b000007030000c13d000000400100043d0000051e02000041000000000021043500000004021000390000000000020435000003280000013d0000052b0500004100000000070000190000000008740019000000000881034f000000000808043b000000000085041b00000001055000390000002007700039000000000067004b000006620000413d000000000026004b000006750000613d0000000306200210000000f80660018f0000054f0660027f0000054f066001670000000004740019000000000141034f000000000101043b000000000161016f000000000015041b00000001010000390000000104200210000000000114019f000000000013041b00000000010000190000130c0001042e0000054d055001970000000000540435000000000003004b000000200500003900000000050060390000003f035000390000054e043001970000000003140019000000000043004b00000000040000390000000104004039000004c70030009c000008590000213d0000000100400190000008590000c13d000000400030043f000000000300041500000000023200490000000002000002000000400200043d000b00000002001d000005160020009c0000000c04000029000008590000213d0000000b030000290000002002300039000800000002001d000000400020043f0000000000030435000000400500043d0000002002500039000000e00300003900000000003204350000053c020000410000000000250435000000e00250003900000000430404340000000000320435000c00000005001d0000010002500039000000000003004b000006ad0000613d000000000500001900000000062500190000000007540019000000000707043300000000007604350000002005500039000000000035004b000006a60000413d000000000423001900000000000404350000001f033000390000054e0330019700000000022300190000000c0400002900000000034200490000004004400039000000000034043500000000160104340000000005620436000000000006004b000006c20000613d000000000200001900000000035200190000000004210019000000000404043300000000004304350000002002200039000000000062004b000006bb0000413d000a00000005001d000900000006001d00000000015600190000000000010435000004df0100004100000000001004430000000001000414000004c40010009c000004c401008041000000c001100210000004e0011001c70000800b02000039130b13060000040f000000010020019000000b310000613d000000000101043b0000000c040000290000008002400039000000000300041000000000003204350000006002400039000000000012043500000009010000290000001f011000390000054e011001970000000a011000290000000002410049000000c0034000390000000000230435000000a00240003900000000000204350000000b0200002900000000020204330000000001210436000000000002004b0000052b0000613d00000000030000190000000805000029000000005405043400000000014104360000000103300039000000000023004b000006e80000413d0000052b0000013d0000054d044001970000000000430435000000000001004b000000200400003900000000040060390000003f014000390000054e041001970000000001240019000000000041004b00000000040000390000000104004039000004c70010009c000008590000213d0000000100400190000008590000c13d000000400010043f0000000002020433000000000002004b000007b10000c13d0000000001090019000008090000013d0000000801000029000000000010043f0000000401000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000101041a000504cc0010019c0000080d0000c13d0000000001000411000000000010043f0000000501000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000201041a0000000102200039000000000021041b0000000801000029000000000010043f0000000401000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000201041a000004d6022001970000000006000411000000000262019f000000000021041b0000000001000414000004c40010009c000004c401008041000000c001100210000004d7011001c70000800d020000390000000403000039000005180400004100000005050000290000000807000029130b13010000040f0000000100200190000000540000613d000000050000006b000008b80000c13d0000051a010000410000000000100443000000000100041100000004001004430000000001000414000004c40010009c000004c401008041000000c0011002100000051b011001c70000800202000039130b13060000040f000000010020019000000b310000613d000000000101043b000000000001004b000009260000c13d0000000b01000029000000a0011000390000000001010433000c00000001001d00000007010000290000000001010433000b00000001001d000000000010043f0000000801000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000900000001001d0000000c010000290000000021010434000700000002001d000800000001001d000004c70010009c000008590000213d0000000901000029000000000101041a000000010010019000000001021002700000007f0220618f000600000002001d0000001f0020008c00000000020000390000000102002039000000000112013f00000001001001900000033b0000c13d0000000601000029000000200010008c0000079d0000413d0000000901000029000000000010043f0000000001000414000004c40010009c000004c401008041000000c001100210000004d5011001c70000801002000039130b13060000040f0000000100200190000000540000613d00000008030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000006010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b0000079d0000813d000000000002041b0000000102200039000000000012004b000007990000413d00000008010000290000001f0010008c00000a7b0000a13d0000000901000029000000000010043f0000000001000414000004c40010009c000004c401008041000000c001100210000004d5011001c70000801002000039130b13060000040f0000000100200190000000540000613d0000000802000029000004d302200198000000000101043b00000b320000c13d000000200300003900000b3f0000013d0000000004090433000000000004004b000007e30000c13d0000000c01000029000000000010043f0000000401000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000101041a000004cc00100198000002ff0000613d0000000e01000039000000000301041a000000010530019000000001013002700000007f0110618f0000001f0010008c00000000020000390000000102002039000000000232013f00000001002001900000033b0000c13d000000400400043d0000000002140436000000000005004b0000089e0000613d0000000e03000039000000000030043f000000000001004b0000000003000019000008a30000613d0000052b0500004100000000030000190000000006230019000000000705041a000000000076043500000001055000390000002003300039000000000013004b000007db0000413d000008a30000013d0000002004100039000000000500001900000000064500190000000007530019000000000707043300000000007604350000002005500039000000000025004b000007e50000413d000000000342001900000000000304350000000004090433000000000004004b000007f90000613d000000000500001900000000063500190000000007580019000000000707043300000000007604350000002005500039000000000045004b000007f20000413d00000000033400190000000000030435000000000224001900000000002104350000003f022000390000054e032001970000000002130019000000000032004b00000000030000390000000103004039000004c70020009c000008590000213d0000000100300190000008590000c13d0000004003000039000000000023043500000000020004150000000b022000690000000002000002000002e00000013d0000000801000029000000000010043f0000000601000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000201041a000004d602200197000000000021041b0000000501000029000000000010043f0000000501000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000000201041a000000010220008a000000000021041b000007140000013d000000000004004b0000000001000019000008340000613d000000000102043300000003024002100000054f0220027f0000054f02200167000000000121016f0000000102400210000000000121019f000008530000013d000004d2020000410000002005000039000000010760008a0000000507700270000004d40770009a00000000085100190000000008080433000000000082041b00000020055000390000000102200039000000000072004b000008400000c13d000000000046004b000008510000613d0000000306400210000000f80660018f0000054f0660027f0000054f0660016700000000015100190000000001010433000000000161016f000000000012041b000000010140021000000001011001bf000000000013041b0000000b010000290000000001010433000200000001001d000004c70010009c0000085f0000a13d0000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d000104300000000301000039000000000101041a000000010010019000000001021002700000007f0220618f000100000002001d0000001f0020008c00000000020000390000000102002039000000000112013f00000001001001900000033b0000c13d0000000101000029000000200010008c0000088a0000413d0000000301000039000000000010043f0000000001000414000004c40010009c000004c401008041000000c001100210000004d5011001c70000801002000039130b13060000040f0000000100200190000000540000613d00000002030000290000001f023000390000000502200270000000200030008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000013100190000000002230019000000000012004b0000088a0000813d000000000002041b0000000102200039000000000012004b000008860000413d00000002010000290000001f0010008c000008bb0000a13d0000000301000039000000000010043f0000000001000414000004c40010009c000004c401008041000000c001100210000004d5011001c70000801002000039130b13060000040f0000000100200190000000540000613d0000000202000029000004d302200198000000000101043b0000098b0000c13d0000002003000039000009980000013d0000054d033001970000000000320435000000000001004b000000200300003900000000030060390000003f013000390000054e011001970000000003410019000000000013004b00000000010000390000000101004039000004c70030009c000008590000213d0000000100100190000008590000c13d000000400030043f0000000001040433000000000001004b000008c80000c13d000005160030009c000008590000213d0000002001300039000000400010043f00000000020000190000000001030019000008080000013d000000400100043d00000519020000410000065c0000013d000000020000006b0000000001000019000008c00000613d0000000c010000290000000001010433000000020400002900000003024002100000054f0220027f0000054f02200167000000000121016f0000000102400210000000000121019f000009a60000013d0000000c010000290000052c0010009c000008cf0000413d00000040010000390000000c050000290000052c0550012a000008d80000013d0000000c050000290000052e0050009c0000052d0550212a000000000100003900000020010020390000052f0050009c00000010011081bf00000530055081970000052f0550812a000005310050009c0000000801108039000004c705508197000005310550812a000027100050008c0000000401108039000004c405508197000027100550811a000000640050008c00000002011080390000ffff0550818f000000640550811a000000090050008c00000001011020390000002005100039000004c9065001970000003f05600039000004ca055001970000000005350019000004c70050009c000008590000213d000000400050043f00000001051000390000000005530436000000000006004b000008fa0000613d0000000006650019000000000700003100000001077003670000000008050019000000007907043c0000000008980436000000000068004b000008f60000c13d000000000113001900000021011000390000000c08000029000000090080008c0000000a6880011a0000000306600210000000010110008a00000000070104330000053207700197000005330660021f0000053406600197000000000676019f0000000000610435000008fd0000213d000000400100043d00000020061000390000000004040433000000000004004b000009150000613d000000000700001900000000086700190000000009720019000000000909043300000000009804350000002007700039000000000047004b0000090e0000413d000000000264001900000000000204350000000003030433000000000003004b000009220000613d000000000600001900000000072600190000000008560019000000000808043300000000008704350000002006600039000000000036004b0000091b0000413d000000000223001900000000000204350000000002430019000007fc0000013d000000400300043d0000006401300039000000800200003900000000002104350000004401300039000000080200002900000000002104350000051c010000410000000000130435000000040130003900000000020004110000000000210435000000240130003900000000000104350000000901000029000000000101043300000084023000390000000000120435000500000003001d000000a402300039000000000001004b0000000606000029000009450000613d000000000300001900000000042300190000000005360019000000000505043300000000005404350000002003300039000000000013004b0000093e0000413d0000001f031000390000054e0330019700000000012100190000000000010435000000a401300039000004c40010009c000004c40100804100000060011002100000000502000029000004c40020009c000004c4020080410000004002200210000000000112019f0000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f0000000002000411130b13010000040f0000006003100270000004c403300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000505700029000009680000613d000000000801034f0000000509000029000000008a08043c0000000009a90436000000000059004b000009640000c13d000000000006004b000009750000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000009e50000613d0000001f01400039000000600210018f0000000501200029000000000021004b00000000020000390000000102004039000004c70010009c000008590000213d0000000100200190000008590000c13d000000400010043f000000200030008c000000540000413d000000050200002900000000020204330000051f00200198000000540000c13d0000051c0020009c000007570000613d00000a510000013d000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000b0600002900000000053600190000000005050433000000000051041b00000020033000390000000101100039000000000041004b000009910000c13d000000020020006c000009a30000613d00000002020000290000000302200210000000f80220018f0000054f0220027f0000054f022001670000000b033000290000000003030433000000000223016f000000000021041b0000000201000029000000010110021000000001011001bf0000000302000039000000000012041b0000000006000411000000000006004b000009ae0000c13d000000400100043d000004e8020000410000065c0000013d0000000901000039000000000201041a000004d603200197000000000363019f000000000031041b0000000001000414000004cc05200197000004c40010009c000004c401008041000000c001100210000004d7011001c70000800d020000390000000303000039000004d804000041130b13010000040f0000000100200190000000540000613d000000000100041500000006020000290000000002020433000000200020008c000009e90000413d000004c70020009c000008590000213d0000000a03000039000000000503041a000000010050019000000001045002700000007f0440618f0000001f0040008c00000000060000390000000106002039000000000556013f00000001005001900000033b0000c13d000000200040008c000009df0000413d0000001f0440003900000005044002700000001f052000390000000505500270000000000045004b000009df0000813d000004d90440009a000004d90550009a000000000005041b0000000105500039000000000045004b000009db0000413d000000000030043f000004d30620019800000a5f0000c13d0000002005000039000004da0400004100000a6c0000013d000000000003004b00000a260000c13d000000600200003900000a4d0000013d000000030320021000000100033000890000054f0330021f000000000002004b000000000300601900000004040000290000000004040433000000000334016f000000000223019f000000000300041500000000013100490000000001000002000001200020043f000000000100041500000005020000290000000002020433000000200020008c00000a1c0000413d000004c70020009c000008590000213d0000000b03000039000000000503041a000000010050019000000001045002700000007f0440618f0000001f0040008c00000000060000390000000106002039000000000556013f00000001005001900000033b0000c13d000000200040008c00000a160000413d0000001f0440003900000005044002700000001f052000390000000505500270000000000045004b00000a160000813d000004dc0440009a000004dc0550009a000000000005041b0000000105500039000000000045004b00000a120000413d000000000030043f000004d30620019800000a880000c13d0000002005000039000004dd0400004100000a950000013d000000030320021000000100033000890000054f0330021f000000000002004b000000000300601900000003040000290000000004040433000000000334016f000000000223019f00000aa30000013d0000001f02300039000004c5022001970000003f022000390000051d04200197000000400200043d0000000004420019000000000024004b00000000050000390000000105004039000004c70040009c000008590000213d0000000100500190000008590000c13d000000400040043f0000001f0430018f0000000006320436000004c605300198000c00000006001d000000000356001900000a400000613d000000000601034f0000000c07000029000000006806043c0000000007870436000000000037004b00000a3c0000c13d000000000004004b00000a4d0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000001020433000000000001004b00000a560000c13d000000400100043d0000051e02000041000000000021043500000004021000390000000003000411000003270000013d000004c40010009c000004c40100804100000060011002100000000c02000029000004c40020009c000004c4020080410000004002200210000000000112019f0000130d00010430000004da040000410000002005000039000000010760008a0000000507700270000004db0770009a000000060900002900000000089500190000000008080433000000000084041b00000020055000390000000104400039000000000074004b00000a650000c13d000000000026004b00000a760000613d0000000306200210000000f80660018f0000054f0660027f0000054f0660016700000006055000290000000005050433000000000565016f000000000054041b000000010220021000000001022001bf000000000023041b000000ff02000039000009f20000013d000000080000006b000000000100001900000a800000613d00000007010000290000000001010433000000080400002900000003024002100000054f0220027f0000054f02200167000000000121016f0000000102400210000000000121019f00000b4d0000013d000004dd040000410000002005000039000000010760008a0000000507700270000004de0770009a000000050900002900000000089500190000000008080433000000000084041b00000020055000390000000104400039000000000074004b00000a8e0000c13d000000000026004b00000a9f0000613d0000000306200210000000f80660018f0000054f0660027f0000054f0660016700000005055000290000000005050433000000000565016f000000000054041b000000010220021000000001022001bf000000000023041b000000ff02000039000000000300041500000000013100490000000001000002000001400020043f0000000401000029000004c40010009c000004c401008041000000400110021000000006020000290000000002020433000004c40020009c000004c4020080410000006002200210000000000112019f0000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f000004d7011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000c00000001001d000000e00010043f0000000301000029000004c40010009c000004c401008041000000400110021000000005020000290000000002020433000004c40020009c000004c4020080410000006002200210000000000112019f0000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f000004d7011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000b00000001001d000001000010043f000004df0100004100000000001004430000000001000414000004c40010009c000004c401008041000000c001100210000004e0011001c70000800b02000039130b13060000040f000000010020019000000b310000613d000000000101043b000000a00010043f000000400300043d0000008002300039000000000012043500000060013000390000000b02000029000000000021043500000040013000390000000c020000290000000000210435000000a0010000390000000001130436000000a00230003900000000040004100000000000420435000004e1020000410000000000210435000c00000003001d000004e20030009c000008590000213d0000000c02000029000000c003200039000b00000003001d000000400030043f000004c40010009c000004c40100804100000040011002100000000002020433000004c40020009c000004c4020080410000006002200210000000000121019f0000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f000004d7011001c70000801002000039130b13060000040f0000000100200190000000540000613d000000000101043b000000800010043f0000000001000410000000c00010043f0000000c01000039000000000001041b0000000d01000039000000000201041a0000054d02200197000000000021041b0000000f01000039000000000201041a000004d60220019700000008022001af000000000021041b0000001001000039000000000201041a000004d60220019700000007022001af000000000021041b0000000901000029000027110010008c00000ba00000413d000004e6010000410000000b0400002900000000001404350000000c03000029000000e40130003900002710020000390000000000210435000000c40130003900000009020000290000000000210435000004c40040009c000004c4040080410000004001400210000004e7011001c70000130d00010430000000000001042f000000010320008a00000005033002700000000004310019000000200300003900000001044000390000000c0600002900000000056300190000000005050433000000000051041b00000020033000390000000101100039000000000041004b00000b380000c13d000000080020006c00000b4a0000613d00000008020000290000000302200210000000f80220018f0000054f0220027f0000054f022001670000000c033000290000000003030433000000000223016f000000000021041b0000000801000029000000010110021000000001011001bf0000000902000029000000000012041b000000400100043d0000000b020000290000000000210435000004c40010009c000004c40100804100000040011002100000000002000414000004c40020009c000004c402008041000000c002200210000000000121019f000004d5011001c70000800d0200003900000001030000390000052004000041130b13010000040f0000000100200190000000540000613d0000001001000039000000000101041a000004cc041001970000000a0100002900000000030104330000000001000414000004c40010009c000004c401008041000000c001100210000000000003004b00000b6e0000c13d000000000204001900000b710000013d000004d7011001c700008009020000390000000005000019130b13010000040f0000006003100270000004c40330019800000b7a0000c13d0000000100200190000000310000c13d000000400100043d0000052102000041000004810000013d0000001f04300039000004c5044001970000003f044000390000051d04400197000000400500043d0000000004450019000000000054004b00000000060000390000000106004039000004c70040009c000008590000213d0000000100600190000008590000c13d000000400040043f0000001f0430018f0000000006350436000004c605300198000000000356001900000b920000613d000000000701034f000000007807043c0000000006860436000000000036004b00000b8e0000c13d000000000004004b00000b750000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000b750000013d000000400100043d0000000a0000006b00000ba50000c13d000004e4020000410000065c0000013d000004ce0010009c000008590000213d0000004002100039000000400020043f0000002002100039000000090300002900000000003204350000000a020000290000000000210435000000a001300210000000000112019f000000000010041b000000800100043d000001400000044300000160001004430000002001000039000000a00200043d0000018000100443000001a0002004430000004002000039000000c00300043d000001c000200443000001e0003004430000006002000039000000e00300043d000002000020044300000220003004430000008002000039000001000300043d00000240002004430000026000300443000001200200043d000000a0030000390000028000300443000002a000200443000000c002000039000001400300043d000002c000200443000002e000300443000001000010044300000007010000390000012000100443000004e3010000410000130c0001042e000005500010009c00000bd60000813d0000004001100039000000400010043f000000000001042d0000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d00010430000004d30010009c00000be10000813d0000002001100039000000400010043f000000000001042d0000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d000104300000001f022000390000054e022001970000000001120019000000000021004b00000000020000390000000102004039000004c70010009c00000bf30000213d000000010020019000000bf30000c13d000000400010043f000000000001042d0000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d00010430000000000301001900000000011200490000054b0010009c00000c670000213d000000bf0010008c00000c670000a13d000000400100043d000005510010009c00000c690000813d000000c004100039000000400040043f0000000104000367000000000534034f000000000505043b000004cc0050009c00000c670000213d00000000065104360000002005300039000000000754034f000000000707043b000004cc0070009c00000c670000213d00000000007604350000002006500039000000000664034f000000000606043b000000400710003900000000006704350000004006500039000000000664034f000000000606043b000000600710003900000000006704350000006006500039000000000664034f000000000606043b000000800710003900000000006704350000008005500039000000000554034f000000000505043b000004c70050009c00000c670000213d00000000063500190000001f03600039000000000023004b0000000005000019000004cb05008041000004cb03300197000004cb07200197000000000873013f000000000073004b0000000003000019000004cb03004041000004cb0080009c000000000305c019000000000003004b00000c670000c13d000000000364034f000000000303043b000004c70030009c00000c690000213d0000001f05300039000004c9055001970000003f05500039000004ca07500197000000400500043d0000000007750019000000000057004b00000000080000390000000108004039000004c70070009c00000c690000213d000000010080019000000c690000c13d0000002008600039000000400070043f00000000063504360000000007830019000000000027004b00000c670000213d000000000484034f0000054e073001980000001f0830018f000000000276001900000c550000613d000000000904034f000000000a060019000000009b09043c000000000aba043600000000002a004b00000c510000c13d000000000008004b00000c620000613d000000000474034f0000000307800210000000000802043300000000087801cf000000000878022f000000000404043b0000010007700089000000000474022f00000000047401cf000000000484019f000000000042043500000000023600190000000000020435000000a0021000390000000000520435000000000001042d00000000010000190000130d000104300000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d0001043000000000030100190000001f01100039000000000021004b0000000004000019000004cb04004041000004cb05200197000004cb01100197000000000651013f000000000051004b0000000001000019000004cb01002041000004cb0060009c000000000104c019000000000001004b00000cb10000613d0000000105000367000000000135034f000000000401043b000004c80040009c00000cb30000813d0000001f01400039000004c9011001970000003f01100039000004ca06100197000000400100043d0000000006610019000000000016004b00000000070000390000000107004039000004c70060009c00000cb30000213d000000010070019000000cb30000c13d0000002007300039000000400060043f00000000034104360000000006740019000000000026004b00000cb10000213d000000000575034f0000054e064001980000001f0740018f000000000263001900000ca10000613d000000000805034f0000000009030019000000008a08043c0000000009a90436000000000029004b00000c9d0000c13d000000000007004b00000cae0000613d000000000565034f0000000306700210000000000702043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f000000000052043500000000024300190000000000020435000000000001042d00000000010000190000130d000104300000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d0001043000000000430104340000000001320436000000000003004b00000cc50000613d000000000200001900000000051200190000000006240019000000000606043300000000006504350000002002200039000000000032004b00000cbe0000413d000000000213001900000000000204350000001f023000390000054e022001970000000001210019000000000001042d0000054b0010009c00000cdb0000213d000000630010008c00000cdb0000a13d00000001030003670000000401300370000000000101043b000004cc0010009c00000cdb0000213d0000002402300370000000000202043b000004cc0020009c00000cdb0000213d0000004403300370000000000303043b000000000001042d00000000010000190000130d000104300000054b0010009c00000d830000213d0000000003010019000000430010008c00000d830000a13d00000001040003670000000401400370000000000101043b000004c70010009c00000d830000213d000000040210003900000000012300490000054b0010009c00000d830000213d000000c00010008c00000d830000413d000000400100043d000005510010009c00000d850000813d000000c005100039000000400050043f000000000524034f000000000505043b000004cc0050009c00000d830000213d00000000065104360000002005200039000000000754034f000000000707043b000004cc0070009c00000d830000213d00000000007604350000002006500039000000000664034f000000000606043b000000400710003900000000006704350000004006500039000000000664034f000000000606043b000000600710003900000000006704350000006006500039000000000664034f000000000606043b000000800710003900000000006704350000008005500039000000000554034f000000000505043b000004c70050009c00000d830000213d00000000052500190000001f02500039000000000032004b00000d830000813d000000000254034f000000000202043b000004c70020009c00000d850000213d0000001f06200039000004c9066001970000003f06600039000004ca07600197000000400600043d0000000007760019000000000067004b00000000080000390000000108004039000004c70070009c00000d850000213d000000010080019000000d850000c13d0000002005500039000000400070043f00000000072604360000000008520019000000000038004b00000d830000213d000000000954034f0000054e0a2001980000001f0b20018f0000000008a7001900000d370000613d000000000c09034f000000000d07001900000000ce0c043c000000000ded043600000000008d004b00000d330000c13d00000000000b004b00000d440000613d0000000009a9034f000000030ab00210000000000b080433000000000bab01cf000000000bab022f000000000909043b000001000aa000890000000009a9022f0000000009a901cf0000000009b9019f000000000098043500000000022700190000000000020435000000a00210003900000000006204350000002402400370000000000702043b000004c70070009c00000d830000213d0000002302700039000000000032004b00000d830000813d0000000408700039000000000284034f000000000602043b000004c70060009c00000d850000213d0000001f02600039000004c9022001970000003f02200039000004ca09200197000000400200043d0000000009920019000000000029004b000000000a000039000000010a004039000004c70090009c00000d850000213d0000000100a0019000000d850000c13d000000240a700039000000400090043f00000000076204360000000009a60019000000000039004b00000d830000213d0000002003800039000000000434034f0000054e056001980000001f0860018f000000000357001900000d730000613d000000000904034f000000000a070019000000009b09043c000000000aba043600000000003a004b00000d6f0000c13d000000000008004b00000d800000613d000000000454034f0000000305800210000000000803043300000000085801cf000000000858022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000484019f000000000043043500000000036700190000000000030435000000000001042d00000000010000190000130d000104300000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d000104300008000000000002000200000003001d000300000002001d000000a00210003900000000020204330000002003200039000004c40030009c000004c40300804100000040033002100000000002020433000004c40020009c000004c4020080410000006002200210000000000232019f00000080031000390000000003030433000500000003001d00000060031000390000000003030433000600000003001d00000020031000390000000003030433000700000003001d0000000003010433000800000003001d0000004001100039000100000001001d0000000001010433000400000001001d0000000001000414000004c40010009c000004c401008041000000c001100210000000000121019f000004d7011001c70000801002000039130b13060000040f000000010020019000000efa0000613d000000000201043b000000400100043d000000e0031000390000000000230435000000c00210003900000005030000290000000000320435000000a002100039000000060300002900000000003204350000008002100039000000040300002900000000003204350000000702000029000004cc02200197000000600310003900000000002304350000000802000029000004cc022001970000004003100039000000000023043500000020021000390000053d030000410000000000320435000000e0030000390000000000310435000005520010009c00000efc0000813d0000010003100039000000400030043f000004c40020009c000004c40200804100000040022002100000000001010433000004c40010009c000004c4010080410000006001100210000000000121019f0000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f000004d7011001c70000801002000039130b13060000040f000000010020019000000efa0000613d000000000101043b000700000001001d0000000001000415000600000001001d0000053901000041000000000010044300000000010004120000000400100443000000400100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f000000010020019000000ef90000613d000000000101043b000004cc011001970000000002000410000000000012004b00000e280000c13d0000053901000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f000000010020019000000ef90000613d000000000101043b000800000001001d000004df0100004100000000001004430000000001000414000004c40010009c000004c401008041000000c001100210000004e0011001c70000800b02000039130b13060000040f000000010020019000000ef90000613d000000000101043b000000080010006c00000e280000c13d000005390100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f000000010020019000000e800000c13d00000ef90000013d000000400100043d000800000001001d0000002002100039000004e101000041000500000002001d00000000001204350000053901000041000000000010044300000000010004120000000400100443000000600100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f000000010020019000000ef90000613d000000000101043b0000000802000029000000400220003900000000001204350000053901000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f000000010020019000000ef90000613d000000000101043b000000080200002900000060022000390000000000120435000004df0100004100000000001004430000000001000414000004c40010009c000004c401008041000000c001100210000004e0011001c70000800b02000039130b13060000040f000000010020019000000ef90000613d000000000101043b0000000804000029000000a0024000390000000003000410000000000032043500000080024000390000000000120435000000a0010000390000000000140435000004e20040009c00000efc0000213d0000000802000029000000c001200039000000400010043f0000000501000029000004c40010009c000004c40100804100000040011002100000000002020433000004c40020009c000004c4020080410000006002200210000000000112019f0000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f000004d7011001c70000801002000039130b13060000040f000000010020019000000efa0000613d000000000101043b000000000200041500000006022000690000000002000002000000400200043d0000002203200039000000070400002900000000004304350000055303000041000000000032043500000002032000390000000000130435000004c40020009c000004c40200804100000040012002100000000002000414000004c40020009c000004c402008041000000c002200210000000000121019f00000554011001c70000801002000039130b13060000040f000000010020019000000efa0000613d000000000101043b000000000500041500000003040000290000000032040434000000410020008c00000f020000c13d000800000005001d00000040024000390000000002020433000005560020009c00000f070000213d000000600440003900000000040404330000000003030433000000400500043d0000006006500039000000000026043500000040025000390000000000320435000000f802400270000000200350003900000000002304350000000000150435000000000000043f000004c40050009c000004c40500804100000040015002100000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f00000557011001c70000000102000039130b13060000040f0000006003100270000004c403300197000000200030008c000000200400003900000000040340190000001f0540018f000000200440019000000eca0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b00000ec60000c13d000000000005004b00000ed70000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000000010020019000000f140000613d000000000100043d000000000200041500000008022000690000000002000002000004cc0010019800000f320000613d000000020110014f000004cc00100198000000000100001900000ee50000613d000000010110018f000000000001042d00000001010000290000000001010433000800000001001d000005580100004100000000001004430000000001000414000004c40010009c000004c401008041000000c001100210000004e0011001c70000800b02000039130b13060000040f000000010020019000000ef90000613d000000000101043b000000080010006b00000000010000390000000101008039000000010110018f000000000001042d000000000001042f00000000010000190000130d000104300000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d00010430000000000100041500000000011500490000000001000002000005550100004100000f0b0000013d0000000001000415000000080110006900000000010000020000055a01000041000000400300043d000000000013043500000004013000390000000000210435000004c40030009c000004c4030080410000004001300210000004e5011001c70000130d000104300000001f0530018f000004c606300198000000400200043d000000000462001900000f1f0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000f1b0000c13d000000000005004b00000f2c0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000004c40020009c000004c4020080410000004002200210000000000112019f0000130d00010430000000400100043d00000559020000410000000000210435000004c40010009c000004c401008041000000400110021000000522011001c70000130d000104300004000000000002000100000001001d000204cc0020019c00000fe40000613d000300000003001d000000000030043f0000000401000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f000000010020019000000fe20000613d000000000101043b000000000101041a000004cc041001970000000001000411000000000001004b000400000004001d00000f860000613d000000000014004b00000f860000613d000000000040043f0000000701000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f000000010020019000000fe20000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f000000010020019000000fe20000613d000000000101043b000000000101041a000000ff00100190000000040400002900000f860000c13d0000000301000029000000000010043f0000000601000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f000000010020019000000fe20000613d000000000101043b000000000101041a000004cc011001970000000002000411000000000021004b000000040400002900000ffd0000c13d000000000004004b000000050200003900000fac0000613d0000000301000029000000000010043f0000000601000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f000000010020019000000fe20000613d000000000101043b000000000201041a000004d602200197000000000021041b0000000401000029000000000010043f0000000501000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f000000010020019000000fe20000613d000000000101043b000000000201041a000000010220008a000000000021041b00000005020000390000000201000029000000000010043f000000200020043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f000000010020019000000fe20000613d000000000101043b000000000201041a0000000102200039000000000021041b0000000301000029000000000010043f0000000401000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f000000010020019000000fe20000613d000000000101043b000000000201041a000004d6022001970000000206000029000000000262019f000000000021041b0000000001000414000004c40010009c000004c401008041000000c001100210000004d7011001c70000800d020000390000000403000039000005180400004100000004050000290000000307000029130b13010000040f000000010020019000000fe20000613d0000000101000029000004cc011001970000000404000029000000000014004b00000fee0000c13d000000000001042d00000000010000190000130d00010430000000400100043d0000051e02000041000000000021043500000004021000390000000000020435000004c40010009c000004c4010080410000004001100210000004e5011001c70000130d00010430000000400200043d000000440320003900000000004304350000002403200039000000030400002900000000004304350000055c03000041000000000032043500000004032000390000000000130435000004c40020009c000004c40200804100000040012002100000055d011001c70000130d00010430000000400100043d0000000403100039000004c40010009c000004c40200004100000000020140190000004002200210000000000004004b0000100b0000c13d0000053504000041000000000041043500000003010000290000000000130435000004e5012001c70000130d000104300000055b0400004100000000004104350000000004000411000004cc044001970000000000430435000000240110003900000003030000290000000000310435000004e7012001c70000130d000104300005000000000002000000a00210003900000000020204330000002003200039000004c40030009c000004c40300804100000040033002100000000002020433000004c40020009c000004c4020080410000006002200210000000000232019f00000080031000390000000003030433000200000003001d00000060031000390000000003030433000300000003001d00000040031000390000000003030433000400000003001d0000000013010434000500000003001d0000000001010433000100000001001d0000000001000414000004c40010009c000004c401008041000000c001100210000000000121019f000004d7011001c70000801002000039130b13060000040f0000000100200190000010570000613d000000000201043b000000400100043d000000e0031000390000000000230435000000c00210003900000002030000290000000000320435000000a002100039000000030300002900000000003204350000008002100039000000040300002900000000003204350000000102000029000004cc02200197000000600310003900000000002304350000000502000029000004cc022001970000004003100039000000000023043500000020021000390000053d030000410000000000320435000000e0020000390000000000210435000005520010009c000010590000813d0000010002100039000000400020043f000000000001042d00000000010000190000130d000104300000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d000104300006000000000002000100000002001d000000a00210003900000000020204330000002003200039000004c40030009c000004c40300804100000040033002100000000002020433000004c40020009c000004c4020080410000006002200210000000000232019f00000080031000390000000003030433000300000003001d00000060031000390000000003030433000400000003001d00000040031000390000000003030433000500000003001d0000000013010434000600000003001d0000000001010433000200000001001d0000000001000414000004c40010009c000004c401008041000000c001100210000000000121019f000004d7011001c70000801002000039130b13060000040f0000000100200190000011b20000613d000000000201043b000000400100043d000000e0031000390000000000230435000000c00210003900000003030000290000000000320435000000a002100039000000040300002900000000003204350000008002100039000000050300002900000000003204350000000202000029000004cc02200197000000600310003900000000002304350000000602000029000004cc022001970000004003100039000000000023043500000020021000390000053d030000410000000000320435000000e0030000390000000000310435000005520010009c000011b40000813d0000010003100039000000400030043f000004c40020009c000004c40200804100000040022002100000000001010433000004c40010009c000004c4010080410000006001100210000000000121019f0000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f000004d7011001c70000801002000039130b13060000040f0000000100200190000011b20000613d000000000101043b000500000001001d0000000001000415000400000001001d0000053901000041000000000010044300000000010004120000000400100443000000400100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f0000000100200190000011b10000613d000000000101043b000004cc011001970000000002000410000000000012004b000010f90000c13d0000053901000041000000000010044300000000010004120000000400100443000000200100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f0000000100200190000011b10000613d000000000101043b000600000001001d000004df0100004100000000001004430000000001000414000004c40010009c000004c401008041000000c001100210000004e0011001c70000800b02000039130b13060000040f0000000100200190000011b10000613d000000000101043b000000060010006c000010f90000c13d000005390100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f0000000100200190000011510000c13d000011b10000013d000000400100043d000600000001001d0000002002100039000004e101000041000300000002001d00000000001204350000053901000041000000000010044300000000010004120000000400100443000000600100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f0000000100200190000011b10000613d000000000101043b0000000602000029000000400220003900000000001204350000053901000041000000000010044300000000010004120000000400100443000000800100003900000024001004430000000001000414000004c40010009c000004c401008041000000c0011002100000053a011001c70000800502000039130b13060000040f0000000100200190000011b10000613d000000000101043b000000060200002900000060022000390000000000120435000004df0100004100000000001004430000000001000414000004c40010009c000004c401008041000000c001100210000004e0011001c70000800b02000039130b13060000040f0000000100200190000011b10000613d000000000101043b0000000604000029000000a0024000390000000003000410000000000032043500000080024000390000000000120435000000a0010000390000000000140435000004e20040009c000011b40000213d0000000602000029000000c001200039000000400010043f0000000301000029000004c40010009c000004c40100804100000040011002100000000002020433000004c40020009c000004c4020080410000006002200210000000000112019f0000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f000004d7011001c70000801002000039130b13060000040f0000000100200190000011b20000613d000000000101043b000000000200041500000004022000690000000002000002000000400200043d0000002203200039000000050400002900000000004304350000055303000041000000000032043500000002032000390000000000130435000004c40020009c000004c40200804100000040012002100000000002000414000004c40020009c000004c402008041000000c002200210000000000121019f00000554011001c70000801002000039130b13060000040f0000000100200190000011b20000613d000000000101043b000000000500041500000001040000290000000032040434000000410020008c000011ba0000c13d000600000005001d00000040024000390000000002020433000005560020009c000011bf0000213d000000600440003900000000040404330000000003030433000000400500043d0000006006500039000000000026043500000040025000390000000000320435000000f802400270000000200350003900000000002304350000000000150435000000000000043f000004c40050009c000004c40500804100000040015002100000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f00000557011001c70000000102000039130b13060000040f0000006003100270000004c403300197000000200030008c000000200400003900000000040340190000001f0540018f00000020044001900000119b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000011970000c13d000000000005004b000011a80000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f00000000005404350000000100200190000011cc0000613d000000000100043d000000000200041500000006022000690000000002000002000004cc00100198000011ea0000613d000000000001042d000000000001042f00000000010000190000130d000104300000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d000104300000000001000415000000000115004900000000010000020000055501000041000011c30000013d0000000001000415000000060110006900000000010000020000055a01000041000000400300043d000000000013043500000004013000390000000000210435000004c40030009c000004c4030080410000004001300210000004e5011001c70000130d000104300000001f0530018f000004c606300198000000400200043d0000000004620019000011d70000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000011d30000c13d000000000005004b000011e40000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000004c40020009c000004c4020080410000004002200210000000000112019f0000130d00010430000000400100043d00000559020000410000000000210435000004c40010009c000004c401008041000000400110021000000522011001c70000130d000104300000000901000039000000000101041a000004cc021001970000000001000411000000000012004b000011f90000c13d000000000001042d000000400200043d0000052703000041000000000032043500000004032000390000000000130435000004c40020009c000004c4020080410000004001200210000004e5011001c70000130d000104300001000000000002000100000001001d000000000010043f0000000401000039000000200010043f0000000001000414000004c40010009c000004c401008041000000c00110021000000517011001c70000801002000039130b13060000040f0000000100200190000012160000613d000000000101043b000000000101041a000004cc01100198000012180000613d000000000001042d00000000010000190000130d00010430000000400100043d00000535020000410000000000210435000000040210003900000001030000290000000000320435000004c40010009c000004c4010080410000004001100210000004e5011001c70000130d000104300005000000000002000400000004001d000300000003001d000200000001001d0000051a010000410000000000100443000500000002001d00000004002004430000000001000414000004c40010009c000004c401008041000000c0011002100000051b011001c70000800202000039130b13060000040f0000000100200190000012a20000613d000000000101043b000000000001004b0000129f0000613d000000400800043d00000064018000390000008002000039000100000002001d00000000002104350000004401800039000000030200002900000000002104350000000201000029000004cc01100197000000240280003900000000001204350000051c0100004100000000001804350000000401800039000000000200041100000000002104350000008402800039000000040100002900000000310104340000000000120435000000a4078000390000000502000029000004cc02200197000000000001004b000012590000613d000000000400001900000000057400190000000006430019000000000606043300000000006504350000002004400039000000000014004b000012520000413d0000001f031000390000054e0330019700000000017100190000000000010435000000a401300039000004c40010009c000004c4010080410000006001100210000004c40080009c000004c40300004100000000030840190000004003300210000000000131019f0000000003000414000004c40030009c000004c403008041000000c003300210000000000113019f000400000002001d000500000008001d130b13010000040f000000050b0000290000006003100270000004c403300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000000057b00190000127e0000613d000000000801034f00000000090b0019000000008a08043c0000000009a90436000000000059004b0000127a0000c13d000000000006004b0000128b0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000012a30000613d0000001f01400039000000600210018f0000000001b20019000000000021004b00000000020000390000000102004039000004c70010009c000012dc0000213d0000000100200190000012dc0000c13d000000400010043f0000001f0030008c000012a00000a13d00000000020b04330000051f00200198000012a00000c13d0000051c0020009c000012d20000c13d000000000001042d00000000010000190000130d00010430000000000001042f000000000003004b000012a70000c13d0000006002000039000012ce0000013d0000001f02300039000004c5022001970000003f022000390000051d04200197000000400200043d0000000004420019000000000024004b00000000050000390000000105004039000004c70040009c000012dc0000213d0000000100500190000012dc0000c13d000000400040043f0000001f0430018f0000000006320436000004c605300198000100000006001d0000000003560019000012c10000613d000000000601034f0000000107000029000000006806043c0000000007870436000000000037004b000012bd0000c13d000000000004004b000012ce0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000001020433000000000001004b000012e20000c13d000000400100043d0000051e020000410000000000210435000000040210003900000004030000290000000000320435000004c40010009c000004c4010080410000004001100210000004e5011001c70000130d000104300000054001000041000000000010043f0000004101000039000000040010043f000004e5010000410000130d000104300000000102000029000004c40020009c000004c4020080410000004002200210000004c40010009c000004c4010080410000006001100210000000000121019f0000130d00010430000000000001042f000004c40010009c000004c4010080410000004001100210000004c40020009c000004c4020080410000006002200210000000000112019f0000000002000414000004c40020009c000004c402008041000000c002200210000000000112019f000004d7011001c70000801002000039130b13060000040f0000000100200190000012ff0000613d000000000101043b000000000001042d00000000010000190000130d0001043000001304002104210000000102000039000000000001042d0000000002000019000000000001042d00001309002104230000000102000039000000000001042d0000000002000019000000000001042d0000130b000004320000130c0001042e0000130d000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000000000000000000000000000ffffffffffffffff0000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffe0000000000000000000000000000000000000000000000003ffffffffffffffe08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffbf456c796d706963734d696e745469636b657400000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000bfa87805ed57dc1f0d489ce33be4c4577d74ccde357eeeee058a32c55c44a532405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace000000000000000000000000000000000000000000000000ffffffffffffffe0bfa87805ed57dc1f0d489ce33be4c4577d74ccde357eeeee058a32c55c44a5310200000000000000000000000000000000000020000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e039a5844729cae3e308f36a5ce933956d7c6367997d26743ca06a70b77c062d58c65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a839a5844729cae3e308f36a5ce933956d7c6367997d26743ca06a70b77c062d57fe8a4859c7bd88fc0f24184464406785daae8e84cb1860cc4a4eff72e05fe2470175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9fe8a4859c7bd88fc0f24184464406785daae8e84cb1860cc4a4eff72e05fe2469a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b02000002000000000000000000000000000000040000000000000000000000008b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000000000000000000000000000ffffffffffffff3f0000000200000000000000000000000000000200000001000000000000000000b6d9900a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000006f483d090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000001e4fbdf7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070a0823000000000000000000000000000000000000000000000000000000000b1b709cb00000000000000000000000000000000000000000000000000000000f05e6fe500000000000000000000000000000000000000000000000000000000f2fde38a00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000f83760ed00000000000000000000000000000000000000000000000000000000f05e6fe600000000000000000000000000000000000000000000000000000000f0f4426000000000000000000000000000000000000000000000000000000000c87b56dc00000000000000000000000000000000000000000000000000000000c87b56dd00000000000000000000000000000000000000000000000000000000e985e9c500000000000000000000000000000000000000000000000000000000b1b709cc00000000000000000000000000000000000000000000000000000000b88d4fde0000000000000000000000000000000000000000000000000000000084b0196d0000000000000000000000000000000000000000000000000000000095d89b400000000000000000000000000000000000000000000000000000000095d89b4100000000000000000000000000000000000000000000000000000000a22cb4650000000000000000000000000000000000000000000000000000000084b0196e000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000007a9659ee000000000000000000000000000000000000000000000000000000007a9659ef00000000000000000000000000000000000000000000000000000000825e282e0000000000000000000000000000000000000000000000000000000070a0823100000000000000000000000000000000000000000000000000000000715018a60000000000000000000000000000000000000000000000000000000023b872dc0000000000000000000000000000000000000000000000000000000042842e0d0000000000000000000000000000000000000000000000000000000061d027b20000000000000000000000000000000000000000000000000000000061d027b3000000000000000000000000000000000000000000000000000000006352211e0000000000000000000000000000000000000000000000000000000042842e0e000000000000000000000000000000000000000000000000000000004de8bcfb0000000000000000000000000000000000000000000000000000000030176e120000000000000000000000000000000000000000000000000000000030176e1300000000000000000000000000000000000000000000000000000000346de50a0000000000000000000000000000000000000000000000000000000023b872dd000000000000000000000000000000000000000000000000000000002a55205a0000000000000000000000000000000000000000000000000000000006fdde0200000000000000000000000000000000000000000000000000000000095ea7b200000000000000000000000000000000000000000000000000000000095ea7b30000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000006fdde0300000000000000000000000000000000000000000000000000000000081812fc00000000000000000000000000000000000000000000000000000000017340440000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000004634d8d000000000000000000000000000000000000000000000000ffffffffffffffdf0200000000000000000000000000000000000040000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef73c6ac6e000000000000000000000000000000000000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000150b7a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffe064a0ae920000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790b8ec1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000038991c030000000000000000000000000000000000000000000000000000000011011294000000000000000000000000000000000000000000000000000000006686db6400000000000000000000000000000000000000000000000000000000344fa43b00000000000000000000000000000000000000000000000000000000118cdaa700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000080000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000800000000000000000bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000000000000000000000000000000000000000004ee2d6d415b85acef810000000000000000000000000000000000000000000004ee2d6d415b85acef80ffffffff000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000005f5e10000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30313233343536373839616263646566000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000007e2732890000000000000000000000000000000000000000000000000000000017307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c315b08ba1800000000000000000000000000000000000000000000000000000000c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000b3512b0c000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000064c3eb827550fb0a0dc081a8ac682198c5044b41cbc73316e403393d6a12c5e389c62b64000000000000000000000000000000000000000000000000000000004484b5bab23cb6c6dcb7d0f87ddcd612e617dbb100a7d33dfb07aab3c9df3c034e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000a9fbf51f000000000000000000000000000000000000000000000000000000008c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925000000000000000000000000000000000000004400000080000000000000000049064905ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80ac58cd00000000000000000000000000000000000000000000000000000000490649060000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000002a55205a000000000000000000000000000000000000000000000000000000005b5e139f000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000fffffffffffffe80ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffc0000000000000000000000000000000000000000000000000ffffffffffffff40000000000000000000000000000000000000000000000000ffffffffffffff0019010000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000042000000000000000000000000fce698f7000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a00000000000000000000000000000000000000080000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132f645eedf00000000000000000000000000000000000000000000000000000000d78bce0c00000000000000000000000000000000000000000000000000000000177e802f0000000000000000000000000000000000000000000000000000000064283d7b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000a26469706673582212205bb948c21b907a4007d8db44dd878babbea14b2b2c3a69a05904980fd5eb45f364736f6c6378247a6b736f6c633a312e352e31353b736f6c633a302e382e32343b6c6c766d3a312e302e320055
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000bd9abe473fd2189b2d9a9806b9e4927f922aa88800000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000397f862360869b23d765e138132303601ff0437d0000000000000000000000002ecc328147a5f4c453dfb5320d5b279978763068000000000000000000000000000000000000000000000000000000000000000b50656e677520436c61736800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025043000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Pengu Clash
Arg [1] : _symbol (string): PC
Arg [2] : _royaltyReceiver (address): 0xBD9ABe473FD2189B2D9a9806b9e4927f922aA888
Arg [3] : _feeNumerator (uint96): 500
Arg [4] : _ticketSigner (address): 0x397f862360869b23D765E138132303601Ff0437D
Arg [5] : _treasury (address): 0x2ECc328147a5f4c453DFb5320d5B279978763068
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 000000000000000000000000bd9abe473fd2189b2d9a9806b9e4927f922aa888
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [4] : 000000000000000000000000397f862360869b23d765e138132303601ff0437d
Arg [5] : 0000000000000000000000002ecc328147a5f4c453dfb5320d5b279978763068
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [7] : 50656e677520436c617368000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [9] : 5043000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$5.38
Net Worth in ETH
0.001823
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,952.41 | 0.0018229 | $5.38 |
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.