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

Quand un transfert groupé contourne les règles du token

Dans le code de référence d’ERC-7943, un transfert de 80 était refusé, mais 40 + 40 en un seul batch passaient. Comment des tokens gelés ont-ils bougé ?

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 contournement par transfert groupé est un bug dans lequel plusieurs petits montants envoyés en un seul appel totalisent un transfert que le contrôle du token refuse. Dans le code de référence d’ERC-7943, il permettait de déplacer des tokens gelés (correctif proposé, non fusionné au 7 octobre 2026). Ce niveau montre comment.

À RETENIR · 3

  • Dans le code de référence d’ERC-7943, le contrat uRWA1155 comparait chaque élément d’un batch à un solde qu’il ne débitait qu’après la boucle.
  • En répétant un token id (40 + 40), un détenteur pouvait déplacer des tokens gelés, alors que canTransfer refusait un transfert unique de 80.
  • Le bug se trouve dans l’implémentation de référence, pas dans le texte du standard. La PR n° 2045 propose un correctif, non fusionné au 7 octobre 2026.
Sur cette page

Le problème : deux envois de 40 là où 80 était refusé

EN BREF Dans le code de référence d’ERC-7943, un transfert refusé passait dès qu’on le coupait en deux éléments sur le même token id.

UN TRANSFERT, UN BATCH

Un transfert de 80

  • Le contrôle dit non : 80 dépasse les 40 non gelés.
  • Le transfert échoue.

Un batch de 40 + 40, même id

  • Chaque élément est comparé aux mêmes 40 : les deux passent.
  • 80 partent. Solde 20, toujours 60 gelés.
Chiffres tirés de la reproduction de la PR n° 2045, sur le contrat de référence uRWA1155 avant le correctif. Solde 100, gelé 60, donc 40 non gelés.

C’est ce que faisait le contrat de référence ERC-7943 pour les tokens ERC-1155 quand je l’ai vérifié, le 7 octobre 2026. Un correctif attend dans une pull request, pas fusionnée lors de ma vérification (voyez la PR pour son état actuel).

Le bug se trouve dans ce code de référence, pas dans le texte du standard. Je suis l’un des cinq auteurs nommés d’ERC-3643, pas d’ERC-7943, et ce n’est pas moi qui ai trouvé ce bug.

EN CLAIR

Un ERC est un standard pour les applications Ethereum. Une pull request est une proposition de modification du code. Un token permissionné soumet ses transferts à des contrôles d’autorisation.

Ce type de bug est générique. Je le testerais sur tout token permissionné qui a un chemin batch.

Coming up next: Mais que veut dire « gelé » pour un token qui reste à vous ?

Les mots à connaître avant le bug

EN BREF Un token gelé ressemble à de l’argent bloqué sur votre compte : il vous appartient, mais vous ne pouvez pas l’envoyer.

ADAM explique : Prenez un guichetier qui compare chaque bordereau à votre solde libre, mais ne met votre compte à jour qu’à la fermeture. Un humain pourrait remarquer deux bordereaux du même compte ; ce code ne les comparait jamais.

LES MOTS À CONNAÎTRE

Token id
Un contrat ERC-1155 gère plusieurs sortes de tokens. Le token id indique laquelle, comme une référence produit.
Tokens gelés
Des tokens qu’un rôle autorisé a bloqués sur le compte d’un détenteur. Il en reste propriétaire, mais ne peut pas les envoyer.
Transfert groupé (batch)
Un seul appel qui déplace d’un coup plusieurs lots de tokens, sous forme d’une liste de token ids et d’une liste de montants.
canTransfer
Une fonction en lecture seule, une « vue », qui répond oui ou non : ce transfert serait-il autorisé ? Les applications peuvent la consulter avant d’envoyer.
Implémentation de référence
Du code d’exemple publié avec un standard pour montrer une façon de l’implémenter. Ce ne sont pas les règles du standard elles-mêmes.

Comment un transfert groupé contourne le gel des soldes

EN BREF Le code de référence compare chaque élément à un solde pas encore débité : un id répété est donc comparé deux fois aux mêmes 40.

ÉTAPE PAR ÉTAPE

Diagramme de séquence : 4 participants : Détenteur, Pré-contrôle, Code de transfert, SoldesDiagramme de séquence : 4 participants : Détenteur, Pré-contrôle, Code de transfert, Soldes. Étape 1 : Détenteur vers Pré-contrôle, 80 de l’id 1 peuvent partir ?. Étape 2 : Détenteur vers Code de transfert, Un batch : l’id 1 deux fois, 40 chacun. Étape 3 : Code de transfert vers Soldes, Premiers 40 : tiennent dans les 40 libres. Étape 4 : Code de transfert vers Soldes, Seconds 40 : toujours 40 libres, ça tient. Étape 5 : Code de transfert vers Soldes, Débit des deux : 80 partent. Étape 6 : Soldes vers Détenteur, Solde 20, toujours 60 gelés.DÉTENTEUR > PRÉ-CONTRÔLE80 de l’id 1 peuvent partir ?DÉTENTEUR > CODE DE TRANSFERTUn batch : l’id 1 deux fois,40 chacunCODE DE TRANSFERT > SOLDESPremiers 40 : tiennent dansles 40 libresCODE DE TRANSFERT > SOLDESSeconds 40 : toujours 40libres, ça tientRien de débité entre les deuxcontrôlesCODE DE TRANSFERT > SOLDESDébit des deux : 80 partentSOLDES > DÉTENTEURSolde 20, toujours 60 gelés

