Passer au contenu principal
Change page

Norme de multijeton ERC-1155

Dernière modification: @MATsxm(opens in a new tab), 15 août 2023

Introduction

Une interface standard pour les contrats qui gèrent plusieurs types de jetons. Un seul contrat déployé peut intégrer une combinaison de jetons fongibles, de jetons non fongibles ou encore d'autres configurations (par exemple des jetons semi-fongibles).

Qu’entend-on par norme multijeton ?

L'idée est simple et cherche à créer une interface de contrat intelligent qui peut représenter et contrôler n'importe quel nombre de types de jetons fongibles et non fongibles. De cette façon, le jeton ERC-1155 peut exécuter les mêmes fonctions qu'un jeton ERC-20 et ERC-721 et même les deux en même temps. Cela améliore la fonctionnalité des normes ERC-20 et ERC-721, ce qui la rend plus efficace et corrige les erreurs évidentes de mise en œuvre.

Le jeton ERC-1155 est décrit dans les détails dans EIP-1155(opens in a new tab).

Prérequis

Pour mieux comprendre cette page, nous vous recommandons de commencer par lire celles concernant les normes de jeton, ERC-20, et ERC-721.

Fonctions et fonctionnalités ERC-1155 :

Transferts par lot

Les transferts par lot fonctionnent de la même façon que les transferts réguliers ERC-20. Examinons la fonction régulière transferFrom ERC-20 :

1// ERC-20
2function transferFrom(address from, address to, uint256 value) external returns (bool);
3
4// ERC-1155
5function safeBatchTransferFrom(
6 address _from,
7 address _to,
8 uint256[] calldata _ids,
9 uint256[] calldata _values,
10 bytes calldata _data
11) external;
Afficher tout
Copier

La seule différence avec ERC-1155 est que nous passons les valeurs en tant que tableau et que nous fournissons également un tableau d'identifiants. Par exemple compte tenu de ids=[3, 6, 13] et values=[100, 200, 5], les transferts résultants seront

  1. Transférez 100 jetons avec l'id 3 de _from à _to.
  2. Transférez 200 jetons avec l'id 6 de _from à _to.
  3. Transférez 5 jetons avec l'id 13 de _from à _to.

Dans l'ERC-1155, nous n'avons que transferFrom et non transfert. Pour l'utiliser comme un transfer régulier, il suffit de définir l'adresse d'expéditeur sur l'adresse qui appelle la fonction.

Solde par lot

L'appel ERC-20 balanceOf dispose également de sa fonction de partenaire avec le support par lots. Pour rappel, ceci est la version ERC-20 :

1// ERC-20
2function balanceOf(address owner) external view returns (uint256);
3
4// ERC-1155
5function balanceOfBatch(
6 address[] calldata _owners,
7 uint256[] calldata _ids
8) external view returns (uint256[] memory);
Copier

Encore plus simple pour l'appel de solde, nous pouvons récupérer plusieurs soldes en un seul appel. Nous passons le tableau des propriétaires, suivi du tableau des identifiants de jetons.

Par exemple, pour les données _ids=[3, 6, 13] et _owners=[0xbeef..., 0x1337..., 0x1111...], la valeur retournée sera

1[
2 balanceOf(0xbeef...),
3 balanceOf(0x1337...),
4 balanceOf(0x1111...)
5]
Copier

Approbation par lot

1// ERC-1155
2function setApprovalForAll(
3 address _operator,
4 bool _approved
5) external;
6
7function isApprovedForAll(
8 address _owner,
9 address _operator
10) external view returns (bool);
Afficher tout
Copier

Les approbations sont légèrement différentes de l'ERC-20. Au lieu d'approuver des montants spécifiques, vous définissez un opérateur qui approuvera ou non via setApprovalForAll.

La lecture du statut actuel peut être exécutée via isApprovedForAll. Comme vous pouvez le voir, c'est une opération tout ou rien. Vous ne pouvez pas définir le nombre de jetons ou même la classe de jeton à approuver.

Cela a été conçu intentionnellement en gardant à l'esprit le principe de simplicité. Vous ne pouvez tout approuver que pour une seule adresse.

Recevoir un crochet

1function onERC1155BatchReceived(
2 address _operator,
3 address _from,
4 uint256[] calldata _ids,
5 uint256[] calldata _values,
6 bytes calldata _data
7) external returns(bytes4);
Copier

Au regard du support EIP-165(opens in a new tab), le support ERC-1155 ne prend en charge que les crochets pour les contrats intelligents. La fonction crochet doit retourner une valeur magique prédéfinie bytes4 qui est donnée en tant que :

1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
Copier

Lorsque le contrat de réception renvoie cette valeur, cela suppose que le contrat accepte le transfert et sait gérer les jetons ERC-1155. Génial, plus aucun jeton coincé dans un contrat !

Prise en charge NFT

Lorsque la fourniture est unique, le jeton est essentiellement un jeton non fongible (NFT). Et comme c'est la norme pour ERC-721, vous pouvez définir une URL de métadonnées. L'URL peut être lue et modifiée par les clients, voir ici(opens in a new tab).

Règle de transfert sécurisé

Nous avons déjà abordé quelques règles de transfert sécurisé dans les explications précédentes. Mais concentrons-nous sur les règles les plus importantes :

  1. L'appelant doit être approuvé pour envoyer les jetons depuis l'adresse _from ou l'appelant doit être égal à _from.
  2. L'appel de transfert doit être annulé si
    1. l'adresse _to est 0.
    2. la longueur des _ids n'est pas la même que la longueur des _values.
    3. le(s) solde(s) du(des) détenteur(s) de jeton(s) dans _ids est(sont) inférieur(s) au(x) montant(s) respectif(s) dans les _values envoyées au destinataire.
    4. toute autre erreur se produit.

Note : Toutes les fonctions par lot, y compris le crochet, existent également en tant que versions sans lot. Cela renforce l'efficacité du carburant étant donné que le transfert d'un seul actif reste probablement la méthode la plus couramment utilisée. Nous les avons laissés à l'écart par souci de simplicité dans les explications, y compris des règles de transfert sécurisé. Les noms sont identiques, il suffit de supprimer le lot ('Batch)'.

Complément d'information

Cet article vous a été utile ?