Decodifica transazioni SCW

Con i portafogli smart contract (SCW), gli swap seguono un percorso molto diverso rispetto ai portafogli tradizionali Ethereum/EVM. Questa differenza può confondere, specialmente quando qualcosa va storto. Ma una volta compresi i protagonisti chiave del flusso — e come leggere passo dopo passo cosa è successo nell'app e sull'explorer — le cose iniziano ad avere senso.

Passeggiandoci insieme.


Da un tocco all'esecuzione on-chain: cosa succede realmente

Quando tocchi “Swap” nell'app, sembra un'unica azione. In realtà, avvii un processo multilivello costruito sopra l'account abstraction di Ethereum (ERC-4337). La tua transazione non va direttamente sulla blockchain come con un portafoglio normale. Invece, prende una deviazione:

  1. Noi costruiamo il percorso. Chiediamo al motore di routing (come 1inch) di trovare il percorso migliore per il tuo swap e lo simuliamo per assicurarci che funzioni. Stimiamo il gas, verifichiamo che tu abbia i token e impacchettiamo le istruzioni in un formato speciale: un UserOperation.

  2. Un bundler interviene. Questo è un attore off-chain responsabile dell'invio delle UserOperation alla blockchain. Controlla la tua op, si assicura che sia valida e pre-paga il gas per te (viene rimborsato successivamente).

  3. La tua UserOp entra nella blockchain tramite lo EntryPoint smart contract. Pensa a EntryPoint come all'unico cancello attraverso cui passano tutte le transazioni SCW. EntryPoint esegue i controlli finali e, se tutto sembra a posto…

  4. EntryPoint dice al tuo Smart Contract Wallet (SCW) di eseguire lo swap. Il tuo SCW chiama il router (es. 1inch), il router chiama le pool, i token si muovono e l'output torna nel tuo wallet.

Quindi per riassumere: tocchi swap → noi simuliamo → il bundler invia → EntryPoint valida → il tuo SCW esegue.


Vediamo un esempio reale

Ora che capiamo il flusso a alto livello, vediamo come si svolge in uno swap reale: prima nell'app, poi on-chain:

