├── .github └── FUNDING.yml ├── .gitignore ├── README.md ├── contracts ├── YourContract.sol └── YourNFT.sol ├── frontend ├── .env.local.example ├── .eslintrc.json ├── .prettierignore ├── .prettierrc ├── 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 │ │ │ │ ├── ERC721Burnable.sol │ │ │ │ ├── ERC721Burnable.dbg.json │ │ │ │ └── ERC721Burnable.json │ │ │ │ ├── ERC721Enumerable.sol │ │ │ │ ├── ERC721Enumerable.dbg.json │ │ │ │ └── ERC721Enumerable.json │ │ │ │ ├── ERC721URIStorage.sol │ │ │ │ ├── ERC721URIStorage.dbg.json │ │ │ │ └── ERC721URIStorage.json │ │ │ │ ├── IERC721Enumerable.sol │ │ │ │ ├── IERC721Enumerable.dbg.json │ │ │ │ └── IERC721Enumerable.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 │ │ │ └── introspection │ │ │ ├── ERC165.sol │ │ │ ├── ERC165.dbg.json │ │ │ └── ERC165.json │ │ │ └── IERC165.sol │ │ │ ├── IERC165.dbg.json │ │ │ └── IERC165.json │ ├── build-info │ │ └── 85a28b75f4e4eee98a4deb6c57b91bd9.json │ ├── contracts │ │ ├── YourContract.sol │ │ │ ├── YourContract.dbg.json │ │ │ └── YourContract.json │ │ ├── YourNFT.sol │ │ │ ├── YourNFT.dbg.json │ │ │ ├── YourNFT.js │ │ │ └── YourNFT.json │ │ └── contractAddress.ts │ └── hardhat │ │ └── console.sol │ │ ├── console.dbg.json │ │ └── console.json ├── components │ ├── LocalFaucetButton.tsx │ ├── NftList.tsx │ └── layout │ │ ├── Head.tsx │ │ └── Layout.tsx ├── hooks │ ├── useCheckLocalChain.tsx │ └── useIsMounted.tsx ├── next-env.d.ts ├── next.config.js ├── package.json ├── pages │ ├── _app.tsx │ ├── index.tsx │ ├── nft.tsx │ └── token-gated.tsx ├── tsconfig.json ├── types │ └── typechain │ │ ├── @openzeppelin │ │ ├── contracts │ │ │ ├── access │ │ │ │ ├── Ownable.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── token │ │ │ │ ├── ERC721 │ │ │ │ │ ├── ERC721.ts │ │ │ │ │ ├── IERC721.ts │ │ │ │ │ ├── IERC721Receiver.ts │ │ │ │ │ ├── extensions │ │ │ │ │ │ ├── ERC721Burnable.ts │ │ │ │ │ │ ├── ERC721Enumerable.ts │ │ │ │ │ │ ├── ERC721URIStorage.ts │ │ │ │ │ │ ├── IERC721Enumerable.ts │ │ │ │ │ │ ├── IERC721Metadata.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ └── utils │ │ │ │ ├── index.ts │ │ │ │ └── introspection │ │ │ │ ├── ERC165.ts │ │ │ │ ├── IERC165.ts │ │ │ │ └── index.ts │ │ └── index.ts │ │ ├── common.ts │ │ ├── contracts │ │ ├── YourContract.ts │ │ ├── YourNFT.ts │ │ └── index.ts │ │ ├── factories │ │ ├── @openzeppelin │ │ │ ├── contracts │ │ │ │ ├── access │ │ │ │ │ ├── Ownable__factory.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── token │ │ │ │ │ ├── ERC721 │ │ │ │ │ │ ├── ERC721__factory.ts │ │ │ │ │ │ ├── IERC721Receiver__factory.ts │ │ │ │ │ │ ├── IERC721__factory.ts │ │ │ │ │ │ ├── extensions │ │ │ │ │ │ │ ├── ERC721Burnable__factory.ts │ │ │ │ │ │ │ ├── ERC721Enumerable__factory.ts │ │ │ │ │ │ │ ├── ERC721URIStorage__factory.ts │ │ │ │ │ │ │ ├── IERC721Enumerable__factory.ts │ │ │ │ │ │ │ ├── IERC721Metadata__factory.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ └── utils │ │ │ │ │ ├── index.ts │ │ │ │ │ └── introspection │ │ │ │ │ ├── ERC165__factory.ts │ │ │ │ │ ├── IERC165__factory.ts │ │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── contracts │ │ │ ├── YourContract__factory.ts │ │ │ ├── YourNFT__factory.ts │ │ │ └── index.ts │ │ └── index.ts │ │ ├── hardhat.d.ts │ │ └── index.ts ├── utils │ └── generateTokenUri.ts └── yarn.lock ├── hardhat.config.ts ├── package.json ├── scripts └── deploy.ts ├── tsconfig.json └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: hunterchang.eth 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | **/node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env.local 30 | .env.development.local 31 | .env.test.local 32 | .env.production.local 33 | 34 | # vercel 35 | .vercel 36 | 37 | # typescript 38 | *.tsbuildinfo 39 | 40 | node_modules 41 | 42 | #Hardhat files 43 | cache 44 | # artifacts 45 | 46 | ## Frontend Files ## 47 | # testing 48 | /frontend/coverage 49 | # next.js 50 | /frontend/.next/ 51 | /frontend/out/ 52 | # production 53 | /frontend/build 54 | # contracts 55 | # /frontend/artifacts/* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nextjs-ethereum-starter (Deprecated!) 2 | 3 | This repo may be too old to be of any use. Please see the new [Scaffold ETH 2](https://github.com/scaffold-eth/scaffold-eth-2) which is very similar to this project. 4 | 5 | This project was sponsored by the [BuidlGuidl](https://buidlguidl.com). Please support the BuidlGuidl if this project has been helpful! 6 | 7 | --- 8 | 9 | My iteration of [Austin Griffith's scaffold-eth](https://github.com/austintgriffith/scaffold-eth). 10 | Also inspired by [Nader Dabit's blog post](https://dev.to/dabit3/the-complete-guide-to-full-stack-ethereum-development-3j13) 11 | 12 | - [Hardhat](https://hardhat.org/) 13 | - [Next.js](https://nextjs.org/) 14 | - [RainbowKit](https://www.rainbowkit.com/) 15 | - [wagmi](https://wagmi.sh/) 16 | - [Chakra UI](https://chakra-ui.com/) 17 | 18 | 👀 [View the Live Demo](https://nextjs-ethereum-starter.vercel.app/) 19 | 20 | ## Getting Started 21 | 22 | It is recommended to use Yarn to avoid dependency collisions: [Yarn](https://classic.yarnpkg.com/en/docs/install) 23 | 24 | ```bash 25 | git clone https://github.com/ChangoMan/nextjs-ethereum-starter.git 26 | cd nextjs-ethereum-starter 27 | 28 | yarn install 29 | 30 | # Start up the Hardhat Network 31 | yarn chain 32 | ``` 33 | 34 | Here we just install the npm project's dependencies, and by running `yarn chain` we spin up an instance of Hardhat Network that you can connect to using MetaMask. In a different terminal in the same directory, run: 35 | 36 | ```bash 37 | yarn deploy 38 | ``` 39 | 40 | This will deploy the contract to Hardhat Network. After this completes run: 41 | 42 | ```bash 43 | cd frontend 44 | yarn install 45 | ``` 46 | 47 | This will install the frontend packages. We also need to set up the local configuration file. 48 | 49 | ```bash 50 | cp .env.local.example .env.local 51 | ``` 52 | 53 | This will create a file called `.env.local`. Open up that file and fill in the `NEXT_PUBLIC_ALCHEMY_API_KEY=` and `NEXT_PUBLIC_UNSPLASH_ACCESS_KEY=` environment variables. 54 | 55 | ```bash 56 | yarn dev 57 | ``` 58 | 59 | This will start up the Next.js development server. Your site will be available at http://localhost:3000/ 60 | 61 | To interact with the local contract, be sure to switch your MetaMask Network to `Localhost 8545` 62 | -------------------------------------------------------------------------------- /contracts/YourContract.sol: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: UNLICENSED 2 | 3 | // Solidity files have to start with this pragma. 4 | // It will be used by the Solidity compiler to validate its version. 5 | pragma solidity ^0.8.9; 6 | 7 | // We import this library to be able to use console.log 8 | import "hardhat/console.sol"; 9 | 10 | // This is the main building block for smart contracts. 11 | contract YourContract { 12 | event SetGreeting(address sender, string greeting); 13 | 14 | string public greeting = "Hello Ethereum!"; 15 | 16 | constructor() payable { 17 | // what should we do on deploy? 18 | } 19 | 20 | function setGreeting(string memory newGreeting) public { 21 | greeting = newGreeting; 22 | console.log(msg.sender, "set greeting to", greeting); 23 | emit SetGreeting(msg.sender, greeting); 24 | } 25 | 26 | // to support receiving ETH by default 27 | receive() external payable {} 28 | 29 | fallback() external payable {} 30 | } 31 | -------------------------------------------------------------------------------- /contracts/YourNFT.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.4; 3 | 4 | import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; 5 | import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; 6 | import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; 7 | import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; 8 | import "@openzeppelin/contracts/access/Ownable.sol"; 9 | import "@openzeppelin/contracts/utils/Counters.sol"; 10 | 11 | contract YourNFT is 12 | ERC721, 13 | ERC721Enumerable, 14 | ERC721URIStorage, 15 | ERC721Burnable, 16 | Ownable 17 | { 18 | using Counters for Counters.Counter; 19 | 20 | Counters.Counter private _tokenIdCounter; 21 | 22 | constructor() ERC721("CodeBushiToken", "CBT") {} 23 | 24 | function safeMint(address to, string memory uri) public returns (uint256) { 25 | uint256 tokenId = _tokenIdCounter.current(); 26 | _tokenIdCounter.increment(); 27 | _safeMint(to, tokenId); 28 | _setTokenURI(tokenId, uri); 29 | return tokenId; 30 | } 31 | 32 | // The following functions are overrides required by Solidity. 33 | 34 | function _beforeTokenTransfer( 35 | address from, 36 | address to, 37 | uint256 tokenId 38 | ) internal override(ERC721, ERC721Enumerable) { 39 | super._beforeTokenTransfer(from, to, tokenId); 40 | } 41 | 42 | function _burn(uint256 tokenId) 43 | internal 44 | override(ERC721, ERC721URIStorage) 45 | { 46 | super._burn(tokenId); 47 | } 48 | 49 | function tokenURI(uint256 tokenId) 50 | public 51 | view 52 | override(ERC721, ERC721URIStorage) 53 | returns (string memory) 54 | { 55 | return super.tokenURI(tokenId); 56 | } 57 | 58 | function supportsInterface(bytes4 interfaceId) 59 | public 60 | view 61 | override(ERC721, ERC721Enumerable) 62 | returns (bool) 63 | { 64 | return super.supportsInterface(interfaceId); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /frontend/.env.local.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_ENABLE_TESTNETS=true 2 | NEXT_PUBLIC_UNSPLASH_ACCESS_KEY= # Get an access key https://unsplash.com/developers 3 | 4 | # This is Alchemy's default API key. Get your own to avoid rate limiting errors. 5 | NEXT_PUBLIC_ALCHEMY_API_KEY=_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC -------------------------------------------------------------------------------- /frontend/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /frontend/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .next 3 | yarn.lock 4 | package-lock.json 5 | public -------------------------------------------------------------------------------- /frontend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/access/Ownable.sol/Ownable.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/IERC721.sol/IERC721.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol/IERC721Receiver.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol/ERC721Burnable.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol/ERC721Burnable.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "ERC721Burnable", 4 | "sourceName": "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.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": "burn", 127 | "outputs": [], 128 | "stateMutability": "nonpayable", 129 | "type": "function" 130 | }, 131 | { 132 | "inputs": [ 133 | { 134 | "internalType": "uint256", 135 | "name": "tokenId", 136 | "type": "uint256" 137 | } 138 | ], 139 | "name": "getApproved", 140 | "outputs": [ 141 | { 142 | "internalType": "address", 143 | "name": "", 144 | "type": "address" 145 | } 146 | ], 147 | "stateMutability": "view", 148 | "type": "function" 149 | }, 150 | { 151 | "inputs": [ 152 | { 153 | "internalType": "address", 154 | "name": "owner", 155 | "type": "address" 156 | }, 157 | { 158 | "internalType": "address", 159 | "name": "operator", 160 | "type": "address" 161 | } 162 | ], 163 | "name": "isApprovedForAll", 164 | "outputs": [ 165 | { 166 | "internalType": "bool", 167 | "name": "", 168 | "type": "bool" 169 | } 170 | ], 171 | "stateMutability": "view", 172 | "type": "function" 173 | }, 174 | { 175 | "inputs": [], 176 | "name": "name", 177 | "outputs": [ 178 | { 179 | "internalType": "string", 180 | "name": "", 181 | "type": "string" 182 | } 183 | ], 184 | "stateMutability": "view", 185 | "type": "function" 186 | }, 187 | { 188 | "inputs": [ 189 | { 190 | "internalType": "uint256", 191 | "name": "tokenId", 192 | "type": "uint256" 193 | } 194 | ], 195 | "name": "ownerOf", 196 | "outputs": [ 197 | { 198 | "internalType": "address", 199 | "name": "", 200 | "type": "address" 201 | } 202 | ], 203 | "stateMutability": "view", 204 | "type": "function" 205 | }, 206 | { 207 | "inputs": [ 208 | { 209 | "internalType": "address", 210 | "name": "from", 211 | "type": "address" 212 | }, 213 | { 214 | "internalType": "address", 215 | "name": "to", 216 | "type": "address" 217 | }, 218 | { 219 | "internalType": "uint256", 220 | "name": "tokenId", 221 | "type": "uint256" 222 | } 223 | ], 224 | "name": "safeTransferFrom", 225 | "outputs": [], 226 | "stateMutability": "nonpayable", 227 | "type": "function" 228 | }, 229 | { 230 | "inputs": [ 231 | { 232 | "internalType": "address", 233 | "name": "from", 234 | "type": "address" 235 | }, 236 | { 237 | "internalType": "address", 238 | "name": "to", 239 | "type": "address" 240 | }, 241 | { 242 | "internalType": "uint256", 243 | "name": "tokenId", 244 | "type": "uint256" 245 | }, 246 | { 247 | "internalType": "bytes", 248 | "name": "data", 249 | "type": "bytes" 250 | } 251 | ], 252 | "name": "safeTransferFrom", 253 | "outputs": [], 254 | "stateMutability": "nonpayable", 255 | "type": "function" 256 | }, 257 | { 258 | "inputs": [ 259 | { 260 | "internalType": "address", 261 | "name": "operator", 262 | "type": "address" 263 | }, 264 | { 265 | "internalType": "bool", 266 | "name": "approved", 267 | "type": "bool" 268 | } 269 | ], 270 | "name": "setApprovalForAll", 271 | "outputs": [], 272 | "stateMutability": "nonpayable", 273 | "type": "function" 274 | }, 275 | { 276 | "inputs": [ 277 | { 278 | "internalType": "bytes4", 279 | "name": "interfaceId", 280 | "type": "bytes4" 281 | } 282 | ], 283 | "name": "supportsInterface", 284 | "outputs": [ 285 | { 286 | "internalType": "bool", 287 | "name": "", 288 | "type": "bool" 289 | } 290 | ], 291 | "stateMutability": "view", 292 | "type": "function" 293 | }, 294 | { 295 | "inputs": [], 296 | "name": "symbol", 297 | "outputs": [ 298 | { 299 | "internalType": "string", 300 | "name": "", 301 | "type": "string" 302 | } 303 | ], 304 | "stateMutability": "view", 305 | "type": "function" 306 | }, 307 | { 308 | "inputs": [ 309 | { 310 | "internalType": "uint256", 311 | "name": "tokenId", 312 | "type": "uint256" 313 | } 314 | ], 315 | "name": "tokenURI", 316 | "outputs": [ 317 | { 318 | "internalType": "string", 319 | "name": "", 320 | "type": "string" 321 | } 322 | ], 323 | "stateMutability": "view", 324 | "type": "function" 325 | }, 326 | { 327 | "inputs": [ 328 | { 329 | "internalType": "address", 330 | "name": "from", 331 | "type": "address" 332 | }, 333 | { 334 | "internalType": "address", 335 | "name": "to", 336 | "type": "address" 337 | }, 338 | { 339 | "internalType": "uint256", 340 | "name": "tokenId", 341 | "type": "uint256" 342 | } 343 | ], 344 | "name": "transferFrom", 345 | "outputs": [], 346 | "stateMutability": "nonpayable", 347 | "type": "function" 348 | } 349 | ], 350 | "bytecode": "0x", 351 | "deployedBytecode": "0x", 352 | "linkReferences": {}, 353 | "deployedLinkReferences": {} 354 | } 355 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol/ERC721Enumerable.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol/ERC721URIStorage.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol/IERC721Enumerable.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol/IERC721Enumerable.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "IERC721Enumerable", 4 | "sourceName": "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.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": "uint256", 272 | "name": "index", 273 | "type": "uint256" 274 | } 275 | ], 276 | "name": "tokenByIndex", 277 | "outputs": [ 278 | { 279 | "internalType": "uint256", 280 | "name": "", 281 | "type": "uint256" 282 | } 283 | ], 284 | "stateMutability": "view", 285 | "type": "function" 286 | }, 287 | { 288 | "inputs": [ 289 | { 290 | "internalType": "address", 291 | "name": "owner", 292 | "type": "address" 293 | }, 294 | { 295 | "internalType": "uint256", 296 | "name": "index", 297 | "type": "uint256" 298 | } 299 | ], 300 | "name": "tokenOfOwnerByIndex", 301 | "outputs": [ 302 | { 303 | "internalType": "uint256", 304 | "name": "", 305 | "type": "uint256" 306 | } 307 | ], 308 | "stateMutability": "view", 309 | "type": "function" 310 | }, 311 | { 312 | "inputs": [], 313 | "name": "totalSupply", 314 | "outputs": [ 315 | { 316 | "internalType": "uint256", 317 | "name": "", 318 | "type": "uint256" 319 | } 320 | ], 321 | "stateMutability": "view", 322 | "type": "function" 323 | }, 324 | { 325 | "inputs": [ 326 | { 327 | "internalType": "address", 328 | "name": "from", 329 | "type": "address" 330 | }, 331 | { 332 | "internalType": "address", 333 | "name": "to", 334 | "type": "address" 335 | }, 336 | { 337 | "internalType": "uint256", 338 | "name": "tokenId", 339 | "type": "uint256" 340 | } 341 | ], 342 | "name": "transferFrom", 343 | "outputs": [], 344 | "stateMutability": "nonpayable", 345 | "type": "function" 346 | } 347 | ], 348 | "bytecode": "0x", 349 | "deployedBytecode": "0x", 350 | "linkReferences": {}, 351 | "deployedLinkReferences": {} 352 | } 353 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol/IERC721Metadata.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/utils/Address.sol/Address.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220919410102baee4ae49f3fecd64009dc614f68802b33ddab312e079faa4a9a47b64736f6c63430008090033", 7 | "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220919410102baee4ae49f3fecd64009dc614f68802b33ddab312e079faa4a9a47b64736f6c63430008090033", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/utils/Counters.sol/Counters.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206b1c31e7b962abcf83f83118011fe94b3f162b24dd0e3a485631d28652e7e89264736f6c63430008090033", 7 | "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206b1c31e7b962abcf83f83118011fe94b3f162b24dd0e3a485631d28652e7e89264736f6c63430008090033", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/utils/Strings.sol/Strings.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b92035b42dcc3aec0b3e4eabd70fbc2c49f312baebbbc38f9fc50feda5de9d5b64736f6c63430008090033", 7 | "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b92035b42dcc3aec0b3e4eabd70fbc2c49f312baebbbc38f9fc50feda5de9d5b64736f6c63430008090033", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/utils/introspection/ERC165.sol/ERC165.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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 | -------------------------------------------------------------------------------- /frontend/artifacts/@openzeppelin/contracts/utils/introspection/IERC165.sol/IERC165.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../../../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/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 | -------------------------------------------------------------------------------- /frontend/artifacts/contracts/YourContract.sol/YourContract.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/artifacts/contracts/YourContract.sol/YourContract.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "YourContract", 4 | "sourceName": "contracts/YourContract.sol", 5 | "abi": [ 6 | { 7 | "inputs": [], 8 | "stateMutability": "payable", 9 | "type": "constructor" 10 | }, 11 | { 12 | "anonymous": false, 13 | "inputs": [ 14 | { 15 | "indexed": false, 16 | "internalType": "address", 17 | "name": "sender", 18 | "type": "address" 19 | }, 20 | { 21 | "indexed": false, 22 | "internalType": "string", 23 | "name": "greeting", 24 | "type": "string" 25 | } 26 | ], 27 | "name": "SetGreeting", 28 | "type": "event" 29 | }, 30 | { 31 | "stateMutability": "payable", 32 | "type": "fallback" 33 | }, 34 | { 35 | "inputs": [], 36 | "name": "greeting", 37 | "outputs": [ 38 | { 39 | "internalType": "string", 40 | "name": "", 41 | "type": "string" 42 | } 43 | ], 44 | "stateMutability": "view", 45 | "type": "function" 46 | }, 47 | { 48 | "inputs": [ 49 | { 50 | "internalType": "string", 51 | "name": "newGreeting", 52 | "type": "string" 53 | } 54 | ], 55 | "name": "setGreeting", 56 | "outputs": [], 57 | "stateMutability": "nonpayable", 58 | "type": "function" 59 | }, 60 | { 61 | "stateMutability": "payable", 62 | "type": "receive" 63 | } 64 | ], 65 | "bytecode": "0x60806040526040518060400160405280600f81526020017f48656c6c6f20457468657265756d2100000000000000000000000000000000008152506000908051906020019061004f929190610055565b50610159565b82805461006190610127565b90600052602060002090601f01602090048101928261008357600085556100ca565b82601f1061009c57805160ff19168380011785556100ca565b828001600101855582156100ca579182015b828111156100c95782518255916020019190600101906100ae565b5b5090506100d791906100db565b5090565b5b808211156100f45760008160009055506001016100dc565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061013f57607f821691505b60208210811415610153576101526100f8565b5b50919050565b6107d0806101686000396000f3fe60806040526004361061002d5760003560e01c8063a413686214610036578063ef690cc01461005f57610034565b3661003457005b005b34801561004257600080fd5b5061005d600480360381019061005891906104fb565b61008a565b005b34801561006b57600080fd5b506100746101a8565b60405161008191906105cc565b60405180910390f35b80600090805190602001906100a09291906102fe565b5061016b336040518060400160405280600f81526020017f736574206772656574696e6720746f0000000000000000000000000000000000815250600080546100e89061061d565b80601f01602080910402602001604051908101604052809291908181526020018280546101149061061d565b80156101615780601f1061013657610100808354040283529160200191610161565b820191906000526020600020905b81548152906001019060200180831161014457829003601f168201915b5050505050610236565b7ffae51f5480b362c362b5f790e2a1b86b677c562bf1c1db0094505abfe05ef91133600060405161019d929190610725565b60405180910390a150565b600080546101b59061061d565b80601f01602080910402602001604051908101604052809291908181526020018280546101e19061061d565b801561022e5780601f106102035761010080835404028352916020019161022e565b820191906000526020600020905b81548152906001019060200180831161021157829003601f168201915b505050505081565b6102d083838360405160240161024e93929190610755565b6040516020818303038152906040527ffb772265000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102d5565b505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b82805461030a9061061d565b90600052602060002090601f01602090048101928261032c5760008555610373565b82601f1061034557805160ff1916838001178555610373565b82800160010185558215610373579182015b82811115610372578251825591602001919060010190610357565b5b5090506103809190610384565b5090565b5b8082111561039d576000816000905550600101610385565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610408826103bf565b810181811067ffffffffffffffff82111715610427576104266103d0565b5b80604052505050565b600061043a6103a1565b905061044682826103ff565b919050565b600067ffffffffffffffff821115610466576104656103d0565b5b61046f826103bf565b9050602081019050919050565b82818337600083830152505050565b600061049e6104998461044b565b610430565b9050828152602081018484840111156104ba576104b96103ba565b5b6104c584828561047c565b509392505050565b600082601f8301126104e2576104e16103b5565b5b81356104f284826020860161048b565b91505092915050565b600060208284031215610511576105106103ab565b5b600082013567ffffffffffffffff81111561052f5761052e6103b0565b5b61053b848285016104cd565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561057e578082015181840152602081019050610563565b8381111561058d576000848401525b50505050565b600061059e82610544565b6105a8818561054f565b93506105b8818560208601610560565b6105c1816103bf565b840191505092915050565b600060208201905081810360008301526105e68184610593565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061063557607f821691505b60208210811415610649576106486105ee565b5b50919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061067a8261064f565b9050919050565b61068a8161066f565b82525050565b60008190508160005260206000209050919050565b600081546106b28161061d565b6106bc818661054f565b945060018216600081146106d757600181146106e95761071c565b60ff198316865260208601935061071c565b6106f285610690565b60005b83811015610714578154818901526001820191506020810190506106f5565b808801955050505b50505092915050565b600060408201905061073a6000830185610681565b818103602083015261074c81846106a5565b90509392505050565b600060608201905061076a6000830186610681565b818103602083015261077c8185610593565b905081810360408301526107908184610593565b905094935050505056fea26469706673582212200f1852fc2ac35d618510c9b658879b59e17bd87c6dce8561395006f991c254af64736f6c63430008090033", 66 | "deployedBytecode": "0x60806040526004361061002d5760003560e01c8063a413686214610036578063ef690cc01461005f57610034565b3661003457005b005b34801561004257600080fd5b5061005d600480360381019061005891906104fb565b61008a565b005b34801561006b57600080fd5b506100746101a8565b60405161008191906105cc565b60405180910390f35b80600090805190602001906100a09291906102fe565b5061016b336040518060400160405280600f81526020017f736574206772656574696e6720746f0000000000000000000000000000000000815250600080546100e89061061d565b80601f01602080910402602001604051908101604052809291908181526020018280546101149061061d565b80156101615780601f1061013657610100808354040283529160200191610161565b820191906000526020600020905b81548152906001019060200180831161014457829003601f168201915b5050505050610236565b7ffae51f5480b362c362b5f790e2a1b86b677c562bf1c1db0094505abfe05ef91133600060405161019d929190610725565b60405180910390a150565b600080546101b59061061d565b80601f01602080910402602001604051908101604052809291908181526020018280546101e19061061d565b801561022e5780601f106102035761010080835404028352916020019161022e565b820191906000526020600020905b81548152906001019060200180831161021157829003601f168201915b505050505081565b6102d083838360405160240161024e93929190610755565b6040516020818303038152906040527ffb772265000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102d5565b505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b82805461030a9061061d565b90600052602060002090601f01602090048101928261032c5760008555610373565b82601f1061034557805160ff1916838001178555610373565b82800160010185558215610373579182015b82811115610372578251825591602001919060010190610357565b5b5090506103809190610384565b5090565b5b8082111561039d576000816000905550600101610385565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610408826103bf565b810181811067ffffffffffffffff82111715610427576104266103d0565b5b80604052505050565b600061043a6103a1565b905061044682826103ff565b919050565b600067ffffffffffffffff821115610466576104656103d0565b5b61046f826103bf565b9050602081019050919050565b82818337600083830152505050565b600061049e6104998461044b565b610430565b9050828152602081018484840111156104ba576104b96103ba565b5b6104c584828561047c565b509392505050565b600082601f8301126104e2576104e16103b5565b5b81356104f284826020860161048b565b91505092915050565b600060208284031215610511576105106103ab565b5b600082013567ffffffffffffffff81111561052f5761052e6103b0565b5b61053b848285016104cd565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561057e578082015181840152602081019050610563565b8381111561058d576000848401525b50505050565b600061059e82610544565b6105a8818561054f565b93506105b8818560208601610560565b6105c1816103bf565b840191505092915050565b600060208201905081810360008301526105e68184610593565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061063557607f821691505b60208210811415610649576106486105ee565b5b50919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061067a8261064f565b9050919050565b61068a8161066f565b82525050565b60008190508160005260206000209050919050565b600081546106b28161061d565b6106bc818661054f565b945060018216600081146106d757600181146106e95761071c565b60ff198316865260208601935061071c565b6106f285610690565b60005b83811015610714578154818901526001820191506020810190506106f5565b808801955050505b50505092915050565b600060408201905061073a6000830185610681565b818103602083015261074c81846106a5565b90509392505050565b600060608201905061076a6000830186610681565b818103602083015261077c8185610593565b905081810360408301526107908184610593565b905094935050505056fea26469706673582212200f1852fc2ac35d618510c9b658879b59e17bd87c6dce8561395006f991c254af64736f6c63430008090033", 67 | "linkReferences": {}, 68 | "deployedLinkReferences": {} 69 | } 70 | -------------------------------------------------------------------------------- /frontend/artifacts/contracts/YourNFT.sol/YourNFT.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/artifacts/contracts/contractAddress.ts: -------------------------------------------------------------------------------- 1 | export const YourContract = '0x5FbDB2315678afecb367f032d93F642f64180aa3' 2 | export const YourNFTContract = '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512' 3 | -------------------------------------------------------------------------------- /frontend/artifacts/hardhat/console.sol/console.dbg.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-dbg-1", 3 | "buildInfo": "../../build-info/85a28b75f4e4eee98a4deb6c57b91bd9.json" 4 | } 5 | -------------------------------------------------------------------------------- /frontend/artifacts/hardhat/console.sol/console.json: -------------------------------------------------------------------------------- 1 | { 2 | "_format": "hh-sol-artifact-1", 3 | "contractName": "console", 4 | "sourceName": "hardhat/console.sol", 5 | "abi": [], 6 | "bytecode": "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122023ed7727ab4a3926687af4d4c2d34d1104da736a65dadf10a6bb9551cb1c779564736f6c63430008090033", 7 | "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122023ed7727ab4a3926687af4d4c2d34d1104da736a65dadf10a6bb9551cb1c779564736f6c63430008090033", 8 | "linkReferences": {}, 9 | "deployedLinkReferences": {} 10 | } 11 | -------------------------------------------------------------------------------- /frontend/components/LocalFaucetButton.tsx: -------------------------------------------------------------------------------- 1 | import { Button, useToast } from '@chakra-ui/react' 2 | import { ethers, providers } from 'ethers' 3 | import { useCallback } from 'react' 4 | import { useAccount } from 'wagmi' 5 | import { useCheckLocalChain } from '../hooks/useCheckLocalChain' 6 | 7 | /** 8 | * Constants & Helpers 9 | */ 10 | 11 | const localProvider = new providers.StaticJsonRpcProvider( 12 | 'http://localhost:8545' 13 | ) 14 | 15 | /** 16 | * Component 17 | */ 18 | export const LocalFaucetButton = () => { 19 | const { address } = useAccount() 20 | 21 | const { isLocalChain } = useCheckLocalChain() 22 | 23 | const toast = useToast() 24 | 25 | // Use the localProvider as the signer to send ETH to our wallet 26 | const sendFunds = useCallback(async () => { 27 | if (address) { 28 | const signer = localProvider.getSigner() 29 | 30 | const transaction = await signer.sendTransaction({ 31 | to: address, 32 | value: ethers.constants.WeiPerEther, 33 | }) 34 | 35 | await transaction.wait() 36 | 37 | toast({ 38 | title: 'Transaction Successful', 39 | description: 'ETH sent from local faucet', 40 | status: 'success', 41 | duration: 5000, 42 | isClosable: true, 43 | }) 44 | } 45 | }, [address, toast]) 46 | 47 | return ( 48 | 51 | ) 52 | } 53 | -------------------------------------------------------------------------------- /frontend/components/NftList.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Alert, 3 | AlertIcon, 4 | Box, 5 | Flex, 6 | Image, 7 | SimpleGrid, 8 | Text, 9 | } from '@chakra-ui/react' 10 | import { Result } from '@ethersproject/abi' 11 | import { IPFSHTTPClient } from 'ipfs-http-client' 12 | import { useEffect, useState } from 'react' 13 | 14 | interface NftListProps { 15 | address?: string | null 16 | ipfs: IPFSHTTPClient 17 | nftTokenUris: Array | Array 18 | } 19 | 20 | type NftMetadataType = { 21 | description: string 22 | image: string 23 | name: string 24 | } 25 | 26 | export const NftList = ({ 27 | address, 28 | ipfs, 29 | nftTokenUris, 30 | }: NftListProps): JSX.Element => { 31 | const [nfts, setNfts] = useState>([]) 32 | 33 | useEffect(() => { 34 | const fetchNftData = async (ipfsHash: string) => { 35 | try { 36 | const resp = await ipfs.cat(ipfsHash) 37 | let content: Array = [] 38 | 39 | for await (const chunk of resp) { 40 | content = [...content, ...chunk] 41 | } 42 | 43 | const raw = Buffer.from(content).toString('utf8') 44 | 45 | return JSON.parse(raw) 46 | } catch (error) { 47 | console.log('error', error) 48 | } 49 | } 50 | 51 | const processTokenUris = async () => { 52 | const nftData = await Promise.all( 53 | nftTokenUris.map(async (tokenUri: any = '') => { 54 | if (tokenUri) { 55 | const ipfsHash = tokenUri.replace('https://ipfs.io/ipfs/', '') 56 | const ipfsData = await fetchNftData(ipfsHash) 57 | return ipfsData 58 | } 59 | 60 | return { 61 | image: '', 62 | name: '', 63 | } 64 | }) 65 | ) 66 | 67 | setNfts(nftData) 68 | } 69 | 70 | processTokenUris() 71 | }, [ipfs, nftTokenUris]) 72 | 73 | if (nftTokenUris.length === 0) { 74 | return ( 75 | 76 | 77 | No NFTs associated with your address: {address} 78 | 79 | ) 80 | } 81 | 82 | return ( 83 |
84 | 85 | {nfts.map((nft) => { 86 | return ( 87 | 96 | {nft.name} 102 | 103 | 104 | {nft.name} 105 | 106 | {nft.description} 107 | 108 | 109 | ) 110 | })} 111 | 112 |
113 | ) 114 | } 115 | -------------------------------------------------------------------------------- /frontend/components/layout/Head.tsx: -------------------------------------------------------------------------------- 1 | import NextHead from 'next/head' 2 | import { useRouter } from 'next/router' 3 | 4 | /** 5 | * Constants & Helpers 6 | */ 7 | export const WEBSITE_HOST_URL = 'https://nextjs-ethereum-starter.vercel.app/' 8 | 9 | /** 10 | * Prop Types 11 | */ 12 | export interface MetaProps { 13 | description?: string 14 | image?: string 15 | title: string 16 | type?: string 17 | } 18 | 19 | /** 20 | * Component 21 | */ 22 | export const Head = ({ 23 | customMeta, 24 | }: { 25 | customMeta?: MetaProps 26 | }): JSX.Element => { 27 | const router = useRouter() 28 | const meta: MetaProps = { 29 | title: 'Next.js Ethereum Starter', 30 | description: 'Next.js - RainbowKit - Hardhat', 31 | image: `${WEBSITE_HOST_URL}/images/site-preview.png`, 32 | type: 'website', 33 | ...customMeta, 34 | } 35 | 36 | return ( 37 | 38 | {meta.title} 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | ) 54 | } 55 | -------------------------------------------------------------------------------- /frontend/components/layout/Layout.tsx: -------------------------------------------------------------------------------- 1 | import { Container, Flex, Link, SimpleGrid, Text } from '@chakra-ui/react' 2 | import { ConnectButton } from '@rainbow-me/rainbowkit' 3 | import NextLink from 'next/link' 4 | import React from 'react' 5 | import { LocalFaucetButton } from '../LocalFaucetButton' 6 | import { Head, MetaProps } from './Head' 7 | 8 | interface LayoutProps { 9 | children: React.ReactNode 10 | customMeta?: MetaProps 11 | } 12 | 13 | export const Layout = ({ children, customMeta }: LayoutProps): JSX.Element => { 14 | return ( 15 | <> 16 | 17 |
18 | 19 | 25 | 26 | 27 | 28 | Home 29 | 30 | 31 | 32 | 33 | Mint NFT 34 | 35 | 36 | 37 | 38 | Token Gated 39 | 40 | 41 | 42 | 47 | 48 | 49 | 50 | 51 |
52 |
53 | {children} 54 |
55 |
56 | 57 | 58 | Built by{' '} 59 | Hunter Chang 60 | 61 | 62 | 63 |
64 | 65 | ) 66 | } 67 | -------------------------------------------------------------------------------- /frontend/hooks/useCheckLocalChain.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react' 2 | import { useNetwork } from 'wagmi' 3 | 4 | export const useCheckLocalChain = () => { 5 | const [isLocalChain, setIsLocalChain] = useState(false) 6 | 7 | const { chain } = useNetwork() 8 | 9 | useEffect(() => { 10 | if (chain && chain.id === 1337) { 11 | setIsLocalChain(true) 12 | } 13 | }, [chain]) 14 | 15 | return { 16 | isLocalChain, 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /frontend/hooks/useIsMounted.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react' 2 | 3 | export const useIsMounted = () => { 4 | const [isMounted, setIsMounted] = useState(false) 5 | 6 | useEffect(() => { 7 | setIsMounted(true) 8 | }, []) 9 | 10 | return { 11 | isMounted, 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /frontend/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | } 5 | 6 | module.exports = nextConfig 7 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nextjs-ethereum-starter-frontend", 3 | "author": "@hunterhchang", 4 | "license": "MIT", 5 | "version": "1.0.0", 6 | "scripts": { 7 | "dev": "next dev", 8 | "build": "next build", 9 | "start": "next start", 10 | "lint": "next lint" 11 | }, 12 | "dependencies": { 13 | "@chakra-ui/react": "^2.4.1", 14 | "@emotion/react": "^11.10.5", 15 | "@emotion/styled": "^11.10.5", 16 | "@rainbow-me/rainbowkit": "^0.8.0", 17 | "ethers": "^5.7.2", 18 | "framer-motion": "^7.6.7", 19 | "ipfs-http-client": "^59.0.0", 20 | "next": "^13.0.4", 21 | "react": "^18.2.0", 22 | "react-dom": "^18.2.0", 23 | "wagmi": "^0.8.5" 24 | }, 25 | "devDependencies": { 26 | "@types/node": "^18.11.9", 27 | "@types/react": "^18.0.25", 28 | "eslint": "^8.28.0", 29 | "eslint-config-next": "^13.0.4", 30 | "typescript": "^4.9.3" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /frontend/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import { ChakraProvider } from '@chakra-ui/react' 2 | import { 3 | connectorsForWallets, 4 | darkTheme, 5 | getDefaultWallets, 6 | RainbowKitProvider, 7 | } from '@rainbow-me/rainbowkit' 8 | import '@rainbow-me/rainbowkit/styles.css' 9 | import type { AppProps } from 'next/app' 10 | import { chain, configureChains, createClient, WagmiConfig } from 'wagmi' 11 | import { alchemyProvider } from 'wagmi/providers/alchemy' 12 | import { publicProvider } from 'wagmi/providers/public' 13 | 14 | const ALCHEMY_API_KEY = process.env.NEXT_PUBLIC_ALCHEMY_API_KEY || '' 15 | 16 | const { chains, provider, webSocketProvider } = configureChains( 17 | [ 18 | chain.mainnet, 19 | chain.polygon, 20 | chain.optimism, 21 | chain.arbitrum, 22 | ...(process.env.NEXT_PUBLIC_ENABLE_TESTNETS === 'true' 23 | ? [chain.goerli, chain.localhost] 24 | : []), 25 | ], 26 | [ 27 | alchemyProvider({ 28 | apiKey: ALCHEMY_API_KEY, 29 | }), 30 | publicProvider(), 31 | ] 32 | ) 33 | 34 | const { wallets } = getDefaultWallets({ 35 | appName: 'RainbowKit demo', 36 | chains, 37 | }) 38 | 39 | const demoAppInfo = { 40 | appName: 'Rainbowkit Demo', 41 | } 42 | 43 | const connectors = connectorsForWallets(wallets) 44 | 45 | const wagmiClient = createClient({ 46 | autoConnect: true, 47 | connectors, 48 | provider, 49 | webSocketProvider, 50 | }) 51 | 52 | export default function App({ Component, pageProps }: AppProps) { 53 | return ( 54 | 55 | 62 | 63 | 64 | 65 | 66 | 67 | ) 68 | } 69 | -------------------------------------------------------------------------------- /frontend/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Box, 3 | Button, 4 | Divider, 5 | Heading, 6 | Input, 7 | Link, 8 | ListItem, 9 | Text, 10 | UnorderedList, 11 | useToast, 12 | } from '@chakra-ui/react' 13 | import { ethers, providers } from 'ethers' 14 | import type { NextPage } from 'next' 15 | import { useReducer } from 'react' 16 | import { 17 | useAccount, 18 | useContractWrite, 19 | usePrepareContractWrite, 20 | useProvider, 21 | useWaitForTransaction, 22 | } from 'wagmi' 23 | import { YourContract as LOCAL_CONTRACT_ADDRESS } from '../artifacts/contracts/contractAddress' 24 | import YourContract from '../artifacts/contracts/YourContract.sol/YourContract.json' 25 | import { Layout } from '../components/layout/Layout' 26 | import { useCheckLocalChain } from '../hooks/useCheckLocalChain' 27 | import { useIsMounted } from '../hooks/useIsMounted' 28 | import { YourContract as YourContractType } from '../types/typechain' 29 | 30 | /** 31 | * Constants & Helpers 32 | */ 33 | 34 | const localProvider = new providers.StaticJsonRpcProvider( 35 | 'http://localhost:8545' 36 | ) 37 | 38 | const GOERLI_CONTRACT_ADDRESS = '0x3B73833638556f10ceB1b49A18a27154e3828303' 39 | 40 | /** 41 | * Prop Types 42 | */ 43 | type StateType = { 44 | greeting: string 45 | inputValue: string 46 | } 47 | type ActionType = 48 | | { 49 | type: 'SET_GREETING' 50 | greeting: StateType['greeting'] 51 | } 52 | | { 53 | type: 'SET_INPUT_VALUE' 54 | inputValue: StateType['inputValue'] 55 | } 56 | 57 | /** 58 | * Component 59 | */ 60 | const initialState: StateType = { 61 | greeting: '', 62 | inputValue: '', 63 | } 64 | 65 | function reducer(state: StateType, action: ActionType): StateType { 66 | switch (action.type) { 67 | // Track the greeting from the blockchain 68 | case 'SET_GREETING': 69 | return { 70 | ...state, 71 | greeting: action.greeting, 72 | } 73 | case 'SET_INPUT_VALUE': 74 | return { 75 | ...state, 76 | inputValue: action.inputValue, 77 | } 78 | default: 79 | throw new Error() 80 | } 81 | } 82 | 83 | const Home: NextPage = () => { 84 | const [state, dispatch] = useReducer(reducer, initialState) 85 | 86 | const { isLocalChain } = useCheckLocalChain() 87 | 88 | const { isMounted } = useIsMounted() 89 | 90 | const CONTRACT_ADDRESS = isLocalChain 91 | ? LOCAL_CONTRACT_ADDRESS 92 | : GOERLI_CONTRACT_ADDRESS 93 | 94 | const { address } = useAccount() 95 | 96 | const provider = useProvider() 97 | 98 | const toast = useToast() 99 | 100 | const { config } = usePrepareContractWrite({ 101 | address: CONTRACT_ADDRESS, 102 | abi: YourContract.abi, 103 | functionName: 'setGreeting', 104 | args: [state.inputValue], 105 | enabled: Boolean(state.inputValue), 106 | }) 107 | 108 | const { data, write } = useContractWrite(config) 109 | 110 | const { isLoading } = useWaitForTransaction({ 111 | hash: data?.hash, 112 | onSuccess(data) { 113 | console.log('success data', data) 114 | toast({ 115 | title: 'Transaction Successful', 116 | description: ( 117 | <> 118 | Successfully updated the Greeting! 119 | 120 | 124 | View on Etherscan 125 | 126 | 127 | 128 | ), 129 | status: 'success', 130 | duration: 5000, 131 | isClosable: true, 132 | }) 133 | }, 134 | }) 135 | 136 | // call the smart contract, read the current greeting value 137 | async function fetchContractGreeting() { 138 | if (provider) { 139 | const contract = new ethers.Contract( 140 | CONTRACT_ADDRESS, 141 | YourContract.abi, 142 | provider 143 | ) as YourContractType 144 | try { 145 | const data = await contract.greeting() 146 | dispatch({ type: 'SET_GREETING', greeting: data }) 147 | } catch (err) { 148 | // eslint-disable-next-line no-console 149 | console.log('Error: ', err) 150 | } 151 | } 152 | } 153 | 154 | if (!isMounted) { 155 | return null 156 | } 157 | 158 | return ( 159 | 160 | 161 | Next.js Ethereum Starter 162 | 163 | 164 | Ethereum starter kit made with: 165 | 166 | 167 | 168 | 169 | Hardhat 170 | 171 | 172 | 173 | 174 | Next.js 175 | 176 | 177 | 178 | 179 | RainbowKit 180 | 181 | 182 | 183 | 184 | wagmi Hooks 185 | 186 | 187 | 188 | 189 | Chakra UI 190 | 191 | 192 | 193 | 204 | 205 | 206 | This page only works on the GOERLI Testnet or on a Local Chain. 207 | 208 | 209 | Contract Address: {CONTRACT_ADDRESS} 210 | 211 | 212 | Greeting: {state.greeting} 213 | 221 | 222 | 223 | 224 | 225 | Enter a Greeting: 226 | 227 | { 233 | dispatch({ 234 | type: 'SET_INPUT_VALUE', 235 | inputValue: e.target.value, 236 | }) 237 | }} 238 | /> 239 | 248 | 249 | 250 | 251 | ) 252 | } 253 | 254 | export default Home 255 | -------------------------------------------------------------------------------- /frontend/pages/nft.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Box, 3 | Button, 4 | Divider, 5 | Heading, 6 | Link, 7 | Text, 8 | useToast, 9 | } from '@chakra-ui/react' 10 | import { create } from 'ipfs-http-client' 11 | import type { NextPage } from 'next' 12 | import { useCallback, useEffect, useMemo, useRef, useState } from 'react' 13 | import { 14 | erc721ABI, 15 | useAccount, 16 | useContractRead, 17 | useContractReads, 18 | useContractWrite, 19 | usePrepareContractWrite, 20 | useWaitForTransaction, 21 | } from 'wagmi' 22 | import { YourNFTContract as LOCAL_CONTRACT_ADDRESS } from '../artifacts/contracts/contractAddress' 23 | // `YourNFT.js` was made manually from `YourNFT.json`, since wagmi hooks require a `const` for the `abi` input. 24 | // If you update the `YourNFT` contract, be sure to update this `YourNFT.js` file as well. 25 | // Simply copy the array from `abi: []` found in `YourNFT.json`. 26 | import { YourNFT_ABI } from '../artifacts/contracts/YourNFT.sol/YourNFT.js' 27 | import { Layout } from '../components/layout/Layout' 28 | import { NftList } from '../components/NftList' 29 | import { useCheckLocalChain } from '../hooks/useCheckLocalChain' 30 | import { useIsMounted } from '../hooks/useIsMounted' 31 | import { generateTokenUri } from '../utils/generateTokenUri' 32 | 33 | const GOERLI_CONTRACT_ADDRESS = '0x982659f8ce3988096A735044aD42445D6514ba7e' 34 | 35 | const UNSPLASH_ACCESS_KEY = process.env.NEXT_PUBLIC_UNSPLASH_ACCESS_KEY 36 | 37 | const IPFS_BASE_URL = 'https://ipfs.io/ipfs' 38 | 39 | const projectId = '2DDHiA47zFkJXtnxzl2jFkyuaoq' 40 | const projectSecret = '96a91eeafc0a390ab66e6a87f61152aa' 41 | const projectIdAndSecret = `${projectId}:${projectSecret}` 42 | 43 | const ipfs = create({ 44 | host: 'ipfs.infura.io', 45 | port: 5001, 46 | protocol: 'https', 47 | headers: { 48 | authorization: `Basic ${Buffer.from(projectIdAndSecret).toString( 49 | 'base64' 50 | )}`, 51 | }, 52 | }) 53 | 54 | const NftIndex: NextPage = () => { 55 | const [hasNftUri, setHasNftUri] = useState(false) 56 | const nftUriRef = useRef('') 57 | 58 | const { isLocalChain } = useCheckLocalChain() 59 | 60 | const { isMounted } = useIsMounted() 61 | 62 | const CONTRACT_ADDRESS = isLocalChain 63 | ? LOCAL_CONTRACT_ADDRESS 64 | : GOERLI_CONTRACT_ADDRESS 65 | 66 | const { address } = useAccount() 67 | 68 | const toast = useToast() 69 | 70 | const CONTRACT_CONFIG = useMemo(() => { 71 | return { 72 | address: CONTRACT_ADDRESS, 73 | abi: YourNFT_ABI, 74 | } 75 | }, [CONTRACT_ADDRESS]) 76 | 77 | // Gets the total number of NFTs owned by the connected address. 78 | const { data: nftBalanceData, refetch: refetchNftBalanceData } = 79 | useContractRead({ 80 | address: CONTRACT_ADDRESS, 81 | abi: erc721ABI, 82 | functionName: 'balanceOf', 83 | args: address ? [address] : undefined, 84 | }) 85 | 86 | // Creates the contracts array for `nftTokenIds` 87 | const tokenOwnerContractsArray = useMemo(() => { 88 | let contractCalls = [] 89 | 90 | if (nftBalanceData && nftBalanceData.toNumber) { 91 | const nftBalance = nftBalanceData.toNumber() 92 | 93 | for (let tokenIndex = 0; tokenIndex < nftBalance; tokenIndex++) { 94 | const contractObj = { 95 | ...CONTRACT_CONFIG, 96 | functionName: 'tokenOfOwnerByIndex', 97 | args: [address, tokenIndex], 98 | } 99 | 100 | contractCalls.push(contractObj) 101 | } 102 | } 103 | 104 | return contractCalls 105 | }, [CONTRACT_CONFIG, address, nftBalanceData]) 106 | 107 | // Gets all of the NFT tokenIds owned by the connected address. 108 | const { data: nftTokenIds } = useContractReads({ 109 | contracts: tokenOwnerContractsArray, 110 | enabled: tokenOwnerContractsArray.length > 0, 111 | }) 112 | 113 | // Creates the contracts array for `nftTokenUris` 114 | const tokenUriContractsArray = useMemo(() => { 115 | if (!nftTokenIds || nftTokenIds.length === 0) { 116 | return [] 117 | } 118 | 119 | const contractCalls = nftTokenIds?.map((tokenId) => { 120 | return { 121 | ...CONTRACT_CONFIG, 122 | functionName: 'tokenURI', 123 | args: tokenId ? [tokenId] : undefined, 124 | } 125 | }) 126 | 127 | return contractCalls 128 | }, [CONTRACT_CONFIG, nftTokenIds]) 129 | 130 | // Gets all of the NFT tokenUris owned by the connected address. 131 | const { data: nftTokenUris } = useContractReads({ 132 | contracts: tokenUriContractsArray, 133 | enabled: tokenUriContractsArray.length > 0, 134 | }) 135 | 136 | const { config, isFetched } = usePrepareContractWrite({ 137 | ...CONTRACT_CONFIG, 138 | functionName: 'safeMint', 139 | args: [address, nftUriRef.current], 140 | enabled: hasNftUri, 141 | }) 142 | 143 | const { data, write } = useContractWrite(config) 144 | 145 | const { isLoading } = useWaitForTransaction({ 146 | hash: data?.hash, 147 | onSuccess(data) { 148 | console.log('success data', data) 149 | setHasNftUri(false) 150 | nftUriRef.current = '' 151 | toast({ 152 | title: 'Transaction Successful', 153 | description: ( 154 | <> 155 | Successfully minted your NFT! 156 | 157 | 161 | View on Etherscan 162 | 163 | 164 | 165 | ), 166 | status: 'success', 167 | duration: 5000, 168 | isClosable: true, 169 | }) 170 | refetchNftBalanceData() 171 | }, 172 | }) 173 | 174 | const mintItem = useCallback(async () => { 175 | const fetchImage = async () => { 176 | const response = await fetch( 177 | `https://api.unsplash.com/photos/random/?client_id=${UNSPLASH_ACCESS_KEY}` 178 | ) 179 | 180 | if (!response.ok) { 181 | throw Error('Error with fetch') 182 | } 183 | 184 | const data = await response.json() 185 | return data 186 | } 187 | 188 | try { 189 | // Fetch a random photo from Unsplash 190 | const photos = await fetchImage() 191 | 192 | // Convert that photo into `tokenURI` metadata 193 | const tokenURI = generateTokenUri(photos) 194 | 195 | // Upload the `tokenURI` to IPFS 196 | const uploaded = await ipfs.add(tokenURI) 197 | 198 | // // This will trigger the useEffect to run the `write()` function. 199 | setHasNftUri(true) 200 | nftUriRef.current = `${IPFS_BASE_URL}/${uploaded.path}` 201 | } catch (error) { 202 | console.log('error', error) 203 | } 204 | }, []) 205 | 206 | useEffect(() => { 207 | if (hasNftUri && write) { 208 | write() 209 | setHasNftUri(false) 210 | } 211 | }, [hasNftUri, write]) 212 | 213 | if (!isMounted) { 214 | return null 215 | } 216 | 217 | return ( 218 | 219 | 220 | Mint NFT 221 | 222 | 223 | This page only works on the GOERLI Testnet or on a Local Chain. 224 | 225 | 226 | 227 | Contract Address: {CONTRACT_ADDRESS} 228 | 229 | 230 | 231 | 240 | 241 | 242 | {nftTokenUris && ( 243 | 244 | )} 245 | 246 | 247 | ) 248 | } 249 | 250 | export default NftIndex 251 | -------------------------------------------------------------------------------- /frontend/pages/token-gated.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Alert, 3 | AlertDescription, 4 | AlertIcon, 5 | AlertTitle, 6 | Code, 7 | Heading, 8 | Link, 9 | Text, 10 | } from '@chakra-ui/react' 11 | import type { NextPage } from 'next' 12 | import NextLink from 'next/link' 13 | import { useEffect, useState } from 'react' 14 | import { erc721ABI, useAccount, useContractRead } from 'wagmi' 15 | import { YourNFTContract as LOCAL_CONTRACT_ADDRESS } from '../artifacts/contracts/contractAddress' 16 | import { Layout } from '../components/layout/Layout' 17 | import { useCheckLocalChain } from '../hooks/useCheckLocalChain' 18 | import { useIsMounted } from '../hooks/useIsMounted' 19 | 20 | const GOERLI_CONTRACT_ADDRESS = '0x982659f8ce3988096A735044aD42445D6514ba7e' 21 | 22 | const TokenGated: NextPage = () => { 23 | const { address, isConnected } = useAccount() 24 | 25 | const { isLocalChain } = useCheckLocalChain() 26 | 27 | const { isMounted } = useIsMounted() 28 | 29 | const CONTRACT_ADDRESS = isLocalChain 30 | ? LOCAL_CONTRACT_ADDRESS 31 | : GOERLI_CONTRACT_ADDRESS 32 | 33 | const [hasNft, setHasNft] = useState(false) 34 | 35 | const { data, isError, isLoading } = useContractRead({ 36 | address: CONTRACT_ADDRESS, 37 | abi: erc721ABI, 38 | functionName: 'balanceOf', 39 | args: address ? [address] : undefined, 40 | }) 41 | 42 | useEffect(() => { 43 | if (!isLoading && data && data.toNumber) { 44 | const numberOfNfts = data.toNumber() 45 | 46 | if (numberOfNfts > 0) { 47 | setHasNft(true) 48 | return 49 | } 50 | 51 | setHasNft(false) 52 | } 53 | }, [data, isLoading]) 54 | 55 | if (!isMounted) { 56 | return null 57 | } 58 | 59 | const sharedDescription = ( 60 | <> 61 | 62 | This page will check your authenticated user's address for a 63 | particular NFT. 64 | 65 | 66 | This is checking for the{' '} 67 | 72 | CodeBushiToken (CBT) 73 | {' '} 74 | on the GOERLI Testnet. You can test this out by{' '} 75 | 76 | Minting the NFT 77 | 78 | . 79 | 80 | 81 | ) 82 | 83 | if (!isConnected) { 84 | return ( 85 | 86 | 87 | Unauthenticated 88 | 89 | {sharedDescription} 90 | Please connect a wallet 91 | 92 | ) 93 | } 94 | 95 | if (isError) { 96 | return ( 97 | 98 | 99 | Token Gated Page 100 | 101 | {sharedDescription} 102 | 103 | 104 | Error: 105 | 106 | There was an error trying to fetch your NFT. 107 | 108 | 109 | 110 | ) 111 | } 112 | 113 | if (!hasNft) { 114 | return ( 115 | 116 | 117 | Token Gated Page 118 | 119 | {sharedDescription} 120 | 121 | Authenticated as {address} 122 | 123 | 124 | 125 | Access Denied: 126 | You do not have the NFT. 127 | 128 | 129 | ) 130 | } 131 | 132 | return ( 133 | 134 | 135 | Token Gated Page 136 | 137 | {sharedDescription} 138 | 139 | Authenticated as: {address} 140 | 141 | 142 | 143 | Access Granted: 144 | You have the NFT! 145 | 146 | 147 | ) 148 | } 149 | 150 | export default TokenGated 151 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true 17 | }, 18 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 19 | "exclude": ["node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/access/Ownable.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type { 5 | BaseContract, 6 | BigNumber, 7 | BytesLike, 8 | CallOverrides, 9 | ContractTransaction, 10 | Overrides, 11 | PopulatedTransaction, 12 | Signer, 13 | utils, 14 | } from "ethers"; 15 | import type { 16 | FunctionFragment, 17 | Result, 18 | EventFragment, 19 | } from "@ethersproject/abi"; 20 | import type { Listener, Provider } from "@ethersproject/providers"; 21 | import type { 22 | TypedEventFilter, 23 | TypedEvent, 24 | TypedListener, 25 | OnEvent, 26 | PromiseOrValue, 27 | } from "../../../common"; 28 | 29 | export interface OwnableInterface extends utils.Interface { 30 | functions: { 31 | "owner()": FunctionFragment; 32 | "renounceOwnership()": FunctionFragment; 33 | "transferOwnership(address)": FunctionFragment; 34 | }; 35 | 36 | getFunction( 37 | nameOrSignatureOrTopic: "owner" | "renounceOwnership" | "transferOwnership" 38 | ): FunctionFragment; 39 | 40 | encodeFunctionData(functionFragment: "owner", values?: undefined): string; 41 | encodeFunctionData( 42 | functionFragment: "renounceOwnership", 43 | values?: undefined 44 | ): string; 45 | encodeFunctionData( 46 | functionFragment: "transferOwnership", 47 | values: [PromiseOrValue] 48 | ): string; 49 | 50 | decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; 51 | decodeFunctionResult( 52 | functionFragment: "renounceOwnership", 53 | data: BytesLike 54 | ): Result; 55 | decodeFunctionResult( 56 | functionFragment: "transferOwnership", 57 | data: BytesLike 58 | ): Result; 59 | 60 | events: { 61 | "OwnershipTransferred(address,address)": EventFragment; 62 | }; 63 | 64 | getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; 65 | } 66 | 67 | export interface OwnershipTransferredEventObject { 68 | previousOwner: string; 69 | newOwner: string; 70 | } 71 | export type OwnershipTransferredEvent = TypedEvent< 72 | [string, string], 73 | OwnershipTransferredEventObject 74 | >; 75 | 76 | export type OwnershipTransferredEventFilter = 77 | TypedEventFilter; 78 | 79 | export interface Ownable extends BaseContract { 80 | connect(signerOrProvider: Signer | Provider | string): this; 81 | attach(addressOrName: string): this; 82 | deployed(): Promise; 83 | 84 | interface: OwnableInterface; 85 | 86 | queryFilter( 87 | event: TypedEventFilter, 88 | fromBlockOrBlockhash?: string | number | undefined, 89 | toBlock?: string | number | undefined 90 | ): Promise>; 91 | 92 | listeners( 93 | eventFilter?: TypedEventFilter 94 | ): Array>; 95 | listeners(eventName?: string): Array; 96 | removeAllListeners( 97 | eventFilter: TypedEventFilter 98 | ): this; 99 | removeAllListeners(eventName?: string): this; 100 | off: OnEvent; 101 | on: OnEvent; 102 | once: OnEvent; 103 | removeListener: OnEvent; 104 | 105 | functions: { 106 | owner(overrides?: CallOverrides): Promise<[string]>; 107 | 108 | renounceOwnership( 109 | overrides?: Overrides & { from?: PromiseOrValue } 110 | ): Promise; 111 | 112 | transferOwnership( 113 | newOwner: PromiseOrValue, 114 | overrides?: Overrides & { from?: PromiseOrValue } 115 | ): Promise; 116 | }; 117 | 118 | owner(overrides?: CallOverrides): Promise; 119 | 120 | renounceOwnership( 121 | overrides?: Overrides & { from?: PromiseOrValue } 122 | ): Promise; 123 | 124 | transferOwnership( 125 | newOwner: PromiseOrValue, 126 | overrides?: Overrides & { from?: PromiseOrValue } 127 | ): Promise; 128 | 129 | callStatic: { 130 | owner(overrides?: CallOverrides): Promise; 131 | 132 | renounceOwnership(overrides?: CallOverrides): Promise; 133 | 134 | transferOwnership( 135 | newOwner: PromiseOrValue, 136 | overrides?: CallOverrides 137 | ): Promise; 138 | }; 139 | 140 | filters: { 141 | "OwnershipTransferred(address,address)"( 142 | previousOwner?: PromiseOrValue | null, 143 | newOwner?: PromiseOrValue | null 144 | ): OwnershipTransferredEventFilter; 145 | OwnershipTransferred( 146 | previousOwner?: PromiseOrValue | null, 147 | newOwner?: PromiseOrValue | null 148 | ): OwnershipTransferredEventFilter; 149 | }; 150 | 151 | estimateGas: { 152 | owner(overrides?: CallOverrides): Promise; 153 | 154 | renounceOwnership( 155 | overrides?: Overrides & { from?: PromiseOrValue } 156 | ): Promise; 157 | 158 | transferOwnership( 159 | newOwner: PromiseOrValue, 160 | overrides?: Overrides & { from?: PromiseOrValue } 161 | ): Promise; 162 | }; 163 | 164 | populateTransaction: { 165 | owner(overrides?: CallOverrides): Promise; 166 | 167 | renounceOwnership( 168 | overrides?: Overrides & { from?: PromiseOrValue } 169 | ): Promise; 170 | 171 | transferOwnership( 172 | newOwner: PromiseOrValue, 173 | overrides?: Overrides & { from?: PromiseOrValue } 174 | ): Promise; 175 | }; 176 | } 177 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/access/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export type { Ownable } from "./Ownable"; 5 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type * as access from "./access"; 5 | export type { access }; 6 | import type * as token from "./token"; 7 | export type { token }; 8 | import type * as utils from "./utils"; 9 | export type { utils }; 10 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/token/ERC721/IERC721Receiver.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type { 5 | BaseContract, 6 | BigNumber, 7 | BigNumberish, 8 | BytesLike, 9 | CallOverrides, 10 | ContractTransaction, 11 | Overrides, 12 | PopulatedTransaction, 13 | Signer, 14 | utils, 15 | } from "ethers"; 16 | import type { FunctionFragment, Result } from "@ethersproject/abi"; 17 | import type { Listener, Provider } from "@ethersproject/providers"; 18 | import type { 19 | TypedEventFilter, 20 | TypedEvent, 21 | TypedListener, 22 | OnEvent, 23 | PromiseOrValue, 24 | } from "../../../../common"; 25 | 26 | export interface IERC721ReceiverInterface extends utils.Interface { 27 | functions: { 28 | "onERC721Received(address,address,uint256,bytes)": FunctionFragment; 29 | }; 30 | 31 | getFunction(nameOrSignatureOrTopic: "onERC721Received"): FunctionFragment; 32 | 33 | encodeFunctionData( 34 | functionFragment: "onERC721Received", 35 | values: [ 36 | PromiseOrValue, 37 | PromiseOrValue, 38 | PromiseOrValue, 39 | PromiseOrValue 40 | ] 41 | ): string; 42 | 43 | decodeFunctionResult( 44 | functionFragment: "onERC721Received", 45 | data: BytesLike 46 | ): Result; 47 | 48 | events: {}; 49 | } 50 | 51 | export interface IERC721Receiver extends BaseContract { 52 | connect(signerOrProvider: Signer | Provider | string): this; 53 | attach(addressOrName: string): this; 54 | deployed(): Promise; 55 | 56 | interface: IERC721ReceiverInterface; 57 | 58 | queryFilter( 59 | event: TypedEventFilter, 60 | fromBlockOrBlockhash?: string | number | undefined, 61 | toBlock?: string | number | undefined 62 | ): Promise>; 63 | 64 | listeners( 65 | eventFilter?: TypedEventFilter 66 | ): Array>; 67 | listeners(eventName?: string): Array; 68 | removeAllListeners( 69 | eventFilter: TypedEventFilter 70 | ): this; 71 | removeAllListeners(eventName?: string): this; 72 | off: OnEvent; 73 | on: OnEvent; 74 | once: OnEvent; 75 | removeListener: OnEvent; 76 | 77 | functions: { 78 | onERC721Received( 79 | operator: PromiseOrValue, 80 | from: PromiseOrValue, 81 | tokenId: PromiseOrValue, 82 | data: PromiseOrValue, 83 | overrides?: Overrides & { from?: PromiseOrValue } 84 | ): Promise; 85 | }; 86 | 87 | onERC721Received( 88 | operator: PromiseOrValue, 89 | from: PromiseOrValue, 90 | tokenId: PromiseOrValue, 91 | data: PromiseOrValue, 92 | overrides?: Overrides & { from?: PromiseOrValue } 93 | ): Promise; 94 | 95 | callStatic: { 96 | onERC721Received( 97 | operator: PromiseOrValue, 98 | from: PromiseOrValue, 99 | tokenId: PromiseOrValue, 100 | data: PromiseOrValue, 101 | overrides?: CallOverrides 102 | ): Promise; 103 | }; 104 | 105 | filters: {}; 106 | 107 | estimateGas: { 108 | onERC721Received( 109 | operator: PromiseOrValue, 110 | from: PromiseOrValue, 111 | tokenId: PromiseOrValue, 112 | data: PromiseOrValue, 113 | overrides?: Overrides & { from?: PromiseOrValue } 114 | ): Promise; 115 | }; 116 | 117 | populateTransaction: { 118 | onERC721Received( 119 | operator: PromiseOrValue, 120 | from: PromiseOrValue, 121 | tokenId: PromiseOrValue, 122 | data: PromiseOrValue, 123 | overrides?: Overrides & { from?: PromiseOrValue } 124 | ): Promise; 125 | }; 126 | } 127 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/token/ERC721/extensions/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export type { ERC721Burnable } from "./ERC721Burnable"; 5 | export type { ERC721Enumerable } from "./ERC721Enumerable"; 6 | export type { ERC721URIStorage } from "./ERC721URIStorage"; 7 | export type { IERC721Enumerable } from "./IERC721Enumerable"; 8 | export type { IERC721Metadata } from "./IERC721Metadata"; 9 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/token/ERC721/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type * as extensions from "./extensions"; 5 | export type { extensions }; 6 | export type { ERC721 } from "./ERC721"; 7 | export type { IERC721 } from "./IERC721"; 8 | export type { IERC721Receiver } from "./IERC721Receiver"; 9 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/token/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type * as erc721 from "./ERC721"; 5 | export type { erc721 }; 6 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/utils/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type * as introspection from "./introspection"; 5 | export type { introspection }; 6 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/utils/introspection/ERC165.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type { 5 | BaseContract, 6 | BigNumber, 7 | BytesLike, 8 | CallOverrides, 9 | PopulatedTransaction, 10 | Signer, 11 | utils, 12 | } from "ethers"; 13 | import type { FunctionFragment, Result } from "@ethersproject/abi"; 14 | import type { Listener, Provider } from "@ethersproject/providers"; 15 | import type { 16 | TypedEventFilter, 17 | TypedEvent, 18 | TypedListener, 19 | OnEvent, 20 | PromiseOrValue, 21 | } from "../../../../common"; 22 | 23 | export interface ERC165Interface extends utils.Interface { 24 | functions: { 25 | "supportsInterface(bytes4)": FunctionFragment; 26 | }; 27 | 28 | getFunction(nameOrSignatureOrTopic: "supportsInterface"): FunctionFragment; 29 | 30 | encodeFunctionData( 31 | functionFragment: "supportsInterface", 32 | values: [PromiseOrValue] 33 | ): string; 34 | 35 | decodeFunctionResult( 36 | functionFragment: "supportsInterface", 37 | data: BytesLike 38 | ): Result; 39 | 40 | events: {}; 41 | } 42 | 43 | export interface ERC165 extends BaseContract { 44 | connect(signerOrProvider: Signer | Provider | string): this; 45 | attach(addressOrName: string): this; 46 | deployed(): Promise; 47 | 48 | interface: ERC165Interface; 49 | 50 | queryFilter( 51 | event: TypedEventFilter, 52 | fromBlockOrBlockhash?: string | number | undefined, 53 | toBlock?: string | number | undefined 54 | ): Promise>; 55 | 56 | listeners( 57 | eventFilter?: TypedEventFilter 58 | ): Array>; 59 | listeners(eventName?: string): Array; 60 | removeAllListeners( 61 | eventFilter: TypedEventFilter 62 | ): this; 63 | removeAllListeners(eventName?: string): this; 64 | off: OnEvent; 65 | on: OnEvent; 66 | once: OnEvent; 67 | removeListener: OnEvent; 68 | 69 | functions: { 70 | supportsInterface( 71 | interfaceId: PromiseOrValue, 72 | overrides?: CallOverrides 73 | ): Promise<[boolean]>; 74 | }; 75 | 76 | supportsInterface( 77 | interfaceId: PromiseOrValue, 78 | overrides?: CallOverrides 79 | ): Promise; 80 | 81 | callStatic: { 82 | supportsInterface( 83 | interfaceId: PromiseOrValue, 84 | overrides?: CallOverrides 85 | ): Promise; 86 | }; 87 | 88 | filters: {}; 89 | 90 | estimateGas: { 91 | supportsInterface( 92 | interfaceId: PromiseOrValue, 93 | overrides?: CallOverrides 94 | ): Promise; 95 | }; 96 | 97 | populateTransaction: { 98 | supportsInterface( 99 | interfaceId: PromiseOrValue, 100 | overrides?: CallOverrides 101 | ): Promise; 102 | }; 103 | } 104 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/utils/introspection/IERC165.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type { 5 | BaseContract, 6 | BigNumber, 7 | BytesLike, 8 | CallOverrides, 9 | PopulatedTransaction, 10 | Signer, 11 | utils, 12 | } from "ethers"; 13 | import type { FunctionFragment, Result } from "@ethersproject/abi"; 14 | import type { Listener, Provider } from "@ethersproject/providers"; 15 | import type { 16 | TypedEventFilter, 17 | TypedEvent, 18 | TypedListener, 19 | OnEvent, 20 | PromiseOrValue, 21 | } from "../../../../common"; 22 | 23 | export interface IERC165Interface extends utils.Interface { 24 | functions: { 25 | "supportsInterface(bytes4)": FunctionFragment; 26 | }; 27 | 28 | getFunction(nameOrSignatureOrTopic: "supportsInterface"): FunctionFragment; 29 | 30 | encodeFunctionData( 31 | functionFragment: "supportsInterface", 32 | values: [PromiseOrValue] 33 | ): string; 34 | 35 | decodeFunctionResult( 36 | functionFragment: "supportsInterface", 37 | data: BytesLike 38 | ): Result; 39 | 40 | events: {}; 41 | } 42 | 43 | export interface IERC165 extends BaseContract { 44 | connect(signerOrProvider: Signer | Provider | string): this; 45 | attach(addressOrName: string): this; 46 | deployed(): Promise; 47 | 48 | interface: IERC165Interface; 49 | 50 | queryFilter( 51 | event: TypedEventFilter, 52 | fromBlockOrBlockhash?: string | number | undefined, 53 | toBlock?: string | number | undefined 54 | ): Promise>; 55 | 56 | listeners( 57 | eventFilter?: TypedEventFilter 58 | ): Array>; 59 | listeners(eventName?: string): Array; 60 | removeAllListeners( 61 | eventFilter: TypedEventFilter 62 | ): this; 63 | removeAllListeners(eventName?: string): this; 64 | off: OnEvent; 65 | on: OnEvent; 66 | once: OnEvent; 67 | removeListener: OnEvent; 68 | 69 | functions: { 70 | supportsInterface( 71 | interfaceId: PromiseOrValue, 72 | overrides?: CallOverrides 73 | ): Promise<[boolean]>; 74 | }; 75 | 76 | supportsInterface( 77 | interfaceId: PromiseOrValue, 78 | overrides?: CallOverrides 79 | ): Promise; 80 | 81 | callStatic: { 82 | supportsInterface( 83 | interfaceId: PromiseOrValue, 84 | overrides?: CallOverrides 85 | ): Promise; 86 | }; 87 | 88 | filters: {}; 89 | 90 | estimateGas: { 91 | supportsInterface( 92 | interfaceId: PromiseOrValue, 93 | overrides?: CallOverrides 94 | ): Promise; 95 | }; 96 | 97 | populateTransaction: { 98 | supportsInterface( 99 | interfaceId: PromiseOrValue, 100 | overrides?: CallOverrides 101 | ): Promise; 102 | }; 103 | } 104 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/contracts/utils/introspection/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export type { ERC165 } from "./ERC165"; 5 | export type { IERC165 } from "./IERC165"; 6 | -------------------------------------------------------------------------------- /frontend/types/typechain/@openzeppelin/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type * as contracts from "./contracts"; 5 | export type { contracts }; 6 | -------------------------------------------------------------------------------- /frontend/types/typechain/common.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type { Listener } from "@ethersproject/providers"; 5 | import type { Event, EventFilter } from "ethers"; 6 | 7 | export interface TypedEvent< 8 | TArgsArray extends Array = any, 9 | TArgsObject = any 10 | > extends Event { 11 | args: TArgsArray & TArgsObject; 12 | } 13 | 14 | export interface TypedEventFilter<_TEvent extends TypedEvent> 15 | extends EventFilter {} 16 | 17 | export interface TypedListener { 18 | (...listenerArg: [...__TypechainArgsArray, TEvent]): void; 19 | } 20 | 21 | type __TypechainArgsArray = T extends TypedEvent ? U : never; 22 | 23 | export interface OnEvent { 24 | ( 25 | eventFilter: TypedEventFilter, 26 | listener: TypedListener 27 | ): TRes; 28 | (eventName: string, listener: Listener): TRes; 29 | } 30 | 31 | export type MinEthersFactory = { 32 | deploy(...a: ARGS[]): Promise; 33 | }; 34 | 35 | export type GetContractTypeFromFactory = F extends MinEthersFactory< 36 | infer C, 37 | any 38 | > 39 | ? C 40 | : never; 41 | 42 | export type GetARGsTypeFromFactory = F extends MinEthersFactory 43 | ? Parameters 44 | : never; 45 | 46 | export type PromiseOrValue = T | Promise; 47 | -------------------------------------------------------------------------------- /frontend/types/typechain/contracts/YourContract.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type { 5 | BaseContract, 6 | BigNumber, 7 | BytesLike, 8 | CallOverrides, 9 | ContractTransaction, 10 | Overrides, 11 | PopulatedTransaction, 12 | Signer, 13 | utils, 14 | } from "ethers"; 15 | import type { 16 | FunctionFragment, 17 | Result, 18 | EventFragment, 19 | } from "@ethersproject/abi"; 20 | import type { Listener, Provider } from "@ethersproject/providers"; 21 | import type { 22 | TypedEventFilter, 23 | TypedEvent, 24 | TypedListener, 25 | OnEvent, 26 | PromiseOrValue, 27 | } from "../common"; 28 | 29 | export interface YourContractInterface extends utils.Interface { 30 | functions: { 31 | "greeting()": FunctionFragment; 32 | "setGreeting(string)": FunctionFragment; 33 | }; 34 | 35 | getFunction( 36 | nameOrSignatureOrTopic: "greeting" | "setGreeting" 37 | ): FunctionFragment; 38 | 39 | encodeFunctionData(functionFragment: "greeting", values?: undefined): string; 40 | encodeFunctionData( 41 | functionFragment: "setGreeting", 42 | values: [PromiseOrValue] 43 | ): string; 44 | 45 | decodeFunctionResult(functionFragment: "greeting", data: BytesLike): Result; 46 | decodeFunctionResult( 47 | functionFragment: "setGreeting", 48 | data: BytesLike 49 | ): Result; 50 | 51 | events: { 52 | "SetGreeting(address,string)": EventFragment; 53 | }; 54 | 55 | getEvent(nameOrSignatureOrTopic: "SetGreeting"): EventFragment; 56 | } 57 | 58 | export interface SetGreetingEventObject { 59 | sender: string; 60 | greeting: string; 61 | } 62 | export type SetGreetingEvent = TypedEvent< 63 | [string, string], 64 | SetGreetingEventObject 65 | >; 66 | 67 | export type SetGreetingEventFilter = TypedEventFilter; 68 | 69 | export interface YourContract extends BaseContract { 70 | connect(signerOrProvider: Signer | Provider | string): this; 71 | attach(addressOrName: string): this; 72 | deployed(): Promise; 73 | 74 | interface: YourContractInterface; 75 | 76 | queryFilter( 77 | event: TypedEventFilter, 78 | fromBlockOrBlockhash?: string | number | undefined, 79 | toBlock?: string | number | undefined 80 | ): Promise>; 81 | 82 | listeners( 83 | eventFilter?: TypedEventFilter 84 | ): Array>; 85 | listeners(eventName?: string): Array; 86 | removeAllListeners( 87 | eventFilter: TypedEventFilter 88 | ): this; 89 | removeAllListeners(eventName?: string): this; 90 | off: OnEvent; 91 | on: OnEvent; 92 | once: OnEvent; 93 | removeListener: OnEvent; 94 | 95 | functions: { 96 | greeting(overrides?: CallOverrides): Promise<[string]>; 97 | 98 | setGreeting( 99 | newGreeting: PromiseOrValue, 100 | overrides?: Overrides & { from?: PromiseOrValue } 101 | ): Promise; 102 | }; 103 | 104 | greeting(overrides?: CallOverrides): Promise; 105 | 106 | setGreeting( 107 | newGreeting: PromiseOrValue, 108 | overrides?: Overrides & { from?: PromiseOrValue } 109 | ): Promise; 110 | 111 | callStatic: { 112 | greeting(overrides?: CallOverrides): Promise; 113 | 114 | setGreeting( 115 | newGreeting: PromiseOrValue, 116 | overrides?: CallOverrides 117 | ): Promise; 118 | }; 119 | 120 | filters: { 121 | "SetGreeting(address,string)"( 122 | sender?: null, 123 | greeting?: null 124 | ): SetGreetingEventFilter; 125 | SetGreeting(sender?: null, greeting?: null): SetGreetingEventFilter; 126 | }; 127 | 128 | estimateGas: { 129 | greeting(overrides?: CallOverrides): Promise; 130 | 131 | setGreeting( 132 | newGreeting: PromiseOrValue, 133 | overrides?: Overrides & { from?: PromiseOrValue } 134 | ): Promise; 135 | }; 136 | 137 | populateTransaction: { 138 | greeting(overrides?: CallOverrides): Promise; 139 | 140 | setGreeting( 141 | newGreeting: PromiseOrValue, 142 | overrides?: Overrides & { from?: PromiseOrValue } 143 | ): Promise; 144 | }; 145 | } 146 | -------------------------------------------------------------------------------- /frontend/types/typechain/contracts/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export type { YourContract } from "./YourContract"; 5 | export type { YourNFT } from "./YourNFT"; 6 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/access/Ownable__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | Ownable, 9 | OwnableInterface, 10 | } from "../../../../@openzeppelin/contracts/access/Ownable"; 11 | 12 | const _abi = [ 13 | { 14 | anonymous: false, 15 | inputs: [ 16 | { 17 | indexed: true, 18 | internalType: "address", 19 | name: "previousOwner", 20 | type: "address", 21 | }, 22 | { 23 | indexed: true, 24 | internalType: "address", 25 | name: "newOwner", 26 | type: "address", 27 | }, 28 | ], 29 | name: "OwnershipTransferred", 30 | type: "event", 31 | }, 32 | { 33 | inputs: [], 34 | name: "owner", 35 | outputs: [ 36 | { 37 | internalType: "address", 38 | name: "", 39 | type: "address", 40 | }, 41 | ], 42 | stateMutability: "view", 43 | type: "function", 44 | }, 45 | { 46 | inputs: [], 47 | name: "renounceOwnership", 48 | outputs: [], 49 | stateMutability: "nonpayable", 50 | type: "function", 51 | }, 52 | { 53 | inputs: [ 54 | { 55 | internalType: "address", 56 | name: "newOwner", 57 | type: "address", 58 | }, 59 | ], 60 | name: "transferOwnership", 61 | outputs: [], 62 | stateMutability: "nonpayable", 63 | type: "function", 64 | }, 65 | ]; 66 | 67 | export class Ownable__factory { 68 | static readonly abi = _abi; 69 | static createInterface(): OwnableInterface { 70 | return new utils.Interface(_abi) as OwnableInterface; 71 | } 72 | static connect( 73 | address: string, 74 | signerOrProvider: Signer | Provider 75 | ): Ownable { 76 | return new Contract(address, _abi, signerOrProvider) as Ownable; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/access/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export { Ownable__factory } from "./Ownable__factory"; 5 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export * as access from "./access"; 5 | export * as token from "./token"; 6 | export * as utils from "./utils"; 7 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/ERC721/IERC721Receiver__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | IERC721Receiver, 9 | IERC721ReceiverInterface, 10 | } from "../../../../../@openzeppelin/contracts/token/ERC721/IERC721Receiver"; 11 | 12 | const _abi = [ 13 | { 14 | inputs: [ 15 | { 16 | internalType: "address", 17 | name: "operator", 18 | type: "address", 19 | }, 20 | { 21 | internalType: "address", 22 | name: "from", 23 | type: "address", 24 | }, 25 | { 26 | internalType: "uint256", 27 | name: "tokenId", 28 | type: "uint256", 29 | }, 30 | { 31 | internalType: "bytes", 32 | name: "data", 33 | type: "bytes", 34 | }, 35 | ], 36 | name: "onERC721Received", 37 | outputs: [ 38 | { 39 | internalType: "bytes4", 40 | name: "", 41 | type: "bytes4", 42 | }, 43 | ], 44 | stateMutability: "nonpayable", 45 | type: "function", 46 | }, 47 | ]; 48 | 49 | export class IERC721Receiver__factory { 50 | static readonly abi = _abi; 51 | static createInterface(): IERC721ReceiverInterface { 52 | return new utils.Interface(_abi) as IERC721ReceiverInterface; 53 | } 54 | static connect( 55 | address: string, 56 | signerOrProvider: Signer | Provider 57 | ): IERC721Receiver { 58 | return new Contract(address, _abi, signerOrProvider) as IERC721Receiver; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/ERC721/IERC721__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | IERC721, 9 | IERC721Interface, 10 | } from "../../../../../@openzeppelin/contracts/token/ERC721/IERC721"; 11 | 12 | const _abi = [ 13 | { 14 | anonymous: false, 15 | inputs: [ 16 | { 17 | indexed: true, 18 | internalType: "address", 19 | name: "owner", 20 | type: "address", 21 | }, 22 | { 23 | indexed: true, 24 | internalType: "address", 25 | name: "approved", 26 | type: "address", 27 | }, 28 | { 29 | indexed: true, 30 | internalType: "uint256", 31 | name: "tokenId", 32 | type: "uint256", 33 | }, 34 | ], 35 | name: "Approval", 36 | type: "event", 37 | }, 38 | { 39 | anonymous: false, 40 | inputs: [ 41 | { 42 | indexed: true, 43 | internalType: "address", 44 | name: "owner", 45 | type: "address", 46 | }, 47 | { 48 | indexed: true, 49 | internalType: "address", 50 | name: "operator", 51 | type: "address", 52 | }, 53 | { 54 | indexed: false, 55 | internalType: "bool", 56 | name: "approved", 57 | type: "bool", 58 | }, 59 | ], 60 | name: "ApprovalForAll", 61 | type: "event", 62 | }, 63 | { 64 | anonymous: false, 65 | inputs: [ 66 | { 67 | indexed: true, 68 | internalType: "address", 69 | name: "from", 70 | type: "address", 71 | }, 72 | { 73 | indexed: true, 74 | internalType: "address", 75 | name: "to", 76 | type: "address", 77 | }, 78 | { 79 | indexed: true, 80 | internalType: "uint256", 81 | name: "tokenId", 82 | type: "uint256", 83 | }, 84 | ], 85 | name: "Transfer", 86 | type: "event", 87 | }, 88 | { 89 | inputs: [ 90 | { 91 | internalType: "address", 92 | name: "to", 93 | type: "address", 94 | }, 95 | { 96 | internalType: "uint256", 97 | name: "tokenId", 98 | type: "uint256", 99 | }, 100 | ], 101 | name: "approve", 102 | outputs: [], 103 | stateMutability: "nonpayable", 104 | type: "function", 105 | }, 106 | { 107 | inputs: [ 108 | { 109 | internalType: "address", 110 | name: "owner", 111 | type: "address", 112 | }, 113 | ], 114 | name: "balanceOf", 115 | outputs: [ 116 | { 117 | internalType: "uint256", 118 | name: "balance", 119 | type: "uint256", 120 | }, 121 | ], 122 | stateMutability: "view", 123 | type: "function", 124 | }, 125 | { 126 | inputs: [ 127 | { 128 | internalType: "uint256", 129 | name: "tokenId", 130 | type: "uint256", 131 | }, 132 | ], 133 | name: "getApproved", 134 | outputs: [ 135 | { 136 | internalType: "address", 137 | name: "operator", 138 | type: "address", 139 | }, 140 | ], 141 | stateMutability: "view", 142 | type: "function", 143 | }, 144 | { 145 | inputs: [ 146 | { 147 | internalType: "address", 148 | name: "owner", 149 | type: "address", 150 | }, 151 | { 152 | internalType: "address", 153 | name: "operator", 154 | type: "address", 155 | }, 156 | ], 157 | name: "isApprovedForAll", 158 | outputs: [ 159 | { 160 | internalType: "bool", 161 | name: "", 162 | type: "bool", 163 | }, 164 | ], 165 | stateMutability: "view", 166 | type: "function", 167 | }, 168 | { 169 | inputs: [ 170 | { 171 | internalType: "uint256", 172 | name: "tokenId", 173 | type: "uint256", 174 | }, 175 | ], 176 | name: "ownerOf", 177 | outputs: [ 178 | { 179 | internalType: "address", 180 | name: "owner", 181 | type: "address", 182 | }, 183 | ], 184 | stateMutability: "view", 185 | type: "function", 186 | }, 187 | { 188 | inputs: [ 189 | { 190 | internalType: "address", 191 | name: "from", 192 | type: "address", 193 | }, 194 | { 195 | internalType: "address", 196 | name: "to", 197 | type: "address", 198 | }, 199 | { 200 | internalType: "uint256", 201 | name: "tokenId", 202 | type: "uint256", 203 | }, 204 | ], 205 | name: "safeTransferFrom", 206 | outputs: [], 207 | stateMutability: "nonpayable", 208 | type: "function", 209 | }, 210 | { 211 | inputs: [ 212 | { 213 | internalType: "address", 214 | name: "from", 215 | type: "address", 216 | }, 217 | { 218 | internalType: "address", 219 | name: "to", 220 | type: "address", 221 | }, 222 | { 223 | internalType: "uint256", 224 | name: "tokenId", 225 | type: "uint256", 226 | }, 227 | { 228 | internalType: "bytes", 229 | name: "data", 230 | type: "bytes", 231 | }, 232 | ], 233 | name: "safeTransferFrom", 234 | outputs: [], 235 | stateMutability: "nonpayable", 236 | type: "function", 237 | }, 238 | { 239 | inputs: [ 240 | { 241 | internalType: "address", 242 | name: "operator", 243 | type: "address", 244 | }, 245 | { 246 | internalType: "bool", 247 | name: "_approved", 248 | type: "bool", 249 | }, 250 | ], 251 | name: "setApprovalForAll", 252 | outputs: [], 253 | stateMutability: "nonpayable", 254 | type: "function", 255 | }, 256 | { 257 | inputs: [ 258 | { 259 | internalType: "bytes4", 260 | name: "interfaceId", 261 | type: "bytes4", 262 | }, 263 | ], 264 | name: "supportsInterface", 265 | outputs: [ 266 | { 267 | internalType: "bool", 268 | name: "", 269 | type: "bool", 270 | }, 271 | ], 272 | stateMutability: "view", 273 | type: "function", 274 | }, 275 | { 276 | inputs: [ 277 | { 278 | internalType: "address", 279 | name: "from", 280 | type: "address", 281 | }, 282 | { 283 | internalType: "address", 284 | name: "to", 285 | type: "address", 286 | }, 287 | { 288 | internalType: "uint256", 289 | name: "tokenId", 290 | type: "uint256", 291 | }, 292 | ], 293 | name: "transferFrom", 294 | outputs: [], 295 | stateMutability: "nonpayable", 296 | type: "function", 297 | }, 298 | ]; 299 | 300 | export class IERC721__factory { 301 | static readonly abi = _abi; 302 | static createInterface(): IERC721Interface { 303 | return new utils.Interface(_abi) as IERC721Interface; 304 | } 305 | static connect( 306 | address: string, 307 | signerOrProvider: Signer | Provider 308 | ): IERC721 { 309 | return new Contract(address, _abi, signerOrProvider) as IERC721; 310 | } 311 | } 312 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | ERC721Burnable, 9 | ERC721BurnableInterface, 10 | } from "../../../../../../@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable"; 11 | 12 | const _abi = [ 13 | { 14 | anonymous: false, 15 | inputs: [ 16 | { 17 | indexed: true, 18 | internalType: "address", 19 | name: "owner", 20 | type: "address", 21 | }, 22 | { 23 | indexed: true, 24 | internalType: "address", 25 | name: "approved", 26 | type: "address", 27 | }, 28 | { 29 | indexed: true, 30 | internalType: "uint256", 31 | name: "tokenId", 32 | type: "uint256", 33 | }, 34 | ], 35 | name: "Approval", 36 | type: "event", 37 | }, 38 | { 39 | anonymous: false, 40 | inputs: [ 41 | { 42 | indexed: true, 43 | internalType: "address", 44 | name: "owner", 45 | type: "address", 46 | }, 47 | { 48 | indexed: true, 49 | internalType: "address", 50 | name: "operator", 51 | type: "address", 52 | }, 53 | { 54 | indexed: false, 55 | internalType: "bool", 56 | name: "approved", 57 | type: "bool", 58 | }, 59 | ], 60 | name: "ApprovalForAll", 61 | type: "event", 62 | }, 63 | { 64 | anonymous: false, 65 | inputs: [ 66 | { 67 | indexed: true, 68 | internalType: "address", 69 | name: "from", 70 | type: "address", 71 | }, 72 | { 73 | indexed: true, 74 | internalType: "address", 75 | name: "to", 76 | type: "address", 77 | }, 78 | { 79 | indexed: true, 80 | internalType: "uint256", 81 | name: "tokenId", 82 | type: "uint256", 83 | }, 84 | ], 85 | name: "Transfer", 86 | type: "event", 87 | }, 88 | { 89 | inputs: [ 90 | { 91 | internalType: "address", 92 | name: "to", 93 | type: "address", 94 | }, 95 | { 96 | internalType: "uint256", 97 | name: "tokenId", 98 | type: "uint256", 99 | }, 100 | ], 101 | name: "approve", 102 | outputs: [], 103 | stateMutability: "nonpayable", 104 | type: "function", 105 | }, 106 | { 107 | inputs: [ 108 | { 109 | internalType: "address", 110 | name: "owner", 111 | type: "address", 112 | }, 113 | ], 114 | name: "balanceOf", 115 | outputs: [ 116 | { 117 | internalType: "uint256", 118 | name: "", 119 | type: "uint256", 120 | }, 121 | ], 122 | stateMutability: "view", 123 | type: "function", 124 | }, 125 | { 126 | inputs: [ 127 | { 128 | internalType: "uint256", 129 | name: "tokenId", 130 | type: "uint256", 131 | }, 132 | ], 133 | name: "burn", 134 | outputs: [], 135 | stateMutability: "nonpayable", 136 | type: "function", 137 | }, 138 | { 139 | inputs: [ 140 | { 141 | internalType: "uint256", 142 | name: "tokenId", 143 | type: "uint256", 144 | }, 145 | ], 146 | name: "getApproved", 147 | outputs: [ 148 | { 149 | internalType: "address", 150 | name: "", 151 | type: "address", 152 | }, 153 | ], 154 | stateMutability: "view", 155 | type: "function", 156 | }, 157 | { 158 | inputs: [ 159 | { 160 | internalType: "address", 161 | name: "owner", 162 | type: "address", 163 | }, 164 | { 165 | internalType: "address", 166 | name: "operator", 167 | type: "address", 168 | }, 169 | ], 170 | name: "isApprovedForAll", 171 | outputs: [ 172 | { 173 | internalType: "bool", 174 | name: "", 175 | type: "bool", 176 | }, 177 | ], 178 | stateMutability: "view", 179 | type: "function", 180 | }, 181 | { 182 | inputs: [], 183 | name: "name", 184 | outputs: [ 185 | { 186 | internalType: "string", 187 | name: "", 188 | type: "string", 189 | }, 190 | ], 191 | stateMutability: "view", 192 | type: "function", 193 | }, 194 | { 195 | inputs: [ 196 | { 197 | internalType: "uint256", 198 | name: "tokenId", 199 | type: "uint256", 200 | }, 201 | ], 202 | name: "ownerOf", 203 | outputs: [ 204 | { 205 | internalType: "address", 206 | name: "", 207 | type: "address", 208 | }, 209 | ], 210 | stateMutability: "view", 211 | type: "function", 212 | }, 213 | { 214 | inputs: [ 215 | { 216 | internalType: "address", 217 | name: "from", 218 | type: "address", 219 | }, 220 | { 221 | internalType: "address", 222 | name: "to", 223 | type: "address", 224 | }, 225 | { 226 | internalType: "uint256", 227 | name: "tokenId", 228 | type: "uint256", 229 | }, 230 | ], 231 | name: "safeTransferFrom", 232 | outputs: [], 233 | stateMutability: "nonpayable", 234 | type: "function", 235 | }, 236 | { 237 | inputs: [ 238 | { 239 | internalType: "address", 240 | name: "from", 241 | type: "address", 242 | }, 243 | { 244 | internalType: "address", 245 | name: "to", 246 | type: "address", 247 | }, 248 | { 249 | internalType: "uint256", 250 | name: "tokenId", 251 | type: "uint256", 252 | }, 253 | { 254 | internalType: "bytes", 255 | name: "data", 256 | type: "bytes", 257 | }, 258 | ], 259 | name: "safeTransferFrom", 260 | outputs: [], 261 | stateMutability: "nonpayable", 262 | type: "function", 263 | }, 264 | { 265 | inputs: [ 266 | { 267 | internalType: "address", 268 | name: "operator", 269 | type: "address", 270 | }, 271 | { 272 | internalType: "bool", 273 | name: "approved", 274 | type: "bool", 275 | }, 276 | ], 277 | name: "setApprovalForAll", 278 | outputs: [], 279 | stateMutability: "nonpayable", 280 | type: "function", 281 | }, 282 | { 283 | inputs: [ 284 | { 285 | internalType: "bytes4", 286 | name: "interfaceId", 287 | type: "bytes4", 288 | }, 289 | ], 290 | name: "supportsInterface", 291 | outputs: [ 292 | { 293 | internalType: "bool", 294 | name: "", 295 | type: "bool", 296 | }, 297 | ], 298 | stateMutability: "view", 299 | type: "function", 300 | }, 301 | { 302 | inputs: [], 303 | name: "symbol", 304 | outputs: [ 305 | { 306 | internalType: "string", 307 | name: "", 308 | type: "string", 309 | }, 310 | ], 311 | stateMutability: "view", 312 | type: "function", 313 | }, 314 | { 315 | inputs: [ 316 | { 317 | internalType: "uint256", 318 | name: "tokenId", 319 | type: "uint256", 320 | }, 321 | ], 322 | name: "tokenURI", 323 | outputs: [ 324 | { 325 | internalType: "string", 326 | name: "", 327 | type: "string", 328 | }, 329 | ], 330 | stateMutability: "view", 331 | type: "function", 332 | }, 333 | { 334 | inputs: [ 335 | { 336 | internalType: "address", 337 | name: "from", 338 | type: "address", 339 | }, 340 | { 341 | internalType: "address", 342 | name: "to", 343 | type: "address", 344 | }, 345 | { 346 | internalType: "uint256", 347 | name: "tokenId", 348 | type: "uint256", 349 | }, 350 | ], 351 | name: "transferFrom", 352 | outputs: [], 353 | stateMutability: "nonpayable", 354 | type: "function", 355 | }, 356 | ]; 357 | 358 | export class ERC721Burnable__factory { 359 | static readonly abi = _abi; 360 | static createInterface(): ERC721BurnableInterface { 361 | return new utils.Interface(_abi) as ERC721BurnableInterface; 362 | } 363 | static connect( 364 | address: string, 365 | signerOrProvider: Signer | Provider 366 | ): ERC721Burnable { 367 | return new Contract(address, _abi, signerOrProvider) as ERC721Burnable; 368 | } 369 | } 370 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | ERC721Enumerable, 9 | ERC721EnumerableInterface, 10 | } from "../../../../../../@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable"; 11 | 12 | const _abi = [ 13 | { 14 | anonymous: false, 15 | inputs: [ 16 | { 17 | indexed: true, 18 | internalType: "address", 19 | name: "owner", 20 | type: "address", 21 | }, 22 | { 23 | indexed: true, 24 | internalType: "address", 25 | name: "approved", 26 | type: "address", 27 | }, 28 | { 29 | indexed: true, 30 | internalType: "uint256", 31 | name: "tokenId", 32 | type: "uint256", 33 | }, 34 | ], 35 | name: "Approval", 36 | type: "event", 37 | }, 38 | { 39 | anonymous: false, 40 | inputs: [ 41 | { 42 | indexed: true, 43 | internalType: "address", 44 | name: "owner", 45 | type: "address", 46 | }, 47 | { 48 | indexed: true, 49 | internalType: "address", 50 | name: "operator", 51 | type: "address", 52 | }, 53 | { 54 | indexed: false, 55 | internalType: "bool", 56 | name: "approved", 57 | type: "bool", 58 | }, 59 | ], 60 | name: "ApprovalForAll", 61 | type: "event", 62 | }, 63 | { 64 | anonymous: false, 65 | inputs: [ 66 | { 67 | indexed: true, 68 | internalType: "address", 69 | name: "from", 70 | type: "address", 71 | }, 72 | { 73 | indexed: true, 74 | internalType: "address", 75 | name: "to", 76 | type: "address", 77 | }, 78 | { 79 | indexed: true, 80 | internalType: "uint256", 81 | name: "tokenId", 82 | type: "uint256", 83 | }, 84 | ], 85 | name: "Transfer", 86 | type: "event", 87 | }, 88 | { 89 | inputs: [ 90 | { 91 | internalType: "address", 92 | name: "to", 93 | type: "address", 94 | }, 95 | { 96 | internalType: "uint256", 97 | name: "tokenId", 98 | type: "uint256", 99 | }, 100 | ], 101 | name: "approve", 102 | outputs: [], 103 | stateMutability: "nonpayable", 104 | type: "function", 105 | }, 106 | { 107 | inputs: [ 108 | { 109 | internalType: "address", 110 | name: "owner", 111 | type: "address", 112 | }, 113 | ], 114 | name: "balanceOf", 115 | outputs: [ 116 | { 117 | internalType: "uint256", 118 | name: "", 119 | type: "uint256", 120 | }, 121 | ], 122 | stateMutability: "view", 123 | type: "function", 124 | }, 125 | { 126 | inputs: [ 127 | { 128 | internalType: "uint256", 129 | name: "tokenId", 130 | type: "uint256", 131 | }, 132 | ], 133 | name: "getApproved", 134 | outputs: [ 135 | { 136 | internalType: "address", 137 | name: "", 138 | type: "address", 139 | }, 140 | ], 141 | stateMutability: "view", 142 | type: "function", 143 | }, 144 | { 145 | inputs: [ 146 | { 147 | internalType: "address", 148 | name: "owner", 149 | type: "address", 150 | }, 151 | { 152 | internalType: "address", 153 | name: "operator", 154 | type: "address", 155 | }, 156 | ], 157 | name: "isApprovedForAll", 158 | outputs: [ 159 | { 160 | internalType: "bool", 161 | name: "", 162 | type: "bool", 163 | }, 164 | ], 165 | stateMutability: "view", 166 | type: "function", 167 | }, 168 | { 169 | inputs: [], 170 | name: "name", 171 | outputs: [ 172 | { 173 | internalType: "string", 174 | name: "", 175 | type: "string", 176 | }, 177 | ], 178 | stateMutability: "view", 179 | type: "function", 180 | }, 181 | { 182 | inputs: [ 183 | { 184 | internalType: "uint256", 185 | name: "tokenId", 186 | type: "uint256", 187 | }, 188 | ], 189 | name: "ownerOf", 190 | outputs: [ 191 | { 192 | internalType: "address", 193 | name: "", 194 | type: "address", 195 | }, 196 | ], 197 | stateMutability: "view", 198 | type: "function", 199 | }, 200 | { 201 | inputs: [ 202 | { 203 | internalType: "address", 204 | name: "from", 205 | type: "address", 206 | }, 207 | { 208 | internalType: "address", 209 | name: "to", 210 | type: "address", 211 | }, 212 | { 213 | internalType: "uint256", 214 | name: "tokenId", 215 | type: "uint256", 216 | }, 217 | ], 218 | name: "safeTransferFrom", 219 | outputs: [], 220 | stateMutability: "nonpayable", 221 | type: "function", 222 | }, 223 | { 224 | inputs: [ 225 | { 226 | internalType: "address", 227 | name: "from", 228 | type: "address", 229 | }, 230 | { 231 | internalType: "address", 232 | name: "to", 233 | type: "address", 234 | }, 235 | { 236 | internalType: "uint256", 237 | name: "tokenId", 238 | type: "uint256", 239 | }, 240 | { 241 | internalType: "bytes", 242 | name: "data", 243 | type: "bytes", 244 | }, 245 | ], 246 | name: "safeTransferFrom", 247 | outputs: [], 248 | stateMutability: "nonpayable", 249 | type: "function", 250 | }, 251 | { 252 | inputs: [ 253 | { 254 | internalType: "address", 255 | name: "operator", 256 | type: "address", 257 | }, 258 | { 259 | internalType: "bool", 260 | name: "approved", 261 | type: "bool", 262 | }, 263 | ], 264 | name: "setApprovalForAll", 265 | outputs: [], 266 | stateMutability: "nonpayable", 267 | type: "function", 268 | }, 269 | { 270 | inputs: [ 271 | { 272 | internalType: "bytes4", 273 | name: "interfaceId", 274 | type: "bytes4", 275 | }, 276 | ], 277 | name: "supportsInterface", 278 | outputs: [ 279 | { 280 | internalType: "bool", 281 | name: "", 282 | type: "bool", 283 | }, 284 | ], 285 | stateMutability: "view", 286 | type: "function", 287 | }, 288 | { 289 | inputs: [], 290 | name: "symbol", 291 | outputs: [ 292 | { 293 | internalType: "string", 294 | name: "", 295 | type: "string", 296 | }, 297 | ], 298 | stateMutability: "view", 299 | type: "function", 300 | }, 301 | { 302 | inputs: [ 303 | { 304 | internalType: "uint256", 305 | name: "index", 306 | type: "uint256", 307 | }, 308 | ], 309 | name: "tokenByIndex", 310 | outputs: [ 311 | { 312 | internalType: "uint256", 313 | name: "", 314 | type: "uint256", 315 | }, 316 | ], 317 | stateMutability: "view", 318 | type: "function", 319 | }, 320 | { 321 | inputs: [ 322 | { 323 | internalType: "address", 324 | name: "owner", 325 | type: "address", 326 | }, 327 | { 328 | internalType: "uint256", 329 | name: "index", 330 | type: "uint256", 331 | }, 332 | ], 333 | name: "tokenOfOwnerByIndex", 334 | outputs: [ 335 | { 336 | internalType: "uint256", 337 | name: "", 338 | type: "uint256", 339 | }, 340 | ], 341 | stateMutability: "view", 342 | type: "function", 343 | }, 344 | { 345 | inputs: [ 346 | { 347 | internalType: "uint256", 348 | name: "tokenId", 349 | type: "uint256", 350 | }, 351 | ], 352 | name: "tokenURI", 353 | outputs: [ 354 | { 355 | internalType: "string", 356 | name: "", 357 | type: "string", 358 | }, 359 | ], 360 | stateMutability: "view", 361 | type: "function", 362 | }, 363 | { 364 | inputs: [], 365 | name: "totalSupply", 366 | outputs: [ 367 | { 368 | internalType: "uint256", 369 | name: "", 370 | type: "uint256", 371 | }, 372 | ], 373 | stateMutability: "view", 374 | type: "function", 375 | }, 376 | { 377 | inputs: [ 378 | { 379 | internalType: "address", 380 | name: "from", 381 | type: "address", 382 | }, 383 | { 384 | internalType: "address", 385 | name: "to", 386 | type: "address", 387 | }, 388 | { 389 | internalType: "uint256", 390 | name: "tokenId", 391 | type: "uint256", 392 | }, 393 | ], 394 | name: "transferFrom", 395 | outputs: [], 396 | stateMutability: "nonpayable", 397 | type: "function", 398 | }, 399 | ]; 400 | 401 | export class ERC721Enumerable__factory { 402 | static readonly abi = _abi; 403 | static createInterface(): ERC721EnumerableInterface { 404 | return new utils.Interface(_abi) as ERC721EnumerableInterface; 405 | } 406 | static connect( 407 | address: string, 408 | signerOrProvider: Signer | Provider 409 | ): ERC721Enumerable { 410 | return new Contract(address, _abi, signerOrProvider) as ERC721Enumerable; 411 | } 412 | } 413 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | ERC721URIStorage, 9 | ERC721URIStorageInterface, 10 | } from "../../../../../../@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage"; 11 | 12 | const _abi = [ 13 | { 14 | anonymous: false, 15 | inputs: [ 16 | { 17 | indexed: true, 18 | internalType: "address", 19 | name: "owner", 20 | type: "address", 21 | }, 22 | { 23 | indexed: true, 24 | internalType: "address", 25 | name: "approved", 26 | type: "address", 27 | }, 28 | { 29 | indexed: true, 30 | internalType: "uint256", 31 | name: "tokenId", 32 | type: "uint256", 33 | }, 34 | ], 35 | name: "Approval", 36 | type: "event", 37 | }, 38 | { 39 | anonymous: false, 40 | inputs: [ 41 | { 42 | indexed: true, 43 | internalType: "address", 44 | name: "owner", 45 | type: "address", 46 | }, 47 | { 48 | indexed: true, 49 | internalType: "address", 50 | name: "operator", 51 | type: "address", 52 | }, 53 | { 54 | indexed: false, 55 | internalType: "bool", 56 | name: "approved", 57 | type: "bool", 58 | }, 59 | ], 60 | name: "ApprovalForAll", 61 | type: "event", 62 | }, 63 | { 64 | anonymous: false, 65 | inputs: [ 66 | { 67 | indexed: true, 68 | internalType: "address", 69 | name: "from", 70 | type: "address", 71 | }, 72 | { 73 | indexed: true, 74 | internalType: "address", 75 | name: "to", 76 | type: "address", 77 | }, 78 | { 79 | indexed: true, 80 | internalType: "uint256", 81 | name: "tokenId", 82 | type: "uint256", 83 | }, 84 | ], 85 | name: "Transfer", 86 | type: "event", 87 | }, 88 | { 89 | inputs: [ 90 | { 91 | internalType: "address", 92 | name: "to", 93 | type: "address", 94 | }, 95 | { 96 | internalType: "uint256", 97 | name: "tokenId", 98 | type: "uint256", 99 | }, 100 | ], 101 | name: "approve", 102 | outputs: [], 103 | stateMutability: "nonpayable", 104 | type: "function", 105 | }, 106 | { 107 | inputs: [ 108 | { 109 | internalType: "address", 110 | name: "owner", 111 | type: "address", 112 | }, 113 | ], 114 | name: "balanceOf", 115 | outputs: [ 116 | { 117 | internalType: "uint256", 118 | name: "", 119 | type: "uint256", 120 | }, 121 | ], 122 | stateMutability: "view", 123 | type: "function", 124 | }, 125 | { 126 | inputs: [ 127 | { 128 | internalType: "uint256", 129 | name: "tokenId", 130 | type: "uint256", 131 | }, 132 | ], 133 | name: "getApproved", 134 | outputs: [ 135 | { 136 | internalType: "address", 137 | name: "", 138 | type: "address", 139 | }, 140 | ], 141 | stateMutability: "view", 142 | type: "function", 143 | }, 144 | { 145 | inputs: [ 146 | { 147 | internalType: "address", 148 | name: "owner", 149 | type: "address", 150 | }, 151 | { 152 | internalType: "address", 153 | name: "operator", 154 | type: "address", 155 | }, 156 | ], 157 | name: "isApprovedForAll", 158 | outputs: [ 159 | { 160 | internalType: "bool", 161 | name: "", 162 | type: "bool", 163 | }, 164 | ], 165 | stateMutability: "view", 166 | type: "function", 167 | }, 168 | { 169 | inputs: [], 170 | name: "name", 171 | outputs: [ 172 | { 173 | internalType: "string", 174 | name: "", 175 | type: "string", 176 | }, 177 | ], 178 | stateMutability: "view", 179 | type: "function", 180 | }, 181 | { 182 | inputs: [ 183 | { 184 | internalType: "uint256", 185 | name: "tokenId", 186 | type: "uint256", 187 | }, 188 | ], 189 | name: "ownerOf", 190 | outputs: [ 191 | { 192 | internalType: "address", 193 | name: "", 194 | type: "address", 195 | }, 196 | ], 197 | stateMutability: "view", 198 | type: "function", 199 | }, 200 | { 201 | inputs: [ 202 | { 203 | internalType: "address", 204 | name: "from", 205 | type: "address", 206 | }, 207 | { 208 | internalType: "address", 209 | name: "to", 210 | type: "address", 211 | }, 212 | { 213 | internalType: "uint256", 214 | name: "tokenId", 215 | type: "uint256", 216 | }, 217 | ], 218 | name: "safeTransferFrom", 219 | outputs: [], 220 | stateMutability: "nonpayable", 221 | type: "function", 222 | }, 223 | { 224 | inputs: [ 225 | { 226 | internalType: "address", 227 | name: "from", 228 | type: "address", 229 | }, 230 | { 231 | internalType: "address", 232 | name: "to", 233 | type: "address", 234 | }, 235 | { 236 | internalType: "uint256", 237 | name: "tokenId", 238 | type: "uint256", 239 | }, 240 | { 241 | internalType: "bytes", 242 | name: "data", 243 | type: "bytes", 244 | }, 245 | ], 246 | name: "safeTransferFrom", 247 | outputs: [], 248 | stateMutability: "nonpayable", 249 | type: "function", 250 | }, 251 | { 252 | inputs: [ 253 | { 254 | internalType: "address", 255 | name: "operator", 256 | type: "address", 257 | }, 258 | { 259 | internalType: "bool", 260 | name: "approved", 261 | type: "bool", 262 | }, 263 | ], 264 | name: "setApprovalForAll", 265 | outputs: [], 266 | stateMutability: "nonpayable", 267 | type: "function", 268 | }, 269 | { 270 | inputs: [ 271 | { 272 | internalType: "bytes4", 273 | name: "interfaceId", 274 | type: "bytes4", 275 | }, 276 | ], 277 | name: "supportsInterface", 278 | outputs: [ 279 | { 280 | internalType: "bool", 281 | name: "", 282 | type: "bool", 283 | }, 284 | ], 285 | stateMutability: "view", 286 | type: "function", 287 | }, 288 | { 289 | inputs: [], 290 | name: "symbol", 291 | outputs: [ 292 | { 293 | internalType: "string", 294 | name: "", 295 | type: "string", 296 | }, 297 | ], 298 | stateMutability: "view", 299 | type: "function", 300 | }, 301 | { 302 | inputs: [ 303 | { 304 | internalType: "uint256", 305 | name: "tokenId", 306 | type: "uint256", 307 | }, 308 | ], 309 | name: "tokenURI", 310 | outputs: [ 311 | { 312 | internalType: "string", 313 | name: "", 314 | type: "string", 315 | }, 316 | ], 317 | stateMutability: "view", 318 | type: "function", 319 | }, 320 | { 321 | inputs: [ 322 | { 323 | internalType: "address", 324 | name: "from", 325 | type: "address", 326 | }, 327 | { 328 | internalType: "address", 329 | name: "to", 330 | type: "address", 331 | }, 332 | { 333 | internalType: "uint256", 334 | name: "tokenId", 335 | type: "uint256", 336 | }, 337 | ], 338 | name: "transferFrom", 339 | outputs: [], 340 | stateMutability: "nonpayable", 341 | type: "function", 342 | }, 343 | ]; 344 | 345 | export class ERC721URIStorage__factory { 346 | static readonly abi = _abi; 347 | static createInterface(): ERC721URIStorageInterface { 348 | return new utils.Interface(_abi) as ERC721URIStorageInterface; 349 | } 350 | static connect( 351 | address: string, 352 | signerOrProvider: Signer | Provider 353 | ): ERC721URIStorage { 354 | return new Contract(address, _abi, signerOrProvider) as ERC721URIStorage; 355 | } 356 | } 357 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | IERC721Enumerable, 9 | IERC721EnumerableInterface, 10 | } from "../../../../../../@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable"; 11 | 12 | const _abi = [ 13 | { 14 | anonymous: false, 15 | inputs: [ 16 | { 17 | indexed: true, 18 | internalType: "address", 19 | name: "owner", 20 | type: "address", 21 | }, 22 | { 23 | indexed: true, 24 | internalType: "address", 25 | name: "approved", 26 | type: "address", 27 | }, 28 | { 29 | indexed: true, 30 | internalType: "uint256", 31 | name: "tokenId", 32 | type: "uint256", 33 | }, 34 | ], 35 | name: "Approval", 36 | type: "event", 37 | }, 38 | { 39 | anonymous: false, 40 | inputs: [ 41 | { 42 | indexed: true, 43 | internalType: "address", 44 | name: "owner", 45 | type: "address", 46 | }, 47 | { 48 | indexed: true, 49 | internalType: "address", 50 | name: "operator", 51 | type: "address", 52 | }, 53 | { 54 | indexed: false, 55 | internalType: "bool", 56 | name: "approved", 57 | type: "bool", 58 | }, 59 | ], 60 | name: "ApprovalForAll", 61 | type: "event", 62 | }, 63 | { 64 | anonymous: false, 65 | inputs: [ 66 | { 67 | indexed: true, 68 | internalType: "address", 69 | name: "from", 70 | type: "address", 71 | }, 72 | { 73 | indexed: true, 74 | internalType: "address", 75 | name: "to", 76 | type: "address", 77 | }, 78 | { 79 | indexed: true, 80 | internalType: "uint256", 81 | name: "tokenId", 82 | type: "uint256", 83 | }, 84 | ], 85 | name: "Transfer", 86 | type: "event", 87 | }, 88 | { 89 | inputs: [ 90 | { 91 | internalType: "address", 92 | name: "to", 93 | type: "address", 94 | }, 95 | { 96 | internalType: "uint256", 97 | name: "tokenId", 98 | type: "uint256", 99 | }, 100 | ], 101 | name: "approve", 102 | outputs: [], 103 | stateMutability: "nonpayable", 104 | type: "function", 105 | }, 106 | { 107 | inputs: [ 108 | { 109 | internalType: "address", 110 | name: "owner", 111 | type: "address", 112 | }, 113 | ], 114 | name: "balanceOf", 115 | outputs: [ 116 | { 117 | internalType: "uint256", 118 | name: "balance", 119 | type: "uint256", 120 | }, 121 | ], 122 | stateMutability: "view", 123 | type: "function", 124 | }, 125 | { 126 | inputs: [ 127 | { 128 | internalType: "uint256", 129 | name: "tokenId", 130 | type: "uint256", 131 | }, 132 | ], 133 | name: "getApproved", 134 | outputs: [ 135 | { 136 | internalType: "address", 137 | name: "operator", 138 | type: "address", 139 | }, 140 | ], 141 | stateMutability: "view", 142 | type: "function", 143 | }, 144 | { 145 | inputs: [ 146 | { 147 | internalType: "address", 148 | name: "owner", 149 | type: "address", 150 | }, 151 | { 152 | internalType: "address", 153 | name: "operator", 154 | type: "address", 155 | }, 156 | ], 157 | name: "isApprovedForAll", 158 | outputs: [ 159 | { 160 | internalType: "bool", 161 | name: "", 162 | type: "bool", 163 | }, 164 | ], 165 | stateMutability: "view", 166 | type: "function", 167 | }, 168 | { 169 | inputs: [ 170 | { 171 | internalType: "uint256", 172 | name: "tokenId", 173 | type: "uint256", 174 | }, 175 | ], 176 | name: "ownerOf", 177 | outputs: [ 178 | { 179 | internalType: "address", 180 | name: "owner", 181 | type: "address", 182 | }, 183 | ], 184 | stateMutability: "view", 185 | type: "function", 186 | }, 187 | { 188 | inputs: [ 189 | { 190 | internalType: "address", 191 | name: "from", 192 | type: "address", 193 | }, 194 | { 195 | internalType: "address", 196 | name: "to", 197 | type: "address", 198 | }, 199 | { 200 | internalType: "uint256", 201 | name: "tokenId", 202 | type: "uint256", 203 | }, 204 | ], 205 | name: "safeTransferFrom", 206 | outputs: [], 207 | stateMutability: "nonpayable", 208 | type: "function", 209 | }, 210 | { 211 | inputs: [ 212 | { 213 | internalType: "address", 214 | name: "from", 215 | type: "address", 216 | }, 217 | { 218 | internalType: "address", 219 | name: "to", 220 | type: "address", 221 | }, 222 | { 223 | internalType: "uint256", 224 | name: "tokenId", 225 | type: "uint256", 226 | }, 227 | { 228 | internalType: "bytes", 229 | name: "data", 230 | type: "bytes", 231 | }, 232 | ], 233 | name: "safeTransferFrom", 234 | outputs: [], 235 | stateMutability: "nonpayable", 236 | type: "function", 237 | }, 238 | { 239 | inputs: [ 240 | { 241 | internalType: "address", 242 | name: "operator", 243 | type: "address", 244 | }, 245 | { 246 | internalType: "bool", 247 | name: "_approved", 248 | type: "bool", 249 | }, 250 | ], 251 | name: "setApprovalForAll", 252 | outputs: [], 253 | stateMutability: "nonpayable", 254 | type: "function", 255 | }, 256 | { 257 | inputs: [ 258 | { 259 | internalType: "bytes4", 260 | name: "interfaceId", 261 | type: "bytes4", 262 | }, 263 | ], 264 | name: "supportsInterface", 265 | outputs: [ 266 | { 267 | internalType: "bool", 268 | name: "", 269 | type: "bool", 270 | }, 271 | ], 272 | stateMutability: "view", 273 | type: "function", 274 | }, 275 | { 276 | inputs: [ 277 | { 278 | internalType: "uint256", 279 | name: "index", 280 | type: "uint256", 281 | }, 282 | ], 283 | name: "tokenByIndex", 284 | outputs: [ 285 | { 286 | internalType: "uint256", 287 | name: "", 288 | type: "uint256", 289 | }, 290 | ], 291 | stateMutability: "view", 292 | type: "function", 293 | }, 294 | { 295 | inputs: [ 296 | { 297 | internalType: "address", 298 | name: "owner", 299 | type: "address", 300 | }, 301 | { 302 | internalType: "uint256", 303 | name: "index", 304 | type: "uint256", 305 | }, 306 | ], 307 | name: "tokenOfOwnerByIndex", 308 | outputs: [ 309 | { 310 | internalType: "uint256", 311 | name: "", 312 | type: "uint256", 313 | }, 314 | ], 315 | stateMutability: "view", 316 | type: "function", 317 | }, 318 | { 319 | inputs: [], 320 | name: "totalSupply", 321 | outputs: [ 322 | { 323 | internalType: "uint256", 324 | name: "", 325 | type: "uint256", 326 | }, 327 | ], 328 | stateMutability: "view", 329 | type: "function", 330 | }, 331 | { 332 | inputs: [ 333 | { 334 | internalType: "address", 335 | name: "from", 336 | type: "address", 337 | }, 338 | { 339 | internalType: "address", 340 | name: "to", 341 | type: "address", 342 | }, 343 | { 344 | internalType: "uint256", 345 | name: "tokenId", 346 | type: "uint256", 347 | }, 348 | ], 349 | name: "transferFrom", 350 | outputs: [], 351 | stateMutability: "nonpayable", 352 | type: "function", 353 | }, 354 | ]; 355 | 356 | export class IERC721Enumerable__factory { 357 | static readonly abi = _abi; 358 | static createInterface(): IERC721EnumerableInterface { 359 | return new utils.Interface(_abi) as IERC721EnumerableInterface; 360 | } 361 | static connect( 362 | address: string, 363 | signerOrProvider: Signer | Provider 364 | ): IERC721Enumerable { 365 | return new Contract(address, _abi, signerOrProvider) as IERC721Enumerable; 366 | } 367 | } 368 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | IERC721Metadata, 9 | IERC721MetadataInterface, 10 | } from "../../../../../../@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata"; 11 | 12 | const _abi = [ 13 | { 14 | anonymous: false, 15 | inputs: [ 16 | { 17 | indexed: true, 18 | internalType: "address", 19 | name: "owner", 20 | type: "address", 21 | }, 22 | { 23 | indexed: true, 24 | internalType: "address", 25 | name: "approved", 26 | type: "address", 27 | }, 28 | { 29 | indexed: true, 30 | internalType: "uint256", 31 | name: "tokenId", 32 | type: "uint256", 33 | }, 34 | ], 35 | name: "Approval", 36 | type: "event", 37 | }, 38 | { 39 | anonymous: false, 40 | inputs: [ 41 | { 42 | indexed: true, 43 | internalType: "address", 44 | name: "owner", 45 | type: "address", 46 | }, 47 | { 48 | indexed: true, 49 | internalType: "address", 50 | name: "operator", 51 | type: "address", 52 | }, 53 | { 54 | indexed: false, 55 | internalType: "bool", 56 | name: "approved", 57 | type: "bool", 58 | }, 59 | ], 60 | name: "ApprovalForAll", 61 | type: "event", 62 | }, 63 | { 64 | anonymous: false, 65 | inputs: [ 66 | { 67 | indexed: true, 68 | internalType: "address", 69 | name: "from", 70 | type: "address", 71 | }, 72 | { 73 | indexed: true, 74 | internalType: "address", 75 | name: "to", 76 | type: "address", 77 | }, 78 | { 79 | indexed: true, 80 | internalType: "uint256", 81 | name: "tokenId", 82 | type: "uint256", 83 | }, 84 | ], 85 | name: "Transfer", 86 | type: "event", 87 | }, 88 | { 89 | inputs: [ 90 | { 91 | internalType: "address", 92 | name: "to", 93 | type: "address", 94 | }, 95 | { 96 | internalType: "uint256", 97 | name: "tokenId", 98 | type: "uint256", 99 | }, 100 | ], 101 | name: "approve", 102 | outputs: [], 103 | stateMutability: "nonpayable", 104 | type: "function", 105 | }, 106 | { 107 | inputs: [ 108 | { 109 | internalType: "address", 110 | name: "owner", 111 | type: "address", 112 | }, 113 | ], 114 | name: "balanceOf", 115 | outputs: [ 116 | { 117 | internalType: "uint256", 118 | name: "balance", 119 | type: "uint256", 120 | }, 121 | ], 122 | stateMutability: "view", 123 | type: "function", 124 | }, 125 | { 126 | inputs: [ 127 | { 128 | internalType: "uint256", 129 | name: "tokenId", 130 | type: "uint256", 131 | }, 132 | ], 133 | name: "getApproved", 134 | outputs: [ 135 | { 136 | internalType: "address", 137 | name: "operator", 138 | type: "address", 139 | }, 140 | ], 141 | stateMutability: "view", 142 | type: "function", 143 | }, 144 | { 145 | inputs: [ 146 | { 147 | internalType: "address", 148 | name: "owner", 149 | type: "address", 150 | }, 151 | { 152 | internalType: "address", 153 | name: "operator", 154 | type: "address", 155 | }, 156 | ], 157 | name: "isApprovedForAll", 158 | outputs: [ 159 | { 160 | internalType: "bool", 161 | name: "", 162 | type: "bool", 163 | }, 164 | ], 165 | stateMutability: "view", 166 | type: "function", 167 | }, 168 | { 169 | inputs: [], 170 | name: "name", 171 | outputs: [ 172 | { 173 | internalType: "string", 174 | name: "", 175 | type: "string", 176 | }, 177 | ], 178 | stateMutability: "view", 179 | type: "function", 180 | }, 181 | { 182 | inputs: [ 183 | { 184 | internalType: "uint256", 185 | name: "tokenId", 186 | type: "uint256", 187 | }, 188 | ], 189 | name: "ownerOf", 190 | outputs: [ 191 | { 192 | internalType: "address", 193 | name: "owner", 194 | type: "address", 195 | }, 196 | ], 197 | stateMutability: "view", 198 | type: "function", 199 | }, 200 | { 201 | inputs: [ 202 | { 203 | internalType: "address", 204 | name: "from", 205 | type: "address", 206 | }, 207 | { 208 | internalType: "address", 209 | name: "to", 210 | type: "address", 211 | }, 212 | { 213 | internalType: "uint256", 214 | name: "tokenId", 215 | type: "uint256", 216 | }, 217 | ], 218 | name: "safeTransferFrom", 219 | outputs: [], 220 | stateMutability: "nonpayable", 221 | type: "function", 222 | }, 223 | { 224 | inputs: [ 225 | { 226 | internalType: "address", 227 | name: "from", 228 | type: "address", 229 | }, 230 | { 231 | internalType: "address", 232 | name: "to", 233 | type: "address", 234 | }, 235 | { 236 | internalType: "uint256", 237 | name: "tokenId", 238 | type: "uint256", 239 | }, 240 | { 241 | internalType: "bytes", 242 | name: "data", 243 | type: "bytes", 244 | }, 245 | ], 246 | name: "safeTransferFrom", 247 | outputs: [], 248 | stateMutability: "nonpayable", 249 | type: "function", 250 | }, 251 | { 252 | inputs: [ 253 | { 254 | internalType: "address", 255 | name: "operator", 256 | type: "address", 257 | }, 258 | { 259 | internalType: "bool", 260 | name: "_approved", 261 | type: "bool", 262 | }, 263 | ], 264 | name: "setApprovalForAll", 265 | outputs: [], 266 | stateMutability: "nonpayable", 267 | type: "function", 268 | }, 269 | { 270 | inputs: [ 271 | { 272 | internalType: "bytes4", 273 | name: "interfaceId", 274 | type: "bytes4", 275 | }, 276 | ], 277 | name: "supportsInterface", 278 | outputs: [ 279 | { 280 | internalType: "bool", 281 | name: "", 282 | type: "bool", 283 | }, 284 | ], 285 | stateMutability: "view", 286 | type: "function", 287 | }, 288 | { 289 | inputs: [], 290 | name: "symbol", 291 | outputs: [ 292 | { 293 | internalType: "string", 294 | name: "", 295 | type: "string", 296 | }, 297 | ], 298 | stateMutability: "view", 299 | type: "function", 300 | }, 301 | { 302 | inputs: [ 303 | { 304 | internalType: "uint256", 305 | name: "tokenId", 306 | type: "uint256", 307 | }, 308 | ], 309 | name: "tokenURI", 310 | outputs: [ 311 | { 312 | internalType: "string", 313 | name: "", 314 | type: "string", 315 | }, 316 | ], 317 | stateMutability: "view", 318 | type: "function", 319 | }, 320 | { 321 | inputs: [ 322 | { 323 | internalType: "address", 324 | name: "from", 325 | type: "address", 326 | }, 327 | { 328 | internalType: "address", 329 | name: "to", 330 | type: "address", 331 | }, 332 | { 333 | internalType: "uint256", 334 | name: "tokenId", 335 | type: "uint256", 336 | }, 337 | ], 338 | name: "transferFrom", 339 | outputs: [], 340 | stateMutability: "nonpayable", 341 | type: "function", 342 | }, 343 | ]; 344 | 345 | export class IERC721Metadata__factory { 346 | static readonly abi = _abi; 347 | static createInterface(): IERC721MetadataInterface { 348 | return new utils.Interface(_abi) as IERC721MetadataInterface; 349 | } 350 | static connect( 351 | address: string, 352 | signerOrProvider: Signer | Provider 353 | ): IERC721Metadata { 354 | return new Contract(address, _abi, signerOrProvider) as IERC721Metadata; 355 | } 356 | } 357 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/ERC721/extensions/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export { ERC721Burnable__factory } from "./ERC721Burnable__factory"; 5 | export { ERC721Enumerable__factory } from "./ERC721Enumerable__factory"; 6 | export { ERC721URIStorage__factory } from "./ERC721URIStorage__factory"; 7 | export { IERC721Enumerable__factory } from "./IERC721Enumerable__factory"; 8 | export { IERC721Metadata__factory } from "./IERC721Metadata__factory"; 9 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/ERC721/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export * as extensions from "./extensions"; 5 | export { ERC721__factory } from "./ERC721__factory"; 6 | export { IERC721__factory } from "./IERC721__factory"; 7 | export { IERC721Receiver__factory } from "./IERC721Receiver__factory"; 8 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/token/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export * as erc721 from "./ERC721"; 5 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/utils/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export * as introspection from "./introspection"; 5 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/utils/introspection/ERC165__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | ERC165, 9 | ERC165Interface, 10 | } from "../../../../../@openzeppelin/contracts/utils/introspection/ERC165"; 11 | 12 | const _abi = [ 13 | { 14 | inputs: [ 15 | { 16 | internalType: "bytes4", 17 | name: "interfaceId", 18 | type: "bytes4", 19 | }, 20 | ], 21 | name: "supportsInterface", 22 | outputs: [ 23 | { 24 | internalType: "bool", 25 | name: "", 26 | type: "bool", 27 | }, 28 | ], 29 | stateMutability: "view", 30 | type: "function", 31 | }, 32 | ]; 33 | 34 | export class ERC165__factory { 35 | static readonly abi = _abi; 36 | static createInterface(): ERC165Interface { 37 | return new utils.Interface(_abi) as ERC165Interface; 38 | } 39 | static connect(address: string, signerOrProvider: Signer | Provider): ERC165 { 40 | return new Contract(address, _abi, signerOrProvider) as ERC165; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { Contract, Signer, utils } from "ethers"; 6 | import type { Provider } from "@ethersproject/providers"; 7 | import type { 8 | IERC165, 9 | IERC165Interface, 10 | } from "../../../../../@openzeppelin/contracts/utils/introspection/IERC165"; 11 | 12 | const _abi = [ 13 | { 14 | inputs: [ 15 | { 16 | internalType: "bytes4", 17 | name: "interfaceId", 18 | type: "bytes4", 19 | }, 20 | ], 21 | name: "supportsInterface", 22 | outputs: [ 23 | { 24 | internalType: "bool", 25 | name: "", 26 | type: "bool", 27 | }, 28 | ], 29 | stateMutability: "view", 30 | type: "function", 31 | }, 32 | ]; 33 | 34 | export class IERC165__factory { 35 | static readonly abi = _abi; 36 | static createInterface(): IERC165Interface { 37 | return new utils.Interface(_abi) as IERC165Interface; 38 | } 39 | static connect( 40 | address: string, 41 | signerOrProvider: Signer | Provider 42 | ): IERC165 { 43 | return new Contract(address, _abi, signerOrProvider) as IERC165; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/contracts/utils/introspection/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export { ERC165__factory } from "./ERC165__factory"; 5 | export { IERC165__factory } from "./IERC165__factory"; 6 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/@openzeppelin/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export * as contracts from "./contracts"; 5 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/contracts/YourContract__factory.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import { 5 | Signer, 6 | utils, 7 | Contract, 8 | ContractFactory, 9 | PayableOverrides, 10 | } from "ethers"; 11 | import type { Provider, TransactionRequest } from "@ethersproject/providers"; 12 | import type { PromiseOrValue } from "../../common"; 13 | import type { 14 | YourContract, 15 | YourContractInterface, 16 | } from "../../contracts/YourContract"; 17 | 18 | const _abi = [ 19 | { 20 | inputs: [], 21 | stateMutability: "payable", 22 | type: "constructor", 23 | }, 24 | { 25 | anonymous: false, 26 | inputs: [ 27 | { 28 | indexed: false, 29 | internalType: "address", 30 | name: "sender", 31 | type: "address", 32 | }, 33 | { 34 | indexed: false, 35 | internalType: "string", 36 | name: "greeting", 37 | type: "string", 38 | }, 39 | ], 40 | name: "SetGreeting", 41 | type: "event", 42 | }, 43 | { 44 | stateMutability: "payable", 45 | type: "fallback", 46 | }, 47 | { 48 | inputs: [], 49 | name: "greeting", 50 | outputs: [ 51 | { 52 | internalType: "string", 53 | name: "", 54 | type: "string", 55 | }, 56 | ], 57 | stateMutability: "view", 58 | type: "function", 59 | }, 60 | { 61 | inputs: [ 62 | { 63 | internalType: "string", 64 | name: "newGreeting", 65 | type: "string", 66 | }, 67 | ], 68 | name: "setGreeting", 69 | outputs: [], 70 | stateMutability: "nonpayable", 71 | type: "function", 72 | }, 73 | { 74 | stateMutability: "payable", 75 | type: "receive", 76 | }, 77 | ]; 78 | 79 | const _bytecode = 80 | "0x60806040526040518060400160405280600f81526020017f48656c6c6f20457468657265756d2100000000000000000000000000000000008152506000908051906020019061004f929190610055565b50610159565b82805461006190610127565b90600052602060002090601f01602090048101928261008357600085556100ca565b82601f1061009c57805160ff19168380011785556100ca565b828001600101855582156100ca579182015b828111156100c95782518255916020019190600101906100ae565b5b5090506100d791906100db565b5090565b5b808211156100f45760008160009055506001016100dc565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061013f57607f821691505b60208210811415610153576101526100f8565b5b50919050565b6107d0806101686000396000f3fe60806040526004361061002d5760003560e01c8063a413686214610036578063ef690cc01461005f57610034565b3661003457005b005b34801561004257600080fd5b5061005d600480360381019061005891906104fb565b61008a565b005b34801561006b57600080fd5b506100746101a8565b60405161008191906105cc565b60405180910390f35b80600090805190602001906100a09291906102fe565b5061016b336040518060400160405280600f81526020017f736574206772656574696e6720746f0000000000000000000000000000000000815250600080546100e89061061d565b80601f01602080910402602001604051908101604052809291908181526020018280546101149061061d565b80156101615780601f1061013657610100808354040283529160200191610161565b820191906000526020600020905b81548152906001019060200180831161014457829003601f168201915b5050505050610236565b7ffae51f5480b362c362b5f790e2a1b86b677c562bf1c1db0094505abfe05ef91133600060405161019d929190610725565b60405180910390a150565b600080546101b59061061d565b80601f01602080910402602001604051908101604052809291908181526020018280546101e19061061d565b801561022e5780601f106102035761010080835404028352916020019161022e565b820191906000526020600020905b81548152906001019060200180831161021157829003601f168201915b505050505081565b6102d083838360405160240161024e93929190610755565b6040516020818303038152906040527ffb772265000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506102d5565b505050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b82805461030a9061061d565b90600052602060002090601f01602090048101928261032c5760008555610373565b82601f1061034557805160ff1916838001178555610373565b82800160010185558215610373579182015b82811115610372578251825591602001919060010190610357565b5b5090506103809190610384565b5090565b5b8082111561039d576000816000905550600101610385565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610408826103bf565b810181811067ffffffffffffffff82111715610427576104266103d0565b5b80604052505050565b600061043a6103a1565b905061044682826103ff565b919050565b600067ffffffffffffffff821115610466576104656103d0565b5b61046f826103bf565b9050602081019050919050565b82818337600083830152505050565b600061049e6104998461044b565b610430565b9050828152602081018484840111156104ba576104b96103ba565b5b6104c584828561047c565b509392505050565b600082601f8301126104e2576104e16103b5565b5b81356104f284826020860161048b565b91505092915050565b600060208284031215610511576105106103ab565b5b600082013567ffffffffffffffff81111561052f5761052e6103b0565b5b61053b848285016104cd565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561057e578082015181840152602081019050610563565b8381111561058d576000848401525b50505050565b600061059e82610544565b6105a8818561054f565b93506105b8818560208601610560565b6105c1816103bf565b840191505092915050565b600060208201905081810360008301526105e68184610593565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061063557607f821691505b60208210811415610649576106486105ee565b5b50919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061067a8261064f565b9050919050565b61068a8161066f565b82525050565b60008190508160005260206000209050919050565b600081546106b28161061d565b6106bc818661054f565b945060018216600081146106d757600181146106e95761071c565b60ff198316865260208601935061071c565b6106f285610690565b60005b83811015610714578154818901526001820191506020810190506106f5565b808801955050505b50505092915050565b600060408201905061073a6000830185610681565b818103602083015261074c81846106a5565b90509392505050565b600060608201905061076a6000830186610681565b818103602083015261077c8185610593565b905081810360408301526107908184610593565b905094935050505056fea26469706673582212200f1852fc2ac35d618510c9b658879b59e17bd87c6dce8561395006f991c254af64736f6c63430008090033"; 81 | 82 | type YourContractConstructorParams = 83 | | [signer?: Signer] 84 | | ConstructorParameters; 85 | 86 | const isSuperArgs = ( 87 | xs: YourContractConstructorParams 88 | ): xs is ConstructorParameters => xs.length > 1; 89 | 90 | export class YourContract__factory extends ContractFactory { 91 | constructor(...args: YourContractConstructorParams) { 92 | if (isSuperArgs(args)) { 93 | super(...args); 94 | } else { 95 | super(_abi, _bytecode, args[0]); 96 | } 97 | } 98 | 99 | override deploy( 100 | overrides?: PayableOverrides & { from?: PromiseOrValue } 101 | ): Promise { 102 | return super.deploy(overrides || {}) as Promise; 103 | } 104 | override getDeployTransaction( 105 | overrides?: PayableOverrides & { from?: PromiseOrValue } 106 | ): TransactionRequest { 107 | return super.getDeployTransaction(overrides || {}); 108 | } 109 | override attach(address: string): YourContract { 110 | return super.attach(address) as YourContract; 111 | } 112 | override connect(signer: Signer): YourContract__factory { 113 | return super.connect(signer) as YourContract__factory; 114 | } 115 | 116 | static readonly bytecode = _bytecode; 117 | static readonly abi = _abi; 118 | static createInterface(): YourContractInterface { 119 | return new utils.Interface(_abi) as YourContractInterface; 120 | } 121 | static connect( 122 | address: string, 123 | signerOrProvider: Signer | Provider 124 | ): YourContract { 125 | return new Contract(address, _abi, signerOrProvider) as YourContract; 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/contracts/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export { YourContract__factory } from "./YourContract__factory"; 5 | export { YourNFT__factory } from "./YourNFT__factory"; 6 | -------------------------------------------------------------------------------- /frontend/types/typechain/factories/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | export * as openzeppelin from "./@openzeppelin"; 5 | export * as contracts from "./contracts"; 6 | -------------------------------------------------------------------------------- /frontend/types/typechain/hardhat.d.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | 5 | import { ethers } from "ethers"; 6 | import { 7 | FactoryOptions, 8 | HardhatEthersHelpers as HardhatEthersHelpersBase, 9 | } from "@nomiclabs/hardhat-ethers/types"; 10 | 11 | import * as Contracts from "."; 12 | 13 | declare module "hardhat/types/runtime" { 14 | interface HardhatEthersHelpers extends HardhatEthersHelpersBase { 15 | getContractFactory( 16 | name: "Ownable", 17 | signerOrOptions?: ethers.Signer | FactoryOptions 18 | ): Promise; 19 | getContractFactory( 20 | name: "ERC721", 21 | signerOrOptions?: ethers.Signer | FactoryOptions 22 | ): Promise; 23 | getContractFactory( 24 | name: "ERC721Burnable", 25 | signerOrOptions?: ethers.Signer | FactoryOptions 26 | ): Promise; 27 | getContractFactory( 28 | name: "ERC721Enumerable", 29 | signerOrOptions?: ethers.Signer | FactoryOptions 30 | ): Promise; 31 | getContractFactory( 32 | name: "ERC721URIStorage", 33 | signerOrOptions?: ethers.Signer | FactoryOptions 34 | ): Promise; 35 | getContractFactory( 36 | name: "IERC721Enumerable", 37 | signerOrOptions?: ethers.Signer | FactoryOptions 38 | ): Promise; 39 | getContractFactory( 40 | name: "IERC721Metadata", 41 | signerOrOptions?: ethers.Signer | FactoryOptions 42 | ): Promise; 43 | getContractFactory( 44 | name: "IERC721", 45 | signerOrOptions?: ethers.Signer | FactoryOptions 46 | ): Promise; 47 | getContractFactory( 48 | name: "IERC721Receiver", 49 | signerOrOptions?: ethers.Signer | FactoryOptions 50 | ): Promise; 51 | getContractFactory( 52 | name: "ERC165", 53 | signerOrOptions?: ethers.Signer | FactoryOptions 54 | ): Promise; 55 | getContractFactory( 56 | name: "IERC165", 57 | signerOrOptions?: ethers.Signer | FactoryOptions 58 | ): Promise; 59 | getContractFactory( 60 | name: "YourContract", 61 | signerOrOptions?: ethers.Signer | FactoryOptions 62 | ): Promise; 63 | getContractFactory( 64 | name: "YourNFT", 65 | signerOrOptions?: ethers.Signer | FactoryOptions 66 | ): Promise; 67 | 68 | getContractAt( 69 | name: "Ownable", 70 | address: string, 71 | signer?: ethers.Signer 72 | ): Promise; 73 | getContractAt( 74 | name: "ERC721", 75 | address: string, 76 | signer?: ethers.Signer 77 | ): Promise; 78 | getContractAt( 79 | name: "ERC721Burnable", 80 | address: string, 81 | signer?: ethers.Signer 82 | ): Promise; 83 | getContractAt( 84 | name: "ERC721Enumerable", 85 | address: string, 86 | signer?: ethers.Signer 87 | ): Promise; 88 | getContractAt( 89 | name: "ERC721URIStorage", 90 | address: string, 91 | signer?: ethers.Signer 92 | ): Promise; 93 | getContractAt( 94 | name: "IERC721Enumerable", 95 | address: string, 96 | signer?: ethers.Signer 97 | ): Promise; 98 | getContractAt( 99 | name: "IERC721Metadata", 100 | address: string, 101 | signer?: ethers.Signer 102 | ): Promise; 103 | getContractAt( 104 | name: "IERC721", 105 | address: string, 106 | signer?: ethers.Signer 107 | ): Promise; 108 | getContractAt( 109 | name: "IERC721Receiver", 110 | address: string, 111 | signer?: ethers.Signer 112 | ): Promise; 113 | getContractAt( 114 | name: "ERC165", 115 | address: string, 116 | signer?: ethers.Signer 117 | ): Promise; 118 | getContractAt( 119 | name: "IERC165", 120 | address: string, 121 | signer?: ethers.Signer 122 | ): Promise; 123 | getContractAt( 124 | name: "YourContract", 125 | address: string, 126 | signer?: ethers.Signer 127 | ): Promise; 128 | getContractAt( 129 | name: "YourNFT", 130 | address: string, 131 | signer?: ethers.Signer 132 | ): Promise; 133 | 134 | // default types 135 | getContractFactory( 136 | name: string, 137 | signerOrOptions?: ethers.Signer | FactoryOptions 138 | ): Promise; 139 | getContractFactory( 140 | abi: any[], 141 | bytecode: ethers.utils.BytesLike, 142 | signer?: ethers.Signer 143 | ): Promise; 144 | getContractAt( 145 | nameOrAbi: string | any[], 146 | address: string, 147 | signer?: ethers.Signer 148 | ): Promise; 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /frontend/types/typechain/index.ts: -------------------------------------------------------------------------------- 1 | /* Autogenerated file. Do not edit manually. */ 2 | /* tslint:disable */ 3 | /* eslint-disable */ 4 | import type * as openzeppelin from "./@openzeppelin"; 5 | export type { openzeppelin }; 6 | import type * as contracts from "./contracts"; 7 | export type { contracts }; 8 | export * as factories from "./factories"; 9 | export type { Ownable } from "./@openzeppelin/contracts/access/Ownable"; 10 | export { Ownable__factory } from "./factories/@openzeppelin/contracts/access/Ownable__factory"; 11 | export type { ERC721 } from "./@openzeppelin/contracts/token/ERC721/ERC721"; 12 | export { ERC721__factory } from "./factories/@openzeppelin/contracts/token/ERC721/ERC721__factory"; 13 | export type { ERC721Burnable } from "./@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable"; 14 | export { ERC721Burnable__factory } from "./factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable__factory"; 15 | export type { ERC721Enumerable } from "./@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable"; 16 | export { ERC721Enumerable__factory } from "./factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable__factory"; 17 | export type { ERC721URIStorage } from "./@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage"; 18 | export { ERC721URIStorage__factory } from "./factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage__factory"; 19 | export type { IERC721Enumerable } from "./@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable"; 20 | export { IERC721Enumerable__factory } from "./factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable__factory"; 21 | export type { IERC721Metadata } from "./@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata"; 22 | export { IERC721Metadata__factory } from "./factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata__factory"; 23 | export type { IERC721 } from "./@openzeppelin/contracts/token/ERC721/IERC721"; 24 | export { IERC721__factory } from "./factories/@openzeppelin/contracts/token/ERC721/IERC721__factory"; 25 | export type { IERC721Receiver } from "./@openzeppelin/contracts/token/ERC721/IERC721Receiver"; 26 | export { IERC721Receiver__factory } from "./factories/@openzeppelin/contracts/token/ERC721/IERC721Receiver__factory"; 27 | export type { ERC165 } from "./@openzeppelin/contracts/utils/introspection/ERC165"; 28 | export { ERC165__factory } from "./factories/@openzeppelin/contracts/utils/introspection/ERC165__factory"; 29 | export type { IERC165 } from "./@openzeppelin/contracts/utils/introspection/IERC165"; 30 | export { IERC165__factory } from "./factories/@openzeppelin/contracts/utils/introspection/IERC165__factory"; 31 | export type { YourContract } from "./contracts/YourContract"; 32 | export { YourContract__factory } from "./factories/contracts/YourContract__factory"; 33 | export type { YourNFT } from "./contracts/YourNFT"; 34 | export { YourNFT__factory } from "./factories/contracts/YourNFT__factory"; 35 | -------------------------------------------------------------------------------- /frontend/utils/generateTokenUri.ts: -------------------------------------------------------------------------------- 1 | type UrlsType = { 2 | regular: string 3 | } 4 | 5 | type UserType = { 6 | username: string 7 | } 8 | 9 | // This data comes from the Unsplash API 10 | // https://unsplash.com/developers 11 | type DataType = { 12 | description: string 13 | urls: UrlsType 14 | user: UserType 15 | views: number 16 | width: number 17 | height: number 18 | downloads: number 19 | } 20 | 21 | export const generateTokenUri = (data: DataType) => { 22 | const tokenUri = { 23 | description: data.description, 24 | image: data.urls.regular, 25 | name: data.user.username, 26 | attributes: [ 27 | { 28 | trait_type: 'Views', 29 | value: data.views, 30 | }, 31 | { 32 | trait_type: 'Width', 33 | value: data.width, 34 | }, 35 | { 36 | trait_type: 'Height', 37 | value: data.height, 38 | }, 39 | { 40 | trait_type: 'Downloads', 41 | value: data.downloads, 42 | }, 43 | ], 44 | } 45 | 46 | return JSON.stringify(tokenUri) 47 | } 48 | -------------------------------------------------------------------------------- /hardhat.config.ts: -------------------------------------------------------------------------------- 1 | import '@nomicfoundation/hardhat-toolbox'; 2 | import { HardhatUserConfig } from 'hardhat/config'; 3 | 4 | /** @type import('hardhat/config').HardhatUserConfig */ 5 | const config: HardhatUserConfig = { 6 | solidity: '0.8.9', 7 | paths: { 8 | artifacts: './frontend/artifacts', 9 | }, 10 | networks: { 11 | hardhat: { 12 | chainId: 1337, // We set 1337 to make interacting with MetaMask simpler 13 | }, 14 | }, 15 | typechain: { 16 | outDir: './frontend/types/typechain', 17 | }, 18 | }; 19 | 20 | export default config; 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nextjs-ethereum-starter", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "chain": "npx hardhat node", 7 | "compile": "npx hardhat compile", 8 | "deploy": "npx hardhat run scripts/deploy.ts --network localhost", 9 | "test": "hardhat test" 10 | }, 11 | "devDependencies": { 12 | "@ethersproject/abi": "^5.7.0", 13 | "@ethersproject/providers": "^5.7.0", 14 | "@nomicfoundation/hardhat-chai-matchers": "^1.0.3", 15 | "@nomicfoundation/hardhat-network-helpers": "^1.0.5", 16 | "@nomicfoundation/hardhat-toolbox": "^1.0.2", 17 | "@nomiclabs/hardhat-ethers": "^2.1.1", 18 | "@nomiclabs/hardhat-etherscan": "^3.1.0", 19 | "@openzeppelin/contracts": "^4.7.3", 20 | "@typechain/ethers-v5": "^10.1.0", 21 | "@typechain/hardhat": "^6.1.2", 22 | "@types/chai": "^4.3.3", 23 | "@types/mocha": "^9.1.1", 24 | "@types/node": "^18.7.14", 25 | "chai": "^4.3.6", 26 | "ethers": "^5.7.0", 27 | "hardhat": "^2.9.9", 28 | "hardhat-gas-reporter": "^1.0.8", 29 | "solidity-coverage": "^0.7.21", 30 | "ts-node": "^10.9.1", 31 | "typechain": "^8.1.0", 32 | "typescript": "^4.8.2" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /scripts/deploy.ts: -------------------------------------------------------------------------------- 1 | // We require the Hardhat Runtime Environment explicitly here. This is optional 2 | // but useful for running the script in a standalone fashion through `node