In una prima fase di studio, sono andato ad approfondire come riportato nella cartella "Introduzione a Solidity" (https://github.com/chiesa/Introduzione-a-Solidity). Sono poi proseguito con i seguenti codici/progettini:
E' un contratto elementare che permette il salvataggio di alcuni dati: un numero favorito e array di persone composte dal nome e numero favorito
Il contratto è un esempio di SimpleStorage e con questo si pone override della funzione store alla quale si somma 5 al numero che si sta salvando.
Un altro contratto molto semplice in cui, a seguito dell'importazione di SimpleStorage.sol (import './SimpleStorage.sol') si crea e gestisce un array di SimpleStorage.
Il contratto permette di recuperare il prezzo di ETH (etherium) e conventire un amount di ETH in USD, grazie alle librerie di chainlink.
Il contratto permette di inviare soldi all'owner del contratto per finanziarlo in qualche attività. I prezzi sono convertiti in dollari utilizzando il contratto PriceConvertor.sol .
Esempio elementare di un contratto fallback con le funzioni fallback() e recieve().
Nella cartella ether-simple-storage, si riprende il contratto SimpleStorage.sol e si fa un deploy si una rete locale Ganache. Dove si inizia a studiare l'utilizzo della libreria ethersJS.
Nella cartella Hardhat_Deploy è presente un contratto e viene utilizzato il tool Hardhat. Il contratto è un contratto standard e si studia il processo di deploy dei file in reti di test (nell'esempio la rete Goerli) e nella mainnet utilizzando JS e Jnode.
Un'introduzione delle funzionalità di HardHat con l'utilizzo del contratto FundMe.sol
Il programma crea una piccola interfaccia HTML al contratto FundMe precedentemente creato (nel mio caso lanciata tramite il server di VS)
Creiamo un contratto lotteria nel quale è possibile comprare ticket e partecipare a una lotteria. Il vincitore ottiene tutti i soldi nel contratto.
In nextJS viene creato un frontend minimale per il backend contenente il contratto backend. (caricata sia localmente su IPFS che su fleek) In repo: https://github.com/chiesa/Lottery-FontEnd-NextJS-SmartContract
Il contratto è uno studio dei processi di encode e decode passando per la libreria abi, cifrando in base64 e linguaggio macchina di EVM (www.evm.codes)
Il contratto ha l'obiettivo di studiare il funzionamento della funzione call. In particolare vogliamo popolare i parametri e inviare una funzione. Per far questo usiamo le parole chiavi di basso livello: call, staticcall e send. Il programma anzalizza call: come chiamare una funzione avendo un cambio nello stato della blockchain. Per chiamare una funzione usando solo i parametri di call, abbiamo bisogno di cifrare il nome della funzione e i paramtrei in linguaggio EVM. In particolare vogliamo:
- "function signature" si tratta della stringa che contine il nome della funzione e i parametri (es. "transfer(address,uint256"))
- "function selector" cioè i primi 4 byte della function signature dopo l'encode in EVM (es. 0xa9059cbb) In oltre, nel contratto "CallFunctionWithoutContract" si analizza un come questo contratto possa modificare i parametri di un altro contratto (nel caso specifico "call"). Per farlo funzionare: fare deploy del contratto "callAnything", passare come parametro nella fase di deploy di "CallFunctionWithoutContract" l'indirizzo di call.
Nella cartella NFT_hardhat vi è uno studio di differenti forme di NFT con differenti possibilità di creazione in IPFS e di deploy. In particolare nel si stanno sviluppando e facendo i deploy per tre differenti casi:
- NFT Base: si studia un caso base di NFT, dopo la creazione del NFT su IPFS con l'immagine sul localhost, viene fatto il deploy del contratto sulla testnet goerli.
- IPFS Random: si definisce come creare una collezione di NFT con un assegnazione randomica delle immagini e del livello di rarità a seguito di un mint.
- SVG NFT: questo sistema dovrebbe permettere di salvare tutto direttamente on-chain nello smart contract. All'interno del link del tokenURi, viene inserito un json codificato che permette di recuperare i dati svg necessari alla visualizzazione delle immagini. Non caricato in testnet
Nella cartella NFT_marketplace è presente un progetto fullstack per la creazione di un marketplace elementare. Lo smartcontract/backend si trova al seguente link: https://github.com/chiesa/NFTmarketplace_Backend Qui è possibile trovare il front-end: https://github.com/chiesa/NFTMarketplace_FrontEnd E qui le configurazioni di TheGraph: https://github.com/chiesa/NFTMarketplace_FrontEnd
(https://docs.soliditylang.org/en/v0.8.16/style-guide.html) Viene definito il seguente ordine in uno script solidity:
- Pragma statements
- Import statements
- Interfaces
- Libraries
- Contracts All'interno del contratto l'ordine invece è il seguente:
- Type declarations
- State variables
- Events
- Modifiers
- Functions
Si è ripetuto diverse volte il seguente messaggio di errore: TypeError: Cannot read properties of undefined (reading 'getContract') o su altre funzione di ethers. La soluzione risulta essere l'aggiunta di require("@nomiclabs/hardhat-ethers"); in hardhat.config.js
Un altro errore frequente è quello di non trovare il contratto deployato in mock. Per questo bisogna mettere in ordine alfabetico i file di deploy con prima quelli che contengono il deploy di contratti che vengono usati successivamente (come Mock)
at VRFCoordinatorV2Mock.onlyValidConsumer (@chainlink/contracts/src/v0.8/mocks/VRFCoordinatorV2Mock.sol:72)
at VRFCoordinatorV2Mock.requestRandomWords (@chainlink/contracts/src/v0.8/mocks/VRFCoordinatorV2Mock.sol:147)
``` soluzione: yarn add --dev @chainlink/[email protected]