Nekr Profile picture
Lead Blockchain - Lead Developer - J'explique les concepts Blockchain & Web3 avec des mots simples.

Dec 20, 2022, 19 tweets

[#CALENDRIER DE L'AVENT 20/25]

25 jours pour apprendre à développer des Smart Contracts en #Solidity 🔥

Jour 20 / 25 :

Staking : Le staking des NFTs ! Comment faire pour que le contrat permette de staker un NFT ? C'est ce que nous allons développer aujourd'hui. 🔥

🧵

Tweet précédent

🔽

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 ! 🔥

Share this Scrolly Tale with your friends.

A Scrolly Tale is a new way to read Twitter threads with a more visually immersive experience.
Discover more beautiful Scrolly Tales like this.

Keep scrolling