├── README.md ├── .gitignore ├── package.json ├── yarn.lock └── contracts ├── nic_meta_nft.sol └── artifacts └── NicMeta_metadata.json /README.md: -------------------------------------------------------------------------------- 1 | # NFT ERC-721 Basic Example 2 | 3 | 簡單主流的 NFT 專案 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | 4 | # misc 5 | .DS_Store 6 | 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nic_meta", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "@openzeppelin/contracts": "^4.4.2" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@openzeppelin/contracts@^4.4.2": 6 | version "4.4.2" 7 | resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.4.2.tgz#4e889c9c66e736f7de189a53f8ba5b8d789425c2" 8 | integrity sha512-NyJV7sJgoGYqbtNUWgzzOGW4T6rR19FmX1IJgXGdapGPWsuMelGJn9h03nos0iqfforCbCB0iYIR0MtIuIFLLw== 9 | -------------------------------------------------------------------------------- /contracts/nic_meta_nft.sol: -------------------------------------------------------------------------------- 1 | // Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 2 | // SPDX-License-Identifier: MIT 3 | pragma solidity ^0.8.0; 4 | 5 | import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; 6 | import "@openzeppelin/contracts/access/Ownable.sol"; 7 | import "@openzeppelin/contracts/utils/Strings.sol"; 8 | 9 | contract NicMeta is ERC721Enumerable, Ownable { 10 | using Strings for uint256; 11 | 12 | bool public _isSaleActive = false; 13 | bool public _revealed = false; 14 | 15 | // Constants 16 | uint256 public constant MAX_SUPPLY = 10; 17 | uint256 public mintPrice = 0.3 ether; 18 | uint256 public maxBalance = 1; 19 | uint256 public maxMint = 1; 20 | 21 | string baseURI; 22 | string public notRevealedUri; 23 | string public baseExtension = ".json"; 24 | 25 | mapping(uint256 => string) private _tokenURIs; 26 | 27 | constructor(string memory initBaseURI, string memory initNotRevealedUri) 28 | ERC721("Nic Meta", "NM") 29 | { 30 | setBaseURI(initBaseURI); 31 | setNotRevealedURI(initNotRevealedUri); 32 | } 33 | 34 | function mintNicMeta(uint256 tokenQuantity) public payable { 35 | require( 36 | totalSupply() + tokenQuantity <= MAX_SUPPLY, 37 | "Sale would exceed max supply" 38 | ); 39 | require(_isSaleActive, "Sale must be active to mint NicMetas"); 40 | require( 41 | balanceOf(msg.sender) + tokenQuantity <= maxBalance, 42 | "Sale would exceed max balance" 43 | ); 44 | require( 45 | tokenQuantity * mintPrice <= msg.value, 46 | "Not enough ether sent" 47 | ); 48 | require(tokenQuantity <= maxMint, "Can only mint 1 tokens at a time"); 49 | 50 | _mintNicMeta(tokenQuantity); 51 | } 52 | 53 | function _mintNicMeta(uint256 tokenQuantity) internal { 54 | for (uint256 i = 0; i < tokenQuantity; i++) { 55 | uint256 mintIndex = totalSupply(); 56 | if (totalSupply() < MAX_SUPPLY) { 57 | _safeMint(msg.sender, mintIndex); 58 | } 59 | } 60 | } 61 | 62 | function tokenURI(uint256 tokenId) 63 | public 64 | view 65 | virtual 66 | override 67 | returns (string memory) 68 | { 69 | require( 70 | _exists(tokenId), 71 | "ERC721Metadata: URI query for nonexistent token" 72 | ); 73 | 74 | if (_revealed == false) { 75 | return notRevealedUri; 76 | } 77 | 78 | string memory _tokenURI = _tokenURIs[tokenId]; 79 | string memory base = _baseURI(); 80 | 81 | // If there is no base URI, return the token URI. 82 | if (bytes(base).length == 0) { 83 | return _tokenURI; 84 | } 85 | // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). 86 | if (bytes(_tokenURI).length > 0) { 87 | return string(abi.encodePacked(base, _tokenURI)); 88 | } 89 | // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. 90 | return 91 | string(abi.encodePacked(base, tokenId.toString(), baseExtension)); 92 | } 93 | 94 | // internal 95 | function _baseURI() internal view virtual override returns (string memory) { 96 | return baseURI; 97 | } 98 | 99 | //only owner 100 | function flipSaleActive() public onlyOwner { 101 | _isSaleActive = !_isSaleActive; 102 | } 103 | 104 | function flipReveal() public onlyOwner { 105 | _revealed = !_revealed; 106 | } 107 | 108 | function setMintPrice(uint256 _mintPrice) public onlyOwner { 109 | mintPrice = _mintPrice; 110 | } 111 | 112 | function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { 113 | notRevealedUri = _notRevealedURI; 114 | } 115 | 116 | function setBaseURI(string memory _newBaseURI) public onlyOwner { 117 | baseURI = _newBaseURI; 118 | } 119 | 120 | function setBaseExtension(string memory _newBaseExtension) 121 | public 122 | onlyOwner 123 | { 124 | baseExtension = _newBaseExtension; 125 | } 126 | 127 | function setMaxBalance(uint256 _maxBalance) public onlyOwner { 128 | maxBalance = _maxBalance; 129 | } 130 | 131 | function setMaxMint(uint256 _maxMint) public onlyOwner { 132 | maxMint = _maxMint; 133 | } 134 | 135 | function withdraw(address to) public onlyOwner { 136 | uint256 balance = address(this).balance; 137 | payable(to).transfer(balance); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /contracts/artifacts/NicMeta_metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "compiler": { 3 | "version": "0.8.7+commit.e28d00a7" 4 | }, 5 | "language": "Solidity", 6 | "output": { 7 | "abi": [ 8 | { 9 | "inputs": [ 10 | { 11 | "internalType": "string", 12 | "name": "initBaseURI", 13 | "type": "string" 14 | }, 15 | { 16 | "internalType": "string", 17 | "name": "initNotRevealedUri", 18 | "type": "string" 19 | } 20 | ], 21 | "stateMutability": "nonpayable", 22 | "type": "constructor" 23 | }, 24 | { 25 | "anonymous": false, 26 | "inputs": [ 27 | { 28 | "indexed": true, 29 | "internalType": "address", 30 | "name": "owner", 31 | "type": "address" 32 | }, 33 | { 34 | "indexed": true, 35 | "internalType": "address", 36 | "name": "approved", 37 | "type": "address" 38 | }, 39 | { 40 | "indexed": true, 41 | "internalType": "uint256", 42 | "name": "tokenId", 43 | "type": "uint256" 44 | } 45 | ], 46 | "name": "Approval", 47 | "type": "event" 48 | }, 49 | { 50 | "anonymous": false, 51 | "inputs": [ 52 | { 53 | "indexed": true, 54 | "internalType": "address", 55 | "name": "owner", 56 | "type": "address" 57 | }, 58 | { 59 | "indexed": true, 60 | "internalType": "address", 61 | "name": "operator", 62 | "type": "address" 63 | }, 64 | { 65 | "indexed": false, 66 | "internalType": "bool", 67 | "name": "approved", 68 | "type": "bool" 69 | } 70 | ], 71 | "name": "ApprovalForAll", 72 | "type": "event" 73 | }, 74 | { 75 | "anonymous": false, 76 | "inputs": [ 77 | { 78 | "indexed": true, 79 | "internalType": "address", 80 | "name": "previousOwner", 81 | "type": "address" 82 | }, 83 | { 84 | "indexed": true, 85 | "internalType": "address", 86 | "name": "newOwner", 87 | "type": "address" 88 | } 89 | ], 90 | "name": "OwnershipTransferred", 91 | "type": "event" 92 | }, 93 | { 94 | "anonymous": false, 95 | "inputs": [ 96 | { 97 | "indexed": true, 98 | "internalType": "address", 99 | "name": "from", 100 | "type": "address" 101 | }, 102 | { 103 | "indexed": true, 104 | "internalType": "address", 105 | "name": "to", 106 | "type": "address" 107 | }, 108 | { 109 | "indexed": true, 110 | "internalType": "uint256", 111 | "name": "tokenId", 112 | "type": "uint256" 113 | } 114 | ], 115 | "name": "Transfer", 116 | "type": "event" 117 | }, 118 | { 119 | "inputs": [], 120 | "name": "MAX_SUPPLY", 121 | "outputs": [ 122 | { 123 | "internalType": "uint256", 124 | "name": "", 125 | "type": "uint256" 126 | } 127 | ], 128 | "stateMutability": "view", 129 | "type": "function" 130 | }, 131 | { 132 | "inputs": [], 133 | "name": "_isAuctionActive", 134 | "outputs": [ 135 | { 136 | "internalType": "bool", 137 | "name": "", 138 | "type": "bool" 139 | } 140 | ], 141 | "stateMutability": "view", 142 | "type": "function" 143 | }, 144 | { 145 | "inputs": [], 146 | "name": "_isSaleActive", 147 | "outputs": [ 148 | { 149 | "internalType": "bool", 150 | "name": "", 151 | "type": "bool" 152 | } 153 | ], 154 | "stateMutability": "view", 155 | "type": "function" 156 | }, 157 | { 158 | "inputs": [], 159 | "name": "_revealed", 160 | "outputs": [ 161 | { 162 | "internalType": "bool", 163 | "name": "", 164 | "type": "bool" 165 | } 166 | ], 167 | "stateMutability": "view", 168 | "type": "function" 169 | }, 170 | { 171 | "inputs": [ 172 | { 173 | "internalType": "address", 174 | "name": "to", 175 | "type": "address" 176 | }, 177 | { 178 | "internalType": "uint256", 179 | "name": "tokenId", 180 | "type": "uint256" 181 | } 182 | ], 183 | "name": "approve", 184 | "outputs": [], 185 | "stateMutability": "nonpayable", 186 | "type": "function" 187 | }, 188 | { 189 | "inputs": [ 190 | { 191 | "internalType": "address", 192 | "name": "owner", 193 | "type": "address" 194 | } 195 | ], 196 | "name": "balanceOf", 197 | "outputs": [ 198 | { 199 | "internalType": "uint256", 200 | "name": "", 201 | "type": "uint256" 202 | } 203 | ], 204 | "stateMutability": "view", 205 | "type": "function" 206 | }, 207 | { 208 | "inputs": [], 209 | "name": "baseExtension", 210 | "outputs": [ 211 | { 212 | "internalType": "string", 213 | "name": "", 214 | "type": "string" 215 | } 216 | ], 217 | "stateMutability": "view", 218 | "type": "function" 219 | }, 220 | { 221 | "inputs": [], 222 | "name": "flipReveal", 223 | "outputs": [], 224 | "stateMutability": "nonpayable", 225 | "type": "function" 226 | }, 227 | { 228 | "inputs": [], 229 | "name": "flipSaleActive", 230 | "outputs": [], 231 | "stateMutability": "nonpayable", 232 | "type": "function" 233 | }, 234 | { 235 | "inputs": [ 236 | { 237 | "internalType": "uint256", 238 | "name": "tokenId", 239 | "type": "uint256" 240 | } 241 | ], 242 | "name": "getApproved", 243 | "outputs": [ 244 | { 245 | "internalType": "address", 246 | "name": "", 247 | "type": "address" 248 | } 249 | ], 250 | "stateMutability": "view", 251 | "type": "function" 252 | }, 253 | { 254 | "inputs": [ 255 | { 256 | "internalType": "address", 257 | "name": "owner", 258 | "type": "address" 259 | }, 260 | { 261 | "internalType": "address", 262 | "name": "operator", 263 | "type": "address" 264 | } 265 | ], 266 | "name": "isApprovedForAll", 267 | "outputs": [ 268 | { 269 | "internalType": "bool", 270 | "name": "", 271 | "type": "bool" 272 | } 273 | ], 274 | "stateMutability": "view", 275 | "type": "function" 276 | }, 277 | { 278 | "inputs": [], 279 | "name": "maxBalance", 280 | "outputs": [ 281 | { 282 | "internalType": "uint256", 283 | "name": "", 284 | "type": "uint256" 285 | } 286 | ], 287 | "stateMutability": "view", 288 | "type": "function" 289 | }, 290 | { 291 | "inputs": [], 292 | "name": "maxMint", 293 | "outputs": [ 294 | { 295 | "internalType": "uint256", 296 | "name": "", 297 | "type": "uint256" 298 | } 299 | ], 300 | "stateMutability": "view", 301 | "type": "function" 302 | }, 303 | { 304 | "inputs": [ 305 | { 306 | "internalType": "uint256", 307 | "name": "tokenQuantity", 308 | "type": "uint256" 309 | } 310 | ], 311 | "name": "mintNicMeta", 312 | "outputs": [], 313 | "stateMutability": "payable", 314 | "type": "function" 315 | }, 316 | { 317 | "inputs": [], 318 | "name": "mintPrice", 319 | "outputs": [ 320 | { 321 | "internalType": "uint256", 322 | "name": "", 323 | "type": "uint256" 324 | } 325 | ], 326 | "stateMutability": "view", 327 | "type": "function" 328 | }, 329 | { 330 | "inputs": [], 331 | "name": "name", 332 | "outputs": [ 333 | { 334 | "internalType": "string", 335 | "name": "", 336 | "type": "string" 337 | } 338 | ], 339 | "stateMutability": "view", 340 | "type": "function" 341 | }, 342 | { 343 | "inputs": [], 344 | "name": "notRevealedUri", 345 | "outputs": [ 346 | { 347 | "internalType": "string", 348 | "name": "", 349 | "type": "string" 350 | } 351 | ], 352 | "stateMutability": "view", 353 | "type": "function" 354 | }, 355 | { 356 | "inputs": [], 357 | "name": "owner", 358 | "outputs": [ 359 | { 360 | "internalType": "address", 361 | "name": "", 362 | "type": "address" 363 | } 364 | ], 365 | "stateMutability": "view", 366 | "type": "function" 367 | }, 368 | { 369 | "inputs": [ 370 | { 371 | "internalType": "uint256", 372 | "name": "tokenId", 373 | "type": "uint256" 374 | } 375 | ], 376 | "name": "ownerOf", 377 | "outputs": [ 378 | { 379 | "internalType": "address", 380 | "name": "", 381 | "type": "address" 382 | } 383 | ], 384 | "stateMutability": "view", 385 | "type": "function" 386 | }, 387 | { 388 | "inputs": [], 389 | "name": "renounceOwnership", 390 | "outputs": [], 391 | "stateMutability": "nonpayable", 392 | "type": "function" 393 | }, 394 | { 395 | "inputs": [ 396 | { 397 | "internalType": "address", 398 | "name": "from", 399 | "type": "address" 400 | }, 401 | { 402 | "internalType": "address", 403 | "name": "to", 404 | "type": "address" 405 | }, 406 | { 407 | "internalType": "uint256", 408 | "name": "tokenId", 409 | "type": "uint256" 410 | } 411 | ], 412 | "name": "safeTransferFrom", 413 | "outputs": [], 414 | "stateMutability": "nonpayable", 415 | "type": "function" 416 | }, 417 | { 418 | "inputs": [ 419 | { 420 | "internalType": "address", 421 | "name": "from", 422 | "type": "address" 423 | }, 424 | { 425 | "internalType": "address", 426 | "name": "to", 427 | "type": "address" 428 | }, 429 | { 430 | "internalType": "uint256", 431 | "name": "tokenId", 432 | "type": "uint256" 433 | }, 434 | { 435 | "internalType": "bytes", 436 | "name": "_data", 437 | "type": "bytes" 438 | } 439 | ], 440 | "name": "safeTransferFrom", 441 | "outputs": [], 442 | "stateMutability": "nonpayable", 443 | "type": "function" 444 | }, 445 | { 446 | "inputs": [ 447 | { 448 | "internalType": "address", 449 | "name": "operator", 450 | "type": "address" 451 | }, 452 | { 453 | "internalType": "bool", 454 | "name": "approved", 455 | "type": "bool" 456 | } 457 | ], 458 | "name": "setApprovalForAll", 459 | "outputs": [], 460 | "stateMutability": "nonpayable", 461 | "type": "function" 462 | }, 463 | { 464 | "inputs": [ 465 | { 466 | "internalType": "string", 467 | "name": "_newBaseExtension", 468 | "type": "string" 469 | } 470 | ], 471 | "name": "setBaseExtension", 472 | "outputs": [], 473 | "stateMutability": "nonpayable", 474 | "type": "function" 475 | }, 476 | { 477 | "inputs": [ 478 | { 479 | "internalType": "string", 480 | "name": "_newBaseURI", 481 | "type": "string" 482 | } 483 | ], 484 | "name": "setBaseURI", 485 | "outputs": [], 486 | "stateMutability": "nonpayable", 487 | "type": "function" 488 | }, 489 | { 490 | "inputs": [ 491 | { 492 | "internalType": "uint256", 493 | "name": "_maxBalance", 494 | "type": "uint256" 495 | } 496 | ], 497 | "name": "setMaxBalance", 498 | "outputs": [], 499 | "stateMutability": "nonpayable", 500 | "type": "function" 501 | }, 502 | { 503 | "inputs": [ 504 | { 505 | "internalType": "uint256", 506 | "name": "_maxMint", 507 | "type": "uint256" 508 | } 509 | ], 510 | "name": "setMaxMint", 511 | "outputs": [], 512 | "stateMutability": "nonpayable", 513 | "type": "function" 514 | }, 515 | { 516 | "inputs": [ 517 | { 518 | "internalType": "uint256", 519 | "name": "_mintPrice", 520 | "type": "uint256" 521 | } 522 | ], 523 | "name": "setMintPrice", 524 | "outputs": [], 525 | "stateMutability": "nonpayable", 526 | "type": "function" 527 | }, 528 | { 529 | "inputs": [ 530 | { 531 | "internalType": "string", 532 | "name": "_notRevealedURI", 533 | "type": "string" 534 | } 535 | ], 536 | "name": "setNotRevealedURI", 537 | "outputs": [], 538 | "stateMutability": "nonpayable", 539 | "type": "function" 540 | }, 541 | { 542 | "inputs": [ 543 | { 544 | "internalType": "bytes4", 545 | "name": "interfaceId", 546 | "type": "bytes4" 547 | } 548 | ], 549 | "name": "supportsInterface", 550 | "outputs": [ 551 | { 552 | "internalType": "bool", 553 | "name": "", 554 | "type": "bool" 555 | } 556 | ], 557 | "stateMutability": "view", 558 | "type": "function" 559 | }, 560 | { 561 | "inputs": [], 562 | "name": "symbol", 563 | "outputs": [ 564 | { 565 | "internalType": "string", 566 | "name": "", 567 | "type": "string" 568 | } 569 | ], 570 | "stateMutability": "view", 571 | "type": "function" 572 | }, 573 | { 574 | "inputs": [ 575 | { 576 | "internalType": "uint256", 577 | "name": "index", 578 | "type": "uint256" 579 | } 580 | ], 581 | "name": "tokenByIndex", 582 | "outputs": [ 583 | { 584 | "internalType": "uint256", 585 | "name": "", 586 | "type": "uint256" 587 | } 588 | ], 589 | "stateMutability": "view", 590 | "type": "function" 591 | }, 592 | { 593 | "inputs": [ 594 | { 595 | "internalType": "address", 596 | "name": "owner", 597 | "type": "address" 598 | }, 599 | { 600 | "internalType": "uint256", 601 | "name": "index", 602 | "type": "uint256" 603 | } 604 | ], 605 | "name": "tokenOfOwnerByIndex", 606 | "outputs": [ 607 | { 608 | "internalType": "uint256", 609 | "name": "", 610 | "type": "uint256" 611 | } 612 | ], 613 | "stateMutability": "view", 614 | "type": "function" 615 | }, 616 | { 617 | "inputs": [ 618 | { 619 | "internalType": "uint256", 620 | "name": "tokenId", 621 | "type": "uint256" 622 | } 623 | ], 624 | "name": "tokenURI", 625 | "outputs": [ 626 | { 627 | "internalType": "string", 628 | "name": "", 629 | "type": "string" 630 | } 631 | ], 632 | "stateMutability": "view", 633 | "type": "function" 634 | }, 635 | { 636 | "inputs": [], 637 | "name": "totalSupply", 638 | "outputs": [ 639 | { 640 | "internalType": "uint256", 641 | "name": "", 642 | "type": "uint256" 643 | } 644 | ], 645 | "stateMutability": "view", 646 | "type": "function" 647 | }, 648 | { 649 | "inputs": [ 650 | { 651 | "internalType": "address", 652 | "name": "from", 653 | "type": "address" 654 | }, 655 | { 656 | "internalType": "address", 657 | "name": "to", 658 | "type": "address" 659 | }, 660 | { 661 | "internalType": "uint256", 662 | "name": "tokenId", 663 | "type": "uint256" 664 | } 665 | ], 666 | "name": "transferFrom", 667 | "outputs": [], 668 | "stateMutability": "nonpayable", 669 | "type": "function" 670 | }, 671 | { 672 | "inputs": [ 673 | { 674 | "internalType": "address", 675 | "name": "newOwner", 676 | "type": "address" 677 | } 678 | ], 679 | "name": "transferOwnership", 680 | "outputs": [], 681 | "stateMutability": "nonpayable", 682 | "type": "function" 683 | }, 684 | { 685 | "inputs": [ 686 | { 687 | "internalType": "address", 688 | "name": "to", 689 | "type": "address" 690 | } 691 | ], 692 | "name": "withdraw", 693 | "outputs": [], 694 | "stateMutability": "nonpayable", 695 | "type": "function" 696 | } 697 | ], 698 | "devdoc": { 699 | "kind": "dev", 700 | "methods": { 701 | "approve(address,uint256)": { 702 | "details": "See {IERC721-approve}." 703 | }, 704 | "balanceOf(address)": { 705 | "details": "See {IERC721-balanceOf}." 706 | }, 707 | "getApproved(uint256)": { 708 | "details": "See {IERC721-getApproved}." 709 | }, 710 | "isApprovedForAll(address,address)": { 711 | "details": "See {IERC721-isApprovedForAll}." 712 | }, 713 | "name()": { 714 | "details": "See {IERC721Metadata-name}." 715 | }, 716 | "owner()": { 717 | "details": "Returns the address of the current owner." 718 | }, 719 | "ownerOf(uint256)": { 720 | "details": "See {IERC721-ownerOf}." 721 | }, 722 | "renounceOwnership()": { 723 | "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner." 724 | }, 725 | "safeTransferFrom(address,address,uint256)": { 726 | "details": "See {IERC721-safeTransferFrom}." 727 | }, 728 | "safeTransferFrom(address,address,uint256,bytes)": { 729 | "details": "See {IERC721-safeTransferFrom}." 730 | }, 731 | "setApprovalForAll(address,bool)": { 732 | "details": "See {IERC721-setApprovalForAll}." 733 | }, 734 | "supportsInterface(bytes4)": { 735 | "details": "See {IERC165-supportsInterface}." 736 | }, 737 | "symbol()": { 738 | "details": "See {IERC721Metadata-symbol}." 739 | }, 740 | "tokenByIndex(uint256)": { 741 | "details": "See {IERC721Enumerable-tokenByIndex}." 742 | }, 743 | "tokenOfOwnerByIndex(address,uint256)": { 744 | "details": "See {IERC721Enumerable-tokenOfOwnerByIndex}." 745 | }, 746 | "tokenURI(uint256)": { 747 | "details": "See {IERC721Metadata-tokenURI}." 748 | }, 749 | "totalSupply()": { 750 | "details": "See {IERC721Enumerable-totalSupply}." 751 | }, 752 | "transferFrom(address,address,uint256)": { 753 | "details": "See {IERC721-transferFrom}." 754 | }, 755 | "transferOwnership(address)": { 756 | "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." 757 | } 758 | }, 759 | "version": 1 760 | }, 761 | "userdoc": { 762 | "kind": "user", 763 | "methods": {}, 764 | "version": 1 765 | } 766 | }, 767 | "settings": { 768 | "compilationTarget": { 769 | "contracts/nic_meta_nft.sol": "NicMeta" 770 | }, 771 | "evmVersion": "london", 772 | "libraries": {}, 773 | "metadata": { 774 | "bytecodeHash": "ipfs" 775 | }, 776 | "optimizer": { 777 | "enabled": false, 778 | "runs": 200 779 | }, 780 | "remappings": [] 781 | }, 782 | "sources": { 783 | "@openzeppelin/contracts/access/Ownable.sol": { 784 | "keccak256": "0x24e0364e503a9bbde94c715d26573a76f14cd2a202d45f96f52134ab806b67b9", 785 | "license": "MIT", 786 | "urls": [ 787 | "bzz-raw://e12cbaa7378fd9b62280e4e1d164bedcb4399ce238f5f98fc0eefb7e50577981", 788 | "dweb:/ipfs/QmXRoFGUgfsaRkoPT5bxNMtSayKTQ8GZATLPXf69HcRA51" 789 | ] 790 | }, 791 | "@openzeppelin/contracts/token/ERC721/ERC721.sol": { 792 | "keccak256": "0x81c02855bc239e16ec09eee000a8bec691424c715188d6d881037e69c45414c4", 793 | "license": "MIT", 794 | "urls": [ 795 | "bzz-raw://46e3ecc8920aeb78c362a387520fe28e022cdc6d04256d9e5874eb8ff6868b6d", 796 | "dweb:/ipfs/QmdfCTHrV6CZMGiM3KqGF8tWkdNvGpEmWFyy72X1LAHsz2" 797 | ] 798 | }, 799 | "@openzeppelin/contracts/token/ERC721/IERC721.sol": { 800 | "keccak256": "0x516a22876c1fab47f49b1bc22b4614491cd05338af8bd2e7b382da090a079990", 801 | "license": "MIT", 802 | "urls": [ 803 | "bzz-raw://a439187f7126d31add4557f82d8aed6be0162007cd7182c48fd934dbab8f3849", 804 | "dweb:/ipfs/QmRPLguRFvrRJS7r6F1bcLvsx6q1VrgjEpZafyeL8D7xZh" 805 | ] 806 | }, 807 | "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { 808 | "keccak256": "0xd5fa74b4fb323776fa4a8158800fec9d5ac0fec0d6dd046dd93798632ada265f", 809 | "license": "MIT", 810 | "urls": [ 811 | "bzz-raw://33017a30a99cc5411a9e376622c31fc4a55cfc6a335e2f57f00cbf24a817ff3f", 812 | "dweb:/ipfs/QmWNQtWTPhA7Lo8nbxbc8KFMvZwbFYB8fSeEQ3vuapSV4a" 813 | ] 814 | }, 815 | "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol": { 816 | "keccak256": "0x0a79511df8151b10b0a0004d6a76ad956582d32824af4c0f4886bdbdfe5746e5", 817 | "license": "MIT", 818 | "urls": [ 819 | "bzz-raw://afbedcf17f31db719e6fdc56caa8f458799c5fa2eb94cb1e94ef18f89af85768", 820 | "dweb:/ipfs/QmVmqRdBfbgYThpZSoAJ5o9mnAMjx8mCHHjv3Rh8cQAAg3" 821 | ] 822 | }, 823 | "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol": { 824 | "keccak256": "0x483f88fbbb1d6d75000fbe8ce14279b5e6121cd5a29ff5f1b91fed407735a6c3", 825 | "license": "MIT", 826 | "urls": [ 827 | "bzz-raw://51cbe83f9ccd8619d58ca5458ff49c470c656a45856b0e7435eebf5f5d431bf1", 828 | "dweb:/ipfs/QmZwR7nwu4hzVJW2m3JTPyjUopoxZUxjYLSgcSK5D4F7E2" 829 | ] 830 | }, 831 | "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { 832 | "keccak256": "0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9", 833 | "license": "MIT", 834 | "urls": [ 835 | "bzz-raw://a0a107160525724f9e1bbbab031defc2f298296dd9e331f16a6f7130cec32146", 836 | "dweb:/ipfs/QmemujxSd7gX8A9M8UwmNbz4Ms3U9FG9QfudUgxwvTmPWf" 837 | ] 838 | }, 839 | "@openzeppelin/contracts/utils/Address.sol": { 840 | "keccak256": "0x51b758a8815ecc9596c66c37d56b1d33883a444631a3f916b9fe65cb863ef7c4", 841 | "license": "MIT", 842 | "urls": [ 843 | "bzz-raw://997ca03557985b3c6f9143a18b6c3a710b3bc1c7f189ee956d305a966ecfb922", 844 | "dweb:/ipfs/QmQaD3Wb62F88SHqmpLttvF6wKuPDQep2LLUcKPekeRzvz" 845 | ] 846 | }, 847 | "@openzeppelin/contracts/utils/Context.sol": { 848 | "keccak256": "0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7", 849 | "license": "MIT", 850 | "urls": [ 851 | "bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92", 852 | "dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3" 853 | ] 854 | }, 855 | "@openzeppelin/contracts/utils/Strings.sol": { 856 | "keccak256": "0x32c202bd28995dd20c4347b7c6467a6d3241c74c8ad3edcbb610cd9205916c45", 857 | "license": "MIT", 858 | "urls": [ 859 | "bzz-raw://8179c356adb19e70d6b31a1eedc8c5c7f0c00e669e2540f4099e3844c6074d30", 860 | "dweb:/ipfs/QmWFbivarEobbqhS1go64ootVuHfVohBseerYy9FTEd1W2" 861 | ] 862 | }, 863 | "@openzeppelin/contracts/utils/introspection/ERC165.sol": { 864 | "keccak256": "0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b", 865 | "license": "MIT", 866 | "urls": [ 867 | "bzz-raw://fb0048dee081f6fffa5f74afc3fb328483c2a30504e94a0ddd2a5114d731ec4d", 868 | "dweb:/ipfs/QmZptt1nmYoA5SgjwnSgWqgUSDgm4q52Yos3xhnMv3MV43" 869 | ] 870 | }, 871 | "@openzeppelin/contracts/utils/introspection/IERC165.sol": { 872 | "keccak256": "0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1", 873 | "license": "MIT", 874 | "urls": [ 875 | "bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f", 876 | "dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy" 877 | ] 878 | }, 879 | "contracts/nic_meta_nft.sol": { 880 | "keccak256": "0x33fdcff40902ff0fb40eb1b6584e84cb8c532fff82fdf194ce6b6c7cbab85339", 881 | "license": "MIT", 882 | "urls": [ 883 | "bzz-raw://4fcb0ff52d9512c6585a6088d1e67d6d6303bdb2f97dda94bd7d616880c23080", 884 | "dweb:/ipfs/QmRFQAbPRxQvpptqnVm2iP4pCUN72chRxZHYczDwPETrmA" 885 | ] 886 | } 887 | }, 888 | "version": 1 889 | } --------------------------------------------------------------------------------