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 :
- Transfert par lot : Transférer plusieurs actifs en un seul appel.
- Solde par lot : Obtenez les soldes de plusieurs actifs en un seul appel.
- Approbation par lot : Approuver tous les jetons à une adresse.
- Crochets : Recevoir des crochets de jetons.
- Support NFT : Si l'échange est unique, le traiter comme NFT.
- Règles de transfert sécurisées : Ensemble de règles pour sécuriser un transfert.
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-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 toutCopier
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
- Transférez 100 jetons avec l'id 3 de
_from
à_to
. - Transférez 200 jetons avec l'id 6 de
_from
à_to
. - 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-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);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-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Afficher toutCopier
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 _data7) 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 :
- L'appelant doit être approuvé pour envoyer les jetons depuis l'adresse
_from
ou l'appelant doit être égal à_from
. - L'appel de transfert doit être annulé si
- l'adresse
_to
est 0. - la longueur des
_ids
n'est pas la même que la longueur des_values
. - 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. - toute autre erreur se produit.
- l'adresse
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)'.