ALLER AU CONTENU
STANDARDS ETHEREUM7 minStandards en production / Ép. 9 · Niveau 9-2

Bug du transfert groupé : comment marche le correctif proposé

Le correctif proposé additionne les éléments d’un même token id : 40 + 40 compte pour 80. Est-il fusionné, et que faire d’autre ?

XIN
Scène nocturne en pixel art du poste de contrôle d’un coffre. Une lampe rouge refuse une grande caisse au portail, tandis qu’un tapis roulant fait passer deux petites caisses identiques par le même portail sous une lampe verte, et qu’une étagère cadenassée du coffre est vide.

EN 30 SECONDES

Un contrôle cumulé par id est un correctif qui additionne les éléments d’un batch de même token id et compare ce total cumulé au solde brut et au montant non gelé. La PR n° 2045 le propose pour le code de référence d’ERC-7943 ; elle n’était pas fusionnée au 7 octobre 2026.

À RETENIR · 3

  • Avec la PR n° 2045, le batch de 40 + 40 sur un même id est refusé au second élément, avant tout débit.
  • Au 7 octobre 2026, la PR était ouverte, non fusionnée et sans revue, et l’issue n° 1814 restait ouverte.
  • Tout correctif doit montrer au contrôle le total par id. Un contrôle du solde après le débit est un filet de sécurité de plus, pas un remplacement.
Sur cette page

Un exemple concret : le même batch, avant et après le correctif

EN BREF Avec la PR n° 2045, le même batch est refusé au second élément : le contrôle additionne désormais les éléments d’un même id.

LES MOTS À CONNAÎTRE

Test de non-régression
Un test qui rejoue un bug une fois corrigé, pour qu’il ne puisse jamais revenir sans qu’on le voie.
Pull request
Une proposition de modification du code d’un projet, ouverte à la relecture. Elle ne change rien tant que personne ne la fusionne.
Transfert vers soi-même
Un transfert dont l’expéditeur et le destinataire sont le même compte.

UN EXEMPLE CONCRET

REFUSÉPR n° 2045 appliquée : l’id 1 deux fois, 40 chacun

ENTRÉE

Solde
100
Gelé
60
Batch
id 1 deux fois : 40 + 40

CE QUI SE PASSE

  1. Premier élément : le total cumulé de l’id 1 vaut 40, dans la limite des 40 non gelés.
  2. Second élément : le total cumulé de l’id 1 passe à 80, au-delà des 40 non gelés.
  3. L’appel échoue (revert) avant tout débit.

SORTIE

Déplacé
0
Solde / gelé
100 / 60

CONTOURNÉContrat de référence avant le correctif, même batch

ENTRÉE

Batch
id 1 deux fois : 40 + 40

CE QUI SE PASSE

  1. Chaque élément est comparé aux mêmes 40 non gelés : les deux passent.
  2. Ensuite seulement, les deux éléments sont débités : 80 au total.

SORTIE

Déplacé
80
Solde / gelé
20 / 60

OBJET OBTENU

Additionner par id

Le correctif ne vise pas cette astuce en particulier. Les éléments d’un même id s’additionnent, comme tout autre découpage.

Chiffres tirés de la reproduction de la PR, pas inventés. Sans correctif, le contournement reste limité : vers un autre compte, jamais plus que le solde brut, et chaque élément doit tenir dans les 40 non gelés. Mais tout détenteur sur liste blanche peut s’en servir, sans rôle particulier.

Un Test de non-régression Un test qui rejoue un bug une fois corrigé, pour qu’il ne puisse jamais revenir sans qu’on le voie. Voir le glossaire rejoue exactement ce batch, et il passe une fois les modifications de la PR appliquées.

Coming up next: Alors, ce correctif est-il fusionné ?

Où en sont l’issue n° 1814 et la PR n° 2045

EN BREF Au 7 octobre 2026, le correctif attendait dans une pull request ouverte, sans revue, et l’issue restait ouverte.

ÉTAPE PAR ÉTAPE

Diagramme de flux : 5 étapesDiagramme de flux : 5 étapes. 5 mai 2026 : ERC-7943 passe Final, puis 13 juin 2026 : issue n° 1814. 13 juin 2026 : issue n° 1814, puis 19 juin 2026 : renvoi vers le forum. 19 juin 2026 : renvoi vers le forum, puis 3 octobre 2026 : PR n° 2045. 3 octobre 2026 : PR n° 2045, puis 7 octobre 2026 : toujours ouverte.15 mai 2026 : ERC-7943passe Final213 juin 2026 : issue n°1814319 juin 2026 : renvoivers le forum43 octobre 2026 : PR n°204557 octobre 2026 : toujoursouverte

Étape 1. Final. Le commit « Update ERC-7943: Move to Final » fait passer le texte de l’ERC en Final.

