├── .all-contributorsrc ├── .env.example ├── .eslintignore ├── .eslintrc.js ├── .github └── FUNDING.yml ├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .nvmrc ├── .prettierignore ├── .prettierrc ├── .solhint.json ├── .solhintignore ├── .yarn └── install-state.gz ├── .yarnrc.yml ├── LICENSE ├── Procfile ├── README.md ├── contracts └── MyAwesomeLogo.sol ├── coverage.json ├── cspell.json ├── graph ├── Box.dot ├── BoxV2.dot ├── Greeter.dot └── ITManToken.dot ├── hardhat.config.ts ├── index.html ├── nft-app.txt ├── package.json ├── postcss.config.js ├── renovate.json ├── screenshot1.png ├── screenshot2.png ├── scripts ├── assets │ ├── set-1 │ │ ├── 1 Black Logo 800x600.png │ │ ├── 1 Inverted Color 800x600.png │ │ ├── 1 Main Logo 800x600.png │ │ └── 1 White logo 800x600.png │ ├── set-2 │ │ ├── 1 Black Logo 800x600.png │ │ ├── 1 Inverted Color 800x600.png │ │ ├── 1 Main Logo 800x600.png │ │ └── 1 White logo 800x600.png │ └── set-3 │ │ ├── 1 Black Logo 800x600.png │ │ ├── 1 Inverted Color 800x600.png │ │ ├── 1 Main Logo 800x600.png │ │ └── 1 White logo 800x600.png ├── deploy.ts └── mint.ts ├── server ├── .env.example ├── .gitignore ├── .taprc ├── .yarn │ └── install-state.gz ├── Procfile ├── package.json ├── src │ ├── app.ts │ ├── plugins │ │ ├── README.md │ │ ├── cors.ts │ │ ├── multipart.ts │ │ ├── sensible.ts │ │ └── support.ts │ ├── routes │ │ ├── README.md │ │ ├── nft │ │ │ └── index.ts │ │ └── root.ts │ └── server.ts ├── test │ ├── helper.ts │ ├── plugins │ │ └── support.test.ts │ ├── routes │ │ ├── nft.test.ts │ │ └── root.test.ts │ └── tsconfig.test.json ├── tsconfig.json └── yarn.lock ├── src ├── App.tsx ├── components │ ├── Account.tsx │ ├── AddItemModal.tsx │ ├── Balance.tsx │ ├── ChainId.tsx │ ├── Demo.tsx │ ├── Header.tsx │ ├── Image.tsx │ ├── Nft.tsx │ └── Pagination.tsx ├── dapp │ ├── connectors.ts │ └── hooks.ts ├── favicon.svg ├── index.css ├── logger.ts ├── logo.svg ├── main.tsx ├── metamask.png ├── networkName.tsx ├── types │ ├── @openzeppelin │ │ ├── contracts │ │ │ ├── access │ │ │ │ ├── Ownable.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── interfaces │ │ │ │ ├── IERC4906.ts │ │ │ │ └── index.ts │ │ │ ├── token │ │ │ │ ├── ERC721 │ │ │ │ │ ├── ERC721.ts │ │ │ │ │ ├── IERC721.ts │ │ │ │ │ ├── IERC721Receiver.ts │ │ │ │ │ ├── extensions │ │ │ │ │ │ ├── ERC721Burnable.ts │ │ │ │ │ │ ├── ERC721URIStorage.ts │ │ │ │ │ │ ├── IERC721Metadata.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ └── utils │ │ │ │ ├── index.ts │ │ │ │ └── introspection │ │ │ │ ├── ERC165.ts │ │ │ │ ├── IERC165.ts │ │ │ │ └── index.ts │ │ └── index.ts │ ├── common.ts │ ├── contracts │ │ ├── MyAwesomeLogo.ts │ │ └── index.ts │ ├── factories │ │ ├── @openzeppelin │ │ │ ├── contracts │ │ │ │ ├── access │ │ │ │ │ ├── Ownable__factory.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── interfaces │ │ │ │ │ ├── IERC4906__factory.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── token │ │ │ │ │ ├── ERC721 │ │ │ │ │ │ ├── ERC721__factory.ts │ │ │ │ │ │ ├── IERC721Receiver__factory.ts │ │ │ │ │ │ ├── IERC721__factory.ts │ │ │ │ │ │ ├── extensions │ │ │ │ │ │ │ ├── ERC721Burnable__factory.ts │ │ │ │ │ │ │ ├── ERC721URIStorage__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 │ │ │ ├── MyAwesomeLogo__factory.ts │ │ │ └── index.ts │ │ └── index.ts │ ├── hardhat.d.ts │ └── index.ts └── vite-env.d.ts ├── tailwind.config.js ├── test ├── box.test.js ├── boxv2.test.js ├── greeter.test.js └── itmantoken.test.js ├── tsconfig.json ├── vite.config.ts └── yarn.lock /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "commitType": "docs", 8 | "commitConvention": "angular", 9 | "contributors": [ 10 | { 11 | "login": "jellydn", 12 | "name": "Dung Duc Huynh (Kaka)", 13 | "avatar_url": "https://avatars.githubusercontent.com/u/870029?v=4", 14 | "profile": "https://productsway.com/", 15 | "contributions": [ 16 | "doc", 17 | "code" 18 | ] 19 | }, 20 | { 21 | "login": "tomholford", 22 | "name": "tomholford", 23 | "avatar_url": "https://avatars.githubusercontent.com/u/16504501?v=4", 24 | "profile": "https://tholf.org/", 25 | "contributions": [ 26 | "doc" 27 | ] 28 | } 29 | ], 30 | "contributorsPerLine": 7, 31 | "skipCi": true, 32 | "repoType": "github", 33 | "repoHost": "https://github.com", 34 | "projectName": "nft-app", 35 | "projectOwner": "jellydn" 36 | } 37 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | ETHERSCAN_API_KEY=ABC123ABC123ABC123ABC123ABC123ABC1 2 | ROPSTEN_PROVIDER_URL=https://eth-ropsten.alchemyapi.io/v2/ 3 | PRIVATE_KEY= 4 | OWNER_ADDRESS= 5 | NFT_STORAGE_KEY= 6 | VITE_NFT_DEPLOYED_ADDRESS= 7 | VITE_CHAIN_ID= 8 | VITE_API_URL=YOUR_API_URL -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | artifacts 3 | cache 4 | coverage 5 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | mocha: true, 6 | node: true, 7 | }, 8 | extends: ["productsway/react"], 9 | ignorePatterns: ["dist", ".eslintrc.js", "vite.config.ts"], 10 | parserOptions: { 11 | project: ["./tsconfig.json"], 12 | }, 13 | overrides: [ 14 | { 15 | files: ["hardhat.config.js"], 16 | globals: { task: true }, 17 | }, 18 | { 19 | files: ["scripts/**"], 20 | rules: { "no-process-exit": "off" }, 21 | }, 22 | { 23 | files: ["hardhat.config.js", "scripts/**", "test/**"], 24 | rules: { "node/no-unpublished-require": "off" }, 25 | }, 26 | ], 27 | }; 28 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [jellydn] 2 | ko_fi: dunghd 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | 7 | node_modules 8 | .env 9 | 10 | #Hardhat files 11 | cache 12 | artifacts 13 | 14 | coverage 15 | .eslintcache 16 | .openzeppelin/*.json 17 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | yarn test 2 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | lts/* 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | artifacts 3 | cache 4 | coverage* 5 | gasReporterOutput.json 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "importOrder": [ 4 | "^@server/(.*)$", 5 | "^@core/(.*)$", 6 | "^@ui/(.*)$", 7 | "^[./]" 8 | ], 9 | "importOrderSeparation": true, 10 | "overrides": [ 11 | { 12 | "files": "*.sol", 13 | "options": { 14 | "printWidth": 80, 15 | "tabWidth": 4, 16 | "useTabs": true, 17 | "singleQuote": false, 18 | "bracketSpacing": true, 19 | "explicitTypes": "always" 20 | } 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /.solhint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "solhint:recommended", 3 | "rules": { 4 | "compiler-version": ["error", "^0.8.0"], 5 | "func-visibility": ["warn", { "ignoreConstructors": true }] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.solhintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.yarn/install-state.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/.yarn/install-state.gz -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Huynh Duc Dung 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: npm serve 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Welcome to nft-app 👋 2 | 3 | [![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) 4 | 5 | 6 | ![Version](https://img.shields.io/badge/version-0.0.1-blue.svg?cacheSeconds=2592000) 7 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](#) 8 | [![Twitter: jellydn](https://img.shields.io/twitter/follow/jellydn.svg?style=social)](https://twitter.com/jellydn) 9 | 10 | > How to create your own NFT token 11 | 12 | ## 🏠 [Homepage](https://nft-app.productsway.com) 13 | 14 | [![Blockchain - DApp 101 - Create your own NFT token](https://img.youtube.com/vi/_veIZBaHkSk/0.jpg)](https://www.youtube.com/watch?v=_veIZBaHkSk) 15 | 16 | [![Blockchain - DApp 101 - Mint a NFT token](https://img.youtube.com/vi/UWJJa1hAYlo/0.jpg)](https://www.youtube.com/watch?v=UWJJa1hAYlo) 17 | 18 | ## ✨ [Demo](https://nft-app.productsway.com/) 19 | 20 | ![https://gyazo.com/fccacc5f480839196343bf95728c9b6a.gif](https://gyazo.com/fccacc5f480839196343bf95728c9b6a.gif) 21 | 22 | ## Screenshot 23 | 24 | ![screenshot1.png](./screenshot1.png) 25 | 26 | ![screenshot2.png](./screenshot2.png) 27 | 28 | ## Features 29 | 30 | - ⚡️ React TypeScript template with [Vite 5](https://vitejs.dev/) 31 | - 📦 [Hardhat](https://hardhat.org/) - Ethereum development environment for professionals 32 | - 🦾 [TypeChain Hardhat plugin](https://github.com/ethereum-ts/TypeChain/tree/master/packages/hardhat) - Automatically generate TypeScript bindings for smartcontracts while using Hardhat. 33 | - 🔥 [web3-react](https://github.com/NoahZinsmeister/web3-react/) - A simple, maximally extensible, dependency minimized framework for building modern Ethereum dApps 34 | - 🎨 [daisyUI Tailwind CSS Components](https://daisyui.com/) - clean HTML with component classes 35 | - 🎨 [OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/) - standard for secure blockchain applications 36 | 37 | ## Install 38 | 39 | ```sh 40 | yarn install 41 | ``` 42 | 43 | ## Usage 44 | 45 | ### Run Web App 46 | 47 | ```sh 48 | # Prepare .env file 49 | # Run web site 50 | cp .env.example .env 51 | npx hardhat compile --network localhost 52 | yarn dev 53 | 54 | ``` 55 | 56 | ### Run API App 57 | 58 | ```sh 59 | # Prepare .env file 60 | # Run web site 61 | cd server 62 | cp .env.example .env 63 | yarn install 64 | yarn dev 65 | 66 | ``` 67 | 68 | ## Run tests 69 | 70 | ```sh 71 | yarn test 72 | ``` 73 | 74 | ## Deploy NFT to Rinkeby 75 | 76 | - Sign up and earn [$100 in credit](https://alchemy.com/?r=9ae3d9f1-56c4-476e-9f7e-23387e0e166a) on alchemy. More detail [here](https://docs.alchemy.com/alchemy/introduction/referral-program). 77 | 78 | - Send some ETH to your wallet https://faucet.dimensions.network/ 79 | 80 | This example, we will deploy to Rinkeby network. If you do not have `hardhat` [shorthand](https://hardhat.org/guides/shorthand.html), then please run 81 | 82 | ```sh 83 | npm i -g hardhat-shorthand 84 | hardhat-completion install 85 | ``` 86 | 87 | 1.Deploy MyAwesomeLogo to Rinkeby 88 | 89 | ```sh 90 | hh run scripts/deploy.ts --network rinkeby 91 | ``` 92 | 93 | Output: 94 | 95 | ```sh 96 | Generating typings for: 0 artifacts in dir: src/types for target: ethers-v5 97 | Successfully generated 3 typings! 98 | Successfully generated 3 typings for external artifacts! 99 | MyAwesomeLogo deployed to: 0x39a5079afE9F3e3bB4db1B943e2063AC3dc87251 100 | owner 0x096cd10D7BEF8D5923b18b18E9f79CA230ee2285 101 | ``` 102 | 103 | 2. Mint some NFT tokens 104 | 105 | ```sh 106 | hh run scripts/mint.ts --network rinkeby 107 | ``` 108 | 109 | Output: 110 | 111 | ```sh 112 | Generating typings for: 0 artifacts in dir: src/types for target: ethers-v5 113 | Successfully generated 3 typings! 114 | Successfully generated 3 typings for external artifacts! 115 | MyAwesomeLogo deployed to: 0x39a5079afE9F3e3bB4db1B943e2063AC3dc87251 116 | Name MyAwesomeLogo 117 | Symbol MAL 118 | Uploaded file to nft storage Token { 119 | ipnft: 'bafyreib22oziqft7cbakshc374mwctwiprzyj24ufpeogkjff3lroumcru', 120 | url: 'ipfs://bafyreib22oziqft7cbakshc374mwctwiprzyj24ufpeogkjff3lroumcru/metadata.json' 121 | } 122 | Minted NFT 0x0aad3903cb8d11f095babdc7ba47963ad6235b0a3cd5d32ee42560798816235a 123 | Uploaded file to nft storage Token { 124 | ipnft: 'bafyreid3gvwkltwkgvpxur3eozuh6dirfg2ohqizhn4rpn764dji272aoe', 125 | url: 'ipfs://bafyreid3gvwkltwkgvpxur3eozuh6dirfg2ohqizhn4rpn764dji272aoe/metadata.json' 126 | } 127 | Minted NFT 0xe1ed7be02639310cf101b495e55d27421be018cc12cd90d1f46547c627b5132c 128 | Uploaded file to nft storage Token { 129 | ipnft: 'bafyreieealfw66zppxhkivuti5qkmsuihjxgxgrxdfm2o5p4qna5l347bu', 130 | url: 'ipfs://bafyreieealfw66zppxhkivuti5qkmsuihjxgxgrxdfm2o5p4qna5l347bu/metadata.json' 131 | } 132 | Minted NFT 0x183af6b95464305aa5f9f0ed97a5b8847bd168bbb28e3f6368d04662a44cb8fc 133 | ``` 134 | 135 | 3.Verify with etherscan.io 136 | 137 | ```sh 138 | hh verify --network rinkeby 0x39a5079afE9F3e3bB4db1B943e2063AC3dc87251 139 | ``` 140 | 141 | Output: 142 | 143 | ```sh 144 | Nothing to compile 145 | Generating typings for: 0 artifacts in dir: src/types for target: ethers-v5 146 | Successfully generated 3 typings! 147 | Successfully generated 3 typings for external artifacts! 148 | Compiling 1 file with 0.8.4 149 | Successfully submitted source code for contract 150 | contracts/MyAwesomeLogo.sol:MyAwesomeLogo at 0x39a5079afE9F3e3bB4db1B943e2063AC3dc87251 151 | for verification on Etherscan. Waiting for verification result... 152 | 153 | Successfully verified contract MyAwesomeLogo on Etherscan. 154 | https://rinkeby.etherscan.io/address/0x39a5079afE9F3e3bB4db1B943e2063AC3dc87251#code 155 | ``` 156 | 157 | ## Hardhat guideline 158 | 159 | This project demonstrates an advanced Hardhat use case, integrating other tools commonly used alongside Hardhat in the ecosystem. 160 | 161 | The project comes with a sample contract, a test for that contract, a sample script that deploys that contract, and an example of a task implementation, which simply lists the available accounts. It also comes with a variety of other tools, preconfigured to work with the project code. 162 | 163 | Try running some of the following tasks: 164 | 165 | ```shell 166 | npx hardhat accounts 167 | npx hardhat compile --network localhost 168 | npx hardhat clean 169 | npx hardhat test 170 | npx hardhat node 171 | npx hardhat help 172 | REPORT_GAS=true npx hardhat test 173 | npx hardhat coverage 174 | npx hardhat run scripts/deploy_greeter.js --network localhost 175 | node scripts/deploy.js 176 | npx eslint '**/*.js' 177 | npx eslint '**/*.js' --fix 178 | npx prettier '**/*.{json,sol,md}' --check 179 | npx prettier '**/*.{json,sol,md}' --write 180 | npx solhint 'contracts/**/*.sol' 181 | npx solhint 'contracts/**/*.sol' --fix 182 | ``` 183 | 184 | ## Etherscan verification 185 | 186 | To try out Etherscan verification, you first need to deploy a contract to an Ethereum network that's supported by Etherscan, such as Ropsten. 187 | 188 | In this project, copy the .env.example file to a file named .env, and then edit it to fill in the details. Enter your Etherscan API key, your Ropsten node URL (eg from Alchemy), and the private key of the account which will send the deployment transaction. With a valid .env file in place, first deploy your contract: 189 | 190 | ```shell 191 | npx hardhat run --network ropsten scripts/deploy_greeter.js 192 | ``` 193 | 194 | Then, copy the deployment address and paste it in to replace `DEPLOYED_CONTRACT_ADDRESS` in this command: 195 | 196 | ```shell 197 | npx hardhat verify --network ropsten DEPLOYED_CONTRACT_ADDRESS "Hello, Hardhat!" 198 | ``` 199 | 200 | ## Contract upgrade 201 | 202 | OpenZeppelin provides tooling for deploying and securing [upgradeable smart contracts](https://docs.openzeppelin.com/learn/upgrading-smart-contracts). 203 | 204 | Smart contracts deployed using OpenZeppelin Upgrades Plugins can be upgraded to modify their code, while preserving their address, state, and balance. This allows you to iteratively add new features to your project, or fix any bugs you may find in production. 205 | 206 | In this project, there are a 2 versions of contract: Box and BoxV2 which is improvement of Box. First deploy your contract: 207 | 208 | ```shell 209 | npx hardhat run --network localhost scripts/deploy_upgradeable_box.js 210 | ``` 211 | 212 | Then, deploy the upgrade smart contract 213 | 214 | ```shell 215 | npx hardhat run --network localhost scripts/upgrade_box.js 216 | ``` 217 | 218 | ## Examples 219 | 220 | - [Simple Store App](https://github.com/jellydn/nft-app/pull/20): counter-like smart contract, read/write value and listen to event from smart contract. 221 | - [ICO Token App](https://github.com/jellydn/dapp-token-ico): How to create An ERC20 token and implement ICO smart contract (CrowdSale). 222 | 223 | ## One click deployment 224 | 225 | [![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/new/template/6ZY4MT?referralCode=-GINmA) 226 | 227 | ## Author 228 | 229 | 👤 **Dung Huynh** 230 | 231 | - Website: https://productsway.com/ 232 | - Twitter: [@jellydn](https://twitter.com/jellydn) 233 | - Github: [@jellydn](https://github.com/jellydn) 234 | 235 | ## Stargazers 🌟 236 | 237 | [![kofi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/dunghd) 238 | [![paypal](https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white)](https://paypal.me/dunghd) 239 | [![buymeacoffee](https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/dunghd) 240 | 241 | [![Stargazers repo roster for jellydn/nft-app](https://reporoster.com/stars/jellydn/nft-app)](https://github.com/jellydn/nft-app/stargazers) 242 | 243 | ## Show your support 244 | 245 | Give a ⭐️ if this project helped you! 246 | 247 | ## Contributors ✨ 248 | 249 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 |
Dung Duc Huynh (Kaka)
Dung Duc Huynh (Kaka)