Étape 1. Demander d’abord. Le détenteur veut envoyer 80 tokens de l’id 1 vers un autre compte, et consulte d’abord le pré-contrôle.

Choisissez une étape pour la voir bouger
  1. Demander d’abord Le détenteur veut envoyer 80 tokens de l’id 1 vers un autre compte, et consulte d’abord le pré-contrôle.
  2. Refusé Le pré-contrôle répond non : 80 dépasse les 40 non gelés.
  3. Envoyer un batch Le détenteur envoie à la place un seul batch : l’id 1 deux fois, 40 à chaque fois.
  4. Premier contrôle Le premier élément demande 40. Le solde non gelé vaut 40 : il passe.
  5. Second contrôle Le second demande aussi 40. Rien n’a encore été débité, le solde non gelé vaut toujours 40. Il passe aussi.
  6. Débits C’est seulement maintenant, après les deux contrôles, que le contrat débite les deux éléments : 80 au total.
  7. Résultat Solde 20, gelé toujours 60. Une partie de la position gelée a quitté le compte.
Solde 100, gelé 60, donc 40 non gelés. Le pré-contrôle refuse 80 ; le batch déplace 80 parce que les débits ne commencent qu’après les deux contrôles.

ERC-7943 (uRWA, l’interface universelle des actifs réels) est un ERC Final signé par Dario Lo Buglio, Tino Martinez Molina et Mihai Colceriu. Final, c’est le stade où le texte est arrêté. Sa version multi-token permet à un rôle autorisé de geler une partie du solde d’un compte pour un Token id Un contrat ERC-1155 gère plusieurs sortes de tokens. Le token id indique laquelle, comme une référence produit. Voir le glossaire.

Frozen tokens cannot be transferred by the account.

ERC-7943, le texte du standard

Autrement dit, le détenteur ne doit pas pouvoir déplacer ses Tokens gelés Des tokens qu’un rôle autorisé a bloqués sur le compte d’un détenteur. Il en reste propriétaire, mais ne peut pas les envoyer. Voir le glossaire. Et canTransfer Une fonction en lecture seule, une « vue », qui répond oui ou non : ce transfert serait-il autorisé ? Les applications peuvent la consulter avant d’envoyer. Voir le glossaire « MUST validate that the amount being transferred doesn’t exceed the unfrozen amount » : il doit vérifier que le montant ne dépasse pas la part non gelée.

L’Implémentation de référence Du code d’exemple publié avec un standard pour montrer une façon de l’implémenter. Ce ne sont pas les règles du standard elles-mêmes. Voir le glossaire, le contrat uRWA1155, est censée appliquer cette règle dans _update, la fonction interne des transferts ordinaires. Pour un Transfert groupé (batch) Un seul appel qui déplace d’un coup plusieurs lots de tokens, sous forme d’une liste de token ids et d’une liste de montants. Voir le glossaire, elle compare chaque élément au solde non gelé. Le problème : le débit n’a lieu qu’après la boucle.

OBJET OBTENU

Contrôlés un par un, débités à la fin

Les deux éléments étaient comparés aux mêmes 40, car rien n’était débité avant la fin de la boucle.

Les dégâts sont bornés. Vers un autre compte, le batch ne peut pas déplacer plus que le solde brut. Et chaque élément pris seul doit tenir dans le montant non gelé.

ATTENTION

Dans ces limites, un détenteur sans rôle particulier peut déplacer la part gelée de sa position. Il lui suffit d’être sur la liste blanche du token.

Pourtant, le pré-contrôle que les applis peuvent consulter refuse ce même total.

Sources : issue n° 1814 des ERC, PR n° 2045 des ERC (ouverte au 7 oct. 2026), ERC-7943 (Final), contrat de référence uRWA1155.

NIVEAU TERMINÉ

Ce que vous savez maintenant

  • Pourquoi un contrôle qui regarde un élément à la fois peut rater ce que fait le batch entier.
  • Pourquoi un débit placé après la boucle laissait passer 40 + 40 là où 80 était refusé.
  • Où se trouve le bug : dans le code de référence, pas dans le texte du standard.

Vérifiez par vous-même

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

Un batch envoie 30 de l’id 1 et 30 de l’id 2, avec 40 non gelés sur chaque id. Entame-t-il le montant gelé ?

Non. Chaque id n’apparaît qu’une fois : chaque élément est déjà le total de son id. L’astuce exige le même id deux fois.

Niveau suivant :Comment le correctif proposé arrête-t-il le batch, et a-t-il été fusionné ?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.