{"id":20040006,"url":"https://github.com/carmhack/solidity-nft-onchain","last_synced_at":"2025-05-05T08:31:57.268Z","repository":{"id":113278580,"uuid":"490669657","full_name":"carmhack/solidity-nft-onchain","owner":"carmhack","description":null,"archived":false,"fork":false,"pushed_at":"2022-05-16T17:31:47.000Z","size":138,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-08T19:23:02.042Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/carmhack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-05-10T11:36:27.000Z","updated_at":"2022-06-14T12:45:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"4b372161-dde3-413e-bc5f-cd708cbbc55b","html_url":"https://github.com/carmhack/solidity-nft-onchain","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carmhack%2Fsolidity-nft-onchain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carmhack%2Fsolidity-nft-onchain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carmhack%2Fsolidity-nft-onchain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carmhack%2Fsolidity-nft-onchain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/carmhack","download_url":"https://codeload.github.com/carmhack/solidity-nft-onchain/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252466670,"owners_count":21752409,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T10:40:02.911Z","updated_at":"2025-05-05T08:31:57.250Z","avatar_url":"https://github.com/carmhack.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NFT con dati on-chain\nQuesto progetto ha lo scopo di mostrare la creazione di un **NFT** con **dati on-chain** sfruttando lo **standard ERC-721**.\n\nI dati sono on-chain perché sono all'interno del tokenURI dell'NFT che viene mintato. In questo modo non dobbiamo affidarci a servizi di terze parti per lo storage dell'NFT e sfruttiamo a pieno la decentralizzazione.\n### Smart Contract\nLo smart contract è di tipo `ERC721URIStorage`. Nel costruttore chiamiamo il costruttore della super classe (passando due parametri: il nome e il simbolo dei nostri NFT) e impostiamo `tokenId = 0`, che tiene il conto di quanti token sono stati mintati.\n\nIl core del contratto è il metodo `create`:\n```js\nfunction create(string memory _svg) public {\n    _safeMint(msg.sender, tokenId);\n    string memory imageURI = toImageURI(_svg);\n    _setTokenURI(tokenId, toTokenURI(imageURI));\n    tokenId = tokenId + 1;\n    emit CreatedMyNFT(tokenId, _svg);\n}\n```\n- `_safeMint` è il metodo che ereditiamo da `ERC721` ed è (dalla documentazione di OpenZeppelin) una \"internal function to safely mint a new token\";\n- `toImageURI` è un metodo del nostro contratto che serve a convertire il contenuto testuale di un file SVG in un URI in base 64. In parole povere, qualcosa da concatenare con la stringa `data:image/svg+xml;base64,`;\n- `toTokenURI` genera un JSON in base 64 che viene impostato come `tokenURI` dell'NFT appena mintato. Viene infatti usato quando chiamiamo `_setTokenURI`.\n### Configurazione\n**Premessa**: per l'esecuzione dello smart contract hai bisogno di un `wallet MetaMask`. Ricordati di settare la rete di test Rinkeby (o quella che preferisci). Per avere ether a disposizione puoi usare qualsiasi faucet Rinkeby disponibile online.\n\n1. Clona la repository\n2. `npm install`\n3. Crea un file `.env` in cui impostare le variabili d'ambiente:\n    - **RINKEBY_URL** (serve per deploy su rinkeby): *crea un account su Alchemy =\u003e nuovo progetto =\u003e imposta rinkeby come rete di test =\u003e copia HTTP URL*\n    - **MNEMONIC** (serve per deploy non in locale): *frase mnemonica di MetaMask*\n    - **ETHERSCAN_API_KEY**: *registrati su etherscan =\u003e impostazioni =\u003e copia API KEY*\n4. Compila lo smart contract\n5. Deploy\n\n### Compilazione \u0026 Deploy\nPer compilare: `npx hardhat compile`\n\nLo script `deploy-nft.js` effettua il deploy del contratto, la verifica e il mint di un NFT basato sul file `flag.svg` nella cartella `img`.\nPer eseguire il deploy:\n- (localhost) `npx hardhat deploy`\n- (rinkeby) `npx hardhat deploy --network rinkeby`\n\nAl termine, nel terminale avrai un log di questo tipo\n`tokenURI: data:application/json;base64,eyJuYW1lIjogIkZsYWdneU5GVCIsImRlc2NyaXB0aW9u[...]rQ2p3dmMzWm5QZ289In0=\n`\n\nProva a copiarlo sulla barra degli indirizzi del browser e dovresti visualizzare qualcosa del genere: \n```json\n{\n    \"name\": \"FlaggyNFT\",\n    \"description\": \"On-chain flag NFT\",\n    \"attributes\": \"\",\n    \"image\": \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZG[...]BQUFBRWxGVGtTdVFtQ0MiIC8+Cjwvc3ZnPgo=\"\n}\n```\n\nPuoi provare anche ad estrapolare solo il valore di `image` e copiarlo sulla barra degli indirizzi del browser, dovresti visualizzare proprio il tuo NFT :)\n\n### Buon divertimento!","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarmhack%2Fsolidity-nft-onchain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarmhack%2Fsolidity-nft-onchain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarmhack%2Fsolidity-nft-onchain/lists"}