Décodage des transactions SCW

Avec les portefeuilles de contrats intelligents (SCW), les échanges suivent une trajectoire très différente de celle des portefeuilles Ethereum/EVM traditionnels. Cette différence peut être déroutante, surtout quand quelque chose tourne mal. Mais une fois que vous comprenez les acteurs clés du processus — et comment lire ce qui s’est passé étape par étape dans l’application et sur l’explorateur — les choses commencent à avoir du sens.

Parcourons cela ensemble.


D’un tap à l’exécution on-chain : ce qui se passe réellement

Lorsque vous appuyez sur « Swap » dans l’application, cela donne l’impression d’une action unique. En réalité, vous lancez un processus à plusieurs couches construit sur l’abstraction de compte d’Ethereum (ERC-4337). Votre transaction ne va pas directement sur la blockchain comme avec un portefeuille normal. Elle emprunte plutôt un détour :

  1. Nous construisons la route. Nous demandons au moteur de routage (comme 1inch) de trouver le meilleur chemin pour votre swap, et le simulons pour s’assurer qu’il fonctionne. Nous estimons le gaz, vérifions que vous possédez les tokens, et emballons les instructions dans un format spécial : un UserOperation.

  2. Un bundler intervient. Il s’agit d’un acteur hors chaîne responsable de soumettre les UserOperations à la blockchain. Il vérifie votre opération, s’assure qu’elle est valide, et préfinance le gaz pour vous (il sera remboursé plus tard).

  3. Votre UserOp entre dans la blockchain via le EntryPoint contrat intelligent. Pensez à EntryPoint comme la unique porte par laquelle passent toutes les transactions SCW. EntryPoint effectue les vérifications finales, et si tout est en ordre…

  4. EntryPoint dit à votre Smart Contract Wallet (SCW) d’exécuter le swap. Votre SCW appelle le routeur (par ex., 1inch), le routeur appelle les pools, les tokens se déplacent, et la sortie revient dans votre portefeuille.

Pour résumer : vous appuyez sur swap → nous simulons → le bundler soumet → EntryPoint valide → votre SCW exécute.


Voyons un exemple réel

Maintenant que nous comprenons le flux à haut niveau, voyons comment cela se déroule dans un swap réel : d’abord dans l’application, puis on-chain :

Voici ce que nous voyons :

  • Nous avons échangé 1 USDC contre 0,765 KTA.

  • Le swap a été exécuté sur Base (notez l’icône Base sur les symboles des pièces).

  • Nous avons payé :

    • 0,03 $ de gaz (en ETH)

    • 0,22 % de frais de swap à goodcryptoX

    • 0,05 % de frais de routeur à 1inch

  • La route était simple : 100 % via un pool Uniswap v4.

  • Bundler : Alchemy (voir l’étape 2 ci‑dessus pour le récapitulatif)

  • Des liens d’explorateur apparaissent si la transaction a atteint la blockchain et a été enregistrée dans le bloc (même si elle échoue)

Tout va bien jusque là. Ensuite, cliquons sur le lien BaseScan pour voir à quoi ressemble cette transaction on‑chain :

De : ce n’est pas votre portefeuille — c’est le bundler d’Alchemy. C’est attendu, puisque le bundler a soumis la transaction.

À : EntryPoint (v0.6.0). Là encore, c’est attendu — toutes les transactions SCW passent par ici.

Transactions internes : affiche les flux de tokens natifs (ETH sur Base) au sein de la transaction. Voici ce que nous voyons :

  • Notre wallet (…0A5) a envoyé de l’ETH à EntryPoint pour les frais de gaz.

  • EntryPoint a remboursé le bundler du coût réel du gaz (puisque le bundler a prépayé le gaz en votre nom ; voir l’étape 2 ci‑dessus). Tout ETH restant est demeuré dans EntryPoint comme dépôt pour de futures transactions.

Transferts ERC‑20 : montre les mouvements réels de tokens :