📖 💻
tomholford
tomholford

📖
262 | 263 | 264 | 265 | 266 | 267 | 268 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 269 | -------------------------------------------------------------------------------- /contracts/MyAwesomeLogo.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.2; 3 | 4 | import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; 5 | import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; 6 | import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; 7 | import "@openzeppelin/contracts/access/Ownable.sol"; 8 | import "@openzeppelin/contracts/utils/Counters.sol"; 9 | 10 | contract MyAwesomeLogo is ERC721, ERC721URIStorage, ERC721Burnable, Ownable { 11 | using Counters for Counters.Counter; 12 | 13 | Counters.Counter private _tokenIdCounter; 14 | 15 | constructor() ERC721("MyAwesomeLogo", "MAL") {} 16 | 17 | function safeMint(address to, string memory nftTokenURI) public onlyOwner { 18 | _safeMint(to, _tokenIdCounter.current()); 19 | _setTokenURI(_tokenIdCounter.current(), nftTokenURI); 20 | _tokenIdCounter.increment(); 21 | } 22 | 23 | // The following functions are overrides required by Solidity. 24 | function _burn( 25 | uint256 tokenId 26 | ) internal override(ERC721, ERC721URIStorage) { 27 | super._burn(tokenId); 28 | } 29 | 30 | function tokenURI( 31 | uint256 tokenId 32 | ) public view override(ERC721, ERC721URIStorage) returns (string memory) { 33 | return super.tokenURI(tokenId); 34 | } 35 | 36 | function supportsInterface( 37 | bytes4 interfaceId 38 | ) public view override(ERC721, ERC721URIStorage) returns (bool) { 39 | return super.supportsInterface(interfaceId); 40 | } 41 | 42 | function currentCounter() public view returns (uint256) { 43 | return _tokenIdCounter.current(); 44 | } 45 | 46 | function freeMint(address to, string memory nftTokenURI) public { 47 | _safeMint(to, _tokenIdCounter.current()); 48 | _setTokenURI(_tokenIdCounter.current(), nftTokenURI); 49 | _tokenIdCounter.increment(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /coverage.json: -------------------------------------------------------------------------------- 1 | {"contracts/Box.sol":{"l":{"12":1,"13":1,"18":2},"path":"/Users/huynhducdung/Projects/dapp-starter/contracts/Box.sol","s":{"1":1,"2":1,"3":2},"b":{},"f":{"1":1,"2":2},"fnMap":{"1":{"name":"store","line":11,"loc":{"start":{"line":11,"column":4},"end":{"line":14,"column":4}}},"2":{"name":"retrieve","line":17,"loc":{"start":{"line":17,"column":4},"end":{"line":19,"column":4}}}},"statementMap":{"1":{"start":{"line":12,"column":8},"end":{"line":12,"column":21}},"2":{"start":{"line":13,"column":8},"end":{"line":13,"column":32}},"3":{"start":{"line":18,"column":8},"end":{"line":18,"column":21}}},"branchMap":{}},"contracts/BoxV2.sol":{"l":{"12":1,"13":1,"18":4,"23":1,"24":1},"path":"/Users/huynhducdung/Projects/dapp-starter/contracts/BoxV2.sol","s":{"1":1,"2":1,"3":4,"4":1,"5":1},"b":{},"f":{"1":1,"2":4,"3":1},"fnMap":{"1":{"name":"store","line":11,"loc":{"start":{"line":11,"column":4},"end":{"line":14,"column":4}}},"2":{"name":"retrieve","line":17,"loc":{"start":{"line":17,"column":4},"end":{"line":19,"column":4}}},"3":{"name":"increment","line":22,"loc":{"start":{"line":22,"column":4},"end":{"line":25,"column":4}}}},"statementMap":{"1":{"start":{"line":12,"column":8},"end":{"line":12,"column":21}},"2":{"start":{"line":13,"column":8},"end":{"line":13,"column":32}},"3":{"start":{"line":18,"column":8},"end":{"line":18,"column":21}},"4":{"start":{"line":23,"column":8},"end":{"line":23,"column":26}},"5":{"start":{"line":24,"column":8},"end":{"line":24,"column":33}}},"branchMap":{}},"contracts/Greeter.sol":{"l":{"10":3,"11":3,"15":2,"19":1,"20":1},"path":"/Users/huynhducdung/Projects/dapp-starter/contracts/Greeter.sol","s":{"1":3,"2":3,"3":2,"4":1,"5":1},"b":{},"f":{"1":3,"2":2,"3":1},"fnMap":{"1":{"name":"constructor","line":9,"loc":{"start":{"line":9,"column":4},"end":{"line":12,"column":4}}},"2":{"name":"greet","line":14,"loc":{"start":{"line":14,"column":4},"end":{"line":16,"column":4}}},"3":{"name":"setGreeting","line":18,"loc":{"start":{"line":18,"column":4},"end":{"line":21,"column":4}}}},"statementMap":{"1":{"start":{"line":10,"column":8},"end":{"line":10,"column":67}},"2":{"start":{"line":11,"column":8},"end":{"line":11,"column":27}},"3":{"start":{"line":15,"column":8},"end":{"line":15,"column":23}},"4":{"start":{"line":19,"column":8},"end":{"line":19,"column":78}},"5":{"start":{"line":20,"column":8},"end":{"line":20,"column":27}}},"branchMap":{}}} -------------------------------------------------------------------------------- /cspell.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", 3 | "version": "0.2", 4 | "language": "en", 5 | "globRoot": ".", 6 | "dictionaryDefinitions": [ 7 | { 8 | "name": "nft-app", 9 | "path": "./nft-app.txt", 10 | "addWords": true 11 | } 12 | ], 13 | "dictionaries": [ 14 | "nft-app" 15 | ], 16 | "ignorePaths": [ 17 | "node_modules", 18 | "dist", 19 | "build", 20 | "/nft-app.txt" 21 | ] 22 | } -------------------------------------------------------------------------------- /graph/Box.dot: -------------------------------------------------------------------------------- 1 | strict digraph { 2 | store 3 | ValueChanged 4 | retrieve [color=yellow] 5 | store -> ValueChanged 6 | } -------------------------------------------------------------------------------- /graph/BoxV2.dot: -------------------------------------------------------------------------------- 1 | strict digraph { 2 | store 3 | ValueChanged 4 | retrieve [color=yellow] 5 | increment 6 | store -> ValueChanged 7 | increment -> ValueChanged 8 | } 9 | -------------------------------------------------------------------------------- /graph/Greeter.dot: -------------------------------------------------------------------------------- 1 | strict digraph { 2 | constructor 3 | log 4 | greet [color=yellow] 5 | setGreeting 6 | constructor -> log 7 | setGreeting -> log 8 | } -------------------------------------------------------------------------------- /graph/ITManToken.dot: -------------------------------------------------------------------------------- 1 | strict digraph { 2 | initialize 3 | __ERC20_init 4 | __Ownable_init 5 | __UUPSUpgradeable_init 6 | _authorizeUpgrade [color=gray] 7 | initialize -> __ERC20_init 8 | initialize -> __Ownable_init 9 | initialize -> __UUPSUpgradeable_init 10 | } -------------------------------------------------------------------------------- /hardhat.config.ts: -------------------------------------------------------------------------------- 1 | import "@nomiclabs/hardhat-ethers"; 2 | import "@nomiclabs/hardhat-etherscan"; 3 | import "@nomiclabs/hardhat-waffle"; 4 | import "@openzeppelin/hardhat-upgrades"; 5 | import "@typechain/hardhat"; 6 | import { config } from "dotenv"; 7 | import { readFileSync } from "fs"; 8 | import "hardhat-gas-reporter"; 9 | import { task } from "hardhat/config"; 10 | import { File, NFTStorage } from "nft.storage"; 11 | import { join } from "path"; 12 | import "solidity-coverage"; 13 | 14 | config(); 15 | 16 | // This is a sample Hardhat task. To learn how to create your own go to 17 | // https://hardhat.org/guides/create-task.html 18 | task("accounts", "Prints the list of accounts", async (taskArgs, hre) => { 19 | const accounts = await hre.ethers.getSigners(); 20 | 21 | // eslint-disable-next-line no-restricted-syntax 22 | for (const account of accounts) { 23 | console.log(account.address); 24 | } 25 | }); 26 | 27 | // Mint a nft token 28 | task("mint", "Mint a NFT token") 29 | .addParam("contract", "Contract address") 30 | .addParam("owner", "Owner address") 31 | .addParam("file", "FIle path") 32 | .addParam("name", "File name") 33 | .addParam("description", "File description") 34 | .setAction(async (taskArgs, hre) => { 35 | const { contract, owner, file, name, description } = taskArgs; 36 | console.log(`Minting NFT token for contract ${contract}`); 37 | console.log(`Owner: ${owner}`); 38 | console.log(`File: ${file}`); 39 | console.log(`Name: ${name}`); 40 | console.log(`Description: ${description}`); 41 | const token = await hre.ethers.getContractAt("MyAwesomeLogo", contract); 42 | 43 | // upload file 44 | const apiKey = process.env.NFT_STORAGE_KEY || ""; 45 | const client = new NFTStorage({ token: apiKey }); 46 | const metadata = await client.store({ 47 | name, 48 | description, 49 | image: new File([readFileSync(join(__dirname, file)).buffer], name, { 50 | type: "image/png", // image/png 51 | }), 52 | }); 53 | console.log("Uploaded file to nft storage", metadata); 54 | 55 | // mint a token 56 | const tx = await token.safeMint(owner, metadata.url); 57 | const { blockHash } = await tx.wait(); 58 | console.log("Minted NFT", blockHash); 59 | }); 60 | 61 | // You need to export an object to set up your config 62 | // Go to https://hardhat.org/config/ to learn more 63 | 64 | /** 65 | * @type import('hardhat/config').HardhatUserConfig 66 | */ 67 | export default { 68 | solidity: "0.8.4", 69 | paths: { 70 | artifacts: "./src/artifacts", 71 | }, 72 | typechain: { 73 | outDir: "src/types", 74 | target: "ethers-v5", 75 | }, 76 | networks: { 77 | hardhat: { 78 | chainId: 1337, 79 | initialBaseFeePerGas: 0, // workaround from https://github.com/sc-forks/solidity-coverage/issues/652#issuecomment-896330136 . Remove when that issue is closed. 80 | }, 81 | tomotestnet: { 82 | chainId: 89, 83 | url: process.env.TOMO_PROVIDER_URL || "https://rpc.testnet.tomochain.com", 84 | accounts: process.env.PRIVATE_KEY !== undefined 85 | ? [process.env.PRIVATE_KEY] 86 | : [], 87 | }, 88 | matictestnet: { 89 | chainId: 80001, 90 | url: process.env.MATIC_PROVIDER_URL || 91 | "https://speedy-nodes-nyc.moralis.io/036063875a28828fa0c00596/polygon/mumbai", 92 | accounts: process.env.PRIVATE_KEY !== undefined 93 | ? [process.env.PRIVATE_KEY] 94 | : [], 95 | }, 96 | bsctestnet: { 97 | chainId: 97, 98 | url: process.env.BSC_PROVIDER_URL || 99 | "https://speedy-nodes-nyc.moralis.io/036063875a28828fa0c00596/bsc/testnet", 100 | accounts: process.env.PRIVATE_KEY !== undefined 101 | ? [process.env.PRIVATE_KEY] 102 | : [], 103 | }, 104 | }, 105 | gasReporter: { 106 | enabled: process.env.REPORT_GAS !== undefined, 107 | currency: "USD", 108 | }, 109 | etherscan: { 110 | apiKey: process.env.ETHERSCAN_API_KEY, 111 | }, 112 | }; 113 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | NFT App 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /nft-app.txt: -------------------------------------------------------------------------------- 1 | huynhdung 2 | IERC 3 | delegatecall 4 | huynhducdung 5 | nomiclabs 6 | typechain 7 | tomotestnet 8 | TOMO 9 | matictestnet 10 | bsctestnet 11 | solhint 12 | rustywind 13 | walletconnect 14 | daisyui 15 | loglevel 16 | trivago 17 | productsway 18 | solgraph 19 | jellydn 20 | smartcontracts 21 | ipnft 22 | bafyreib 23 | oziqft 24 | cbakshc 25 | mwctwiprzyj 26 | ufpeogkjff 27 | lroumcru 28 | ipfs 29 | bafyreid 30 | gvwkltwkgvpxur 31 | eozuh 32 | dirfg 33 | ohqizhn 34 | bafyreieealfw 35 | zppxhkivuti 36 | qkmsuihjxgxgrxdfm 37 | preconfigured 38 | Huynh 39 | kofi 40 | buymeacoffee 41 | automerge 42 | tsup 43 | fastify 44 | autoload 45 | typebox 46 | Autoload 47 | Fastify 48 | formdata 49 | retval 50 | mload 51 | adoc 52 | mixedcase 53 | reentrancy 54 | SELFDESTRUCT 55 | composability 56 | Reentrancy 57 | returndata 58 | staticcall 59 | Condon 60 | Remco 61 | Bloemen 62 | mulmod 63 | Raphson 64 | Hensel's 65 | mstore 66 | checksummed 67 | keccak 68 | stringliteral 69 | metatype 70 | abiencodepacked 71 | barecall 72 | barestaticcall 73 | baredelegatecall 74 | objectcreation 75 | devdoc 76 | userdoc 77 | remappings 78 | dweb 79 | PHXMS 80 | Yvvrz 81 | Kkgsgn 82 | aake 83 | inplace 84 | Qmbh 85 | Azctqo 86 | Vyqfmz 87 | Pvmx 88 | Qmaf 89 | oqbxxd 90 | XEAVM 91 | Qmbzg 92 | Fjshqb 93 | huzx 94 | Qdmw 95 | Xvyqt 96 | wmsp 97 | iszero 98 | ptrt 99 | MSTORE 100 | CALLVALUE 101 | ISZERO 102 | JUMPI 103 | JUMPDEST 104 | MLOAD 105 | CODESIZE 106 | CODECOPY 107 | SLOAD 108 | KECCAK 109 | SSTORE 110 | CALLDATASIZE 111 | CALLDATALOAD 112 | CALLDATACOPY 113 | RETURNDATASIZE 114 | RETURNDATACOPY 115 | ADDMOD 116 | calldataload 117 | addresst 118 | ccbde 119 | cfeb 120 | fbde 121 | eede 122 | eeef 123 | calldatacopy 124 | owne 125 | ceiver 126 | ress 127 | Xkcv 128 | PCXP 129 | Aykx 130 | Vsddf 131 | Lfoqui 132 | Htvbg 133 | TJNPSVPS 134 | Cjrtj 135 | Qmemujx 136 | Qfud 137 | Ugxwv 138 | Yjnj 139 | Ypuxurqve 140 | Htzs 141 | Jkyjro 142 | yipwfism 143 | Zptt 144 | Sgjwn 145 | JSKN 146 | RLPS 147 | Qggxi 148 | BBLV 149 | Wdkh 150 | Eysqypj 151 | XLWC 152 | LZWXZ 153 | noqx 154 | MULMOD 155 | Qmezu 156 | Zhoz 157 | Fekhq 158 | Cqhu 159 | DELEGATECALL 160 | STATICCALL 161 | CALLCODE 162 | baff 163 | ffbfcc 164 | ebdf 165 | effe 166 | ddress 167 | iznm 168 | ATXT 169 | ethersproject 170 | squircle 171 | sircleu 172 | Blockhash 173 | Numberish 174 | Typechain -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nft-app", 3 | "version": "0.1.0", 4 | "scripts": { 5 | "build": "npx hardhat compile --network localhost && tsc && vite build", 6 | "dev": "vite", 7 | "lint:sol": "npx solhint 'contracts/**/*.sol'", 8 | "prepare": "husky", 9 | "serve": "vite preview", 10 | "test": "mocha --exit --recursive" 11 | }, 12 | "lint-staged": { 13 | "*.js": "eslint --cache --fix", 14 | "*.{js,css,md}": "prettier --write", 15 | "*.{tsx,jsx}": "rustywind --write", 16 | "package.json": "sort-package-json" 17 | }, 18 | "dependencies": { 19 | "@hookform/devtools": "4.4.0", 20 | "@tailwindcss/typography": "0.5.16", 21 | "@web3-react/core": "6.1.9", 22 | "@web3-react/injected-connector": "6.0.7", 23 | "@web3-react/network-connector": "6.2.9", 24 | "@web3-react/walletconnect-connector": "6.2.13", 25 | "daisyui": "5.0.21", 26 | "loglevel": "1.9.2", 27 | "nft.storage": "7.2.0", 28 | "react": "19.1.0", 29 | "react-dom": "19.1.0", 30 | "react-dropzone": "14.3.8", 31 | "react-hook-form": "7.55.0", 32 | "react-hot-toast": "2.5.2", 33 | "use-nft": "0.12.0", 34 | "web3-react": "5.0.5", 35 | "web3.storage": "4.5.5" 36 | }, 37 | "devDependencies": { 38 | "@nomiclabs/hardhat-ethers": "2.2.3", 39 | "@nomiclabs/hardhat-etherscan": "3.1.8", 40 | "@nomiclabs/hardhat-waffle": "2.0.6", 41 | "@openzeppelin/contracts": "4.9.6", 42 | "@openzeppelin/contracts-upgradeable": "4.9.6", 43 | "@openzeppelin/hardhat-upgrades": "1.28.0", 44 | "@tailwindcss/postcss": "4.1.4", 45 | "@trivago/prettier-plugin-sort-imports": "5.2.2", 46 | "@typechain/ethers-v5": "11.1.2", 47 | "@typechain/hardhat": "9.1.0", 48 | "@types/chai": "5.2.1", 49 | "@types/mocha": "10.0.10", 50 | "@types/node": "22.14.1", 51 | "@types/react": "19.1.2", 52 | "@types/react-dom": "19.1.2", 53 | "@typescript-eslint/eslint-plugin": "8.30.1", 54 | "@typescript-eslint/parser": "8.30.1", 55 | "@vitejs/plugin-react-refresh": "1.3.6", 56 | "chai": "5.2.0", 57 | "dotenv": "16.5.0", 58 | "eslint": "9.24.0", 59 | "eslint-config-productsway": "1.3.4", 60 | "ethereum-waffle": "4.0.10", 61 | "ethers": "5.8.0", 62 | "hardhat": "2.23.0", 63 | "hardhat-gas-reporter": "2.2.3", 64 | "husky": "9.1.7", 65 | "lint-staged": "15.5.1", 66 | "p-queue": "8.1.0", 67 | "postcss": "8.5.3", 68 | "prettier": "3.5.3", 69 | "prettier-plugin-solidity": "2.0.0", 70 | "rustywind": "0.24.0", 71 | "solgraph": "1.0.2", 72 | "solhint": "5.0.5", 73 | "solidity-coverage": "0.8.15", 74 | "sort-package-json": "3.0.0", 75 | "tailwindcss": "4.1.4", 76 | "ts-node": "10.9.2", 77 | "typechain": "8.3.2", 78 | "typescript": "5.8.3", 79 | "vite": "6.2.7" 80 | }, 81 | "packageManager": "yarn@1.22.22", 82 | "engines": { 83 | "node": ">=18.12.0" 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | '@tailwindcss/postcss': {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base", 4 | "group:allNonMajor", 5 | ":pinAllExceptPeerDependencies" 6 | ], 7 | "lockFileMaintenance": { 8 | "enabled": true 9 | }, 10 | "automerge": true, 11 | "major": { 12 | "automerge": false 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/screenshot1.png -------------------------------------------------------------------------------- /screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/screenshot2.png -------------------------------------------------------------------------------- /scripts/assets/set-1/1 Black Logo 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-1/1 Black Logo 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-1/1 Inverted Color 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-1/1 Inverted Color 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-1/1 Main Logo 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-1/1 Main Logo 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-1/1 White logo 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-1/1 White logo 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-2/1 Black Logo 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-2/1 Black Logo 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-2/1 Inverted Color 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-2/1 Inverted Color 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-2/1 Main Logo 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-2/1 Main Logo 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-2/1 White logo 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-2/1 White logo 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-3/1 Black Logo 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-3/1 Black Logo 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-3/1 Inverted Color 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-3/1 Inverted Color 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-3/1 Main Logo 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-3/1 Main Logo 800x600.png -------------------------------------------------------------------------------- /scripts/assets/set-3/1 White logo 800x600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jellydn/nft-app/6c431bd2da7634dd68c0bad628001d69db072fcc/scripts/assets/set-3/1 White logo 800x600.png -------------------------------------------------------------------------------- /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