Vous êtes-vous déjà demandé s’il était possible de créer des niveaux au sein d’un même projet NFT, avec des prix et des fournitures de jetons différents ? Il y a quelques semaines, des amis et moi avons réfléchi à des idées pour un projet NFT basé sur des services publics sur lequel nous travaillons. Les NFT agiraient comme une sorte d’abonnement à notre service, nous avons donc rapidement réalisé qu’il serait avantageux d’avoir différents niveaux, tout comme vous avez différents niveaux d’abonnement. Essentiellement, il y aurait un plus grand nombre de jetons moins chers et plus accessibles, ainsi qu’un plus petit nombre de jetons plus rares et plus chers.
Chaque niveau aurait des valeurs différentes pour des propriétés telles que le prix et l’offre, « appliquant » efficacement leur rareté dès le début. En tant qu’exigence supplémentaire, il devrait être possible de frapper des jetons de n’importe quel niveau à tout moment, en le spécifiant simplement dans l’appel de contrat.
L’idée allait à l’encontre de ce qui se fait traditionnellement dans les projets NFT où il y a généralement 1 prix de menthe pour tous les jetons ou une structure de prix séquentielle où les prix changent après la frappe d’un certain nombre X de jetons. Ce dernier exemple est quelque peu similaire mais toujours différent de ce que nous essayons de réaliser, en raison du fait que chaque niveau ne peut être créé qu’une fois le précédent terminé.
En tant que développeur, j’ai immédiatement commencé à me demander à quoi ressemblerait une telle fonctionnalité dans le code. Mon intuition me disait que construire un tel contrat intelligent devrait être un jeu d’enfant et que quelqu’un l’avait probablement déjà fait. À ma grande surprise, je n’ai trouvé aucune bonne solution en ligne, alors j’ai décidé d’écrire la mienne, c’est ce que je veux partager avec vous aujourd’hui.
J’ai écrit le smartcontract dans Solidity, car c’est le langage de programmation blockchain le plus accessible et le plus utilisé.
Nous commençons par spécifier la version du compilateur solidity et importons les deux interfaces de base dont nous avons besoin pour un projet NFT, ERC721 et Ownable. La première variable d’état saleIsActive est un booléen qui indique simplement si une vente est active pour ce contrat intelligent, ou en d’autres termes, les gens sont-ils autorisés à frapper des NFT, rien de nouveau.
La partie intéressante commence dans la définition de la Étage struct, où nous stockerons les propriétés spécifiques au niveau. Chaque Étage aura:
- le prix: le prix de ce niveau
- approvisionnement total: combien de jetons de ce niveau ont été créés
- approvisionnement max: combien de jetons de ce niveau peuvent être frappés
- index de départ: à quel tokenID ce niveau commence-t-il
- menthesParAdresse: combien de menthes chaque adresse est-elle autorisée à faire pour ce niveau
Ensuite, nous créons un mappage imbriqué dans lequel nous conserverons les informations sur le nombre de menthes qu’une adresse a créées pour un niveau spécifique. Le premier index pointera vers le niveau correspondant, et le second index vers le nombre de menthes d’une adresse, à ce niveau.
Ceci est suivi d’un autre mappage, niveaux, qui contiendra simplement toutes les données que nous venons de décrire, indexées sur le étage.
Et enfin, nous avons les variables URI de base et de jeton qui nous permettront d’avoir des URI spécifiques associés à chaque tokenID. Ceux-ci pointeront vers un système de fichiers distribué comme IPFS qui contiendra les métadonnées de ce jeton.
Alors, à quoi ressemblera notre constructeur ?
Nous spécifions le nom et le symbole comme arguments dans le constructeur, puis nous codons en dur chaque niveau et l’ajoutons au mappage des niveaux. Pour cet exemple de projet, nous allons avec un système à 3 niveaux où
- Le niveau 0 a un maxSupply de 300 et coûte 0,42 éther
- Le niveau 1 a un maxSupply de 100 et coûte 0,6 éther
- Le niveau 2 a un maxSupply de 20 et coûte 0,9 éther
Nous sommes maintenant prêts à passer en revue la fonction menthe.
Nous suivrons l’habitude Vérifie l’interaction des effets motif nous commençons donc par affirmer que toutes les conditions requises pour la fonction de menthe sont remplies. Dans ce cas, nous vérifions les exigences pour
- Vente en cours
- L’approvisionnement de niveau maximum n’a pas encore été atteint
- La valeur de la transaction étant suffisante pour frapper ce niveau
- L’adresse effectuant la transaction n’ayant pas dépassé le nombre maximum de menthes par adresse pour ce niveau.
Notez que ces exigences dépendent toutes du niveau spécifié en tant qu’argument de la fonction mint.
Une fois nos vérifications effectuées, nous pouvons passer aux effets. Nous mettons à jour le nombre de menthes par l’adresse de l’expéditeur pour le niveau spécifié et nous mettons également à jour l’offre totale du niveau. Avant cette dernière étape, nous enregistrons la valeur actuelle de l’offre totale dans une variable afin de pouvoir spécifier le tokenId dans le _safeMint méthode, qui sera notre seule interaction.
Pour être sûr que notre smartcontract répond à nos exigences initiales, nous pouvons écrire des tests en python.
Le test le plus basique consiste à frapper un jeton et à affirmer un certain nombre de valeurs que nous nous attendons à avoir par la suite. Nous commençons par retourner l’état de la vente pour nous assurer que la vente est active. Ensuite, nous créons un jeton du niveau le plus bas en fournissant l’éther 0,42, comme spécifié pour le niveau 0 dans notre constructeur. Après avoir fait cela, il y a quelques choses auxquelles nous pouvons nous attendre concernant l’état de notre smartcontract
- Naturellement, le solde du compte qui a frappé 1 jeton devrait être de 1
- L’offre totale du niveau 0 devrait être de 1 puisque seulement 1 jeton de ce niveau a été frappé
- L’offre totale des niveaux 1 et 2 devrait être de 0 car aucun jeton n’a été créé à partir de ces niveaux
- Enfin, le propriétaire du jeton avec l’ID 0 doit être le même compte qui vient de créer un jeton du niveau 0, puisque nous avons spécifié que ce niveau doit commencer à l’index 0
Nouveau dans le commerce ? Essayez des bots de trading de crypto ou copiez le trading
C’était assez simple ! Maintenant, un test légèrement plus complexe où plusieurs comptes créent plusieurs jetons
Ici, nous avons un compte qui fabrique un jeton des niveaux 0 et 1, tandis qu’un autre compte crée les niveaux 1 et 2. Encore une fois, nous pouvons nous attendre à :
- Les deux comptes doivent avoir un solde de 2, puisqu’ils ont tous deux frappé 2 jetons
- L’offre totale des niveaux 0 et 2 doit être de 1, tandis que l’offre totale du niveau 1 doit être de 2
- Le propriétaire des identifiants de jeton 0 et 300 doit être le compte 0, tandis que le propriétaire des identifiants 301 et 400 doit être le compte 1. Encore une fois, cela est basé sur les indices de départ définis dans le constructeur.
Évidemment, ces deux tests seuls ne sont pas concluants mais donnent une bonne indication que notre smartcontract se comporte comme nous l’avions prévu.
Il semble en effet qu’il soit facile d’avoir des niveaux dans un contrat intelligent ERC721, mais cela présente deux inconvénients majeurs :
- La structure en niveaux du contrat rend impossible la tombola habituelle de style loterie que les projets NFT ont généralement. L’utilisateur qui frappe un jeton peut toujours vérifier quel est l’identifiant du jeton qu’il va frapper, et ainsi cet élément de surprise a disparu. Le caractère aléatoire dans la plupart des projets est introduit en démarrant la menthe à un index arbitraire, ce qui n’est pas possible dans la façon dont nous avons conçu ce contrat.
- Un autre inconvénient est que la structure de niveau nous oblige à spécifier quel est le tokenId créé à tout moment. Cela le rend incompatible avec les interfaces NFT optimisées telles que ERC721A. Par conséquent, l’optimisation du gaz pour la frappe de plusieurs jetons devrait être effectuée manuellement.
Merci d’avoir pris le temps de lire mon message, j’espère qu’il vous a été utile d’une manière ou d’une autre ! Si vous souhaitez consulter le code source complet, voici un lien vers le référentiel : https://github.com/filipkny/TieredNFT
Et si vous souhaitez me suivre sur Twitter : https://twitter.com/cryptowski1337
Source https://medium.com/coinmonks/multi-tier-nfts-5a5b693774ae?source=rss—-721b17443fd5—4