Notre wallet n’a pas envoyé directement des USDC. À la place, le contrat token USDC (…2A8) a traité et émis les transferts. C’est normal : sur les chaînes EVM, les transferts de tokens sont gérés par le contrat du token lui‑même après réception d’une instruction de votre smart contract wallet.

  1. Le contrat USDC a divisé notre 1 USDC en trois transferts :

    • 0,0022 USDC vers le wallet de frais de notre protocole (…608A)

    • 0,0005 USDC vers le wallet de frais de 1inch (…1DE5)

    • Les 0,9973 USDC restants vers le routeur Uniswap v4 (…Universal Router)

  2. Le routeur Uniswap v4 l’a transmis au Pool Manager Uniswap v4 (contrat unique gérant tous les pools v4).

  3. Le Pool Manager a exécuté le swap : USDC entrant → KTA sortant.

  4. Le KTA a été renvoyé via l’Aggregation Router de 1inch, qui l’a transféré vers notre wallet (…0A5).


🧩 Comment décoder une transaction SCW échouée

Maintenant que nous comprenons comment fonctionnent les swaps avec smart contract wallets (SCW) — et que nous avons parcouru une transaction réussie — utilisons les mêmes outils pour déchiffrer une transaction échouée.

Nous utiliserons un autre cas réel : un swap ETH → token sur Ethereum qui a échoué à l’intérieur du contrat EntryPoint parce qu’il n’y avait pas assez d’ETH pour couvrir à la fois le swap et les frais de gaz.

Ok, vous voyez « Error » comme statut de votre swap dans l’application ou recevez une notification push que votre swap a échoué. Que faire ?


Étape 1 — Vérifiez les détails de la commande dans goodcryptoX

Voici ce que vous voyez dans ce cas :

En utilisant le cadre que nous avons développé plus haut, vous remarquez rapidement :

  • Le statut du swap est Error (échoué ?)

  • Aucun message d’erreur n’est affiché (c’est inhabituel)

  • Il y a des frais de gaz (atteint la blockchain ?)

  • Une route est affichée (la simulation s’est bien passée ?)

  • Il y a des liens vers des explorateurs blockchain (je peux vérifier la tx sur la blockchain !).

Vérifions votre intuition :

  • Le Error statut signifie que le swap a échoué

  • Il devrait y avoir à la fois un message d’erreur lisible par un humain (traduit depuis le brut) et le message brut. L’absence de message d’erreur signifie définitivement que quelque chose d’inhabituel s’est produit

  • Des frais de gaz signifient effectivement que la transaction a atteint la blockchain et qu’une activité on‑chain a eu lieu (qui a consommé du gaz)

  • La route confirme que la simulation de la transaction a réussi et a abouti à un chemin clair vers l’exécution

  • Les liens d’explorateur confirment que la transaction a atteint la blockchain — même si elle a échoué. Nous devons définitivement en ouvrir un et enquêter plus avant


Étape 2 – Ouvrez la transaction dans l’explorateur blockchain

Vous touchez le lien Etherscan pour voir ce qui s’est passé :

À première vue, les choses deviennent encore plus confuses :

  • Le statut indique ✅ Success — attendez, quoi ?!

  • Mais nous savons déjà que le swap n’a pas abouti

  • Sous le champ « To » (EntryPoint), il y a un petit message jaune :

    Bien qu’une ou plusieurs erreurs se soient produites [execution reverted] Exécution du contrat terminée

Alors que se passe‑t‑il réellement ici ?

Souvenez‑vous du flux de transaction SCW que nous avons expliqué plus tôt :

  • le bundler encapsule votre swap dans un UserOperation (un paquet de données avec la logique de votre swap)

  • puis l’envoie au contrat EntryPoint

  • EntryPoint le valide (vérification de votre solde, signature et nonce)

  • si tout est correct, il exécute votre intention — appelant les routeurs, les pools et déplaçant les tokens.

Du point de vue de la blockchain, toutefois, tout cela ressemble simplement à « le bundler envoie des données à EntryPoint ».

