Norme de multijeton ERC-1155
Dernière mise à jour de la page : 22 octobre 2025
Introduction
Une interface standard pour les contrats qui gèrent plusieurs types de jetons. Un seul contrat déployé peut inclure n'importe quelle combinaison de jetons fongibles, de jetons non fongibles ou d'autres configurations (p. ex. des jetons semi-fongibles).
Qu'entend-on par norme multi-jetons ?
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 manière, 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 entièrement décrit dans l'EIP-1155 (opens in a new tab).
Prérequis
Pour mieux comprendre cette page, nous vous recommandons de vous informer d'abord sur les normes de jetons, l'ERC-20 et l'ERC-721.
Fonctions et fonctionnalités de l'ERC-1155 :
- Transfert par lots : transférez plusieurs actifs en un seul appel.
- Solde par lots : obtenez les soldes de plusieurs actifs en un seul appel.
- Approbation par lots : approuvez tous les jetons à une adresse.
- Hooks : hook de réception de jetons.
- Support NFT : si l'offre n'est que de 1, traitez-le comme un NFT.
- Règles de transfert sécurisé : ensemble de règles pour un transfert sécurisé.
Transferts par lots
Les transferts par lot fonctionnent de la même façon que les transferts réguliers ERC-20. Examinons la fonction transferFrom standard de l'ERC-20 :
1// ERC-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;Afficher toutLa 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, pour ids=[3, 6, 13] et values=[100, 200, 5], les transferts résultants seront
- Transfert de 100 jetons avec l'id 3 de
_fromvers_to. - Transfert de 200 jetons avec l'id 6 de
_fromvers_to. - Transfert de 5 jetons avec l'id 13 de
_fromvers_to.
Dans l'ERC-1155, nous avons uniquement transferFrom, pas transfer. Pour l'utiliser comme une fonction transfer classique, il suffit de définir l'adresse d'expédition comme étant l'adresse qui appelle la fonction.
Solde par lots
L'appel balanceOf de l'ERC-20 a également sa fonction partenaire avec prise en charge des lots. Pour rappel, ceci est la version ERC-20 :
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) external view returns (uint256[] memory);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 _ids=[3, 6, 13] et _owners=[0xbeef..., 0x1337..., 0x1111...], la valeur renvoyée sera
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Approbation par lots
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Afficher toutLes 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 comme approuvé ou non approuvé via setApprovalForAll.
La lecture de l'état actuel peut se faire 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.
Hook de réception
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);Étant donné la prise en charge de l'EIP-165 (opens in a new tab), l'ERC-1155 ne prend en charge les hooks de réception que 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)"))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 !
Support 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 :
- L'appelant doit être approuvé pour dépenser les jetons de l'adresse
_fromou l'appelant doit être égal à_from. - L'appel de transfert doit être annulé si
- l'adresse
_toest 0. - la longueur de
_idsn'est pas la même que la longueur de_values. - l'un des soldes du ou des détenteurs pour le(s) jeton(s) dans
_idsest inférieur au(x) montant(s) respectif(s) dans_valuesenvoyé(s) au destinataire. - toute autre erreur se produit.
- l'adresse
Remarque : Toutes les fonctions de traitement par lots, y compris le hook, existent également en versions sans traitement par lots. 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)'.