Choisissez une étape pour la voir bouger
  1. Final Le commit « Update ERC-7943: Move to Final » fait passer le texte de l’ERC en Final.
  2. Signalé @MavenRain ouvre une issue, un signalement public, sur le contournement par id répété dans uRWA1155, avec une preuve de concept.
  3. Renvoyé Un contributeur recommande de publier sur le fil de l’ERC dans Ethereum Magicians, le forum des standards.
  4. Correctif proposé @Kshot3000 ouvre la PR n° 2045 : elle corrige les branches de transfert et de burn (un burn détruit des tokens) et ajoute trois tests de non-régression.
  5. Toujours ouverte La PR est ouverte et non fusionnée, sans revue. Le bot indique qu’il faut une revue d’auteur et deux revues d’éditeurs. L’issue reste ouverte, elle aussi.
Dates tirées du dépôt des ERC sur GitHub. État au 7 octobre 2026.

EN CLAIR

La Pull request Une proposition de modification du code d’un projet, ouverte à la relecture. Elle ne change rien tant que personne ne la fusionne. Voir le glossaire tient un total cumulé par id et refuse dès qu’il dépasse le solde brut ou le montant non gelé. Même correctif pour les burns : là, les ids répétés réduisaient trop peu le montant gelé. Sa description annonce 222 tests réussis pour le dossier assets/erc-7943.

Quatre façons de combler l’écart

EN BREF Tout correctif doit montrer au contrôle le total par id, et chaque option a son compromis.

Cumul par id (PR n° 2045)
À chaque élément, comparer le total cumulé de son id au solde brut et au montant non gelé
Coût quadratique en longueur de batch : bien pour les batchs courts. La PR propose aussi un accumulateur d’ids vus
Refuser les ids répétés
Échouer si un id apparaît deux fois dans le batch
Le plus simple ; l’issue note que c’est plus strict que ce qu’exige ERC-1155
Contrôler après le débit
Débiter d’abord, puis, sur les transferts du détenteur partant d’un solde ≥ gelé, maintenir cette inégalité pour chaque id déplacé
Doit passer avant l’appel au destinataire. Ne voit pas les transferts vers soi-même, donc ne remplace pas le contrôle agrégé
Un transfert à la fois
Chaque élément est contrôlé et débité avant le suivant
Un événement par élément au lieu d’un seul TransferBatch, ce qui consomme sans doute plus de gas (l’unité qui mesure le calcul sur Ethereum). Un transfert vers soi peut encore exécuter un total refusé par la vue

J’aime le contrôle après débit comme seconde ligne de défense. Sur les transferts du détenteur qui partent d’un solde couvrant le gel, il vérifie directement que les tokens gelés restent en place.

ATTENTION

Le gel peut dépasser le solde : ces transferts ne doivent alors pas aggraver l’écart. Transferts forcés et burns privilégiés ont leur règle : s’ils entament le gel, ils mettent à jour le montant gelé et émettent Frozen avant l’événement de transfert.

Dans OpenZeppelin v5, ERC-1155 exécute _update avant le contrôle de réception, l’appel qui demande au contrat destinataire d’accepter les tokens. Un contrôle en fin de _update passe donc en premier.

ATTENTION

Mais il rate le Transfert vers soi-même Un transfert dont l’expéditeur et le destinataire sont le même compte. Voir le glossaire. Sur le contrat non corrigé avec ce contrôle, du détenteur au détenteur, [40, 40] sur un id passe encore alors que canTransfer refuse 80. Le solde est débité puis recrédité : rien ne part, mais vue et exécution divergent.

Quand j’ai lancé le test du niveau 4, pour cet article et pas sur le code d’un client, la version avec ce contrôle en passait deux sur trois, et la PR n° 2045 les trois, transferts vers soi compris.

Gardez donc le contrôle agrégé, et voyez le contrôle après débit comme un filet de sécurité.

Sources : issue n° 1814 des ERC, PR n° 2045 des ERC (ouverte au 7 oct. 2026).

NIVEAU TERMINÉ

Ce que vous savez maintenant

  • Où en était le correctif au 7 octobre 2026 : ouvert, non fusionné, sans revue.
  • Pourquoi un contrôle après le débit peut compléter le correctif sans le remplacer.

Vérifiez par vous-même

Touchez ou cliquez une question pour voir la réponse.

Vous refusez tout batch qui répète un id. L’astuce du 40 + 40 est-elle bloquée, et à quel prix ?

Bloquée : chaque élément est alors le total de son id. Le prix, c’est de refuser des batchs que l’ERC-1155 autorise.

Niveau suivant :Quelles deux règles détectent ce genre de bug, et où faut-il encore les vérifier ?7 min
Adam Boudjemaa
Adam Boudjemaa

Ancien CTO d’Integra. Auteur nommé (1 sur 5) d’ERC-3643, premier auteur d’ERC-6960, co-auteur d’ERC-7410 et co-auteur d’ERC-8203, encore à l’état de brouillon. Conçoit des systèmes d’IA en production et des systèmes Web3 régulés.

Un projet à livrer ou un poste à pourvoir ?

Parlons de votre besoin
Suivre les notes techniques

Recevez les nouveaux articles sur l’IA en production et les smart contracts par email.