En termes SCW, cette étape s’appelle la transaction externe.

Et cette transaction a réussi : les données ont été livrées et EntryPoint a commencé à exécuter sa logique interne. D’où le ✅ Success en haut.


Mais l’explorateur, par courtoisie, vous informe quand même que quelque chose a échoué à l’intérieur d’EntryPoint avec cette petite note jaune. Pour l’explorateur, cet échec interne n’est pas suffisant pour marquer la transaction comme échouée.

Maintenant, un autre détail saute aux yeux dans l’onglet Overview :

  • Environ $6 d’ETH ont été envoyés de votre wallet à EntryPoint (le préfinancement du gaz).

  • Seulement $2.3 d’ETH ont été remboursés au bundler.

  • Et les frais de transaction affichés en haut sont encore plus bas — environ $2.15.

À première vue, ces chiffres semblent ne pas correspondre. Détaillons cela d’abord avant de poursuivre l’enquête


Étape 3 – Comprendre la divergence du gaz

Voici la répartition :

  • SCW → EntryPoint (~6 $) : Il s’agit du préfinancement du gaz. EntryPoint collecte toujours plus que nécessaire pour s’assurer que votre UserOp peut s’exécuter.

  • EntryPoint → Bundler (~2,3 $) : Il s’agit du remboursement réel du gaz. C’est le montant réel que vous avez payé pour cette tentative échouée.

  • Frais de transaction (~2,15 $) : C’est ce que le bundler a dépensé pour envoyer votre UserOp à EntryPoint. C’est moins car EntryPoint lui‑même a utilisé du gaz supplémentaire lors de la validation et du remboursement du bundler — ce coût supplémentaire vous a été imputé.

Règle générale :

👉 Votre coût réel en gaz est toujours le remboursement EntryPoint ➜ Bundler (et non les « Frais de transaction » affichés en haut)

Et la différence entre ce que vous avez préfinancé (≈6 $) et ce qui a été remboursé (≈2,3 $) n’a pas disparu. Elle est restée dans EntryPoint comme dépôt, qui sera automatiquement appliqué à votre prochaine transaction.


Étape 4 – Vérifiez l’onglet AA Transactions

Sur l’explorateur, vous voyez un onglet AA Transactions (AA = Account Abstraction). C’est là que se trouve l’activité des smart contract wallets, puisque les SCW fonctionnent sur Account Abstraction (ERC‑4337).

Passons de l’Overview à cet onglet :

Ici vous voyez enfin notre UserOperation listée comme une entrée séparée à l’intérieur de la transaction externe du bundler :

  • Le champ « From » affiche maintenant notre adresse de wallet, confirmant qu’il s’agit bien de notre opération.

  • Il y a un AA Txn Hash distinct, différent du hash de la transaction externe. Pourquoi ?

    • Le hash de la transaction externe appartient à la transaction Bundler->EntryPoint qui contenait votre UserOp (et pouvait inclure plusieurs UserOps de différents utilisateurs).

    • Le AA Txn Hash est l’identifiant unique pour votre UserOperation à l’intérieur de ce bundle.

C’est l’idée clé du bundling :

  • Un bundler peut regrouper de nombreuses UserOps dans une seule transaction.

  • Chaque UserOp obtient son propre AA Txn Hash, afin qu’elle puisse être suivie séparément à l’intérieur du bundle.

  • Dans notre cas, comme il s’agit d’une transaction plus ancienne (il y a plus de 400 jours), les SCW étaient encore rares et le bundle ne contenait que notre UserOp — c’est pourquoi l’onglet affiche « AA Transactions (1) ». Dans des transactions plus récentes, vous verrez souvent plusieurs UserOps groupées dans un même bundle.

Dans cette vue, vous remarquerez également une (!) rouge à côté de votre AA Txn Hash — confirmation que votre swap ne s’est pas exécuté.

L’étape suivante est de cliquer sur le AA Txn Hash. Cela ouvre la page dédiée à la UserOperation, où vous verrez les détails complets de notre tentative de swap — frais, transferts et où cela a échoué.


