Avant de commencer, vous pouvez repartir du code développé hier.
Il est présent dans le répertoire "Jour20/Staking_Jour20.sol".
N’oubliez pas de modifier les noms et les imports.
Si vous n'avez pas ce répertoire : git pull.
Le but de notre journée : développer la fonction qui permet de staker un/des NFT(s) !
Cette fonction va se transférer le NFT de l'utilisateur (avec "approve" au préalable) et créer la structure de staking.
On commence donc par définir une nouvelle fonction, la fonction "stake".
Elle prend en paramètre une liste d'ID.
C'est la liste des IDs que l'utilisateur souhaite staker.
La fonction est "external", car elle ne peut être appelée que par l'utilisateur !
Deuxième étape, on définit à l'intérieur de notre fonction une boucle "for".
Cette boucle va nous permettre de parcourir tous les IDs de la liste donnés par l'utilisateur.
Le but est d'effectuer le même traitement pour chaque ID présent dans la liste grâce à la boucle !
Nous allons passer au premier "require", la propriété du NFT.
Au niveau du constructeur, nous avons associé notre variable "nft" à notre adresse de contrat, c'est ici que ça devient utile !
Grâce à notre variable, nous allons pouvoir appeler un autre contrat !
Fait hier 🔽 !
Pour appeler notre autre contrat, on utilise notre variable "nft".
Ici, nous devons appeler la fonction "nft.ownerOf()", qui retourne l'adresse du propriétaire du NFT afin de vérifier que la personne qui veut staker possède bien le NFT !
Tout ça dans un "require".
On vérifie qu'aucun des IDs n'est déjà staké !
Pour ça on récupère, grâce à "StructByID[tokenIds[i]]", la structure associée à notre ID.
On récupère ensuite notre variable "stakingStartTime", si cette variable est à 0 alors le token n'est pas staké !
Pour rappel, la fonction "stake" devra être appelée après que l'utilisateur ait utilisé la fonction standard "setApprovalForAll" pour accorder le droit à notre contrat de transférer ses NFTs à sa place.
Sinon, la fonction que nous allons voir dans le tweet suivant va échouer !
Lorsque le contrat est sûr que l'utilisateur possède bien les NFTs et qu'ils ne sont pas déjà stakés, alors il peut les transférer.
Pour cela on utilise la fonction d'ERC721 "transferFrom".
Le contrat transfert le NFT de l'adresse de l'utilisateur vers sa propre adresse !
C'est ainsi que fonctionne le staking.
Nous sommes sûrs que l'utilisateur a "bloqué" son NFT, car il est présent sur le contrat et ne peut donc pas être vendu ou échangé !
Une fois que le NFT est bien transféré sur le contrat, on émet un événement pour préciser qu'une nouveau NFT est staké.
On précise donc l'adresse de l'utilisateur, le numéro du NFT ainsi que le "timestamp".
Le "block.timestamp" est l'horodatage du block de la transaction.
Maintenant que le NFT est sur notre contrat et que l'événement est émis, alors nous pouvons créer la structure "StakeStruct".
Notre but va être de créer une structure et de la stocker directement dans le mapping "StructByID" pour associer notre nouvelle structure à notre token !
Pour faire cela, on associe directement notre structure à notre ID dans notre token grâce au mapping.
On définit donc un nouveau "StakeStruct" avec :
- tokenId: le token.
- stakingStartTime: le timestamp du block.
- owner: la personne qui appelle la fonction.
Et c'est tout !
Le tweet précédent est compliqué à comprendre en apparence en termes de code, je vous invite à bien le lire et relire jusqu'à bien comprendre comment marche l'association d'une structure à un ID grâce au mapping.
N'oubliez pas de venir sur Discord si vous avez des questions !
Pour finir, il ne reste qu'à incrémenter notre variable "totalStaked" qui permet de savoir combien de NFTs sont stakés au total.
Pour cela, on additionne à la variable la taille du tableau "tokenIds".
La taille est forcément égale au nombre de NFT à ajouter !
Petite note en plus, si une erreur arrive sur la boucle "for" alors la transaction va échouer.
Par exemple, si l'utilisateur renseigne 5 IDs de NFT, et qu'il n'en possède que 4 sur 5, alors toute la transaction échoue !
Pareil si l'utilisateur n'a pas approuvé le contrat !
Et voilà, notre première fonction de staking est terminée !
Nous pouvons désormais envoyer un token sur notre contrat tout en créant une structure, associé au NFT, afin d'avoir les informations sur notre staking !
On attaque la suite dès demain ! 🔥
• • •
Missing some Tweet in this thread? You can try to
force a refresh
Aujourd'hui, je vais vous montrer comment créer un contrat de NFT qui autorise le paiement en #stablecoin à la place de l'ether pour éviter la volatilité (👀).
Suivez ce thread pour apprendre comment mettre en place cette solution technique simplement.
🧵👇
Mise en situation :
Vous lancez une collection de NFT sur la blockchain #Ethereum... mais vous avez besoin d'un montant très précis, 100$ par NFT, pas plus, pas moins.
Et la se pose un problème, un mint en ether induit forcément la variation du cours...
Heureusement, il existe une solution à votre problème...
Avant tout, je vous conseille de lire le super thread de @TCryptomonnaies sur le projet.
Mais ce n'est pas tout, c'est moi qui ai développé le Smart Contrat, vous comprenez pourquoi je suis très heureux de pouvoir vous offrir ce free mint !
25 jours pour apprendre à développer des Smart Contracts en #Solidity 🔥
Jour 25 / 25 : Récap de l'aventure, et thread de mes 24 threads ! ❤️
Retweet et like ça t'a plu ! 💪
🧵
Avant tout, je tiens à re-remercier énormément @CryptoLidl pour les 25 vidéos illustratives du calendrier !
Il est disponible pour vous assister dans la création de contenu (support visuel, montage, etc.).
Si vous êtes intéressé, n'hésitez pas à le contacter via Twitter.
Je sais que le format Twitter n'est pas l'idéal pour beaucoup, ne vous inquiétez pas, je travaille à passer tout ceci en format article pour que cela soit bien plus simple à suivre/réaliser !