Ecco cosa vediamo:

  • Abbiamo scambiato 1 USDC per 0,765 KTA.

  • Lo swap è stato eseguito su Base (nota l'icona Base sui simboli delle monete).

  • Abbiamo pagato:

    • $0,03 di gas (in ETH)

    • 0,22% di fee di swap a goodcryptoX

    • 0,05% di fee router a 1inch

  • Il percorso è stato semplice: 100% attraverso una pool Uniswap v4.

  • Bundler: Alchemy (vedi Passo 2 sopra per il riepilogo)

  • I link dell'explorer appaiono se la transazione ha raggiunto la blockchain ed è stata registrata nel blocco (anche se fallisce)

Finora tutto bene. Successivamente, clicchiamo il link BaseScan per vedere come appare questa transazione on-chain:

Da: questo non è il tuo wallet — è il bundler di Alchemy. Questo è previsto, dato che il bundler ha inviato la transazione.

A: EntryPoint (v0.6.0). Di nuovo, previsto — tutte le transazioni SCW entrano da qui.

Transazioni interne: mostra i flussi di token nativi (ETH su Base) all'interno della transazione. Ecco cosa vediamo:

  • Il nostro wallet (…0A5) ha inviato ETH a EntryPoint per la commissione del gas.

  • EntryPoint ha rimborsato il bundler con il costo reale del gas (dato che il bundler ha pre-pagato il gas per tuo conto; vedi Passo 2 sopra). Eventuali ETH rimanenti sono rimasti in EntryPoint come tuo deposito per transazioni future.

Trasferimenti ERC-20: mostra i movimenti effettivi dei token:

Il nostro wallet non ha inviato USDC direttamente. Invece, il contratto token USDC (…2A8) ha elaborato e inviato i trasferimenti. Questo è normale: sulle chain EVM, i trasferimenti di token sono gestiti dal contratto token stesso dopo aver ricevuto un'istruzione dal tuo smart contract wallet.

  1. Il contratto USDC ha diviso il nostro 1 USDC in tre trasferimenti:

    • 0,0022 USDC al wallet fee del nostro protocollo (…608A)

    • 0,0005 USDC al wallet fee di 1inch (…1DE5)

    • I restanti 0,9973 USDC al router Uniswap v4 (…Universal Router)

  2. Il router Uniswap v4 li ha passati al Pool Manager di Uniswap v4 (contratto singolo che gestisce tutte le pool v4).

  3. Il Pool Manager ha eseguito lo swap: USDC in → KTA out.

  4. Il KTA è stato instradato indietro attraverso l'Aggregation Router di 1inch, che lo ha inoltrato al nostro wallet (…0A5).


🧩 Come decodificare una transazione SCW fallita

Ora che capiamo come funzionano gli swap con smart-contract-wallet (SCW) — e abbiamo analizzato un trade riuscito — usiamo gli stessi strumenti per decifrare uno fallito.

Useremo un altro caso reale: uno swap ETH → token su Ethereum che è fallito dentro il contratto EntryPoint perché non c'era abbastanza ETH per coprire sia lo swap che la fee del gas.

Ok, quindi vedi "Errore" come stato dello swap nell'app o ricevi una notifica push che lo swap è fallito. Cosa fai?


Passo 1 — Controlla i dettagli dell'ordine in goodcryptoX

Ecco cosa vedi in questo caso:

Usando il framework che abbiamo sviluppato prima, noti rapidamente:

  • Lo stato dello swap è Errore (fallito?)

  • Nessun messaggio di errore è mostrato (è insolito)

  • C'è una fee di gas (ha raggiunto la blockchain?)

  • Viene mostrato un percorso (la simulazione è andata a buon fine?)

  • Ci sono link agli explorer della blockchain (posso controllare la tx sulla blockchain!).

Controlliamo la tua intuizione:

  • Il Errore status significa che lo swap è fallito

  • Dovrebbe esserci sia un messaggio di errore leggibile dall'uomo (tradotto dal raw) sia quello raw. L'assenza del messaggio di errore significa sicuramente che è successo qualcosa di insolito

  • La fee di gas indica infatti che la transazione ha raggiunto la blockchain e che è avvenuta qualche attività on-chain (che ha consumato gas)

  • Il percorso conferma che la simulazione della transazione è passata e ha portato a un percorso chiaro per l'esecuzione

  • I link dell'explorer confermano che la transazione ha raggiunto la blockchain — anche se è fallita. Dovremmo sicuramente aprirne uno e indagare ulteriormente


Passo 2 – Apri la transazione nell'explorer della blockchain

Tocchi il link Etherscan per vedere cosa è successo:

A prima vista, le cose diventano ancora più confuse:

  • Lo stato dice ✅ Success — aspetta, cosa?!

  • Ma sappiamo già che lo swap non è andato a buon fine

  • Sotto il campo “To” (EntryPoint), c'è un piccolo messaggio giallo:

    Although one or more errors occurred [execution reverted] Contract Execution Completed

Quindi cosa sta succedendo realmente qui?

Ricorda il flusso delle transazioni SCW che abbiamo coperto prima:

  • il bundler incapsula il tuo swap in un UserOperation (un pacchetto di dati con la logica del tuo swap)

  • poi lo invia allo smart contract EntryPoint

  • EntryPoint lo valida (controllando il tuo saldo, la firma e il nonce)

  • se tutto è ok, esegue la tua intenzione — chiamando router, pool e muovendo token.

Dal punto di vista della blockchain, però, tutto questo sembra semplicemente “il bundler invia dati a EntryPoint”.

In termini SCW, questo passaggio è chiamato la transazione esterna.

E quella transazione è riuscita: i dati sono stati consegnati e EntryPoint ha iniziato a eseguire la sua logica interna. Da qui il ✅ Success in cima.


Ma l'explorer, per cortesia, ti fa comunque sapere che qualcosa è fallito all'interno di EntryPoint con quella piccola nota gialla. Per l'explorer, quel fallimento interno non è sufficiente a segnare la transazione come fallita.

Ora, un altro dettaglio salta all'occhio nella scheda Overview:

  • Circa $6 di ETH sono stati inviati dal tuo wallet a EntryPoint (il prefondo del gas).

  • Solo $2.3 di ETH sono stati rimborsati al bundler.

  • E la commissione di transazione mostrata in alto è ancora più bassa — circa $2.15.

A prima vista, questi numeri non sembrano quadrare. Analizziamo questo prima di continuare l'indagine


Passo 3 – Capire la discrepanza del gas

Ecco la suddivisione:

  • SCW → EntryPoint (~$6): Questo è il prefondo del gas. EntryPoint raccoglie sempre più di quanto serve per assicurarsi che la tua UserOp possa essere eseguita.

  • EntryPoint → Bundler (~$2,3): Questo è il rimborso reale del gas. È la somma reale che hai pagato per questo tentativo fallito.

  • Commissione di transazione (~$2,15): Questo è quanto il bundler ha speso per inviare la tua UserOp a EntryPoint. È più basso perché lo stesso EntryPoint ha usato gas extra durante la validazione e il rimborso del bundler — quel costo extra ti è stato addebitato.

Regola pratica:

👉 Il tuo vero costo del gas è sempre il rimborso EntryPoint ➜ Bundler (non la “Transaction Fee” mostrata in alto)

E la differenza tra quanto hai prefondato ($6) e quanto è stato rimborsato ($2,3) non è scomparsa. È rimasta in EntryPoint come tuo deposito, che verrà applicato automaticamente alla tua prossima transazione.


Passo 4 – Controlla la scheda AA Transactions

Sull'explorer, vedi una scheda AA Transactions (AA = Account Abstraction). Qui vive l'attività dei smart contract wallet, dato che gli SCW funzionano con Account Abstraction (ERC-4337).

Passiamo a quella scheda da Overview:

Qui vedi finalmente la nostra UserOperation elencata come voce separata all'interno della transazione esterna del bundler:

  • Il campo "From" ora mostra il nostro indirizzo wallet, confermando che questa è la nostra operazione.

  • C'è un AA Txn Hash separato, diverso dall'hash della transazione esterna. Perché?

    • L'outer Txn Hash appartiene alla transazione Bundler->EntryPoint che conteneva la tua UserOp (e poteva includere più UserOp di vari utenti).

    • L'AA Txn Hash è l'identificatore unico per la tua UserOperation all'interno di quel bundle.

Questa è l'idea chiave del bundling:

  • Un bundler può impacchettare insieme molte UserOp in una sola transazione.

  • Ogni UserOp ottiene il proprio AA Txn Hash, così può essere tracciata separatamente all'interno del bundle.

  • Nel nostro caso, poiché questa è una transazione più vecchia (oltre 400 giorni fa), gli SCW erano ancora rari e il bundle conteneva solo la nostra UserOp — ecco perché la scheda mostra “AA Transactions (1).” Nelle transazioni più recenti vedrai spesso più UserOp raggruppate insieme in un bundle.

In questa vista noterai anche un (!) rossa accanto al tuo AA Txn Hash — conferma che il tuo swap non è stato eseguito.

Il passo successivo è cliccare l'AA Txn Hash. Questo apre la pagina dedicata alla UserOperation, dove vedrai i dettagli completi del nostro tentativo di swap — fee, trasferimenti e dove è fallito.


Passo 5 – Apri la pagina dei dettagli della AA Transaction

Cliccare l'AA Txn Hash ti porta alla pagina di dettaglio dedicata alla tua UserOperation:

Qui puoi finalmente vedere il nostro effettivo tentativo di swap chiaramente esposto:

  • Stato: x Fallito (nessuna ambiguità questa volta)

  • Da: l'indirizzo del tuo smart contract wallet

  • AA Transaction Fee: ~0,00231 ETH ($2,31). Questo è il vero costo del gas che hai pagato — il rimborso inviato al bundler.

  • Transazione interna: un trasferimento di ~0,00145 ETH ($6,36) dal tuo SCW a EntryPoint (prefondo del gas). Nessun altro trasferimento si è verificato, il che conferma che lo swap stesso non è mai stato eseguito.

  • Bundle Txn Hash: mostrato anch'esso, collegandosi alla transazione esterna del bundler.

Questa pagina finalmente corrisponde alla tua intuizione: questa è la transazione reale — la UserOperation che rappresentava il tuo tentativo di swap.

Questo conclude quasi la nostra indagine. Ma dato che siamo arrivati fin qui, clicchiamo anche su Internal Txns.


Passo 6 – Controlla la scheda Internal Transactions

Passa alla scheda Internal Txns nella vista della AA Transaction:

Qui vedi le azioni passo passo che EntryPoint ha tentato di eseguire per tuo conto:

  1. ✅ Trasferimento dal tuo SCW → EntryPoint (~0,00145 ETH, ~$6,36) = prefondo gas. Questo è riuscito.

  2. ❌ Esecuzione dal tuo SCW → Uniswap Universal Router (~0,002 ETH) = tentativo di swap. Questo è fallito.

Questa suddivisione spiega il fallimento:

  • Hai inviato con successo ETH a EntryPoint come prefondo gas.

  • Ma quando EntryPoint ha cercato di inoltrare ETH a Uniswap per lo swap, il tentativo è fallito.

Per la suddivisione più dettagliata, apri la scheda Logs.


Passo 7 – Ispeziona la scheda Logs

Clicca su Logs (3):

Qui troverai tre eventi chiave:

  • Deposited → conferma che il tuo prefondo gas è stato ricevuto da EntryPoint.

  • BeforeExecution → mostra che EntryPoint ha iniziato a processare la tua UserOperation.

  • UserOperationEvent success: False — il record canonico on-chain che la tua UserOp è fallita.


Cosa è successo realmente (mettendo tutto insieme)

Questo tipo di fallimento è specifico per gli swap con SCW su EVM dove l'input è il token nativo (ETH, BNB, MATIC…).

  • La lacuna: né il bundler né EntryPoint controllano se hai abbastanza token nativo per coprire sia il prefondo del gas che lo swap insieme. Controllano solo separatamente — “abbastanza per il gas?” e “abbastanza per lo swap?”. Ecco perché la simulazione è passata.

  • Abbiamo costruito un sistema di sicurezza nell'app per questi casi, avvisandoti nell'interfaccia che il gas potrebbe essere insufficiente. Ma poiché la simulazione sembrava a posto, potevi comunque procedere con il clic.

  • Una volta che hai confermato, il bundler ha inviato la tua UserOperation a EntryPoint.

  • EntryPoint ha prelevato circa $6 in ETH come prefondo.

  • Quando ha provato a eseguire lo swap, non è rimasto abbastanza ETH per coprire sia lo swap che il prefondo allo stesso tempo.

  • La chiamata di swap è stata revertata dentro EntryPoint.

  • Hai comunque pagato circa $2,3 in gas (il rimborso al bundler).

  • I circa $3,7 inutilizzati sono rimasti in EntryPoint come tuo deposito, da usare automaticamente nella tua prossima transazione.

Last updated