Étape 5 – Ouvrez la page de détails de la AA Transaction

Cliquer sur le AA Txn Hash vous mène à la page de détails dédiée à votre UserOperation :

Ici vous pouvez enfin voir notre tentative de swap réelle clairement présentée :

  • Statut : x Fail (aucune ambiguïté cette fois)

  • From : l’adresse de votre smart contract wallet

  • Frais de transaction AA : ~0,00231 ETH (2,31 $). C’est le coût réel du gaz que vous avez payé — le remboursement envoyé au bundler.

  • Transaction interne : un transfert d’environ 0,00145 ETH (≈6,36 $) de votre SCW vers EntryPoint (préfinancement du gaz). Aucun autre transfert n’a eu lieu, ce qui confirme que le swap lui‑même ne s’est jamais exécuté.

  • Bundle Txn Hash : également affiché, renvoyant à la transaction externe du bundler.

Cette page correspond enfin à votre intuition : il s’agit de la véritable transaction — la UserOperation qui représentait votre tentative de swap.

Cela conclut presque notre enquête. Mais puisque nous sommes arrivés jusqu’ici, cliquons aussi sur Internal Txns.


Étape 6 – Vérifiez l’onglet Internal Transactions

Passez à l’onglet Internal Txns dans la vue de la AA Transaction :

Ici vous voyez les actions étape par étape qu’EntryPoint a tenté d’exécuter en votre nom :

  1. ✅ Transfert de votre SCW → EntryPoint (~0,00145 ETH, ≈6,36 $) = préfinancement du gaz. Cela a réussi.

  2. ❌ Exécution de votre SCW → Uniswap Universal Router (~0,002 ETH) = tentative de swap. Cela a échoué.

Cette répartition explique l’échec :

  • Vous avez envoyé avec succès de l’ETH à EntryPoint comme préfinancement du gaz.

  • Mais quand EntryPoint a essayé de transférer de l’ETH à Uniswap pour le swap, la tentative a échoué.

Pour une répartition la plus détaillée, ouvrez l’onglet Logs.


Étape 7 – Inspectez l’onglet Logs

Cliquez sur Logs (3) :

Vous trouverez ici trois événements clés :

  • Deposited → confirme que votre préfinancement du gaz a été reçu par EntryPoint.

  • BeforeExecution → montre qu’EntryPoint a commencé à traiter votre UserOperation.

  • UserOperationEvent success: False — l’enregistrement canonique on‑chain indiquant que votre UserOp a échoué.


Ce qui s’est réellement passé (tout rassemblé)

Ce type d’échec est spécifique aux swaps avec SCW sur les EVM lorsque l’entrée est le token natif (ETH, BNB, MATIC…).

  • L’écart : ni le bundler ni EntryPoint ne vérifient si vous disposez de suffisamment de token natif pour couvrir à la fois le préfinancement du gaz et le swap. Ils ne vérifient ces éléments que séparément — « assez pour le gaz ? » et « assez pour le swap ? ». C’est pourquoi la simulation est passée.

  • Nous avons mis en place un filet de sécurité dans l’application pour ces cas, et vous avons averti dans l’interface que le gaz pourrait être insuffisant. Mais comme la simulation avait l’air correcte, vous pouviez quand même confirmer.

  • Une fois que vous avez confirmé, le bundler a soumis votre UserOperation à EntryPoint.

  • EntryPoint a prélevé environ 6 $ d’ETH comme préfinancement.

  • Quand il a essayé d’exécuter le swap, il n’est resté pas assez d’ETH pour couvrir à la fois le swap et le préfinancement en même temps.

  • L’appel de swap a été revert à l’intérieur d’EntryPoint.

  • Vous avez quand même payé ≈2,3 $ en gaz (le remboursement au bundler).

  • Les ≈3,7 $ inutilisés sont restés dans EntryPoint comme dépôt, qui sera utilisé automatiquement pour votre prochaine transaction.

Mis à jour