@settlemint/solidity-token-erc721
Version:
Smart contract set to build an ERC721 token in SettleMint
1,272 lines (1,270 loc) • 78 kB
TypeScript
// This file was autogenerated by hardhat-viem, do not edit it.
// prettier-ignore
// tslint:disable
// eslint-disable
import type { Address } from "viem";
import type { AbiParameterToPrimitiveType, GetContractReturnType } from "@nomicfoundation/hardhat-viem/types";
import "@nomicfoundation/hardhat-viem/types";
export interface ExampleERC721$Type {
"_format": "hh-sol-artifact-1",
"contractName": "ExampleERC721",
"sourceName": "contracts/ExampleERC721.sol",
"abi": [
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "string",
"name": "baseTokenURI_",
"type": "string"
},
{
"internalType": "address",
"name": "proxyRegistryAddress_",
"type": "address"
},
{
"internalType": "address payable",
"name": "wallet_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"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": [],
"name": "ERC721EnumerableForbiddenBatchMint",
"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": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "ERC721OutOfBoundsIndex",
"type": "error"
},
{
"inputs": [],
"name": "EnforcedPause",
"type": "error"
},
{
"inputs": [],
"name": "ExpectedPause",
"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": [],
"name": "ReentrancyGuardReentrantCall",
"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": "address",
"name": "account",
"type": "address"
}
],
"name": "MintPaused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "MintUnpaused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "_value",
"type": "string"
},
{
"indexed": true,
"internalType": "uint256",
"name": "_id",
"type": "uint256"
}
],
"name": "PermanentURI",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [],
"name": "MAX_PER_TX",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MAX_SUPPLY",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PRICE_IN_WEI_PUBLIC",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PRICE_IN_WEI_WHITELIST",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "RESERVES",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "ROYALTIES_IN_BASIS_POINTS",
"outputs": [
{
"internalType": "uint96",
"name": "",
"type": "uint96"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_proxyRegistryAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_whitelistMerkleRoot",
"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": [
{
"internalType": "address",
"name": "_from",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "_tokenIds",
"type": "uint256[]"
},
{
"internalType": "bytes",
"name": "data_",
"type": "bytes"
}
],
"name": "batchSafeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_from",
"type": "address"
},
{
"internalType": "address",
"name": "_to",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "_tokenIds",
"type": "uint256[]"
}
],
"name": "batchTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "burn",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "collectReserves",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "disableWhitelistMerkleRoot",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "freeze",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "freezeAllTokens",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "freezeToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "frozen",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "allowance",
"type": "string"
},
{
"internalType": "bytes32[]",
"name": "proof",
"type": "bytes32[]"
}
],
"name": "getAllowance",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "recipients_",
"type": "address[]"
}
],
"name": "gift",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint128",
"name": "value",
"type": "uint128"
}
],
"name": "increaseBalance",
"outputs": [],
"stateMutability": "nonpayable",
"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": "mintPaused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"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": [],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "pauseMint",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "count",
"type": "uint256"
}
],
"name": "publicMint",
"outputs": [],
"stateMutability": "payable",
"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": "receiver",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"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": "setBaseURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "proxyRegistryAddress_",
"type": "address"
}
],
"name": "setProxyRegistryAddress",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "whitelistMerkleRoot_",
"type": "bytes32"
}
],
"name": "setWhitelistMerkleRoot",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "startPublicSale",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "tokenByIndex",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "tokenOfOwnerByIndex",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "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": "unpause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "unpauseMint",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "address",
"name": "auth",
"type": "address"
}
],
"name": "update",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "wallet",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "count",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "allowance",
"type": "uint256"
},
{
"internalType": "bytes32[]",
"name": "proof",
"type": "bytes32[]"
}
],
"name": "whitelistMint",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x60a0604052346105bf5761326780380380610019816105c3565b928339810160a0828203126105bf5781516001600160401b0381116105bf57816100449184016105e8565b60208301519091906001600160401b0381116105bf57816100669185016105e8565b604084015190916001600160401b0382116105bf576100869185016105e8565b606084015190936001600160a01b03821682036105bf57608001516001600160a01b038116939092908484036105bf578051906001600160401b0382116102c45760025490600182811c921680156105b5575b60208310146103bc5781601f849311610547575b50602090601f83116001146104e1575f926104d6575b50508160011b915f199060031b1c1916176002555b8051906001600160401b0382116102c45760035490600182811c921680156104cc575b60208310146103bc5781601f84931161045e575b50602090601f83116001146103f8575f926103ed575b50508160011b915f199060031b1c1916176003555b600e80546001600160b01b03191660109290921b62010000600160b01b031691909117905533156103da57600f8054336001600160a01b0319821681179092556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a360016010556014805460ff1916905582516001600160401b0381116102c457601254600181811c911680156103d0575b60208210146103bc57601f8111610359575b506020601f82116001146102f657819293945f926102eb575b50508160011b915f199060031b1c1916176012555b60805280156102d857604080519081016001600160401b038111828210176102c45760409081528282526101f46020909201919091526001600160a01b03909116607d60a21b175f5551612c2d908161063a8239608051818181610f0b01528181611098015261167d0152f35b634e487b7160e01b5f52604160045260245ffd5b635b6cc80560e11b5f525f60045260245ffd5b015190505f80610242565b601f1982169060125f52805f20915f5b81811061034157509583600195969710610329575b505050811b01601255610257565b01515f1960f88460031b161c191690555f808061031b565b9192602060018192868b015181550194019201610306565b60125f527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444601f830160051c810191602084106103b2575b601f0160051c01905b8181106103a75750610229565b5f815560010161039a565b9091508190610391565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610217565b631e4fbdf760e01b5f525f60045260245ffd5b015190505f80610165565b60035f9081528281209350601f198516905b818110610446575090846001959493921061042e575b505050811b0160035561017a565b01515f1960f88460031b161c191690555f8080610420565b9293602060018192878601518155019501930161040a565b60035f529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c810191602085106104c2575b90601f859493920160051c01905b8181106104b4575061014f565b5f81558493506001016104a7565b9091508190610499565b91607f169161013b565b015190505f80610103565b60025f9081528281209350601f198516905b81811061052f5750908460019594939210610517575b505050811b01600255610118565b01515f1960f88460031b161c191690555f8080610509565b929360206001819287860151815501950193016104f3565b60025f529091507f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c810191602085106105ab575b90601f859493920160051c01905b81811061059d57506100ed565b5f8155849350600101610590565b9091508190610582565b91607f16916100d9565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102c457604052565b81601f820112156105bf578051906001600160401b0382116102c457610617601f8301601f19166020016105c3565b92828452602083830101116105bf57815f9260208093018386015e830101529056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a71461171e57508063029877b61461165c578063054f7d9c1461163a57806306fdde0314611595578063081812fc146115595780630922f9c51461029e578063095ea7b31461148b5780630c1c972a14611460578063163e1e611461139057806318160ddd146113735780631a8bd2da146112f157806323b872dd146112da5780632a55205a146112505780632db115441461116a5780632f745c59146110f857806332cb6b0c146110dd5780633ccfd60b146110715780633f4ba83a1461100b57806342842e0e14610fe257806342966c6814610fc55780634f6ccce714610f77578063501a516214610f3a578063521eb27314610ef657806355f804b314610d6b5780635a4fee3014610ce15780635c975abb14610cbf57806362a5af3b14610c8b5780636352211e14610c5b57806366fddfa914610b2f57806370a0823114610b04578063715018a614610aa95780637ad7614d14610a885780637e4831d314610a635780638456cb5914610a0a57806389cd503a146109de5780638da5cb5b146109b657806395d89b41146108ec578063a0b30390146108cf578063a22cb46514610834578063b440297914610816578063b6854f96146107d5578063b88d4fde14610787578063bd32fb6614610766578063c4be5b59146105a5578063c87b56dd14610582578063cd85cdb514610509578063d0babf38146104ed578063d26ea6c0146104a3578063d283e3cc14610439578063d2bc37f8146103cb578063e985e9c514610395578063f2fde38b1461030f578063f3993d11146102a3578063f43a22dc1461029e5763fbd9b92d14610279575f80fd5b3461029a575f36600319011261029a576020604051669536c7089100008152f35b5f80fd5b611873565b3461029a57606036600319011261029a576102bc61188e565b6102c46118a4565b906044356001600160401b03811161029a576102e49036906004016119bb565b5f5b815181101561030d57806103076102ff60019385611c54565b518686611ab0565b016102e6565b005b3461029a57602036600319011261029a5761032861188e565b610330611fe2565b6001600160a01b0316801561038257600f80546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b631e4fbdf760e01b5f525f60045260245ffd5b3461029a57604036600319011261029a5760206103c16103b361188e565b6103bb6118a4565b90612345565b6040519015158152f35b3461029a575f36600319011261029a576103e960ff600e5416611ce5565b600a5460015b818111156103f957005b80805f516020612bd85f395f51905f5261042c61041861043495611e7c565b60405191829160208352602083019061184f565b0390a2611a18565b6103ef565b3461029a57604036600319011261029a5761045261188e565b602435906fffffffffffffffffffffffffffffffff821680920361029a5781610494576001600160a01b03165f90815260056020526040902080549091019055005b6359171fc160e01b5f5260045ffd5b3461029a57602036600319011261029a576104bc61188e565b6104c4611fe2565b600e805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055005b3461029a575f36600319011261029a5760206040516101f48152f35b3461029a575f36600319011261029a57610521611fe2565b600e5460ff8160081c1661053d5761ff00191661010017600e55005b60405162461bcd60e51b815260206004820152601f60248201527f4552433732314d696e745061757361626c653a204d696e7420706175736564006044820152606490fd5b3461029a57602036600319011261029a576105a1610418600435611e7c565b0390f35b606036600319011261029a576004356024356044356001600160401b03811161029a576105d961062a9136906004016118ba565b6105e16122e4565b610604606f6105fd876011546105f8811515611a5e565b611aa3565b1115611b56565b61062561061961061386612a4a565b33612304565b92600d54923691611c68565b6129de565b1561071657335f5260136020526106458260405f2054611aa3565b116106d1576618838370f3400081028181046618838370f3400014821517156106bd57610673903414611b97565b335f52601360205260405f2061068a828254611aa3565b90555f5b81811061069c576001601055005b6001906106b76106ad601154611a18565b8060115533612009565b0161068e565b634e487b7160e01b5f52601160045260245ffd5b60405162461bcd60e51b815260206004820152601b60248201527f457863656564732077686974656c69737420616c6c6f77616e636500000000006044820152606490fd5b60405162461bcd60e51b815260206004820152602260248201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c69604482015261195960f21b6064820152608490fd5b3461029a57602036600319011261029a5761077f611fe2565b600435600d55005b3461029a57608036600319011261029a576107a061188e565b6107a86118a4565b606435916001600160401b03831161029a576107cb61030d933690600401611960565b9160443591611d3c565b3461029a57602036600319011261029a576004356107f760ff600e5416611ce5565b5f516020612bd85f395f51905f5261081161041883611e7c565b0390a2005b3461029a575f36600319011261029a5761082e611fe2565b5f600d55005b3461029a57604036600319011261029a5761084d61188e565b6024359081151580920361029a576001600160a01b03169081156108bc57335f52600760205260405f20825f5260205260405f2060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b50630b61174360e31b5f5260045260245ffd5b3461029a575f36600319011261029a576020600d54604051908152f35b3461029a575f36600319011261029a576040515f60035461090c81611a26565b80845290600181169081156109925750600114610934575b6105a18361041881850382611924565b91905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f905b80821061097857509091508101602001610418610924565b919260018160209254838588010152019101909291610960565b60ff191660208086019190915291151560051b840190910191506104189050610924565b3461029a575f36600319011261029a57600f546040516001600160a01b039091168152602090f35b3461029a575f36600319011261029a57600e5460405160109190911c6001600160a01b03168152602090f35b3461029a575f36600319011261029a57610a22611fe2565b610a2a612a2f565b600160ff19600c541617600c557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b3461029a575f36600319011261029a57602060ff600e5460081c166040519015158152f35b3461029a575f36600319011261029a5760206040516618838370f340008152f35b3461029a575f36600319011261029a57610ac1611fe2565b600f80546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461029a57602036600319011261029a576020610b27610b2261188e565b611cb4565b604051908152f35b3461029a57604036600319011261029a576004356001600160401b03811161029a57610b5f903690600401611960565b6024356001600160401b03811161029a57610b81610b959136906004016118ba565b9190610b8d8433612304565b923691611c68565b90600d548015610c1657610ba8926129de565b15610bc5576105a19060405191829160208352602083019061184f565b60405162461bcd60e51b815260206004820152602360248201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960448201526232b21760e91b6064820152608490fd5b60405162461bcd60e51b815260206004820152601d60248201527f57686974656c697374206d65726b6c6520726f6f74206e6f74207365740000006044820152606490fd5b3461029a57602036600319011261029a576020610c796004356122b0565b6040516001600160a01b039091168152f35b3461029a575f36600319011261029a57610ca3611fe2565b6001600e54610cb560ff821615611c08565b60ff191617600e55005b3461029a575f36600319011261029a57602060ff600c54166040519015158152f35b3461029a57608036600319011261029a57610cfa61188e565b610d026118a4565b906044356001600160401b03811161029a57610d229036906004016119bb565b6064356001600160401b03811161029a57610d41903690600401611960565b5f5b825181101561030d5780610d6583610d5d60019487611c54565b518888611d3c565b01610d43565b3461029a57602036600319011261029a576004356001600160401b03811161029a57610d9b903690600401611960565b610da3611fe2565b610db260ff600e541615611c08565b80516001600160401b038111610ee257610dcd601254611a26565b601f8111610e7a575b50602091601f8211600114610e12579181925f92610e07575b50505f19600383901b1c191660019190911b17601255005b015190508280610def565b601f1982169260125f525f516020612bb85f395f51905f52915f5b858110610e6257508360019510610e4a575b505050811b01601255005b01515f1960f88460031b161c19169055828080610e3f565b91926020600181928685015181550194019201610e2d565b60125f52601f820160051c5f516020612bb85f395f51905f52019060208310610ecd575b601f0160051c5f516020612bb85f395f51905f5201905b818110610ec25750610dd6565b5f8155600101610eb5565b5f516020612bb85f395f51905f529150610e9e565b634e487b7160e01b5f52604160045260245ffd5b3461029a575f36600319011261029a576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461029a57606036600319011261029a57610f5361188e565b604435906001600160a01b038216820361029a57602091610c7991602435906126fe565b3461029a57602036600319011261029a57600435600a54811015610faf57610fa0602091611bdc565b90549060031b1c604051908152f35b63295f44f760e21b5f525f60045260245260445ffd5b3461029a57602036600319011261029a5761030d33600435612420565b3461029a5761030d610ff3366118ea565b9060405192611003602085611924565b5f8452611d3c565b3461029a575f36600319011261029a57611023611fe2565b600c5460ff8116156110625760ff1916600c557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b3461029a575f36600319011261029a57611089611fe2565b5f808080478181156110d4575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690f1156110c957005b6040513d5f823e3d90fd5b506108fc611096565b3461029a575f36600319011261029a576020604051606f8152f35b3461029a57604036600319011261029a5761111161188e565b6024359061111e81611cb4565b82101561114d5760018060a01b03165f52600860205260405f20905f52602052602060405f2054604051908152f35b63295f44f760e21b5f5260018060a01b031660045260245260445ffd5b602036600319011261029a576004356111816122e4565b61118d600d5415611b11565b61119b60ff60145416611b11565b6111b2606f6105fd836011546105f8811515611a5e565b600581101561120b57669536c7089100008102818104669536c70891000014821517156106bd576111e4903414611b97565b5f5b8181106111f4576001601055005b6001906112056106ad601154611a18565b016111e6565b60405162461bcd60e51b815260206004820152601b60248201527f45786365656473206d617820706572207472616e73616374696f6e00000000006044820152606490fd5b3461029a57604036600319011261029a576004355f90815260016020526040902054602435906001600160a01b0381169060a01c81156112c3575b6001600160601b0316918281029281840414901517156106bd57604080516001600160a01b0390921682526127109092046020820152f35b50505f546001600160a01b0381169060a01c61128b565b3461029a5761030d6112eb366118ea565b91611ab0565b3461029a575f36600319011261029a57611309611fe2565b600e5460ff8160081c16156113225761ff001916600e55005b60405162461bcd60e51b815260206004820152602360248201527f4552433732314d696e745061757361626c653a204d696e74206e6f74207061756044820152621cd95960ea1b6064820152608490fd5b3461029a575f36600319011261029a576020600a54604051908152f35b3461029a57602036600319011261029a576004356001600160401b03811161029a576113c09036906004016118ba565b906113c9611fe2565b606f6113dd836011546105f8811515611a5e565b11611426575f5b8281101561030d57600581901b820135906001600160a01b038216820361029a57611420600192611416601154611a18565b9081601155612009565b016113e4565b60405162461bcd60e51b815260206004820152601260248201527145786365646573206d617820737570706c7960701b6044820152606490fd5b3461029a575f36600319011261029a57611478611fe2565b5f600d556014805460ff19166001179055005b3461029a57604036600319011261029a576114a461188e565b6024356114b0816122b0565b33151580611546575b80611535575b6115225781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a45f90815260066020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b5f523360045260245ffd5b506115403382612345565b156114bf565b506001600160a01b0381163314156114b9565b3461029a57602036600319011261029a57600435611576816122b0565b505f526006602052602060018060a01b0360405f205416604051908152f35b3461029a575f36600319011261029a576040515f6002546115b581611a26565b808452906001811690811561099257506001146115dc576105a18361041881850382611924565b91905060025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace915f905b80821061162057509091508101602001610418610924565b919260018160209254838588010152019101909291611608565b3461029a575f36600319011261029a57602060ff600e54166040519015158152f35b3461029a575f36600319011261029a57611674611fe2565b6011546116d9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660015b60058111156116b357005b6116d4906116cf6116c5601154611a18565b8060115584612009565b611a18565b6116a8565b60405162461bcd60e51b815260206004820152601a60248201527f526573657276657320616c726561647920636f6c6c65637465640000000000006044820152606490fd5b3461029a57602036600319011261029a576004359063ffffffff60e01b821680920361029a57602091630704183b60e11b811490811561183e575b811561182d575b811561181c575b811561180b575b81156117fa575b8115611783575b5015158152f35b63780e9d6360e01b81149150811561179d575b508361177c565b6380ac58cd60e01b8114915081156117e9575b81156117be575b5083611796565b63152a902d60e11b8114915081156117d8575b50836117b7565b6301ffc9a760e01b149050836117d1565b635b5e139f60e01b811491506117b0565b637e4831d360e01b81149150611775565b6330bb02f960e11b8114915061176e565b63c64edc3960e01b81149150611767565b631e7c553160e21b81149150611760565b630852cd8d60e31b81149150611759565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b3461029a575f36600319011261029a57602060405160058152f35b600435906001600160a01b038216820361029a57565b602435906001600160a01b038216820361029a57565b9181601f8401121561029a578235916001600160401b03831161029a576020808501948460051b01011161029a57565b606090600319011261029a576004356001600160a01b038116810361029a57906024356001600160a01b038116810361029a579060443590565b90601f801991011681019081106001600160401b03821117610ee257604052565b6001600160401b038111610ee257601f01601f191660200190565b81601f8201121561029a5760208135910161197a82611945565b926119886040519485611924565b8284528282011161029a57815f92602092838601378301015290565b6001600160401b038111610ee25760051b60200190565b9080601f8301121561029a5781356119d2816119a4565b926119e06040519485611924565b81845260208085019260051b82010192831161029a57602001905b828210611a085750505090565b81358152602091820191016119fb565b5f1981146106bd5760010190565b90600182811c92168015611a54575b6020831014611a4057565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611a35565b15611a6557565b60405162461bcd60e51b815260206004820152601660248201527514995cd95c9d995cc81b9bdd081d185ad95b881e595d60521b6044820152606490fd5b919082018092116106bd57565b91906001600160a01b03811615611afe57611acd908233916126fe565b6001600160a01b039081169216808303611ae657505050565b6364283d7b60e01b5f5260045260245260445260645ffd5b633250574960e11b5f525f60045260245ffd5b15611b1857565b60405162461bcd60e51b81526020600482015260166024820152755075626c69632073616c65206e6f742061637469766560501b6044820152606490fd5b15611b5d57565b60405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b6044820152606490fd5b15611b9e57565b60405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a5908199d5b991cc81c1c9bdd9a59195960521b6044820152606490fd5b600a54811015611bf457600a5f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b15611c0f57565b60405162461bcd60e51b815260206004820152601e60248201527f455243373231467265657a61626c653a205552492069732066726f7a656e00006044820152606490fd5b8051821015611bf45760209160051b010190565b929190611c74816119a4565b93611c826040519586611924565b602085838152019160051b810192831161029a57905b828210611ca457505050565b8135815260209182019101611c98565b6001600160a01b03168015611cd2575f52600560205260405f205490565b6322718ad960e21b5f525f60045260245ffd5b15611cec57565b60405162461bcd60e51b815260206004820152602260248201527f455243373231467265657a61626c653a20555249206973206e6f742066726f7a60448201526132b760f11b6064820152608490fd5b9291611d49818386611ab0565b813b611d56575b50505050565b604051630a85bd0160e11b81523360048201526001600160a01b0394851660248201526044810191909152608060648201529216919060209082908190611da190608483019061184f565b03815f865af15f9181611e37575b50611e0457503d15611dfd573d611dc581611945565b90611dd36040519283611924565b81523d5f602083013e5b80519081611df85782633250574960e11b5f5260045260245ffd5b602001fd5b6060611ddd565b6001600160e01b03191663757a42ff60e11b01611e2557505f808080611d50565b633250574960e11b5f5260045260245ffd5b9091506020813d602011611e74575b81611e5360209383611924565b8101031261029a57516001600160e01b03198116810361029a57905f611daf565b3d9150611e46565b611e85816122b0565b5060405160125491905f81611e9985611a26565b9182825260208201956001811690815f14611fc65750600114611f7a575b611ec392500382611924565b805115611f6157602080611ed9611f0a94612a4a565b6040519586945180918487015e8401908282015f8152815193849201905e01015f815203601f198101835282611924565b805115611f4c57611f496005602080936040519481869251918291018484015e810164173539b7b760d91b838201520301601a19810184520182611924565b90565b50604051611f5b602082611924565b5f815290565b505050604051611f72602082611924565b5f8152611f0a565b509060125f525f516020612bb85f395f51905f52905f915b818310611faa575050906020611ec392820101611eb7565b6020919350806001915483858801015201910190918392611f92565b60ff1916875250611ec392151560051b82016020019050611eb7565b600f546001600160a01b03163303611ff657565b63118cdaa760e01b5f523360045260245ffd5b906001600160a01b0382168015611afe5760ff600e541680612283575b5061202f612a2f565b5f828152600460205260409020546001600160a01b031680158015949193919085612250575b835f52600560205260405f2060018154019055825f52600460205260405f20846001600160601b0360a01b8254161790558284867fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4156121d357600a54825f52600b6020528060405f2055600160401b811015610ee2576120f96120e3826001869401600a55611bdc565b819391549060031b91821b915f19901b19161790565b90555b828403612193575b50505060ff600e5460081c1615801561218c575b15612137575061212457565b6339e3563760e11b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152602760248201527f4552433732314d696e745061757361626c653a204d696e74696e6720697320646044820152661a5cd8589b195960ca1b6064820152608490fd5b5081612118565b61219c90611cb4565b5f198101929083116106bd575f52600860205260405f20825f526020528060405f20555f52600960205260405f20555f8080612104565b8383146120fc576121e384611cb4565b825f52600960205260405f205490855f52600860205260405f2091818103612225575b50835f5260096020525f60408120555f526020525f60408120556120fc565b815f528260205260405f2054815f52836020528060405f20555f52600960205260405f20555f612206565b5f83815260066020526040902080546001600160a01b0319169055845f52600560205260405f205f198154019055612055565b61228c90611ce5565b815f516020612bd85f395f51905f526122a761041883611e7c565b0390a25f612026565b5f818152600460205260409020546001600160a01b03169081156122d2575090565b637e27328960e01b5f5260045260245ffd5b6002601054146122f5576002601055565b633ee5aeb560e01b5f5260045ffd5b9061233f61233191604051928391602083019560018060a01b03168652604080840152606083019061184f565b03601f198101835282611924565b51902090565b600e5460101c6001600160a01b031680612387575b5060018060a01b03165f52600760205260405f209060018060a01b03165f5260205260ff60405f20541690565b60405163c455279160e01b81526001600160a01b038316600482015290602090829060249082905afa9081156110c9575f916123de575b506001600160a01b038381169116146123d7575f61235a565b5050600190565b90506020813d602011612418575b816123f960209383611924565b8101031261029a57516001600160a01b038116810361029a575f6123be565b3d91506123ec565b60ff600e5416806126d1575b50612435612a2f565b5f818152600460205260409020546001600160a01b0390811692908116908115159081612647575b5050508115908115809281612614575b5f83815260046020526040812080546001600160a01b03191690558390867fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4156125995750600a54815f52600b6020528060405f2055600160401b811015610ee2576124e66120e3826001859401600a55611bdc565b90555b600a545f1981019081116106bd57815f52600b60205261250d60405f205491611bdc565b90549060031b1c806125216120e384611bdc565b90555f52600b60205260405f20555f52600b6020525f6040812055600a548015612585575f190161255181611bdc565b8154905f199060031b1b19169055600a5560ff600e5460081c161590811561257d575b50156121375790565b90505f612574565b634e487b7160e01b5f52603160045260245ffd5b156124e9576125a783611cb4565b815f52600960205260405f205490845f52600860205260405f20918181036125e9575b50825f5260096020525f60408120555f526020525f60408120556124e9565b815f528260205260405f2054815f52836020528060405f20555f52600960205260405f20555f6125ca565b5f83815260066020526040902080546001600160a01b0319169055845f52600560205260405f205f19815401905561246d565b81612687575b501561265a57808061245d565b826126725750637e27328960e01b5f5260045260245ffd5b63177e802f60e01b5f5260045260245260445ffd5b848314915081156126c0575b5080156126a1575b5f61264d565b505f828152600660205260409020546001600160a01b0316811461269b565b6126cb915084612345565b5f612693565b6126da90611ce5565b805f516020612bd85f395f51905f526126f561041883611e7c565b0390a25f61242c565b9060ff600e5416806129b1575b50612714612a2f565b5f818152600460205260409020546001600160a01b039081169390811690811515908161293c575b50505082159081159283612909575b6001600160a01b0381169283159081156128f1575b835f52600460205260405f20856001600160601b0360a01b8254161790558385887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a41561287457600a54835f52600b6020528060405f2055600160401b811015610ee2576127db6120e3826001879401600a55611bdc565b