├── LICENSE ├── README.md ├── artifacts ├── @openzeppelin │ └── contracts │ │ ├── access │ │ └── Ownable.sol │ │ │ ├── Ownable.dbg.json │ │ │ └── Ownable.json │ │ ├── token │ │ └── ERC721 │ │ │ ├── ERC721.sol │ │ │ ├── ERC721.dbg.json │ │ │ └── ERC721.json │ │ │ ├── IERC721.sol │ │ │ ├── IERC721.dbg.json │ │ │ └── IERC721.json │ │ │ ├── IERC721Receiver.sol │ │ │ ├── IERC721Receiver.dbg.json │ │ │ └── IERC721Receiver.json │ │ │ └── extensions │ │ │ ├── ERC721URIStorage.sol │ │ │ ├── ERC721URIStorage.dbg.json │ │ │ └── ERC721URIStorage.json │ │ │ └── IERC721Metadata.sol │ │ │ ├── IERC721Metadata.dbg.json │ │ │ └── IERC721Metadata.json │ │ └── utils │ │ ├── Address.sol │ │ ├── Address.dbg.json │ │ └── Address.json │ │ ├── Context.sol │ │ ├── Context.dbg.json │ │ └── Context.json │ │ ├── Counters.sol │ │ ├── Counters.dbg.json │ │ └── Counters.json │ │ ├── Strings.sol │ │ ├── Strings.dbg.json │ │ └── Strings.json │ │ ├── cryptography │ │ ├── ECDSA.sol │ │ │ ├── ECDSA.dbg.json │ │ │ └── ECDSA.json │ │ └── draft-EIP712.sol │ │ │ ├── EIP712.dbg.json │ │ │ └── EIP712.json │ │ └── introspection │ │ ├── ERC165.sol │ │ ├── ERC165.dbg.json │ │ └── ERC165.json │ │ └── IERC165.sol │ │ ├── IERC165.dbg.json │ │ └── IERC165.json └── contracts │ └── example.sol │ ├── SimonDevNFT.dbg.json │ └── SimonDevNFT.json ├── contracts └── example.sol ├── hardhat.config.js ├── package-lock.json ├── package.json ├── scripts ├── create_nfts.js ├── deploy.js ├── screen1.jpg ├── screen2.jpg ├── screen3.jpg ├── screen4.jpg ├── screen5.jpg ├── screen6.jpg └── thumbnail.jpg ├── test └── nft.js └── www ├── base.css ├── index.html ├── main.js └── owned.png /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 simondevyoutube 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is the source for https://youtu.be/5JnodJK4Em0 2 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/access/Ownable.sol/Ownable.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "Ownable", 4 | "sourceName": "@openzeppelin/contracts/access/Ownable.sol", 5 | "abi": [ 6 | { 7 | "anonymous": false, 8 | "inputs": [ 9 | { 10 | "indexed": true, 11 | "internalType": "address", 12 | "name": "previousOwner", 13 | "type": "address" 14 | }, 15 | { 16 | "indexed": true, 17 | "internalType": "address", 18 | "name": "newOwner", 19 | "type": "address" 20 | } 21 | ], 22 | "name": "OwnershipTransferred", 23 | "type": "event" 24 | }, 25 | { 26 | "inputs": [], 27 | "name": "owner", 28 | "outputs": [ 29 | { 30 | "internalType": "address", 31 | "name": "", 32 | "type": "address" 33 | } 34 | ], 35 | "stateMutability": "view", 36 | "type": "function" 37 | }, 38 | { 39 | "inputs": [], 40 | "name": "renounceOwnership", 41 | "outputs": [], 42 | "stateMutability": "nonpayable", 43 | "type": "function" 44 | }, 45 | { 46 | "inputs": [ 47 | { 48 | "internalType": "address", 49 | "name": "newOwner", 50 | "type": "address" 51 | } 52 | ], 53 | "name": "transferOwnership", 54 | "outputs": [], 55 | "stateMutability": "nonpayable", 56 | "type": "function" 57 | } 58 | ], 59 | "bytecode": "0x", 60 | "deployedBytecode": "0x", 61 | "linkReferences": {}, 62 | "deployedLinkReferences": {} 63 | } 64 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "ERC721", 4 | "sourceName": "@openzeppelin/contracts/token/ERC721/ERC721.sol", 5 | "abi": [ 6 | { 7 | "inputs": [ 8 | { 9 | "internalType": "string", 10 | "name": "name_", 11 | "type": "string" 12 | }, 13 | { 14 | "internalType": "string", 15 | "name": "symbol_", 16 | "type": "string" 17 | } 18 | ], 19 | "stateMutability": "nonpayable", 20 | "type": "constructor" 21 | }, 22 | { 23 | "anonymous": false, 24 | "inputs": [ 25 | { 26 | "indexed": true, 27 | "internalType": "address", 28 | "name": "owner", 29 | "type": "address" 30 | }, 31 | { 32 | "indexed": true, 33 | "internalType": "address", 34 | "name": "approved", 35 | "type": "address" 36 | }, 37 | { 38 | "indexed": true, 39 | "internalType": "uint256", 40 | "name": "tokenId", 41 | "type": "uint256" 42 | } 43 | ], 44 | "name": "Approval", 45 | "type": "event" 46 | }, 47 | { 48 | "anonymous": false, 49 | "inputs": [ 50 | { 51 | "indexed": true, 52 | "internalType": "address", 53 | "name": "owner", 54 | "type": "address" 55 | }, 56 | { 57 | "indexed": true, 58 | "internalType": "address", 59 | "name": "operator", 60 | "type": "address" 61 | }, 62 | { 63 | "indexed": false, 64 | "internalType": "bool", 65 | "name": "approved", 66 | "type": "bool" 67 | } 68 | ], 69 | "name": "ApprovalForAll", 70 | "type": "event" 71 | }, 72 | { 73 | "anonymous": false, 74 | "inputs": [ 75 | { 76 | "indexed": true, 77 | "internalType": "address", 78 | "name": "from", 79 | "type": "address" 80 | }, 81 | { 82 | "indexed": true, 83 | "internalType": "address", 84 | "name": "to", 85 | "type": "address" 86 | }, 87 | { 88 | "indexed": true, 89 | "internalType": "uint256", 90 | "name": "tokenId", 91 | "type": "uint256" 92 | } 93 | ], 94 | "name": "Transfer", 95 | "type": "event" 96 | }, 97 | { 98 | "inputs": [ 99 | { 100 | "internalType": "address", 101 | "name": "to", 102 | "type": "address" 103 | }, 104 | { 105 | "internalType": "uint256", 106 | "name": "tokenId", 107 | "type": "uint256" 108 | } 109 | ], 110 | "name": "approve", 111 | "outputs": [], 112 | "stateMutability": "nonpayable", 113 | "type": "function" 114 | }, 115 | { 116 | "inputs": [ 117 | { 118 | "internalType": "address", 119 | "name": "owner", 120 | "type": "address" 121 | } 122 | ], 123 | "name": "balanceOf", 124 | "outputs": [ 125 | { 126 | "internalType": "uint256", 127 | "name": "", 128 | "type": "uint256" 129 | } 130 | ], 131 | "stateMutability": "view", 132 | "type": "function" 133 | }, 134 | { 135 | "inputs": [ 136 | { 137 | "internalType": "uint256", 138 | "name": "tokenId", 139 | "type": "uint256" 140 | } 141 | ], 142 | "name": "getApproved", 143 | "outputs": [ 144 | { 145 | "internalType": "address", 146 | "name": "", 147 | "type": "address" 148 | } 149 | ], 150 | "stateMutability": "view", 151 | "type": "function" 152 | }, 153 | { 154 | "inputs": [ 155 | { 156 | "internalType": "address", 157 | "name": "owner", 158 | "type": "address" 159 | }, 160 | { 161 | "internalType": "address", 162 | "name": "operator", 163 | "type": "address" 164 | } 165 | ], 166 | "name": "isApprovedForAll", 167 | "outputs": [ 168 | { 169 | "internalType": "bool", 170 | "name": "", 171 | "type": "bool" 172 | } 173 | ], 174 | "stateMutability": "view", 175 | "type": "function" 176 | }, 177 | { 178 | "inputs": [], 179 | "name": "name", 180 | "outputs": [ 181 | { 182 | "internalType": "string", 183 | "name": "", 184 | "type": "string" 185 | } 186 | ], 187 | "stateMutability": "view", 188 | "type": "function" 189 | }, 190 | { 191 | "inputs": [ 192 | { 193 | "internalType": "uint256", 194 | "name": "tokenId", 195 | "type": "uint256" 196 | } 197 | ], 198 | "name": "ownerOf", 199 | "outputs": [ 200 | { 201 | "internalType": "address", 202 | "name": "", 203 | "type": "address" 204 | } 205 | ], 206 | "stateMutability": "view", 207 | "type": "function" 208 | }, 209 | { 210 | "inputs": [ 211 | { 212 | "internalType": "address", 213 | "name": "from", 214 | "type": "address" 215 | }, 216 | { 217 | "internalType": "address", 218 | "name": "to", 219 | "type": "address" 220 | }, 221 | { 222 | "internalType": "uint256", 223 | "name": "tokenId", 224 | "type": "uint256" 225 | } 226 | ], 227 | "name": "safeTransferFrom", 228 | "outputs": [], 229 | "stateMutability": "nonpayable", 230 | "type": "function" 231 | }, 232 | { 233 | "inputs": [ 234 | { 235 | "internalType": "address", 236 | "name": "from", 237 | "type": "address" 238 | }, 239 | { 240 | "internalType": "address", 241 | "name": "to", 242 | "type": "address" 243 | }, 244 | { 245 | "internalType": "uint256", 246 | "name": "tokenId", 247 | "type": "uint256" 248 | }, 249 | { 250 | "internalType": "bytes", 251 | "name": "_data", 252 | "type": "bytes" 253 | } 254 | ], 255 | "name": "safeTransferFrom", 256 | "outputs": [], 257 | "stateMutability": "nonpayable", 258 | "type": "function" 259 | }, 260 | { 261 | "inputs": [ 262 | { 263 | "internalType": "address", 264 | "name": "operator", 265 | "type": "address" 266 | }, 267 | { 268 | "internalType": "bool", 269 | "name": "approved", 270 | "type": "bool" 271 | } 272 | ], 273 | "name": "setApprovalForAll", 274 | "outputs": [], 275 | "stateMutability": "nonpayable", 276 | "type": "function" 277 | }, 278 | { 279 | "inputs": [ 280 | { 281 | "internalType": "bytes4", 282 | "name": "interfaceId", 283 | "type": "bytes4" 284 | } 285 | ], 286 | "name": "supportsInterface", 287 | "outputs": [ 288 | { 289 | "internalType": "bool", 290 | "name": "", 291 | "type": "bool" 292 | } 293 | ], 294 | "stateMutability": "view", 295 | "type": "function" 296 | }, 297 | { 298 | "inputs": [], 299 | "name": "symbol", 300 | "outputs": [ 301 | { 302 | "internalType": "string", 303 | "name": "", 304 | "type": "string" 305 | } 306 | ], 307 | "stateMutability": "view", 308 | "type": "function" 309 | }, 310 | { 311 | "inputs": [ 312 | { 313 | "internalType": "uint256", 314 | "name": "tokenId", 315 | "type": "uint256" 316 | } 317 | ], 318 | "name": "tokenURI", 319 | "outputs": [ 320 | { 321 | "internalType": "string", 322 | "name": "", 323 | "type": "string" 324 | } 325 | ], 326 | "stateMutability": "view", 327 | "type": "function" 328 | }, 329 | { 330 | "inputs": [ 331 | { 332 | "internalType": "address", 333 | "name": "from", 334 | "type": "address" 335 | }, 336 | { 337 | "internalType": "address", 338 | "name": "to", 339 | "type": "address" 340 | }, 341 | { 342 | "internalType": "uint256", 343 | "name": "tokenId", 344 | "type": "uint256" 345 | } 346 | ], 347 | "name": "transferFrom", 348 | "outputs": [], 349 | "stateMutability": "nonpayable", 350 | "type": "function" 351 | } 352 | ], 353 | "bytecode": "0x60806040523480156200001157600080fd5b506040516200278d3803806200278d8339818101604052810190620000379190620002be565b81600090805190602001906200004f92919062000071565b5080600190805190602001906200006892919062000071565b505050620003a7565b8280546200007f9062000372565b90600052602060002090601f016020900481019282620000a35760008555620000ef565b82601f10620000be57805160ff1916838001178555620000ef565b82800160010185558215620000ef579182015b82811115620000ee578251825591602001919060010190620000d1565b5b509050620000fe919062000102565b5090565b5b808211156200011d57600081600090555060010162000103565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200018a826200013f565b810181811067ffffffffffffffff82111715620001ac57620001ab62000150565b5b80604052505050565b6000620001c162000121565b9050620001cf82826200017f565b919050565b600067ffffffffffffffff821115620001f257620001f162000150565b5b620001fd826200013f565b9050602081019050919050565b60005b838110156200022a5780820151818401526020810190506200020d565b838111156200023a576000848401525b50505050565b6000620002576200025184620001d4565b620001b5565b9050828152602081018484840111156200027657620002756200013a565b5b620002838482856200020a565b509392505050565b600082601f830112620002a357620002a262000135565b5b8151620002b584826020860162000240565b91505092915050565b60008060408385031215620002d857620002d76200012b565b5b600083015167ffffffffffffffff811115620002f957620002f862000130565b5b62000307858286016200028b565b925050602083015167ffffffffffffffff8111156200032b576200032a62000130565b5b62000339858286016200028b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200038b57607f821691505b602082108103620003a157620003a062000343565b5b50919050565b6123d680620003b76000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80636352211e1161008c578063a22cb46511610066578063a22cb46514610224578063b88d4fde14610240578063c87b56dd1461025c578063e985e9c51461028c576100cf565b80636352211e146101a657806370a08231146101d657806395d89b4114610206576100cf565b806301ffc9a7146100d457806306fdde0314610104578063081812fc14610122578063095ea7b31461015257806323b872dd1461016e57806342842e0e1461018a575b600080fd5b6100ee60048036038101906100e99190611433565b6102bc565b6040516100fb919061147b565b60405180910390f35b61010c61039e565b604051610119919061152f565b60405180910390f35b61013c60048036038101906101379190611587565b610430565b60405161014991906115f5565b60405180910390f35b61016c6004803603810190610167919061163c565b6104b5565b005b6101886004803603810190610183919061167c565b6105cc565b005b6101a4600480360381019061019f919061167c565b61062c565b005b6101c060048036038101906101bb9190611587565b61064c565b6040516101cd91906115f5565b60405180910390f35b6101f060048036038101906101eb91906116cf565b6106fd565b6040516101fd919061170b565b60405180910390f35b61020e6107b4565b60405161021b919061152f565b60405180910390f35b61023e60048036038101906102399190611752565b610846565b005b61025a600480360381019061025591906118c7565b61085c565b005b61027660048036038101906102719190611587565b6108be565b604051610283919061152f565b60405180910390f35b6102a660048036038101906102a1919061194a565b610965565b6040516102b3919061147b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061038757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103975750610396826109f9565b5b9050919050565b6060600080546103ad906119b9565b80601f01602080910402602001604051908101604052809291908181526020018280546103d9906119b9565b80156104265780601f106103fb57610100808354040283529160200191610426565b820191906000526020600020905b81548152906001019060200180831161040957829003601f168201915b5050505050905090565b600061043b82610a63565b61047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047190611a5c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104c08261064c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052790611aee565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661054f610acf565b73ffffffffffffffffffffffffffffffffffffffff16148061057e575061057d81610578610acf565b610965565b5b6105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490611b80565b60405180910390fd5b6105c78383610ad7565b505050565b6105dd6105d7610acf565b82610b90565b61061c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061390611c12565b60405180910390fd5b610627838383610c6e565b505050565b6106478383836040518060200160405280600081525061085c565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106eb90611ca4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361076d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076490611d36565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107c3906119b9565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef906119b9565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b5050505050905090565b610858610851610acf565b8383610ed4565b5050565b61086d610867610acf565b83610b90565b6108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390611c12565b60405180910390fd5b6108b884848484611040565b50505050565b60606108c982610a63565b610908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ff90611dc8565b60405180910390fd5b600061091261109c565b90506000815111610932576040518060200160405280600081525061095d565b8061093c846110b3565b60405160200161094d929190611e24565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610b4a8361064c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610b9b82610a63565b610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd190611eba565b60405180910390fd5b6000610be58361064c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c275750610c268185610965565b5b80610c6557508373ffffffffffffffffffffffffffffffffffffffff16610c4d84610430565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610c8e8261064c565b73ffffffffffffffffffffffffffffffffffffffff1614610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90611f4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90611fde565b60405180910390fd5b610d5e838383611213565b610d69600082610ad7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610db9919061202d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e109190612061565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecf838383611218565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990612103565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611033919061147b565b60405180910390a3505050565b61104b848484610c6e565b6110578484848461121d565b611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108d90612195565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600082036110fa576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061120e565b600082905060005b6000821461112c578080611115906121b5565b915050600a82611125919061222c565b9150611102565b60008167ffffffffffffffff8111156111485761114761179c565b5b6040519080825280601f01601f19166020018201604052801561117a5781602001600182028036833780820191505090505b5090505b6000851461120757600182611193919061202d565b9150600a856111a2919061225d565b60306111ae9190612061565b60f81b8183815181106111c4576111c361228e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611200919061222c565b945061117e565b8093505050505b919050565b505050565b505050565b600061123e8473ffffffffffffffffffffffffffffffffffffffff166113a4565b15611397578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611267610acf565b8786866040518563ffffffff1660e01b81526004016112899493929190612312565b6020604051808303816000875af19250505080156112c557506040513d601f19601f820116820180604052508101906112c29190612373565b60015b611347573d80600081146112f5576040519150601f19603f3d011682016040523d82523d6000602084013e6112fa565b606091505b50600081510361133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690612195565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061139c565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611410816113db565b811461141b57600080fd5b50565b60008135905061142d81611407565b92915050565b600060208284031215611449576114486113d1565b5b60006114578482850161141e565b91505092915050565b60008115159050919050565b61147581611460565b82525050565b6000602082019050611490600083018461146c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114d05780820151818401526020810190506114b5565b838111156114df576000848401525b50505050565b6000601f19601f8301169050919050565b600061150182611496565b61150b81856114a1565b935061151b8185602086016114b2565b611524816114e5565b840191505092915050565b6000602082019050818103600083015261154981846114f6565b905092915050565b6000819050919050565b61156481611551565b811461156f57600080fd5b50565b6000813590506115818161155b565b92915050565b60006020828403121561159d5761159c6113d1565b5b60006115ab84828501611572565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006115df826115b4565b9050919050565b6115ef816115d4565b82525050565b600060208201905061160a60008301846115e6565b92915050565b611619816115d4565b811461162457600080fd5b50565b60008135905061163681611610565b92915050565b60008060408385031215611653576116526113d1565b5b600061166185828601611627565b925050602061167285828601611572565b9150509250929050565b600080600060608486031215611695576116946113d1565b5b60006116a386828701611627565b93505060206116b486828701611627565b92505060406116c586828701611572565b9150509250925092565b6000602082840312156116e5576116e46113d1565b5b60006116f384828501611627565b91505092915050565b61170581611551565b82525050565b600060208201905061172060008301846116fc565b92915050565b61172f81611460565b811461173a57600080fd5b50565b60008135905061174c81611726565b92915050565b60008060408385031215611769576117686113d1565b5b600061177785828601611627565b92505060206117888582860161173d565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117d4826114e5565b810181811067ffffffffffffffff821117156117f3576117f261179c565b5b80604052505050565b60006118066113c7565b905061181282826117cb565b919050565b600067ffffffffffffffff8211156118325761183161179c565b5b61183b826114e5565b9050602081019050919050565b82818337600083830152505050565b600061186a61186584611817565b6117fc565b90508281526020810184848401111561188657611885611797565b5b611891848285611848565b509392505050565b600082601f8301126118ae576118ad611792565b5b81356118be848260208601611857565b91505092915050565b600080600080608085870312156118e1576118e06113d1565b5b60006118ef87828801611627565b945050602061190087828801611627565b935050604061191187828801611572565b925050606085013567ffffffffffffffff811115611932576119316113d6565b5b61193e87828801611899565b91505092959194509250565b60008060408385031215611961576119606113d1565b5b600061196f85828601611627565b925050602061198085828601611627565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806119d157607f821691505b6020821081036119e4576119e361198a565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000611a46602c836114a1565b9150611a51826119ea565b604082019050919050565b60006020820190508181036000830152611a7581611a39565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ad86021836114a1565b9150611ae382611a7c565b604082019050919050565b60006020820190508181036000830152611b0781611acb565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000611b6a6038836114a1565b9150611b7582611b0e565b604082019050919050565b60006020820190508181036000830152611b9981611b5d565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000611bfc6031836114a1565b9150611c0782611ba0565b604082019050919050565b60006020820190508181036000830152611c2b81611bef565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000611c8e6029836114a1565b9150611c9982611c32565b604082019050919050565b60006020820190508181036000830152611cbd81611c81565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000611d20602a836114a1565b9150611d2b82611cc4565b604082019050919050565b60006020820190508181036000830152611d4f81611d13565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000611db2602f836114a1565b9150611dbd82611d56565b604082019050919050565b60006020820190508181036000830152611de181611da5565b9050919050565b600081905092915050565b6000611dfe82611496565b611e088185611de8565b9350611e188185602086016114b2565b80840191505092915050565b6000611e308285611df3565b9150611e3c8284611df3565b91508190509392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000611ea4602c836114a1565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000611f366025836114a1565b9150611f4182611eda565b604082019050919050565b60006020820190508181036000830152611f6581611f29565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611fc86024836114a1565b9150611fd382611f6c565b604082019050919050565b60006020820190508181036000830152611ff781611fbb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061203882611551565b915061204383611551565b92508282101561205657612055611ffe565b5b828203905092915050565b600061206c82611551565b915061207783611551565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156120ac576120ab611ffe565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006120ed6019836114a1565b91506120f8826120b7565b602082019050919050565b6000602082019050818103600083015261211c816120e0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061217f6032836114a1565b915061218a82612123565b604082019050919050565b600060208201905081810360008301526121ae81612172565b9050919050565b60006121c082611551565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121f2576121f1611ffe565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061223782611551565b915061224283611551565b925082612252576122516121fd565b5b828204905092915050565b600061226882611551565b915061227383611551565b925082612283576122826121fd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006122e4826122bd565b6122ee81856122c8565b93506122fe8185602086016114b2565b612307816114e5565b840191505092915050565b600060808201905061232760008301876115e6565b61233460208301866115e6565b61234160408301856116fc565b818103606083015261235381846122d9565b905095945050505050565b60008151905061236d81611407565b92915050565b600060208284031215612389576123886113d1565b5b60006123978482850161235e565b9150509291505056fea264697066735822122098293507656f6f1726598407542d2b88e4b42cdf6953017bbd572f8d4cfab6b264736f6c634300080e0033", 354 | "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80636352211e1161008c578063a22cb46511610066578063a22cb46514610224578063b88d4fde14610240578063c87b56dd1461025c578063e985e9c51461028c576100cf565b80636352211e146101a657806370a08231146101d657806395d89b4114610206576100cf565b806301ffc9a7146100d457806306fdde0314610104578063081812fc14610122578063095ea7b31461015257806323b872dd1461016e57806342842e0e1461018a575b600080fd5b6100ee60048036038101906100e99190611433565b6102bc565b6040516100fb919061147b565b60405180910390f35b61010c61039e565b604051610119919061152f565b60405180910390f35b61013c60048036038101906101379190611587565b610430565b60405161014991906115f5565b60405180910390f35b61016c6004803603810190610167919061163c565b6104b5565b005b6101886004803603810190610183919061167c565b6105cc565b005b6101a4600480360381019061019f919061167c565b61062c565b005b6101c060048036038101906101bb9190611587565b61064c565b6040516101cd91906115f5565b60405180910390f35b6101f060048036038101906101eb91906116cf565b6106fd565b6040516101fd919061170b565b60405180910390f35b61020e6107b4565b60405161021b919061152f565b60405180910390f35b61023e60048036038101906102399190611752565b610846565b005b61025a600480360381019061025591906118c7565b61085c565b005b61027660048036038101906102719190611587565b6108be565b604051610283919061152f565b60405180910390f35b6102a660048036038101906102a1919061194a565b610965565b6040516102b3919061147b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061038757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103975750610396826109f9565b5b9050919050565b6060600080546103ad906119b9565b80601f01602080910402602001604051908101604052809291908181526020018280546103d9906119b9565b80156104265780601f106103fb57610100808354040283529160200191610426565b820191906000526020600020905b81548152906001019060200180831161040957829003601f168201915b5050505050905090565b600061043b82610a63565b61047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047190611a5c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104c08261064c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052790611aee565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661054f610acf565b73ffffffffffffffffffffffffffffffffffffffff16148061057e575061057d81610578610acf565b610965565b5b6105bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b490611b80565b60405180910390fd5b6105c78383610ad7565b505050565b6105dd6105d7610acf565b82610b90565b61061c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061390611c12565b60405180910390fd5b610627838383610c6e565b505050565b6106478383836040518060200160405280600081525061085c565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106eb90611ca4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361076d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076490611d36565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107c3906119b9565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef906119b9565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b5050505050905090565b610858610851610acf565b8383610ed4565b5050565b61086d610867610acf565b83610b90565b6108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390611c12565b60405180910390fd5b6108b884848484611040565b50505050565b60606108c982610a63565b610908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ff90611dc8565b60405180910390fd5b600061091261109c565b90506000815111610932576040518060200160405280600081525061095d565b8061093c846110b3565b60405160200161094d929190611e24565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610b4a8361064c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610b9b82610a63565b610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd190611eba565b60405180910390fd5b6000610be58361064c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c275750610c268185610965565b5b80610c6557508373ffffffffffffffffffffffffffffffffffffffff16610c4d84610430565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610c8e8261064c565b73ffffffffffffffffffffffffffffffffffffffff1614610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90611f4c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90611fde565b60405180910390fd5b610d5e838383611213565b610d69600082610ad7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610db9919061202d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e109190612061565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ecf838383611218565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990612103565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611033919061147b565b60405180910390a3505050565b61104b848484610c6e565b6110578484848461121d565b611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108d90612195565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600082036110fa576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061120e565b600082905060005b6000821461112c578080611115906121b5565b915050600a82611125919061222c565b9150611102565b60008167ffffffffffffffff8111156111485761114761179c565b5b6040519080825280601f01601f19166020018201604052801561117a5781602001600182028036833780820191505090505b5090505b6000851461120757600182611193919061202d565b9150600a856111a2919061225d565b60306111ae9190612061565b60f81b8183815181106111c4576111c361228e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611200919061222c565b945061117e565b8093505050505b919050565b505050565b505050565b600061123e8473ffffffffffffffffffffffffffffffffffffffff166113a4565b15611397578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611267610acf565b8786866040518563ffffffff1660e01b81526004016112899493929190612312565b6020604051808303816000875af19250505080156112c557506040513d601f19601f820116820180604052508101906112c29190612373565b60015b611347573d80600081146112f5576040519150601f19603f3d011682016040523d82523d6000602084013e6112fa565b606091505b50600081510361133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690612195565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061139c565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611410816113db565b811461141b57600080fd5b50565b60008135905061142d81611407565b92915050565b600060208284031215611449576114486113d1565b5b60006114578482850161141e565b91505092915050565b60008115159050919050565b61147581611460565b82525050565b6000602082019050611490600083018461146c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156114d05780820151818401526020810190506114b5565b838111156114df576000848401525b50505050565b6000601f19601f8301169050919050565b600061150182611496565b61150b81856114a1565b935061151b8185602086016114b2565b611524816114e5565b840191505092915050565b6000602082019050818103600083015261154981846114f6565b905092915050565b6000819050919050565b61156481611551565b811461156f57600080fd5b50565b6000813590506115818161155b565b92915050565b60006020828403121561159d5761159c6113d1565b5b60006115ab84828501611572565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006115df826115b4565b9050919050565b6115ef816115d4565b82525050565b600060208201905061160a60008301846115e6565b92915050565b611619816115d4565b811461162457600080fd5b50565b60008135905061163681611610565b92915050565b60008060408385031215611653576116526113d1565b5b600061166185828601611627565b925050602061167285828601611572565b9150509250929050565b600080600060608486031215611695576116946113d1565b5b60006116a386828701611627565b93505060206116b486828701611627565b92505060406116c586828701611572565b9150509250925092565b6000602082840312156116e5576116e46113d1565b5b60006116f384828501611627565b91505092915050565b61170581611551565b82525050565b600060208201905061172060008301846116fc565b92915050565b61172f81611460565b811461173a57600080fd5b50565b60008135905061174c81611726565b92915050565b60008060408385031215611769576117686113d1565b5b600061177785828601611627565b92505060206117888582860161173d565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117d4826114e5565b810181811067ffffffffffffffff821117156117f3576117f261179c565b5b80604052505050565b60006118066113c7565b905061181282826117cb565b919050565b600067ffffffffffffffff8211156118325761183161179c565b5b61183b826114e5565b9050602081019050919050565b82818337600083830152505050565b600061186a61186584611817565b6117fc565b90508281526020810184848401111561188657611885611797565b5b611891848285611848565b509392505050565b600082601f8301126118ae576118ad611792565b5b81356118be848260208601611857565b91505092915050565b600080600080608085870312156118e1576118e06113d1565b5b60006118ef87828801611627565b945050602061190087828801611627565b935050604061191187828801611572565b925050606085013567ffffffffffffffff811115611932576119316113d6565b5b61193e87828801611899565b91505092959194509250565b60008060408385031215611961576119606113d1565b5b600061196f85828601611627565b925050602061198085828601611627565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806119d157607f821691505b6020821081036119e4576119e361198a565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000611a46602c836114a1565b9150611a51826119ea565b604082019050919050565b60006020820190508181036000830152611a7581611a39565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ad86021836114a1565b9150611ae382611a7c565b604082019050919050565b60006020820190508181036000830152611b0781611acb565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000611b6a6038836114a1565b9150611b7582611b0e565b604082019050919050565b60006020820190508181036000830152611b9981611b5d565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000611bfc6031836114a1565b9150611c0782611ba0565b604082019050919050565b60006020820190508181036000830152611c2b81611bef565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000611c8e6029836114a1565b9150611c9982611c32565b604082019050919050565b60006020820190508181036000830152611cbd81611c81565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000611d20602a836114a1565b9150611d2b82611cc4565b604082019050919050565b60006020820190508181036000830152611d4f81611d13565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000611db2602f836114a1565b9150611dbd82611d56565b604082019050919050565b60006020820190508181036000830152611de181611da5565b9050919050565b600081905092915050565b6000611dfe82611496565b611e088185611de8565b9350611e188185602086016114b2565b80840191505092915050565b6000611e308285611df3565b9150611e3c8284611df3565b91508190509392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000611ea4602c836114a1565b9150611eaf82611e48565b604082019050919050565b60006020820190508181036000830152611ed381611e97565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000611f366025836114a1565b9150611f4182611eda565b604082019050919050565b60006020820190508181036000830152611f6581611f29565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611fc86024836114a1565b9150611fd382611f6c565b604082019050919050565b60006020820190508181036000830152611ff781611fbb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061203882611551565b915061204383611551565b92508282101561205657612055611ffe565b5b828203905092915050565b600061206c82611551565b915061207783611551565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156120ac576120ab611ffe565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006120ed6019836114a1565b91506120f8826120b7565b602082019050919050565b6000602082019050818103600083015261211c816120e0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061217f6032836114a1565b915061218a82612123565b604082019050919050565b600060208201905081810360008301526121ae81612172565b9050919050565b60006121c082611551565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121f2576121f1611ffe565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061223782611551565b915061224283611551565b925082612252576122516121fd565b5b828204905092915050565b600061226882611551565b915061227383611551565b925082612283576122826121fd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006122e4826122bd565b6122ee81856122c8565b93506122fe8185602086016114b2565b612307816114e5565b840191505092915050565b600060808201905061232760008301876115e6565b61233460208301866115e6565b61234160408301856116fc565b818103606083015261235381846122d9565b905095945050505050565b60008151905061236d81611407565b92915050565b600060208284031215612389576123886113d1565b5b60006123978482850161235e565b9150509291505056fea264697066735822122098293507656f6f1726598407542d2b88e4b42cdf6953017bbd572f8d4cfab6b264736f6c634300080e0033", 355 | "linkReferences": {}, 356 | "deployedLinkReferences": {} 357 | } 358 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/IERC721.sol/IERC721.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/IERC721.sol/IERC721.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "IERC721", 4 | "sourceName": "@openzeppelin/contracts/token/ERC721/IERC721.sol", 5 | "abi": [ 6 | { 7 | "anonymous": false, 8 | "inputs": [ 9 | { 10 | "indexed": true, 11 | "internalType": "address", 12 | "name": "owner", 13 | "type": "address" 14 | }, 15 | { 16 | "indexed": true, 17 | "internalType": "address", 18 | "name": "approved", 19 | "type": "address" 20 | }, 21 | { 22 | "indexed": true, 23 | "internalType": "uint256", 24 | "name": "tokenId", 25 | "type": "uint256" 26 | } 27 | ], 28 | "name": "Approval", 29 | "type": "event" 30 | }, 31 | { 32 | "anonymous": false, 33 | "inputs": [ 34 | { 35 | "indexed": true, 36 | "internalType": "address", 37 | "name": "owner", 38 | "type": "address" 39 | }, 40 | { 41 | "indexed": true, 42 | "internalType": "address", 43 | "name": "operator", 44 | "type": "address" 45 | }, 46 | { 47 | "indexed": false, 48 | "internalType": "bool", 49 | "name": "approved", 50 | "type": "bool" 51 | } 52 | ], 53 | "name": "ApprovalForAll", 54 | "type": "event" 55 | }, 56 | { 57 | "anonymous": false, 58 | "inputs": [ 59 | { 60 | "indexed": true, 61 | "internalType": "address", 62 | "name": "from", 63 | "type": "address" 64 | }, 65 | { 66 | "indexed": true, 67 | "internalType": "address", 68 | "name": "to", 69 | "type": "address" 70 | }, 71 | { 72 | "indexed": true, 73 | "internalType": "uint256", 74 | "name": "tokenId", 75 | "type": "uint256" 76 | } 77 | ], 78 | "name": "Transfer", 79 | "type": "event" 80 | }, 81 | { 82 | "inputs": [ 83 | { 84 | "internalType": "address", 85 | "name": "to", 86 | "type": "address" 87 | }, 88 | { 89 | "internalType": "uint256", 90 | "name": "tokenId", 91 | "type": "uint256" 92 | } 93 | ], 94 | "name": "approve", 95 | "outputs": [], 96 | "stateMutability": "nonpayable", 97 | "type": "function" 98 | }, 99 | { 100 | "inputs": [ 101 | { 102 | "internalType": "address", 103 | "name": "owner", 104 | "type": "address" 105 | } 106 | ], 107 | "name": "balanceOf", 108 | "outputs": [ 109 | { 110 | "internalType": "uint256", 111 | "name": "balance", 112 | "type": "uint256" 113 | } 114 | ], 115 | "stateMutability": "view", 116 | "type": "function" 117 | }, 118 | { 119 | "inputs": [ 120 | { 121 | "internalType": "uint256", 122 | "name": "tokenId", 123 | "type": "uint256" 124 | } 125 | ], 126 | "name": "getApproved", 127 | "outputs": [ 128 | { 129 | "internalType": "address", 130 | "name": "operator", 131 | "type": "address" 132 | } 133 | ], 134 | "stateMutability": "view", 135 | "type": "function" 136 | }, 137 | { 138 | "inputs": [ 139 | { 140 | "internalType": "address", 141 | "name": "owner", 142 | "type": "address" 143 | }, 144 | { 145 | "internalType": "address", 146 | "name": "operator", 147 | "type": "address" 148 | } 149 | ], 150 | "name": "isApprovedForAll", 151 | "outputs": [ 152 | { 153 | "internalType": "bool", 154 | "name": "", 155 | "type": "bool" 156 | } 157 | ], 158 | "stateMutability": "view", 159 | "type": "function" 160 | }, 161 | { 162 | "inputs": [ 163 | { 164 | "internalType": "uint256", 165 | "name": "tokenId", 166 | "type": "uint256" 167 | } 168 | ], 169 | "name": "ownerOf", 170 | "outputs": [ 171 | { 172 | "internalType": "address", 173 | "name": "owner", 174 | "type": "address" 175 | } 176 | ], 177 | "stateMutability": "view", 178 | "type": "function" 179 | }, 180 | { 181 | "inputs": [ 182 | { 183 | "internalType": "address", 184 | "name": "from", 185 | "type": "address" 186 | }, 187 | { 188 | "internalType": "address", 189 | "name": "to", 190 | "type": "address" 191 | }, 192 | { 193 | "internalType": "uint256", 194 | "name": "tokenId", 195 | "type": "uint256" 196 | } 197 | ], 198 | "name": "safeTransferFrom", 199 | "outputs": [], 200 | "stateMutability": "nonpayable", 201 | "type": "function" 202 | }, 203 | { 204 | "inputs": [ 205 | { 206 | "internalType": "address", 207 | "name": "from", 208 | "type": "address" 209 | }, 210 | { 211 | "internalType": "address", 212 | "name": "to", 213 | "type": "address" 214 | }, 215 | { 216 | "internalType": "uint256", 217 | "name": "tokenId", 218 | "type": "uint256" 219 | }, 220 | { 221 | "internalType": "bytes", 222 | "name": "data", 223 | "type": "bytes" 224 | } 225 | ], 226 | "name": "safeTransferFrom", 227 | "outputs": [], 228 | "stateMutability": "nonpayable", 229 | "type": "function" 230 | }, 231 | { 232 | "inputs": [ 233 | { 234 | "internalType": "address", 235 | "name": "operator", 236 | "type": "address" 237 | }, 238 | { 239 | "internalType": "bool", 240 | "name": "_approved", 241 | "type": "bool" 242 | } 243 | ], 244 | "name": "setApprovalForAll", 245 | "outputs": [], 246 | "stateMutability": "nonpayable", 247 | "type": "function" 248 | }, 249 | { 250 | "inputs": [ 251 | { 252 | "internalType": "bytes4", 253 | "name": "interfaceId", 254 | "type": "bytes4" 255 | } 256 | ], 257 | "name": "supportsInterface", 258 | "outputs": [ 259 | { 260 | "internalType": "bool", 261 | "name": "", 262 | "type": "bool" 263 | } 264 | ], 265 | "stateMutability": "view", 266 | "type": "function" 267 | }, 268 | { 269 | "inputs": [ 270 | { 271 | "internalType": "address", 272 | "name": "from", 273 | "type": "address" 274 | }, 275 | { 276 | "internalType": "address", 277 | "name": "to", 278 | "type": "address" 279 | }, 280 | { 281 | "internalType": "uint256", 282 | "name": "tokenId", 283 | "type": "uint256" 284 | } 285 | ], 286 | "name": "transferFrom", 287 | "outputs": [], 288 | "stateMutability": "nonpayable", 289 | "type": "function" 290 | } 291 | ], 292 | "bytecode": "0x", 293 | "deployedBytecode": "0x", 294 | "linkReferences": {}, 295 | "deployedLinkReferences": {} 296 | } 297 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol/IERC721Receiver.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol/IERC721Receiver.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "IERC721Receiver", 4 | "sourceName": "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol", 5 | "abi": [ 6 | { 7 | "inputs": [ 8 | { 9 | "internalType": "address", 10 | "name": "operator", 11 | "type": "address" 12 | }, 13 | { 14 | "internalType": "address", 15 | "name": "from", 16 | "type": "address" 17 | }, 18 | { 19 | "internalType": "uint256", 20 | "name": "tokenId", 21 | "type": "uint256" 22 | }, 23 | { 24 | "internalType": "bytes", 25 | "name": "data", 26 | "type": "bytes" 27 | } 28 | ], 29 | "name": "onERC721Received", 30 | "outputs": [ 31 | { 32 | "internalType": "bytes4", 33 | "name": "", 34 | "type": "bytes4" 35 | } 36 | ], 37 | "stateMutability": "nonpayable", 38 | "type": "function" 39 | } 40 | ], 41 | "bytecode": "0x", 42 | "deployedBytecode": "0x", 43 | "linkReferences": {}, 44 | "deployedLinkReferences": {} 45 | } 46 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol/ERC721URIStorage.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol/ERC721URIStorage.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "ERC721URIStorage", 4 | "sourceName": "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol", 5 | "abi": [ 6 | { 7 | "anonymous": false, 8 | "inputs": [ 9 | { 10 | "indexed": true, 11 | "internalType": "address", 12 | "name": "owner", 13 | "type": "address" 14 | }, 15 | { 16 | "indexed": true, 17 | "internalType": "address", 18 | "name": "approved", 19 | "type": "address" 20 | }, 21 | { 22 | "indexed": true, 23 | "internalType": "uint256", 24 | "name": "tokenId", 25 | "type": "uint256" 26 | } 27 | ], 28 | "name": "Approval", 29 | "type": "event" 30 | }, 31 | { 32 | "anonymous": false, 33 | "inputs": [ 34 | { 35 | "indexed": true, 36 | "internalType": "address", 37 | "name": "owner", 38 | "type": "address" 39 | }, 40 | { 41 | "indexed": true, 42 | "internalType": "address", 43 | "name": "operator", 44 | "type": "address" 45 | }, 46 | { 47 | "indexed": false, 48 | "internalType": "bool", 49 | "name": "approved", 50 | "type": "bool" 51 | } 52 | ], 53 | "name": "ApprovalForAll", 54 | "type": "event" 55 | }, 56 | { 57 | "anonymous": false, 58 | "inputs": [ 59 | { 60 | "indexed": true, 61 | "internalType": "address", 62 | "name": "from", 63 | "type": "address" 64 | }, 65 | { 66 | "indexed": true, 67 | "internalType": "address", 68 | "name": "to", 69 | "type": "address" 70 | }, 71 | { 72 | "indexed": true, 73 | "internalType": "uint256", 74 | "name": "tokenId", 75 | "type": "uint256" 76 | } 77 | ], 78 | "name": "Transfer", 79 | "type": "event" 80 | }, 81 | { 82 | "inputs": [ 83 | { 84 | "internalType": "address", 85 | "name": "to", 86 | "type": "address" 87 | }, 88 | { 89 | "internalType": "uint256", 90 | "name": "tokenId", 91 | "type": "uint256" 92 | } 93 | ], 94 | "name": "approve", 95 | "outputs": [], 96 | "stateMutability": "nonpayable", 97 | "type": "function" 98 | }, 99 | { 100 | "inputs": [ 101 | { 102 | "internalType": "address", 103 | "name": "owner", 104 | "type": "address" 105 | } 106 | ], 107 | "name": "balanceOf", 108 | "outputs": [ 109 | { 110 | "internalType": "uint256", 111 | "name": "", 112 | "type": "uint256" 113 | } 114 | ], 115 | "stateMutability": "view", 116 | "type": "function" 117 | }, 118 | { 119 | "inputs": [ 120 | { 121 | "internalType": "uint256", 122 | "name": "tokenId", 123 | "type": "uint256" 124 | } 125 | ], 126 | "name": "getApproved", 127 | "outputs": [ 128 | { 129 | "internalType": "address", 130 | "name": "", 131 | "type": "address" 132 | } 133 | ], 134 | "stateMutability": "view", 135 | "type": "function" 136 | }, 137 | { 138 | "inputs": [ 139 | { 140 | "internalType": "address", 141 | "name": "owner", 142 | "type": "address" 143 | }, 144 | { 145 | "internalType": "address", 146 | "name": "operator", 147 | "type": "address" 148 | } 149 | ], 150 | "name": "isApprovedForAll", 151 | "outputs": [ 152 | { 153 | "internalType": "bool", 154 | "name": "", 155 | "type": "bool" 156 | } 157 | ], 158 | "stateMutability": "view", 159 | "type": "function" 160 | }, 161 | { 162 | "inputs": [], 163 | "name": "name", 164 | "outputs": [ 165 | { 166 | "internalType": "string", 167 | "name": "", 168 | "type": "string" 169 | } 170 | ], 171 | "stateMutability": "view", 172 | "type": "function" 173 | }, 174 | { 175 | "inputs": [ 176 | { 177 | "internalType": "uint256", 178 | "name": "tokenId", 179 | "type": "uint256" 180 | } 181 | ], 182 | "name": "ownerOf", 183 | "outputs": [ 184 | { 185 | "internalType": "address", 186 | "name": "", 187 | "type": "address" 188 | } 189 | ], 190 | "stateMutability": "view", 191 | "type": "function" 192 | }, 193 | { 194 | "inputs": [ 195 | { 196 | "internalType": "address", 197 | "name": "from", 198 | "type": "address" 199 | }, 200 | { 201 | "internalType": "address", 202 | "name": "to", 203 | "type": "address" 204 | }, 205 | { 206 | "internalType": "uint256", 207 | "name": "tokenId", 208 | "type": "uint256" 209 | } 210 | ], 211 | "name": "safeTransferFrom", 212 | "outputs": [], 213 | "stateMutability": "nonpayable", 214 | "type": "function" 215 | }, 216 | { 217 | "inputs": [ 218 | { 219 | "internalType": "address", 220 | "name": "from", 221 | "type": "address" 222 | }, 223 | { 224 | "internalType": "address", 225 | "name": "to", 226 | "type": "address" 227 | }, 228 | { 229 | "internalType": "uint256", 230 | "name": "tokenId", 231 | "type": "uint256" 232 | }, 233 | { 234 | "internalType": "bytes", 235 | "name": "_data", 236 | "type": "bytes" 237 | } 238 | ], 239 | "name": "safeTransferFrom", 240 | "outputs": [], 241 | "stateMutability": "nonpayable", 242 | "type": "function" 243 | }, 244 | { 245 | "inputs": [ 246 | { 247 | "internalType": "address", 248 | "name": "operator", 249 | "type": "address" 250 | }, 251 | { 252 | "internalType": "bool", 253 | "name": "approved", 254 | "type": "bool" 255 | } 256 | ], 257 | "name": "setApprovalForAll", 258 | "outputs": [], 259 | "stateMutability": "nonpayable", 260 | "type": "function" 261 | }, 262 | { 263 | "inputs": [ 264 | { 265 | "internalType": "bytes4", 266 | "name": "interfaceId", 267 | "type": "bytes4" 268 | } 269 | ], 270 | "name": "supportsInterface", 271 | "outputs": [ 272 | { 273 | "internalType": "bool", 274 | "name": "", 275 | "type": "bool" 276 | } 277 | ], 278 | "stateMutability": "view", 279 | "type": "function" 280 | }, 281 | { 282 | "inputs": [], 283 | "name": "symbol", 284 | "outputs": [ 285 | { 286 | "internalType": "string", 287 | "name": "", 288 | "type": "string" 289 | } 290 | ], 291 | "stateMutability": "view", 292 | "type": "function" 293 | }, 294 | { 295 | "inputs": [ 296 | { 297 | "internalType": "uint256", 298 | "name": "tokenId", 299 | "type": "uint256" 300 | } 301 | ], 302 | "name": "tokenURI", 303 | "outputs": [ 304 | { 305 | "internalType": "string", 306 | "name": "", 307 | "type": "string" 308 | } 309 | ], 310 | "stateMutability": "view", 311 | "type": "function" 312 | }, 313 | { 314 | "inputs": [ 315 | { 316 | "internalType": "address", 317 | "name": "from", 318 | "type": "address" 319 | }, 320 | { 321 | "internalType": "address", 322 | "name": "to", 323 | "type": "address" 324 | }, 325 | { 326 | "internalType": "uint256", 327 | "name": "tokenId", 328 | "type": "uint256" 329 | } 330 | ], 331 | "name": "transferFrom", 332 | "outputs": [], 333 | "stateMutability": "nonpayable", 334 | "type": "function" 335 | } 336 | ], 337 | "bytecode": "0x", 338 | "deployedBytecode": "0x", 339 | "linkReferences": {}, 340 | "deployedLinkReferences": {} 341 | } 342 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol/IERC721Metadata.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol/IERC721Metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "IERC721Metadata", 4 | "sourceName": "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol", 5 | "abi": [ 6 | { 7 | "anonymous": false, 8 | "inputs": [ 9 | { 10 | "indexed": true, 11 | "internalType": "address", 12 | "name": "owner", 13 | "type": "address" 14 | }, 15 | { 16 | "indexed": true, 17 | "internalType": "address", 18 | "name": "approved", 19 | "type": "address" 20 | }, 21 | { 22 | "indexed": true, 23 | "internalType": "uint256", 24 | "name": "tokenId", 25 | "type": "uint256" 26 | } 27 | ], 28 | "name": "Approval", 29 | "type": "event" 30 | }, 31 | { 32 | "anonymous": false, 33 | "inputs": [ 34 | { 35 | "indexed": true, 36 | "internalType": "address", 37 | "name": "owner", 38 | "type": "address" 39 | }, 40 | { 41 | "indexed": true, 42 | "internalType": "address", 43 | "name": "operator", 44 | "type": "address" 45 | }, 46 | { 47 | "indexed": false, 48 | "internalType": "bool", 49 | "name": "approved", 50 | "type": "bool" 51 | } 52 | ], 53 | "name": "ApprovalForAll", 54 | "type": "event" 55 | }, 56 | { 57 | "anonymous": false, 58 | "inputs": [ 59 | { 60 | "indexed": true, 61 | "internalType": "address", 62 | "name": "from", 63 | "type": "address" 64 | }, 65 | { 66 | "indexed": true, 67 | "internalType": "address", 68 | "name": "to", 69 | "type": "address" 70 | }, 71 | { 72 | "indexed": true, 73 | "internalType": "uint256", 74 | "name": "tokenId", 75 | "type": "uint256" 76 | } 77 | ], 78 | "name": "Transfer", 79 | "type": "event" 80 | }, 81 | { 82 | "inputs": [ 83 | { 84 | "internalType": "address", 85 | "name": "to", 86 | "type": "address" 87 | }, 88 | { 89 | "internalType": "uint256", 90 | "name": "tokenId", 91 | "type": "uint256" 92 | } 93 | ], 94 | "name": "approve", 95 | "outputs": [], 96 | "stateMutability": "nonpayable", 97 | "type": "function" 98 | }, 99 | { 100 | "inputs": [ 101 | { 102 | "internalType": "address", 103 | "name": "owner", 104 | "type": "address" 105 | } 106 | ], 107 | "name": "balanceOf", 108 | "outputs": [ 109 | { 110 | "internalType": "uint256", 111 | "name": "balance", 112 | "type": "uint256" 113 | } 114 | ], 115 | "stateMutability": "view", 116 | "type": "function" 117 | }, 118 | { 119 | "inputs": [ 120 | { 121 | "internalType": "uint256", 122 | "name": "tokenId", 123 | "type": "uint256" 124 | } 125 | ], 126 | "name": "getApproved", 127 | "outputs": [ 128 | { 129 | "internalType": "address", 130 | "name": "operator", 131 | "type": "address" 132 | } 133 | ], 134 | "stateMutability": "view", 135 | "type": "function" 136 | }, 137 | { 138 | "inputs": [ 139 | { 140 | "internalType": "address", 141 | "name": "owner", 142 | "type": "address" 143 | }, 144 | { 145 | "internalType": "address", 146 | "name": "operator", 147 | "type": "address" 148 | } 149 | ], 150 | "name": "isApprovedForAll", 151 | "outputs": [ 152 | { 153 | "internalType": "bool", 154 | "name": "", 155 | "type": "bool" 156 | } 157 | ], 158 | "stateMutability": "view", 159 | "type": "function" 160 | }, 161 | { 162 | "inputs": [], 163 | "name": "name", 164 | "outputs": [ 165 | { 166 | "internalType": "string", 167 | "name": "", 168 | "type": "string" 169 | } 170 | ], 171 | "stateMutability": "view", 172 | "type": "function" 173 | }, 174 | { 175 | "inputs": [ 176 | { 177 | "internalType": "uint256", 178 | "name": "tokenId", 179 | "type": "uint256" 180 | } 181 | ], 182 | "name": "ownerOf", 183 | "outputs": [ 184 | { 185 | "internalType": "address", 186 | "name": "owner", 187 | "type": "address" 188 | } 189 | ], 190 | "stateMutability": "view", 191 | "type": "function" 192 | }, 193 | { 194 | "inputs": [ 195 | { 196 | "internalType": "address", 197 | "name": "from", 198 | "type": "address" 199 | }, 200 | { 201 | "internalType": "address", 202 | "name": "to", 203 | "type": "address" 204 | }, 205 | { 206 | "internalType": "uint256", 207 | "name": "tokenId", 208 | "type": "uint256" 209 | } 210 | ], 211 | "name": "safeTransferFrom", 212 | "outputs": [], 213 | "stateMutability": "nonpayable", 214 | "type": "function" 215 | }, 216 | { 217 | "inputs": [ 218 | { 219 | "internalType": "address", 220 | "name": "from", 221 | "type": "address" 222 | }, 223 | { 224 | "internalType": "address", 225 | "name": "to", 226 | "type": "address" 227 | }, 228 | { 229 | "internalType": "uint256", 230 | "name": "tokenId", 231 | "type": "uint256" 232 | }, 233 | { 234 | "internalType": "bytes", 235 | "name": "data", 236 | "type": "bytes" 237 | } 238 | ], 239 | "name": "safeTransferFrom", 240 | "outputs": [], 241 | "stateMutability": "nonpayable", 242 | "type": "function" 243 | }, 244 | { 245 | "inputs": [ 246 | { 247 | "internalType": "address", 248 | "name": "operator", 249 | "type": "address" 250 | }, 251 | { 252 | "internalType": "bool", 253 | "name": "_approved", 254 | "type": "bool" 255 | } 256 | ], 257 | "name": "setApprovalForAll", 258 | "outputs": [], 259 | "stateMutability": "nonpayable", 260 | "type": "function" 261 | }, 262 | { 263 | "inputs": [ 264 | { 265 | "internalType": "bytes4", 266 | "name": "interfaceId", 267 | "type": "bytes4" 268 | } 269 | ], 270 | "name": "supportsInterface", 271 | "outputs": [ 272 | { 273 | "internalType": "bool", 274 | "name": "", 275 | "type": "bool" 276 | } 277 | ], 278 | "stateMutability": "view", 279 | "type": "function" 280 | }, 281 | { 282 | "inputs": [], 283 | "name": "symbol", 284 | "outputs": [ 285 | { 286 | "internalType": "string", 287 | "name": "", 288 | "type": "string" 289 | } 290 | ], 291 | "stateMutability": "view", 292 | "type": "function" 293 | }, 294 | { 295 | "inputs": [ 296 | { 297 | "internalType": "uint256", 298 | "name": "tokenId", 299 | "type": "uint256" 300 | } 301 | ], 302 | "name": "tokenURI", 303 | "outputs": [ 304 | { 305 | "internalType": "string", 306 | "name": "", 307 | "type": "string" 308 | } 309 | ], 310 | "stateMutability": "view", 311 | "type": "function" 312 | }, 313 | { 314 | "inputs": [ 315 | { 316 | "internalType": "address", 317 | "name": "from", 318 | "type": "address" 319 | }, 320 | { 321 | "internalType": "address", 322 | "name": "to", 323 | "type": "address" 324 | }, 325 | { 326 | "internalType": "uint256", 327 | "name": "tokenId", 328 | "type": "uint256" 329 | } 330 | ], 331 | "name": "transferFrom", 332 | "outputs": [], 333 | "stateMutability": "nonpayable", 334 | "type": "function" 335 | } 336 | ], 337 | "bytecode": "0x", 338 | "deployedBytecode": "0x", 339 | "linkReferences": {}, 340 | "deployedLinkReferences": {} 341 | } 342 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Address.sol/Address.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "Address", 4 | "sourceName": "@openzeppelin/contracts/utils/Address.sol", 5 | "abi": [], 6 | "bytecode": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208ec009440bc2ee622a039bfd15bc54efe545b00b412d79786efa1ac7877236d864736f6c634300080e0033", 7 | "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208ec009440bc2ee622a039bfd15bc54efe545b00b412d79786efa1ac7877236d864736f6c634300080e0033", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Context.sol/Context.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "Context", 4 | "sourceName": "@openzeppelin/contracts/utils/Context.sol", 5 | "abi": [], 6 | "bytecode": "0x", 7 | "deployedBytecode": "0x", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Counters.sol/Counters.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Counters.sol/Counters.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "Counters", 4 | "sourceName": "@openzeppelin/contracts/utils/Counters.sol", 5 | "abi": [], 6 | "bytecode": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220714ff820c223879d0c15a2dda3a35b81ee115f18cdc59077bedf07ff58a7300f64736f6c634300080e0033", 7 | "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220714ff820c223879d0c15a2dda3a35b81ee115f18cdc59077bedf07ff58a7300f64736f6c634300080e0033", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Strings.sol/Strings.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/Strings.sol/Strings.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "Strings", 4 | "sourceName": "@openzeppelin/contracts/utils/Strings.sol", 5 | "abi": [], 6 | "bytecode": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212202a5969d4dd18d4c69370efe154edd2ee6f96b3e9f1c309a7a88fa18a8ffb15ed64736f6c634300080e0033", 7 | "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212202a5969d4dd18d4c69370efe154edd2ee6f96b3e9f1c309a7a88fa18a8ffb15ed64736f6c634300080e0033", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/cryptography/ECDSA.sol/ECDSA.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/0d65ad8af0d44ff298c5c640b3d1e319.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/cryptography/ECDSA.sol/ECDSA.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "ECDSA", 4 | "sourceName": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol", 5 | "abi": [], 6 | "bytecode": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208f8cce67184b0b2d6b0d6471a5da3e6cb1943bf6875155b21e58fa396807027164736f6c634300080e0033", 7 | "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208f8cce67184b0b2d6b0d6471a5da3e6cb1943bf6875155b21e58fa396807027164736f6c634300080e0033", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol/EIP712.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/0d65ad8af0d44ff298c5c640b3d1e319.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol/EIP712.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "EIP712", 4 | "sourceName": "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol", 5 | "abi": [], 6 | "bytecode": "0x", 7 | "deployedBytecode": "0x", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/introspection/ERC165.sol/ERC165.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/introspection/ERC165.sol/ERC165.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "ERC165", 4 | "sourceName": "@openzeppelin/contracts/utils/introspection/ERC165.sol", 5 | "abi": [ 6 | { 7 | "inputs": [ 8 | { 9 | "internalType": "bytes4", 10 | "name": "interfaceId", 11 | "type": "bytes4" 12 | } 13 | ], 14 | "name": "supportsInterface", 15 | "outputs": [ 16 | { 17 | "internalType": "bool", 18 | "name": "", 19 | "type": "bool" 20 | } 21 | ], 22 | "stateMutability": "view", 23 | "type": "function" 24 | } 25 | ], 26 | "bytecode": "0x", 27 | "deployedBytecode": "0x", 28 | "linkReferences": {}, 29 | "deployedLinkReferences": {} 30 | } 31 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/introspection/IERC165.sol/IERC165.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/e412f8bbe8b00b7be0cde052b42cf52a.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/@openzeppelin/contracts/utils/introspection/IERC165.sol/IERC165.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "IERC165", 4 | "sourceName": "@openzeppelin/contracts/utils/introspection/IERC165.sol", 5 | "abi": [ 6 | { 7 | "inputs": [ 8 | { 9 | "internalType": "bytes4", 10 | "name": "interfaceId", 11 | "type": "bytes4" 12 | } 13 | ], 14 | "name": "supportsInterface", 15 | "outputs": [ 16 | { 17 | "internalType": "bool", 18 | "name": "", 19 | "type": "bool" 20 | } 21 | ], 22 | "stateMutability": "view", 23 | "type": "function" 24 | } 25 | ], 26 | "bytecode": "0x", 27 | "deployedBytecode": "0x", 28 | "linkReferences": {}, 29 | "deployedLinkReferences": {} 30 | } 31 | -------------------------------------------------------------------------------- /artifacts/contracts/example.sol/SimonDevNFT.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../build-info/0d65ad8af0d44ff298c5c640b3d1e319.json" 4 | } 5 | -------------------------------------------------------------------------------- /artifacts/contracts/example.sol/SimonDevNFT.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "SimonDevNFT", 4 | "sourceName": "contracts/example.sol", 5 | "abi": [ 6 | { 7 | "inputs": [], 8 | "stateMutability": "nonpayable", 9 | "type": "constructor" 10 | }, 11 | { 12 | "anonymous": false, 13 | "inputs": [ 14 | { 15 | "indexed": true, 16 | "internalType": "address", 17 | "name": "owner", 18 | "type": "address" 19 | }, 20 | { 21 | "indexed": true, 22 | "internalType": "address", 23 | "name": "approved", 24 | "type": "address" 25 | }, 26 | { 27 | "indexed": true, 28 | "internalType": "uint256", 29 | "name": "tokenId", 30 | "type": "uint256" 31 | } 32 | ], 33 | "name": "Approval", 34 | "type": "event" 35 | }, 36 | { 37 | "anonymous": false, 38 | "inputs": [ 39 | { 40 | "indexed": true, 41 | "internalType": "address", 42 | "name": "owner", 43 | "type": "address" 44 | }, 45 | { 46 | "indexed": true, 47 | "internalType": "address", 48 | "name": "operator", 49 | "type": "address" 50 | }, 51 | { 52 | "indexed": false, 53 | "internalType": "bool", 54 | "name": "approved", 55 | "type": "bool" 56 | } 57 | ], 58 | "name": "ApprovalForAll", 59 | "type": "event" 60 | }, 61 | { 62 | "anonymous": false, 63 | "inputs": [ 64 | { 65 | "indexed": true, 66 | "internalType": "address", 67 | "name": "previousOwner", 68 | "type": "address" 69 | }, 70 | { 71 | "indexed": true, 72 | "internalType": "address", 73 | "name": "newOwner", 74 | "type": "address" 75 | } 76 | ], 77 | "name": "OwnershipTransferred", 78 | "type": "event" 79 | }, 80 | { 81 | "anonymous": false, 82 | "inputs": [ 83 | { 84 | "indexed": true, 85 | "internalType": "address", 86 | "name": "from", 87 | "type": "address" 88 | }, 89 | { 90 | "indexed": true, 91 | "internalType": "address", 92 | "name": "to", 93 | "type": "address" 94 | }, 95 | { 96 | "indexed": true, 97 | "internalType": "uint256", 98 | "name": "tokenId", 99 | "type": "uint256" 100 | } 101 | ], 102 | "name": "Transfer", 103 | "type": "event" 104 | }, 105 | { 106 | "inputs": [ 107 | { 108 | "internalType": "address", 109 | "name": "to", 110 | "type": "address" 111 | }, 112 | { 113 | "internalType": "uint256", 114 | "name": "tokenId", 115 | "type": "uint256" 116 | } 117 | ], 118 | "name": "approve", 119 | "outputs": [], 120 | "stateMutability": "nonpayable", 121 | "type": "function" 122 | }, 123 | { 124 | "inputs": [ 125 | { 126 | "internalType": "address", 127 | "name": "owner", 128 | "type": "address" 129 | } 130 | ], 131 | "name": "balanceOf", 132 | "outputs": [ 133 | { 134 | "internalType": "uint256", 135 | "name": "", 136 | "type": "uint256" 137 | } 138 | ], 139 | "stateMutability": "view", 140 | "type": "function" 141 | }, 142 | { 143 | "inputs": [ 144 | { 145 | "internalType": "uint256", 146 | "name": "tokenId", 147 | "type": "uint256" 148 | } 149 | ], 150 | "name": "getApproved", 151 | "outputs": [ 152 | { 153 | "internalType": "address", 154 | "name": "", 155 | "type": "address" 156 | } 157 | ], 158 | "stateMutability": "view", 159 | "type": "function" 160 | }, 161 | { 162 | "inputs": [ 163 | { 164 | "internalType": "address", 165 | "name": "owner", 166 | "type": "address" 167 | }, 168 | { 169 | "internalType": "address", 170 | "name": "operator", 171 | "type": "address" 172 | } 173 | ], 174 | "name": "isApprovedForAll", 175 | "outputs": [ 176 | { 177 | "internalType": "bool", 178 | "name": "", 179 | "type": "bool" 180 | } 181 | ], 182 | "stateMutability": "view", 183 | "type": "function" 184 | }, 185 | { 186 | "inputs": [ 187 | { 188 | "components": [ 189 | { 190 | "internalType": "uint256", 191 | "name": "tokenID", 192 | "type": "uint256" 193 | }, 194 | { 195 | "internalType": "uint256", 196 | "name": "price", 197 | "type": "uint256" 198 | }, 199 | { 200 | "internalType": "string", 201 | "name": "uri", 202 | "type": "string" 203 | } 204 | ], 205 | "internalType": "struct SimonDevNFT.SignedNFTData", 206 | "name": "nft", 207 | "type": "tuple" 208 | }, 209 | { 210 | "internalType": "bytes", 211 | "name": "signature", 212 | "type": "bytes" 213 | } 214 | ], 215 | "name": "lazyMintNFT", 216 | "outputs": [ 217 | { 218 | "internalType": "uint256", 219 | "name": "", 220 | "type": "uint256" 221 | } 222 | ], 223 | "stateMutability": "payable", 224 | "type": "function" 225 | }, 226 | { 227 | "inputs": [], 228 | "name": "name", 229 | "outputs": [ 230 | { 231 | "internalType": "string", 232 | "name": "", 233 | "type": "string" 234 | } 235 | ], 236 | "stateMutability": "view", 237 | "type": "function" 238 | }, 239 | { 240 | "inputs": [], 241 | "name": "owner", 242 | "outputs": [ 243 | { 244 | "internalType": "address", 245 | "name": "", 246 | "type": "address" 247 | } 248 | ], 249 | "stateMutability": "view", 250 | "type": "function" 251 | }, 252 | { 253 | "inputs": [ 254 | { 255 | "internalType": "uint256", 256 | "name": "tokenId", 257 | "type": "uint256" 258 | } 259 | ], 260 | "name": "ownerOf", 261 | "outputs": [ 262 | { 263 | "internalType": "address", 264 | "name": "", 265 | "type": "address" 266 | } 267 | ], 268 | "stateMutability": "view", 269 | "type": "function" 270 | }, 271 | { 272 | "inputs": [], 273 | "name": "renounceOwnership", 274 | "outputs": [], 275 | "stateMutability": "nonpayable", 276 | "type": "function" 277 | }, 278 | { 279 | "inputs": [ 280 | { 281 | "internalType": "address", 282 | "name": "from", 283 | "type": "address" 284 | }, 285 | { 286 | "internalType": "address", 287 | "name": "to", 288 | "type": "address" 289 | }, 290 | { 291 | "internalType": "uint256", 292 | "name": "tokenId", 293 | "type": "uint256" 294 | } 295 | ], 296 | "name": "safeTransferFrom", 297 | "outputs": [], 298 | "stateMutability": "nonpayable", 299 | "type": "function" 300 | }, 301 | { 302 | "inputs": [ 303 | { 304 | "internalType": "address", 305 | "name": "from", 306 | "type": "address" 307 | }, 308 | { 309 | "internalType": "address", 310 | "name": "to", 311 | "type": "address" 312 | }, 313 | { 314 | "internalType": "uint256", 315 | "name": "tokenId", 316 | "type": "uint256" 317 | }, 318 | { 319 | "internalType": "bytes", 320 | "name": "_data", 321 | "type": "bytes" 322 | } 323 | ], 324 | "name": "safeTransferFrom", 325 | "outputs": [], 326 | "stateMutability": "nonpayable", 327 | "type": "function" 328 | }, 329 | { 330 | "inputs": [ 331 | { 332 | "internalType": "address", 333 | "name": "operator", 334 | "type": "address" 335 | }, 336 | { 337 | "internalType": "bool", 338 | "name": "approved", 339 | "type": "bool" 340 | } 341 | ], 342 | "name": "setApprovalForAll", 343 | "outputs": [], 344 | "stateMutability": "nonpayable", 345 | "type": "function" 346 | }, 347 | { 348 | "inputs": [ 349 | { 350 | "internalType": "bytes4", 351 | "name": "interfaceId", 352 | "type": "bytes4" 353 | } 354 | ], 355 | "name": "supportsInterface", 356 | "outputs": [ 357 | { 358 | "internalType": "bool", 359 | "name": "", 360 | "type": "bool" 361 | } 362 | ], 363 | "stateMutability": "view", 364 | "type": "function" 365 | }, 366 | { 367 | "inputs": [], 368 | "name": "symbol", 369 | "outputs": [ 370 | { 371 | "internalType": "string", 372 | "name": "", 373 | "type": "string" 374 | } 375 | ], 376 | "stateMutability": "view", 377 | "type": "function" 378 | }, 379 | { 380 | "inputs": [ 381 | { 382 | "internalType": "uint256", 383 | "name": "tokenId", 384 | "type": "uint256" 385 | } 386 | ], 387 | "name": "tokenURI", 388 | "outputs": [ 389 | { 390 | "internalType": "string", 391 | "name": "", 392 | "type": "string" 393 | } 394 | ], 395 | "stateMutability": "view", 396 | "type": "function" 397 | }, 398 | { 399 | "inputs": [ 400 | { 401 | "internalType": "address", 402 | "name": "from", 403 | "type": "address" 404 | }, 405 | { 406 | "internalType": "address", 407 | "name": "to", 408 | "type": "address" 409 | }, 410 | { 411 | "internalType": "uint256", 412 | "name": "tokenId", 413 | "type": "uint256" 414 | } 415 | ], 416 | "name": "transferFrom", 417 | "outputs": [], 418 | "stateMutability": "nonpayable", 419 | "type": "function" 420 | }, 421 | { 422 | "inputs": [ 423 | { 424 | "internalType": "address", 425 | "name": "newOwner", 426 | "type": "address" 427 | } 428 | ], 429 | "name": "transferOwnership", 430 | "outputs": [], 431 | "stateMutability": "nonpayable", 432 | "type": "function" 433 | } 434 | ], 435 | "bytecode": "0x6101406040523480156200001257600080fd5b506040518060400160405280600881526020017f53696d6f6e4465760000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f312e3000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f53696d6f6e4465764e46540000000000000000000000000000000000000000008152506040518060400160405280600881526020017f53696d6f6e44657600000000000000000000000000000000000000000000000081525081600090805190602001906200010392919062000301565b5080600190805190602001906200011c92919062000301565b5050506200013f62000133620001f760201b60201c565b620001ff60201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001a8818484620002c560201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050620004ed565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008383834630604051602001620002e29594939291906200042c565b6040516020818303038152906040528051906020012090509392505050565b8280546200030f90620004b8565b90600052602060002090601f0160209004810192826200033357600085556200037f565b82601f106200034e57805160ff19168380011785556200037f565b828001600101855582156200037f579182015b828111156200037e57825182559160200191906001019062000361565b5b5090506200038e919062000392565b5090565b5b80821115620003ad57600081600090555060010162000393565b5090565b6000819050919050565b620003c681620003b1565b82525050565b6000819050919050565b620003e181620003cc565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200041482620003e7565b9050919050565b620004268162000407565b82525050565b600060a082019050620004436000830188620003bb565b620004526020830187620003bb565b620004616040830186620003bb565b620004706060830185620003d6565b6200047f60808301846200041b565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004d157607f821691505b602082108103620004e757620004e662000489565b5b50919050565b60805160a05160c05160e05161010051610120516140026200053d6000396000611df601526000611e3801526000611e1701526000611d4c01526000611da201526000611dcb01526140026000f3fe6080604052600436106100fe5760003560e01c806370a0823111610095578063a22cb46511610064578063a22cb4651461033a578063b88d4fde14610363578063c87b56dd1461038c578063e985e9c5146103c9578063f2fde38b14610406576100fe565b806370a0823114610290578063715018a6146102cd5780638da5cb5b146102e457806395d89b411461030f576100fe565b806323b872dd116100d157806323b872dd146101d1578063304cdf90146101fa57806342842e0e1461022a5780636352211e14610253576100fe565b806301ffc9a71461010357806306fdde0314610140578063081812fc1461016b578063095ea7b3146101a8575b600080fd5b34801561010f57600080fd5b5061012a60048036038101906101259190612592565b61042f565b60405161013791906125da565b60405180910390f35b34801561014c57600080fd5b50610155610511565b604051610162919061268e565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d91906126e6565b6105a3565b60405161019f9190612754565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca919061279b565b610628565b005b3480156101dd57600080fd5b506101f860048036038101906101f391906127db565b61073f565b005b610214600480360381019061020f91906128b7565b61079f565b6040516102219190612942565b60405180910390f35b34801561023657600080fd5b50610251600480360381019061024c91906127db565b610910565b005b34801561025f57600080fd5b5061027a600480360381019061027591906126e6565b610930565b6040516102879190612754565b60405180910390f35b34801561029c57600080fd5b506102b760048036038101906102b2919061295d565b6109e1565b6040516102c49190612942565b60405180910390f35b3480156102d957600080fd5b506102e2610a98565b005b3480156102f057600080fd5b506102f9610b20565b6040516103069190612754565b60405180910390f35b34801561031b57600080fd5b50610324610b4a565b604051610331919061268e565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c91906129b6565b610bdc565b005b34801561036f57600080fd5b5061038a60048036038101906103859190612b26565b610bf2565b005b34801561039857600080fd5b506103b360048036038101906103ae91906126e6565b610c54565b6040516103c0919061268e565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612ba9565b610da5565b6040516103fd91906125da565b60405180910390f35b34801561041257600080fd5b5061042d6004803603810190610428919061295d565b610e39565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104fa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061050a575061050982610f30565b5b9050919050565b60606000805461052090612c18565b80601f016020809104026020016040519081016040528092919081815260200182805461054c90612c18565b80156105995780601f1061056e57610100808354040283529160200191610599565b820191906000526020600020905b81548152906001019060200180831161057c57829003601f168201915b5050505050905090565b60006105ae82610f9a565b6105ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e490612cbb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063382610930565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069a90612d4d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c2611006565b73ffffffffffffffffffffffffffffffffffffffff1614806106f157506106f0816106eb611006565b610da5565b5b610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072790612ddf565b60405180910390fd5b61073a838361100e565b505050565b61075061074a611006565b826110c7565b61078f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078690612e71565b60405180910390fd5b61079a8383836111a5565b505050565b6000836020013534146107e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107de90612f03565b60405180910390fd5b61083d6107f38561140b565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061149b565b61087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390612f6f565b60405180910390fd5b610891610887611006565b85600001356114e9565b6108f184600001358580604001906108a99190612f9e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611507565b6109026108fc610b20565b3461157b565b836000013590509392505050565b61092b83838360405180602001604052806000815250610bf2565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90613073565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4890613105565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610aa0611006565b73ffffffffffffffffffffffffffffffffffffffff16610abe610b20565b73ffffffffffffffffffffffffffffffffffffffff1614610b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0b90613171565b60405180910390fd5b610b1e600061166f565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b5990612c18565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8590612c18565b8015610bd25780601f10610ba757610100808354040283529160200191610bd2565b820191906000526020600020905b815481529060010190602001808311610bb557829003601f168201915b5050505050905090565b610bee610be7611006565b8383611735565b5050565b610c03610bfd611006565b836110c7565b610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990612e71565b60405180910390fd5b610c4e848484846118a1565b50505050565b6060610c5f82610f9a565b610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590613203565b60405180910390fd5b6000600660008481526020019081526020016000208054610cbe90612c18565b80601f0160208091040260200160405190810160405280929190818152602001828054610cea90612c18565b8015610d375780601f10610d0c57610100808354040283529160200191610d37565b820191906000526020600020905b815481529060010190602001808311610d1a57829003601f168201915b505050505090506000610d486118fd565b90506000815103610d5d578192505050610da0565b600082511115610d92578082604051602001610d7a92919061325f565b60405160208183030381529060405292505050610da0565b610d9b84611914565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e41611006565b73ffffffffffffffffffffffffffffffffffffffff16610e5f610b20565b73ffffffffffffffffffffffffffffffffffffffff1614610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90613171565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b906132f5565b60405180910390fd5b610f2d8161166f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661108183610930565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006110d282610f9a565b611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890613387565b60405180910390fd5b600061111c83610930565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061115e575061115d8185610da5565b5b8061119c57508373ffffffffffffffffffffffffffffffffffffffff16611184846105a3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111c582610930565b73ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613419565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361128a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611281906134ab565b60405180910390fd5b6112958383836119bb565b6112a060008261100e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112f091906134fa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611347919061352e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114068383836119c0565b505050565b6000806114907f6217db7ed205fcb546b31f7cbc64e62b2d376dc84b0195749af2b916dec915fd8460000135856020013586806040019061144c9190612f9e565b60405161145a9291906135b4565b604051809103902060405160200161147594939291906135e6565b604051602081830303815290604052805190602001206119c5565b905080915050919050565b6000806114a884846119df565b90508073ffffffffffffffffffffffffffffffffffffffff166114c9610b20565b73ffffffffffffffffffffffffffffffffffffffff161491505092915050565b611503828260405180602001604052806000815250611a06565b5050565b61151082610f9a565b61154f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115469061369d565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611576929190612483565b505050565b804710156115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590613709565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516115e49061374f565b60006040518083038185875af1925050503d8060008114611621576040519150601f19603f3d011682016040523d82523d6000602084013e611626565b606091505b505090508061166a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611661906137d6565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90613842565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189491906125da565b60405180910390a3505050565b6118ac8484846111a5565b6118b884848484611a61565b6118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee906138d4565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606061191f82610f9a565b61195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590613966565b60405180910390fd5b60006119686118fd565b9050600081511161198857604051806020016040528060008152506119b3565b8061199284611be8565b6040516020016119a392919061325f565b6040516020818303038152906040525b915050919050565b505050565b505050565b60006119d86119d2611d48565b83611e62565b9050919050565b60008060006119ee8585611e95565b915091506119fb81611f16565b819250505092915050565b611a1083836120e2565b611a1d6000848484611a61565b611a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a53906138d4565b60405180910390fd5b505050565b6000611a828473ffffffffffffffffffffffffffffffffffffffff166122bb565b15611bdb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611aab611006565b8786866040518563ffffffff1660e01b8152600401611acd94939291906139db565b6020604051808303816000875af1925050508015611b0957506040513d601f19601f82011682018060405250810190611b069190613a3c565b60015b611b8b573d8060008114611b39576040519150601f19603f3d011682016040523d82523d6000602084013e611b3e565b606091505b506000815103611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906138d4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611be0565b600190505b949350505050565b606060008203611c2f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d43565b600082905060005b60008214611c61578080611c4a90613a69565b915050600a82611c5a9190613ae0565b9150611c37565b60008167ffffffffffffffff811115611c7d57611c7c6129fb565b5b6040519080825280601f01601f191660200182016040528015611caf5781602001600182028036833780820191505090505b5090505b60008514611d3c57600182611cc891906134fa565b9150600a85611cd79190613b11565b6030611ce3919061352e565b60f81b818381518110611cf957611cf8613b42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d359190613ae0565b9450611cb3565b8093505050505b919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015611dc457507f000000000000000000000000000000000000000000000000000000000000000046145b15611df1577f00000000000000000000000000000000000000000000000000000000000000009050611e5f565b611e5c7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122de565b90505b90565b60008282604051602001611e77929190613bde565b60405160208183030381529060405280519060200120905092915050565b6000806041835103611ed65760008060006020860151925060408601519150606086015160001a9050611eca87828585612318565b94509450505050611f0f565b6040835103611f06576000806020850151915060408501519050611efb868383612424565b935093505050611f0f565b60006002915091505b9250929050565b60006004811115611f2a57611f29613c15565b5b816004811115611f3d57611f3c613c15565b5b03156120df5760016004811115611f5757611f56613c15565b5b816004811115611f6a57611f69613c15565b5b03611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190613c90565b60405180910390fd5b60026004811115611fbe57611fbd613c15565b5b816004811115611fd157611fd0613c15565b5b03612011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200890613cfc565b60405180910390fd5b6003600481111561202557612024613c15565b5b81600481111561203857612037613c15565b5b03612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90613d8e565b60405180910390fd5b60048081111561208b5761208a613c15565b5b81600481111561209e5761209d613c15565b5b036120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d590613e20565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214890613e8c565b60405180910390fd5b61215a81610f9a565b1561219a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219190613ef8565b60405180910390fd5b6121a6600083836119bb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f6919061352e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122b7600083836119c0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600083838346306040516020016122f9959493929190613f18565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561235357600060039150915061241b565b601b8560ff161415801561236b5750601c8560ff1614155b1561237d57600060049150915061241b565b6000600187878787604051600081526020016040526040516123a29493929190613f87565b6020604051602081039080840390855afa1580156123c4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124125760006001925092505061241b565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612467919061352e565b905061247587828885612318565b935093505050935093915050565b82805461248f90612c18565b90600052602060002090601f0160209004810192826124b157600085556124f8565b82601f106124ca57805160ff19168380011785556124f8565b828001600101855582156124f8579182015b828111156124f75782518255916020019190600101906124dc565b5b5090506125059190612509565b5090565b5b8082111561252257600081600090555060010161250a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61256f8161253a565b811461257a57600080fd5b50565b60008135905061258c81612566565b92915050565b6000602082840312156125a8576125a7612530565b5b60006125b68482850161257d565b91505092915050565b60008115159050919050565b6125d4816125bf565b82525050565b60006020820190506125ef60008301846125cb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561262f578082015181840152602081019050612614565b8381111561263e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612660826125f5565b61266a8185612600565b935061267a818560208601612611565b61268381612644565b840191505092915050565b600060208201905081810360008301526126a88184612655565b905092915050565b6000819050919050565b6126c3816126b0565b81146126ce57600080fd5b50565b6000813590506126e0816126ba565b92915050565b6000602082840312156126fc576126fb612530565b5b600061270a848285016126d1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061273e82612713565b9050919050565b61274e81612733565b82525050565b60006020820190506127696000830184612745565b92915050565b61277881612733565b811461278357600080fd5b50565b6000813590506127958161276f565b92915050565b600080604083850312156127b2576127b1612530565b5b60006127c085828601612786565b92505060206127d1858286016126d1565b9150509250929050565b6000806000606084860312156127f4576127f3612530565b5b600061280286828701612786565b935050602061281386828701612786565b9250506040612824868287016126d1565b9150509250925092565b600080fd5b6000606082840312156128495761284861282e565b5b81905092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261287757612876612852565b5b8235905067ffffffffffffffff81111561289457612893612857565b5b6020830191508360018202830111156128b0576128af61285c565b5b9250929050565b6000806000604084860312156128d0576128cf612530565b5b600084013567ffffffffffffffff8111156128ee576128ed612535565b5b6128fa86828701612833565b935050602084013567ffffffffffffffff81111561291b5761291a612535565b5b61292786828701612861565b92509250509250925092565b61293c816126b0565b82525050565b60006020820190506129576000830184612933565b92915050565b60006020828403121561297357612972612530565b5b600061298184828501612786565b91505092915050565b612993816125bf565b811461299e57600080fd5b50565b6000813590506129b08161298a565b92915050565b600080604083850312156129cd576129cc612530565b5b60006129db85828601612786565b92505060206129ec858286016129a1565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a3382612644565b810181811067ffffffffffffffff82111715612a5257612a516129fb565b5b80604052505050565b6000612a65612526565b9050612a718282612a2a565b919050565b600067ffffffffffffffff821115612a9157612a906129fb565b5b612a9a82612644565b9050602081019050919050565b82818337600083830152505050565b6000612ac9612ac484612a76565b612a5b565b905082815260208101848484011115612ae557612ae46129f6565b5b612af0848285612aa7565b509392505050565b600082601f830112612b0d57612b0c612852565b5b8135612b1d848260208601612ab6565b91505092915050565b60008060008060808587031215612b4057612b3f612530565b5b6000612b4e87828801612786565b9450506020612b5f87828801612786565b9350506040612b70878288016126d1565b925050606085013567ffffffffffffffff811115612b9157612b90612535565b5b612b9d87828801612af8565b91505092959194509250565b60008060408385031215612bc057612bbf612530565b5b6000612bce85828601612786565b9250506020612bdf85828601612786565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c3057607f821691505b602082108103612c4357612c42612be9565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612ca5602c83612600565b9150612cb082612c49565b604082019050919050565b60006020820190508181036000830152612cd481612c98565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d37602183612600565b9150612d4282612cdb565b604082019050919050565b60006020820190508181036000830152612d6681612d2a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612dc9603883612600565b9150612dd482612d6d565b604082019050919050565b60006020820190508181036000830152612df881612dbc565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612e5b603183612600565b9150612e6682612dff565b604082019050919050565b60006020820190508181036000830152612e8a81612e4e565b9050919050565b7f53696d6f6e4465764e46543a204d6573736167652076616c756520213d20707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b6000612eed602383612600565b9150612ef882612e91565b604082019050919050565b60006020820190508181036000830152612f1c81612ee0565b9050919050565b7f53696d6f6e4465764e46543a20496e76616c6964207369676e61747572650000600082015250565b6000612f59601e83612600565b9150612f6482612f23565b602082019050919050565b60006020820190508181036000830152612f8881612f4c565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612fbb57612fba612f8f565b5b80840192508235915067ffffffffffffffff821115612fdd57612fdc612f94565b5b602083019250600182023603831315612ff957612ff8612f99565b5b509250929050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061305d602983612600565b915061306882613001565b604082019050919050565b6000602082019050818103600083015261308c81613050565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006130ef602a83612600565b91506130fa82613093565b604082019050919050565b6000602082019050818103600083015261311e816130e2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061315b602083612600565b915061316682613125565b602082019050919050565b6000602082019050818103600083015261318a8161314e565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006131ed603183612600565b91506131f882613191565b604082019050919050565b6000602082019050818103600083015261321c816131e0565b9050919050565b600081905092915050565b6000613239826125f5565b6132438185613223565b9350613253818560208601612611565b80840191505092915050565b600061326b828561322e565b9150613277828461322e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132df602683612600565b91506132ea82613283565b604082019050919050565b6000602082019050818103600083015261330e816132d2565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613371602c83612600565b915061337c82613315565b604082019050919050565b600060208201905081810360008301526133a081613364565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613403602583612600565b915061340e826133a7565b604082019050919050565b60006020820190508181036000830152613432816133f6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613495602483612600565b91506134a082613439565b604082019050919050565b600060208201905081810360008301526134c481613488565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613505826126b0565b9150613510836126b0565b925082821015613523576135226134cb565b5b828203905092915050565b6000613539826126b0565b9150613544836126b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613579576135786134cb565b5b828201905092915050565b600081905092915050565b600061359b8385613584565b93506135a8838584612aa7565b82840190509392505050565b60006135c182848661358f565b91508190509392505050565b6000819050919050565b6135e0816135cd565b82525050565b60006080820190506135fb60008301876135d7565b6136086020830186612933565b6136156040830185612933565b61362260608301846135d7565b95945050505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613687602e83612600565b91506136928261362b565b604082019050919050565b600060208201905081810360008301526136b68161367a565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006136f3601d83612600565b91506136fe826136bd565b602082019050919050565b60006020820190508181036000830152613722816136e6565b9050919050565b50565b6000613739600083613584565b915061374482613729565b600082019050919050565b600061375a8261372c565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006137c0603a83612600565b91506137cb82613764565b604082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061382c601983612600565b9150613837826137f6565b602082019050919050565b6000602082019050818103600083015261385b8161381f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006138be603283612600565b91506138c982613862565b604082019050919050565b600060208201905081810360008301526138ed816138b1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613950602f83612600565b915061395b826138f4565b604082019050919050565b6000602082019050818103600083015261397f81613943565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139ad82613986565b6139b78185613991565b93506139c7818560208601612611565b6139d081612644565b840191505092915050565b60006080820190506139f06000830187612745565b6139fd6020830186612745565b613a0a6040830185612933565b8181036060830152613a1c81846139a2565b905095945050505050565b600081519050613a3681612566565b92915050565b600060208284031215613a5257613a51612530565b5b6000613a6084828501613a27565b91505092915050565b6000613a74826126b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613aa657613aa56134cb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613aeb826126b0565b9150613af6836126b0565b925082613b0657613b05613ab1565b5b828204905092915050565b6000613b1c826126b0565b9150613b27836126b0565b925082613b3757613b36613ab1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613ba7600283613223565b9150613bb282613b71565b600282019050919050565b6000819050919050565b613bd8613bd3826135cd565b613bbd565b82525050565b6000613be982613b9a565b9150613bf58285613bc7565b602082019150613c058284613bc7565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613c7a601883612600565b9150613c8582613c44565b602082019050919050565b60006020820190508181036000830152613ca981613c6d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613ce6601f83612600565b9150613cf182613cb0565b602082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d78602283612600565b9150613d8382613d1c565b604082019050919050565b60006020820190508181036000830152613da781613d6b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e0a602283612600565b9150613e1582613dae565b604082019050919050565b60006020820190508181036000830152613e3981613dfd565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613e76602083612600565b9150613e8182613e40565b602082019050919050565b60006020820190508181036000830152613ea581613e69565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ee2601c83612600565b9150613eed82613eac565b602082019050919050565b60006020820190508181036000830152613f1181613ed5565b9050919050565b600060a082019050613f2d60008301886135d7565b613f3a60208301876135d7565b613f4760408301866135d7565b613f546060830185612933565b613f616080830184612745565b9695505050505050565b600060ff82169050919050565b613f8181613f6b565b82525050565b6000608082019050613f9c60008301876135d7565b613fa96020830186613f78565b613fb660408301856135d7565b613fc360608301846135d7565b9594505050505056fea26469706673582212203949b148ff69fb0790b8964a05b1bc446e7e1672480bc1e7b80bdcae40c66ae664736f6c634300080e0033", 436 | "deployedBytecode": "0x6080604052600436106100fe5760003560e01c806370a0823111610095578063a22cb46511610064578063a22cb4651461033a578063b88d4fde14610363578063c87b56dd1461038c578063e985e9c5146103c9578063f2fde38b14610406576100fe565b806370a0823114610290578063715018a6146102cd5780638da5cb5b146102e457806395d89b411461030f576100fe565b806323b872dd116100d157806323b872dd146101d1578063304cdf90146101fa57806342842e0e1461022a5780636352211e14610253576100fe565b806301ffc9a71461010357806306fdde0314610140578063081812fc1461016b578063095ea7b3146101a8575b600080fd5b34801561010f57600080fd5b5061012a60048036038101906101259190612592565b61042f565b60405161013791906125da565b60405180910390f35b34801561014c57600080fd5b50610155610511565b604051610162919061268e565b60405180910390f35b34801561017757600080fd5b50610192600480360381019061018d91906126e6565b6105a3565b60405161019f9190612754565b60405180910390f35b3480156101b457600080fd5b506101cf60048036038101906101ca919061279b565b610628565b005b3480156101dd57600080fd5b506101f860048036038101906101f391906127db565b61073f565b005b610214600480360381019061020f91906128b7565b61079f565b6040516102219190612942565b60405180910390f35b34801561023657600080fd5b50610251600480360381019061024c91906127db565b610910565b005b34801561025f57600080fd5b5061027a600480360381019061027591906126e6565b610930565b6040516102879190612754565b60405180910390f35b34801561029c57600080fd5b506102b760048036038101906102b2919061295d565b6109e1565b6040516102c49190612942565b60405180910390f35b3480156102d957600080fd5b506102e2610a98565b005b3480156102f057600080fd5b506102f9610b20565b6040516103069190612754565b60405180910390f35b34801561031b57600080fd5b50610324610b4a565b604051610331919061268e565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c91906129b6565b610bdc565b005b34801561036f57600080fd5b5061038a60048036038101906103859190612b26565b610bf2565b005b34801561039857600080fd5b506103b360048036038101906103ae91906126e6565b610c54565b6040516103c0919061268e565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612ba9565b610da5565b6040516103fd91906125da565b60405180910390f35b34801561041257600080fd5b5061042d6004803603810190610428919061295d565b610e39565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104fa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061050a575061050982610f30565b5b9050919050565b60606000805461052090612c18565b80601f016020809104026020016040519081016040528092919081815260200182805461054c90612c18565b80156105995780601f1061056e57610100808354040283529160200191610599565b820191906000526020600020905b81548152906001019060200180831161057c57829003601f168201915b5050505050905090565b60006105ae82610f9a565b6105ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e490612cbb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063382610930565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069a90612d4d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c2611006565b73ffffffffffffffffffffffffffffffffffffffff1614806106f157506106f0816106eb611006565b610da5565b5b610730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072790612ddf565b60405180910390fd5b61073a838361100e565b505050565b61075061074a611006565b826110c7565b61078f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078690612e71565b60405180910390fd5b61079a8383836111a5565b505050565b6000836020013534146107e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107de90612f03565b60405180910390fd5b61083d6107f38561140b565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061149b565b61087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390612f6f565b60405180910390fd5b610891610887611006565b85600001356114e9565b6108f184600001358580604001906108a99190612f9e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611507565b6109026108fc610b20565b3461157b565b836000013590509392505050565b61092b83838360405180602001604052806000815250610bf2565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90613073565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4890613105565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610aa0611006565b73ffffffffffffffffffffffffffffffffffffffff16610abe610b20565b73ffffffffffffffffffffffffffffffffffffffff1614610b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0b90613171565b60405180910390fd5b610b1e600061166f565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610b5990612c18565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8590612c18565b8015610bd25780601f10610ba757610100808354040283529160200191610bd2565b820191906000526020600020905b815481529060010190602001808311610bb557829003601f168201915b5050505050905090565b610bee610be7611006565b8383611735565b5050565b610c03610bfd611006565b836110c7565b610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990612e71565b60405180910390fd5b610c4e848484846118a1565b50505050565b6060610c5f82610f9a565b610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9590613203565b60405180910390fd5b6000600660008481526020019081526020016000208054610cbe90612c18565b80601f0160208091040260200160405190810160405280929190818152602001828054610cea90612c18565b8015610d375780601f10610d0c57610100808354040283529160200191610d37565b820191906000526020600020905b815481529060010190602001808311610d1a57829003601f168201915b505050505090506000610d486118fd565b90506000815103610d5d578192505050610da0565b600082511115610d92578082604051602001610d7a92919061325f565b60405160208183030381529060405292505050610da0565b610d9b84611914565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e41611006565b73ffffffffffffffffffffffffffffffffffffffff16610e5f610b20565b73ffffffffffffffffffffffffffffffffffffffff1614610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90613171565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b906132f5565b60405180910390fd5b610f2d8161166f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661108183610930565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006110d282610f9a565b611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890613387565b60405180910390fd5b600061111c83610930565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061115e575061115d8185610da5565b5b8061119c57508373ffffffffffffffffffffffffffffffffffffffff16611184846105a3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166111c582610930565b73ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613419565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361128a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611281906134ab565b60405180910390fd5b6112958383836119bb565b6112a060008261100e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112f091906134fa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611347919061352e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114068383836119c0565b505050565b6000806114907f6217db7ed205fcb546b31f7cbc64e62b2d376dc84b0195749af2b916dec915fd8460000135856020013586806040019061144c9190612f9e565b60405161145a9291906135b4565b604051809103902060405160200161147594939291906135e6565b604051602081830303815290604052805190602001206119c5565b905080915050919050565b6000806114a884846119df565b90508073ffffffffffffffffffffffffffffffffffffffff166114c9610b20565b73ffffffffffffffffffffffffffffffffffffffff161491505092915050565b611503828260405180602001604052806000815250611a06565b5050565b61151082610f9a565b61154f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115469061369d565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190611576929190612483565b505050565b804710156115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590613709565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516115e49061374f565b60006040518083038185875af1925050503d8060008114611621576040519150601f19603f3d011682016040523d82523d6000602084013e611626565b606091505b505090508061166a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611661906137d6565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90613842565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189491906125da565b60405180910390a3505050565b6118ac8484846111a5565b6118b884848484611a61565b6118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee906138d4565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606061191f82610f9a565b61195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590613966565b60405180910390fd5b60006119686118fd565b9050600081511161198857604051806020016040528060008152506119b3565b8061199284611be8565b6040516020016119a392919061325f565b6040516020818303038152906040525b915050919050565b505050565b505050565b60006119d86119d2611d48565b83611e62565b9050919050565b60008060006119ee8585611e95565b915091506119fb81611f16565b819250505092915050565b611a1083836120e2565b611a1d6000848484611a61565b611a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a53906138d4565b60405180910390fd5b505050565b6000611a828473ffffffffffffffffffffffffffffffffffffffff166122bb565b15611bdb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611aab611006565b8786866040518563ffffffff1660e01b8152600401611acd94939291906139db565b6020604051808303816000875af1925050508015611b0957506040513d601f19601f82011682018060405250810190611b069190613a3c565b60015b611b8b573d8060008114611b39576040519150601f19603f3d011682016040523d82523d6000602084013e611b3e565b606091505b506000815103611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a906138d4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611be0565b600190505b949350505050565b606060008203611c2f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d43565b600082905060005b60008214611c61578080611c4a90613a69565b915050600a82611c5a9190613ae0565b9150611c37565b60008167ffffffffffffffff811115611c7d57611c7c6129fb565b5b6040519080825280601f01601f191660200182016040528015611caf5781602001600182028036833780820191505090505b5090505b60008514611d3c57600182611cc891906134fa565b9150600a85611cd79190613b11565b6030611ce3919061352e565b60f81b818381518110611cf957611cf8613b42565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611d359190613ae0565b9450611cb3565b8093505050505b919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015611dc457507f000000000000000000000000000000000000000000000000000000000000000046145b15611df1577f00000000000000000000000000000000000000000000000000000000000000009050611e5f565b611e5c7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006122de565b90505b90565b60008282604051602001611e77929190613bde565b60405160208183030381529060405280519060200120905092915050565b6000806041835103611ed65760008060006020860151925060408601519150606086015160001a9050611eca87828585612318565b94509450505050611f0f565b6040835103611f06576000806020850151915060408501519050611efb868383612424565b935093505050611f0f565b60006002915091505b9250929050565b60006004811115611f2a57611f29613c15565b5b816004811115611f3d57611f3c613c15565b5b03156120df5760016004811115611f5757611f56613c15565b5b816004811115611f6a57611f69613c15565b5b03611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa190613c90565b60405180910390fd5b60026004811115611fbe57611fbd613c15565b5b816004811115611fd157611fd0613c15565b5b03612011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200890613cfc565b60405180910390fd5b6003600481111561202557612024613c15565b5b81600481111561203857612037613c15565b5b03612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90613d8e565b60405180910390fd5b60048081111561208b5761208a613c15565b5b81600481111561209e5761209d613c15565b5b036120de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d590613e20565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214890613e8c565b60405180910390fd5b61215a81610f9a565b1561219a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219190613ef8565b60405180910390fd5b6121a6600083836119bb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f6919061352e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122b7600083836119c0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600083838346306040516020016122f9959493929190613f18565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561235357600060039150915061241b565b601b8560ff161415801561236b5750601c8560ff1614155b1561237d57600060049150915061241b565b6000600187878787604051600081526020016040526040516123a29493929190613f87565b6020604051602081039080840390855afa1580156123c4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124125760006001925092505061241b565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c612467919061352e565b905061247587828885612318565b935093505050935093915050565b82805461248f90612c18565b90600052602060002090601f0160209004810192826124b157600085556124f8565b82601f106124ca57805160ff19168380011785556124f8565b828001600101855582156124f8579182015b828111156124f75782518255916020019190600101906124dc565b5b5090506125059190612509565b5090565b5b8082111561252257600081600090555060010161250a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61256f8161253a565b811461257a57600080fd5b50565b60008135905061258c81612566565b92915050565b6000602082840312156125a8576125a7612530565b5b60006125b68482850161257d565b91505092915050565b60008115159050919050565b6125d4816125bf565b82525050565b60006020820190506125ef60008301846125cb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561262f578082015181840152602081019050612614565b8381111561263e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612660826125f5565b61266a8185612600565b935061267a818560208601612611565b61268381612644565b840191505092915050565b600060208201905081810360008301526126a88184612655565b905092915050565b6000819050919050565b6126c3816126b0565b81146126ce57600080fd5b50565b6000813590506126e0816126ba565b92915050565b6000602082840312156126fc576126fb612530565b5b600061270a848285016126d1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061273e82612713565b9050919050565b61274e81612733565b82525050565b60006020820190506127696000830184612745565b92915050565b61277881612733565b811461278357600080fd5b50565b6000813590506127958161276f565b92915050565b600080604083850312156127b2576127b1612530565b5b60006127c085828601612786565b92505060206127d1858286016126d1565b9150509250929050565b6000806000606084860312156127f4576127f3612530565b5b600061280286828701612786565b935050602061281386828701612786565b9250506040612824868287016126d1565b9150509250925092565b600080fd5b6000606082840312156128495761284861282e565b5b81905092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261287757612876612852565b5b8235905067ffffffffffffffff81111561289457612893612857565b5b6020830191508360018202830111156128b0576128af61285c565b5b9250929050565b6000806000604084860312156128d0576128cf612530565b5b600084013567ffffffffffffffff8111156128ee576128ed612535565b5b6128fa86828701612833565b935050602084013567ffffffffffffffff81111561291b5761291a612535565b5b61292786828701612861565b92509250509250925092565b61293c816126b0565b82525050565b60006020820190506129576000830184612933565b92915050565b60006020828403121561297357612972612530565b5b600061298184828501612786565b91505092915050565b612993816125bf565b811461299e57600080fd5b50565b6000813590506129b08161298a565b92915050565b600080604083850312156129cd576129cc612530565b5b60006129db85828601612786565b92505060206129ec858286016129a1565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a3382612644565b810181811067ffffffffffffffff82111715612a5257612a516129fb565b5b80604052505050565b6000612a65612526565b9050612a718282612a2a565b919050565b600067ffffffffffffffff821115612a9157612a906129fb565b5b612a9a82612644565b9050602081019050919050565b82818337600083830152505050565b6000612ac9612ac484612a76565b612a5b565b905082815260208101848484011115612ae557612ae46129f6565b5b612af0848285612aa7565b509392505050565b600082601f830112612b0d57612b0c612852565b5b8135612b1d848260208601612ab6565b91505092915050565b60008060008060808587031215612b4057612b3f612530565b5b6000612b4e87828801612786565b9450506020612b5f87828801612786565b9350506040612b70878288016126d1565b925050606085013567ffffffffffffffff811115612b9157612b90612535565b5b612b9d87828801612af8565b91505092959194509250565b60008060408385031215612bc057612bbf612530565b5b6000612bce85828601612786565b9250506020612bdf85828601612786565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612c3057607f821691505b602082108103612c4357612c42612be9565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612ca5602c83612600565b9150612cb082612c49565b604082019050919050565b60006020820190508181036000830152612cd481612c98565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d37602183612600565b9150612d4282612cdb565b604082019050919050565b60006020820190508181036000830152612d6681612d2a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612dc9603883612600565b9150612dd482612d6d565b604082019050919050565b60006020820190508181036000830152612df881612dbc565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612e5b603183612600565b9150612e6682612dff565b604082019050919050565b60006020820190508181036000830152612e8a81612e4e565b9050919050565b7f53696d6f6e4465764e46543a204d6573736167652076616c756520213d20707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b6000612eed602383612600565b9150612ef882612e91565b604082019050919050565b60006020820190508181036000830152612f1c81612ee0565b9050919050565b7f53696d6f6e4465764e46543a20496e76616c6964207369676e61747572650000600082015250565b6000612f59601e83612600565b9150612f6482612f23565b602082019050919050565b60006020820190508181036000830152612f8881612f4c565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612fbb57612fba612f8f565b5b80840192508235915067ffffffffffffffff821115612fdd57612fdc612f94565b5b602083019250600182023603831315612ff957612ff8612f99565b5b509250929050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061305d602983612600565b915061306882613001565b604082019050919050565b6000602082019050818103600083015261308c81613050565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006130ef602a83612600565b91506130fa82613093565b604082019050919050565b6000602082019050818103600083015261311e816130e2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061315b602083612600565b915061316682613125565b602082019050919050565b6000602082019050818103600083015261318a8161314e565b9050919050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006131ed603183612600565b91506131f882613191565b604082019050919050565b6000602082019050818103600083015261321c816131e0565b9050919050565b600081905092915050565b6000613239826125f5565b6132438185613223565b9350613253818560208601612611565b80840191505092915050565b600061326b828561322e565b9150613277828461322e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132df602683612600565b91506132ea82613283565b604082019050919050565b6000602082019050818103600083015261330e816132d2565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613371602c83612600565b915061337c82613315565b604082019050919050565b600060208201905081810360008301526133a081613364565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613403602583612600565b915061340e826133a7565b604082019050919050565b60006020820190508181036000830152613432816133f6565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613495602483612600565b91506134a082613439565b604082019050919050565b600060208201905081810360008301526134c481613488565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613505826126b0565b9150613510836126b0565b925082821015613523576135226134cb565b5b828203905092915050565b6000613539826126b0565b9150613544836126b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613579576135786134cb565b5b828201905092915050565b600081905092915050565b600061359b8385613584565b93506135a8838584612aa7565b82840190509392505050565b60006135c182848661358f565b91508190509392505050565b6000819050919050565b6135e0816135cd565b82525050565b60006080820190506135fb60008301876135d7565b6136086020830186612933565b6136156040830185612933565b61362260608301846135d7565b95945050505050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613687602e83612600565b91506136928261362b565b604082019050919050565b600060208201905081810360008301526136b68161367a565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006136f3601d83612600565b91506136fe826136bd565b602082019050919050565b60006020820190508181036000830152613722816136e6565b9050919050565b50565b6000613739600083613584565b915061374482613729565b600082019050919050565b600061375a8261372c565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006137c0603a83612600565b91506137cb82613764565b604082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061382c601983612600565b9150613837826137f6565b602082019050919050565b6000602082019050818103600083015261385b8161381f565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006138be603283612600565b91506138c982613862565b604082019050919050565b600060208201905081810360008301526138ed816138b1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613950602f83612600565b915061395b826138f4565b604082019050919050565b6000602082019050818103600083015261397f81613943565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139ad82613986565b6139b78185613991565b93506139c7818560208601612611565b6139d081612644565b840191505092915050565b60006080820190506139f06000830187612745565b6139fd6020830186612745565b613a0a6040830185612933565b8181036060830152613a1c81846139a2565b905095945050505050565b600081519050613a3681612566565b92915050565b600060208284031215613a5257613a51612530565b5b6000613a6084828501613a27565b91505092915050565b6000613a74826126b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613aa657613aa56134cb565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613aeb826126b0565b9150613af6836126b0565b925082613b0657613b05613ab1565b5b828204905092915050565b6000613b1c826126b0565b9150613b27836126b0565b925082613b3757613b36613ab1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613ba7600283613223565b9150613bb282613b71565b600282019050919050565b6000819050919050565b613bd8613bd3826135cd565b613bbd565b82525050565b6000613be982613b9a565b9150613bf58285613bc7565b602082019150613c058284613bc7565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613c7a601883612600565b9150613c8582613c44565b602082019050919050565b60006020820190508181036000830152613ca981613c6d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613ce6601f83612600565b9150613cf182613cb0565b602082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d78602283612600565b9150613d8382613d1c565b604082019050919050565b60006020820190508181036000830152613da781613d6b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e0a602283612600565b9150613e1582613dae565b604082019050919050565b60006020820190508181036000830152613e3981613dfd565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613e76602083612600565b9150613e8182613e40565b602082019050919050565b60006020820190508181036000830152613ea581613e69565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613ee2601c83612600565b9150613eed82613eac565b602082019050919050565b60006020820190508181036000830152613f1181613ed5565b9050919050565b600060a082019050613f2d60008301886135d7565b613f3a60208301876135d7565b613f4760408301866135d7565b613f546060830185612933565b613f616080830184612745565b9695505050505050565b600060ff82169050919050565b613f8181613f6b565b82525050565b6000608082019050613f9c60008301876135d7565b613fa96020830186613f78565b613fb660408301856135d7565b613fc360608301846135d7565b9594505050505056fea26469706673582212203949b148ff69fb0790b8964a05b1bc446e7e1672480bc1e7b80bdcae40c66ae664736f6c634300080e0033", 437 | "linkReferences": {}, 438 | "deployedLinkReferences": {} 439 | } 440 | -------------------------------------------------------------------------------- /contracts/example.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.14; 3 | 4 | import "@openzeppelin/contracts/access/Ownable.sol"; 5 | import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; 6 | import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; 7 | import "@openzeppelin/contracts/utils/Address.sol"; 8 | import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; 9 | import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; 10 | 11 | 12 | contract SimonDevNFT is ERC721URIStorage, Ownable, EIP712 { 13 | 14 | struct SignedNFTData { 15 | uint256 tokenID; 16 | uint256 price; 17 | string uri; 18 | } 19 | 20 | constructor() ERC721("SimonDevNFT", "SimonDev") EIP712("SimonDev", "1.0") {} 21 | 22 | function lazyMintNFT( 23 | SignedNFTData calldata nft, bytes calldata signature 24 | ) public payable returns (uint256) { 25 | require(msg.value == nft.price, 'SimonDevNFT: Message value != price'); 26 | require(_validateSignature(_hash(nft), signature), 'SimonDevNFT: Invalid signature'); 27 | 28 | _safeMint(_msgSender(), nft.tokenID); 29 | _setTokenURI(nft.tokenID, nft.uri); 30 | Address.sendValue(payable(owner()), msg.value); 31 | 32 | return nft.tokenID; 33 | } 34 | 35 | function _hash( 36 | SignedNFTData calldata nft 37 | ) internal view returns (bytes32) { 38 | bytes32 digest = _hashTypedDataV4( 39 | keccak256( 40 | abi.encode( 41 | keccak256("SignedNFTData(uint256 tokenID,uint256 price,string uri)"), 42 | nft.tokenID, nft.price, keccak256(bytes(nft.uri)) 43 | ))); 44 | return digest; 45 | } 46 | 47 | function _validateSignature(bytes32 digest, bytes memory signature) internal view returns (bool) { 48 | address signer = ECDSA.recover(digest, signature); 49 | return (owner() == signer); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /hardhat.config.js: -------------------------------------------------------------------------------- 1 | require("@nomiclabs/hardhat-waffle"); 2 | require("hardhat-gas-reporter"); 3 | 4 | const PRIVATE_KEY = null; 5 | 6 | module.exports = { 7 | solidity: "0.8.14", 8 | paths: { 9 | sources: "./contracts", 10 | tests: "./test", 11 | cache: "./cache", 12 | artifacts: "./artifacts" 13 | }, 14 | networks: { 15 | mumbai: { 16 | url: "https://rpc-mumbai.maticvigil.com/", 17 | accounts: [PRIVATE_KEY] 18 | } 19 | }, 20 | }; 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nfts_project1", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@nomiclabs/hardhat-ethers": "^2.0.6", 14 | "@nomiclabs/hardhat-waffle": "^2.0.3", 15 | "chai": "^4.3.6", 16 | "ethereum-waffle": "^3.4.4", 17 | "ethers": "^5.6.8", 18 | "hardhat": "^2.9.7", 19 | "hardhat-gas-reporter": "^1.0.8" 20 | }, 21 | "dependencies": { 22 | "@openzeppelin/contracts": "^4.6.0", 23 | "moralis": "^1.8.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /scripts/create_nfts.js: -------------------------------------------------------------------------------- 1 | const {ethers} = require("hardhat"); 2 | const {Moralis} = require("moralis/node"); 3 | const fs = require("fs"); 4 | 5 | const math = (function() { 6 | return { 7 | rand_range: function(a, b) { 8 | return Math.random() * (b - a) + a; 9 | }, 10 | 11 | rand_normalish: function() { 12 | const r = Math.random() + Math.random() + Math.random() + Math.random(); 13 | return (r / 4.0) * 2.0 - 1; 14 | }, 15 | 16 | rand_int: function(a, b) { 17 | return Math.round(Math.random() * (b - a) + a); 18 | }, 19 | 20 | lerp: function(x, a, b) { 21 | return x * (b - a) + a; 22 | }, 23 | 24 | smoothstep: function(x, a, b) { 25 | x = x * x * (3.0 - 2.0 * x); 26 | return x * (b - a) + a; 27 | }, 28 | 29 | smootherstep: function(x, a, b) { 30 | x = x * x * x * (x * (x * 6 - 15) + 10); 31 | return x * (b - a) + a; 32 | }, 33 | 34 | clamp: function(x, a, b) { 35 | return Math.min(Math.max(x, a), b); 36 | }, 37 | 38 | sat: function(x) { 39 | return Math.min(Math.max(x, 0.0), 1.0); 40 | }, 41 | 42 | in_range: (x, a, b) => { 43 | return x >= a && x <= b; 44 | }, 45 | }; 46 | })(); 47 | 48 | 49 | const MORALIS_SERVER = null; 50 | const MORALIS_APP_ID = null; 51 | const MORALIS_MASTER_KEY = null; 52 | 53 | async function main() { 54 | 55 | const serverUrl = MORALIS_SERVER; 56 | const appId = MORALIS_APP_ID; 57 | const masterKey = MORALIS_MASTER_KEY; 58 | 59 | await Moralis.start({ serverUrl, appId, masterKey }); 60 | console.log('started'); 61 | 62 | const SIGNS = ['Horse', 'Monkey', 'Bird', 'T-Rex', 'Hippo', 'Xenomorph', 'Unicorn', 'Tardigrade', 'Dog', 'Mouse', 'Crab', 'Sauterelle', 'Hagfish', 'Elf', 'Hobbit', 'Pigeon']; 63 | const VALUE = ['Worthless', 'Not Really', 'Somewhat', 'Yes', 'Very', 'Extremely', 'Crazy High']; 64 | const PERSONALITY = ['Extroverted', 'Introverted', 'Likes Coffee', 'Tired', 'Something', 'Weird', 'Bland', 'Fake', 'Loud', 'Annoying', 'Chews Loudly']; 65 | 66 | const [owner] = await ethers.getSigners(); 67 | 68 | for (let i = 1; i <= 6; ++i) { 69 | const data = fs.readFileSync('./scripts/screen' + i + '.jpg', {encoding: 'base64'}); 70 | const thumbnail = new Moralis.File('screen' + i + '.jpg', { 71 | base64: data 72 | }); 73 | await thumbnail.saveIPFS({useMasterKey: true}); 74 | 75 | const nftMetadata = { 76 | 'description': 'SimonDev long descriptive text about this thumbnail with a full history and background and stories and everything.', 77 | 'external_url': 'https://www.simondev.io/', 78 | 'image': thumbnail.ipfs(), 79 | 'name': 'SimonDev NFT[' + i + ']', 80 | 'attributes': [ 81 | { 82 | 'trait_type': 'Awesome', 83 | 'value': 'Yes', 84 | }, 85 | { 86 | 'trait_type': 'Valuable', 87 | 'value': VALUE[math.rand_int(0, VALUE.length - 1)], 88 | }, 89 | { 90 | 'trait_type': 'Personality', 91 | 'value': PERSONALITY[math.rand_int(0, PERSONALITY.length - 1)], 92 | }, 93 | { 94 | 'trait_type': 'Astrology Sign', 95 | 'value': SIGNS[math.rand_int(0, SIGNS.length - 1)], 96 | }, 97 | { 98 | 'display_type': 'boost_percentage', 99 | 'trait_type': 'Coolness', 100 | 'value': Math.floor(Math.random() * 50) + 50, 101 | }, 102 | { 103 | 'display_type': 'boost_percentage', 104 | 'trait_type': 'Freshness', 105 | 'value': Math.floor(Math.random() * 50) + 50, 106 | }, 107 | { 108 | 'display_type': 'boost_number', 109 | 'trait_type': 'Caffeine Value', 110 | 'value': Math.floor(Math.random() * 50) + 50, 111 | }, 112 | { 113 | 'display_type': 'number', 114 | 'trait_type': 'Generation', 115 | 'value': 1, 116 | }, 117 | ] 118 | }; 119 | 120 | const metadata = new Moralis.File("metadata.json", { 121 | base64: btoa(JSON.stringify(nftMetadata)), 122 | }); 123 | await metadata.saveIPFS({useMasterKey: true}); 124 | 125 | const tokenID = i; 126 | const price = ethers.utils.parseEther('0.0' + i); 127 | const uri = metadata.ipfs(); 128 | const nftData = { tokenID, price, uri }; 129 | 130 | const signature = await owner._signTypedData( 131 | { 132 | name: 'SimonDev', 133 | version: '1.0', 134 | chainId: await owner.getChainId(), 135 | verifyingContract: '0xc0e4F91186625d2067918FC6aa5175f3560351A2', 136 | }, 137 | { 138 | SignedNFTData: [ 139 | {name: 'tokenID', type: 'uint256'}, 140 | {name: 'price', type: 'uint256'}, 141 | {name: 'uri', type: 'string'}, 142 | ] 143 | }, 144 | nftData 145 | ); 146 | console.log(signature); 147 | console.log(nftData); 148 | } 149 | } 150 | 151 | 152 | main().then(() => { 153 | process.exit(0); 154 | }).catch((error) => { 155 | console.error(error); 156 | process.exit(1); 157 | }) -------------------------------------------------------------------------------- /scripts/deploy.js: -------------------------------------------------------------------------------- 1 | const {ethers} = require("hardhat"); 2 | 3 | 4 | async function main() { 5 | [owner, addr1] = await ethers.getSigners(); 6 | 7 | const nftContractFactory = await ethers.getContractFactory("SimonDevNFT"); 8 | nftContract = await nftContractFactory.deploy(); 9 | await nftContract.deployed(); 10 | 11 | console.log('NFT Contract: ', nftContract.address); 12 | } 13 | 14 | main().then(() => { 15 | process.exit(0); 16 | }).catch((error) => { 17 | console.error(error); 18 | process.exit(1); 19 | }) -------------------------------------------------------------------------------- /scripts/screen1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simondevyoutube/Solidity_LazyMinting/a0054e8337cb9927b05e30d3d11a86ea2e1cb61a/scripts/screen1.jpg -------------------------------------------------------------------------------- /scripts/screen2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simondevyoutube/Solidity_LazyMinting/a0054e8337cb9927b05e30d3d11a86ea2e1cb61a/scripts/screen2.jpg -------------------------------------------------------------------------------- /scripts/screen3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simondevyoutube/Solidity_LazyMinting/a0054e8337cb9927b05e30d3d11a86ea2e1cb61a/scripts/screen3.jpg -------------------------------------------------------------------------------- /scripts/screen4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simondevyoutube/Solidity_LazyMinting/a0054e8337cb9927b05e30d3d11a86ea2e1cb61a/scripts/screen4.jpg -------------------------------------------------------------------------------- /scripts/screen5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simondevyoutube/Solidity_LazyMinting/a0054e8337cb9927b05e30d3d11a86ea2e1cb61a/scripts/screen5.jpg -------------------------------------------------------------------------------- /scripts/screen6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simondevyoutube/Solidity_LazyMinting/a0054e8337cb9927b05e30d3d11a86ea2e1cb61a/scripts/screen6.jpg -------------------------------------------------------------------------------- /scripts/thumbnail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simondevyoutube/Solidity_LazyMinting/a0054e8337cb9927b05e30d3d11a86ea2e1cb61a/scripts/thumbnail.jpg -------------------------------------------------------------------------------- /test/nft.js: -------------------------------------------------------------------------------- 1 | const {expect} = require("chai"); 2 | const {ethers} = require("hardhat"); 3 | 4 | 5 | describe("NFT", () => { 6 | let nftContract = null; 7 | let owner = null; 8 | let addr1 = null; 9 | 10 | beforeEach(async () => { 11 | [owner, addr1] = await ethers.getSigners(); 12 | 13 | const nftContractFactory = await ethers.getContractFactory("SimonDevNFT"); 14 | nftContract = await nftContractFactory.deploy(); 15 | await nftContract.deployed(); 16 | }); 17 | 18 | it("Deploy assigns ownership", async () => { 19 | expect(await nftContract.owner()).is.equal(owner.address); 20 | }); 21 | 22 | it("Lazy Mint, succeeds, owner can sign", async function () { 23 | const tokenID = 1; 24 | const price = ethers.utils.parseEther('0.1'); 25 | const uri = 'https://FOO'; 26 | const nftData = { 27 | tokenID, 28 | price, 29 | uri, 30 | }; 31 | 32 | const signature = await owner._signTypedData( 33 | { 34 | name: 'SimonDev', 35 | version: '1.0', 36 | chainId: await owner.getChainId(), 37 | verifyingContract: nftContract.address, 38 | }, 39 | { 40 | SignedNFTData: [ 41 | {name: 'tokenID', type: 'uint256'}, 42 | {name: 'price', type: 'uint256'}, 43 | {name: 'uri', type: 'string'}, 44 | ] 45 | }, 46 | nftData 47 | ); 48 | 49 | await expect(nftContract.connect(addr1).lazyMintNFT(nftData, signature, {value: price})) 50 | .to.emit(nftContract, 'Transfer') 51 | .withArgs(ethers.constants.AddressZero, addr1.address, tokenID); 52 | expect(await nftContract.tokenURI(tokenID)).to.equal(uri); 53 | expect(await nftContract.ownerOf(tokenID)).to.equal(addr1.address); 54 | }); 55 | 56 | it("Lazy Mint, succeeds, owner gets paid", async function () { 57 | const tokenID = 1; 58 | const price = ethers.utils.parseEther('0.1'); 59 | const uri = 'https://FOO'; 60 | const nftData = { 61 | tokenID, 62 | price, 63 | uri, 64 | }; 65 | 66 | const signature = await owner._signTypedData( 67 | { 68 | name: 'SimonDev', 69 | version: '1.0', 70 | chainId: await owner.getChainId(), 71 | verifyingContract: nftContract.address, 72 | }, 73 | { 74 | SignedNFTData: [ 75 | {name: 'tokenID', type: 'uint256'}, 76 | {name: 'price', type: 'uint256'}, 77 | {name: 'uri', type: 'string'}, 78 | ] 79 | }, 80 | nftData 81 | ); 82 | 83 | const completeTransaction = () => { 84 | return nftContract.connect(addr1).lazyMintNFT(nftData, signature, {value: price}); 85 | }; 86 | 87 | await expect(completeTransaction).to.changeEtherBalance(owner, price); 88 | }); 89 | 90 | it("Lazy Mint, fails, non-owner cannot sign", async function () { 91 | const tokenID = 1; 92 | const price = ethers.utils.parseEther('0.1'); 93 | const uri = 'https://FOO'; 94 | const nftData = { 95 | tokenID, 96 | price, 97 | uri, 98 | }; 99 | 100 | const signature = await addr1._signTypedData( 101 | { 102 | name: 'SimonDev', 103 | version: '1.0', 104 | chainId: await owner.getChainId(), 105 | verifyingContract: nftContract.address, 106 | }, 107 | { 108 | SignedNFTData: [ 109 | {name: 'tokenID', type: 'uint256'}, 110 | {name: 'price', type: 'uint256'}, 111 | {name: 'uri', type: 'string'}, 112 | ] 113 | }, 114 | nftData 115 | ); 116 | 117 | await expect(nftContract.connect(addr1).lazyMintNFT(nftData, signature, {value: price})) 118 | .to.be.revertedWith('SimonDevNFT: Invalid signature'); 119 | }); 120 | 121 | it("Lazy Mint, fails, changed parameters", async function () { 122 | const tokenID = 1; 123 | const price = ethers.utils.parseEther('0.1'); 124 | const uri = 'https://FOO'; 125 | const nftData = { 126 | tokenID, 127 | price, 128 | uri, 129 | }; 130 | 131 | const signature = await addr1._signTypedData( 132 | { 133 | name: 'SimonDev', 134 | version: '1.0', 135 | chainId: await owner.getChainId(), 136 | verifyingContract: nftContract.address, 137 | }, 138 | { 139 | SignedNFTData: [ 140 | {name: 'tokenID', type: 'uint256'}, 141 | {name: 'price', type: 'uint256'}, 142 | {name: 'uri', type: 'string'}, 143 | ] 144 | }, 145 | nftData 146 | ); 147 | 148 | const changedParameters = { 149 | tokenID, 150 | price, 151 | uri: 'https://foo', 152 | }; 153 | await expect(nftContract.connect(addr1).lazyMintNFT(changedParameters, signature, {value: ethers.utils.parseEther('0.1')})) 154 | .to.be.revertedWith('SimonDevNFT: Invalid signature'); 155 | }); 156 | 157 | it("Lazy Mint, fails, didn't pay enough", async function () { 158 | const tokenID = 1; 159 | const price = ethers.utils.parseEther('0.1'); 160 | const uri = 'https://FOO'; 161 | const nftData = { 162 | tokenID, 163 | price, 164 | uri, 165 | }; 166 | 167 | const signature = await addr1._signTypedData( 168 | { 169 | name: 'SimonDev', 170 | version: '1.0', 171 | chainId: await owner.getChainId(), 172 | verifyingContract: nftContract.address, 173 | }, 174 | { 175 | SignedNFTData: [ 176 | {name: 'tokenID', type: 'uint256'}, 177 | {name: 'price', type: 'uint256'}, 178 | {name: 'uri', type: 'string'}, 179 | ] 180 | }, 181 | nftData 182 | ); 183 | 184 | await expect(nftContract.connect(addr1).lazyMintNFT(nftData, signature, {value: ethers.utils.parseEther('0.2')})) 185 | .to.be.revertedWith('SimonDevNFT: Message value != price'); 186 | }); 187 | 188 | it("Lazy Mint, fails, owner cannot same token twice", async function () { 189 | const tokenID = 1; 190 | const price = ethers.utils.parseEther('0.1'); 191 | const uri = 'https://FOO'; 192 | const nftData = { 193 | tokenID, 194 | price, 195 | uri, 196 | }; 197 | 198 | const signature = await owner._signTypedData( 199 | { 200 | name: 'SimonDev', 201 | version: '1.0', 202 | chainId: await owner.getChainId(), 203 | verifyingContract: nftContract.address, 204 | }, 205 | { 206 | SignedNFTData: [ 207 | {name: 'tokenID', type: 'uint256'}, 208 | {name: 'price', type: 'uint256'}, 209 | {name: 'uri', type: 'string'}, 210 | ] 211 | }, 212 | nftData 213 | ); 214 | 215 | await expect(nftContract.connect(addr1).lazyMintNFT(nftData, signature, {value: price})) 216 | .to.emit(nftContract, 'Transfer') 217 | .withArgs(ethers.constants.AddressZero, addr1.address, tokenID); 218 | 219 | await expect(nftContract.connect(addr1).lazyMintNFT(nftData, signature, {value: price})) 220 | .to.be.revertedWith('ERC721: token already minted'); 221 | }); 222 | }); -------------------------------------------------------------------------------- /www/base.css: -------------------------------------------------------------------------------- 1 | body { 2 | width: 100%; 3 | height: 100%; 4 | position: absolute; 5 | background: #000000; 6 | margin: 0; 7 | padding: 0; 8 | overscroll-behavior: none; 9 | } 10 | 11 | .container { 12 | width: 100%; 13 | height: 100%; 14 | position: relative; 15 | } 16 | 17 | .row { 18 | display: flex; 19 | flex-direction: row; 20 | justify-content: center; 21 | } 22 | 23 | .column { 24 | display: flex; 25 | flex-direction: column; 26 | justify-content: center; 27 | } 28 | 29 | .header { 30 | font-size: 4em; 31 | color: white; 32 | margin: 40px; 33 | } 34 | 35 | .nft-listing { 36 | display: grid; 37 | grid-template-columns: 480px 480px; 38 | grid-template-rows: 270px 270px 270px; 39 | column-gap: 20px; 40 | row-gap: 20px; 41 | } 42 | 43 | nft-thumbnail { 44 | position: relative; 45 | } 46 | 47 | nft-thumbnail > img { 48 | width: 480px; 49 | height: 270px; 50 | } 51 | 52 | .owned { 53 | background-image: url('owned.png'); 54 | background-size: cover; 55 | position: absolute; 56 | top: 0; 57 | left: 0; 58 | right: 0; 59 | bottom: 0; 60 | } 61 | 62 | nft-thumbnail > img:hover { 63 | transition: 0.5s; 64 | filter: blur(5px); 65 | } 66 | 67 | message-thingy { 68 | height: 100%; 69 | width: 100%; 70 | position: fixed; 71 | left: 0; 72 | top: 0; 73 | background-color: black; 74 | opacity: 0%; 75 | z-index: 1000; 76 | overflow: hidden; 77 | transition: 1s; 78 | display: flex; 79 | flex-direction: column; 80 | justify-content: center; 81 | align-items: center; 82 | } 83 | 84 | message-thingy > .message { 85 | font-size: 3em; 86 | color: white; 87 | opacity: 100%; 88 | display: block; 89 | margin-bottom: 20px; 90 | } 91 | 92 | message-thingy > .sub-message { 93 | font-size: 1.5em; 94 | color: white; 95 | opacity: 100%; 96 | display: block; 97 | } 98 | 99 | message-thingy .close { 100 | position: absolute; 101 | top: 20px; 102 | right: 45px; 103 | font-size: 60px; 104 | color: white; 105 | text-decoration: none; 106 | } -------------------------------------------------------------------------------- /www/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |