Decodarea swap-urilor SCW

Cu portofele inteligente bazate pe contracte (SCW), schimburile urmează un traseu foarte diferit față de portofelele Ethereum/EVM tradiționale. Acea diferență poate fi confuză, mai ales când ceva merge prost. Dar odată ce înțelegi actorii principali din flux — și cum să citești ce s-a întâmplat pas cu pas în aplicație și pe explorer — lucrurile încep să capete sens.

Să parcurgem procesul împreună.


De la o atingere la execuția on-chain: ce se întâmplă cu adevărat

Când apeși „Swap” în aplicație, pare o acțiune unică. În realitate, lansezi un proces cu mai multe straturi construit peste abstractizarea contului a Ethereum (ERC-4337). Tranzacția ta nu merge direct la blockchain ca la un portofel normal. În schimb, face un ocol:

  1. Noi construim ruta. Cerem motorului de rutare (cum ar fi 1inch) să găsească cel mai bun traseu pentru swap-ul tău și îl simulăm pentru a ne asigura că funcționează. Estimăm gazul, validăm că ai tokenii, și împachetăm instrucțiunile într-un format special: un UserOperation.

  2. Un bundler intervine. Acesta este un actor off-chain responsabil cu trimiterea UserOperations către blockchain. Verifică op-ul tău, se asigură că este valid și plătește în avans gazul pentru tine (îi va fi rambursat mai târziu).

  3. UserOp-ul tău intră în blockchain prin EntryPoint contractul inteligent. Gândește-te la EntryPoint ca la singura poartă prin care trec toate tranzacțiile SCW. EntryPoint rulează verificări finale și, dacă totul pare în regulă…

  4. EntryPoint îi spune portofelului tău inteligent (SCW) să execute swap-ul. SCW-ul tău apelează router-ul (de ex., 1inch), router-ul apelează pool-urile, tokenii se mișcă, iar rezultatul se întoarce în portofelul tău.

Deci, ca să rezumăm: apeși swap → simulăm → bundler trimite → EntryPoint validează → SCW-ul tău execută.


Să vedem un exemplu real

Acum că înțelegem fluxul la nivel înalt, să vedem cum se desfășoară într-un swap real: mai întâi în aplicație, apoi on-chain:

Iată ce vedem:

  • Am schimbat 1 USDC pentru 0.765 KTA.

  • Swap-ul a fost executat pe Base (observă iconița Base pe simbolurile monedelor).

  • Am plătit:

    • $0.03 gaz (în ETH)

    • 0.22% taxă de swap către goodcryptoX

    • 0.05% taxă de router către 1inch

  • Ruta a fost simplă: 100% printr-un pool Uniswap v4.

  • Bundler: Alchemy (vezi Pasul 2 de mai sus pentru recapitulare)

  • Link-urile către explorer apar dacă tranzacția a ajuns pe blockchain și a fost înregistrată în bloc (chiar dacă a eșuat)

Până acum, bine. Următorul pas, hai să dăm click pe linkul BaseScan ca să vedem cum arată această tranzacție on-chain:

Notă despre linkurile din explorer: În cele mai recente versiuni ale aplicației, linkurile din explorer deschid deja tranzacția ta AA (UserOp). Dacă asta vezi (câmpul „From” arată adresa portofelului tău), poți trece direct la Pasul 5 – pagina cu detalii despre tranzacția AA. Pașii anteriori se aplică doar dacă linkul tău indică spre tranzacția externă a bundler-ului (unde „From” NU este portofelul tău). Oricum, este totuși o lectură utilă pentru a înțelege mai bine cum funcționează tranzacțiile SCW

De la: acesta nu este portofelul tău — este bundler-ul Alchemy. Asta e de așteptat, deoarece bundler-ul a trimis tranzacția.

Către: EntryPoint (v0.6.0). Din nou, de așteptat — toate tranzacțiile SCW intră prin aici.

Tranzacții interne: arată fluxurile de tokeni nativi (ETH pe Base) în cadrul tranzacției. Iată ce vedem:

  • Portofelul nostru (…0A5) a trimis ETH către EntryPoint pentru taxa de gaz.

  • EntryPoint a rambursat bundler-ului costul real al gazului (deoarece bundler-ul a plătit gazul în avans în numele tău; vezi Pasul 2 de mai sus). Orice ETH rămas a rămas în EntryPoint ca depozit pentru tranzacțiile viitoare.

Transferuri ERC-20: arată mișcările reale ale tokenilor:

Portofelul nostru nu a trimis USDC direct. În schimb, contractul token USDC (…2A8) a procesat și a declanșat transferurile. Acest lucru este normal: pe chain-urile EVM, transferurile de tokeni sunt gestionate de contractul token după ce primește o instrucțiune de la portofelul tău inteligent.

  1. Contractul USDC a împărțit cei 1 USDC în trei transferuri:

    • 0.0022 USDC către portofelul de taxe al protocolului nostru (…608A)

    • 0.0005 USDC către portofelul de taxe al 1inch (…1DE5)

    • Restul de 0.9973 USDC către router-ul Uniswap v4 (…Universal Router)

  2. Router-ul Uniswap v4 l-a transmis către Pool Manager-ul Uniswap v4 (contract unic care gestionează toate pool-urile v4).

  3. Pool Manager-ul a executat swap-ul: USDC în → KTA afară.

  4. KTA a fost rutat înapoi prin Aggregation Router-ul 1inch, care l-a redirecționat către portofelul nostru (…0A5).


🧩 Cum să decodezi o tranzacție SCW eșuată

Acum că înțelegem cum funcționează swap-urile cu portofele inteligente (SCW) — și am parcurs un trade reușit — să folosim aceleași instrumente pentru a descifra unul eșuat.

Vom folosi un alt caz real: un swap ETH → token pe Ethereum care a eșuat în interiorul contractului EntryPoint pentru că nu a existat suficient ETH pentru a acoperi atât swap-ul, cât și taxa de gaz.

Ok, deci vezi „Error” ca stare a swap-ului în aplicație sau primești o notificare push că swap-ul tău a eșuat. Ce faci?


Pasul 1 — Verifică detaliile comenzii în goodcryptoX

Iată ce vezi în acest caz:

Folosind cadrul pe care l-am dezvoltat mai devreme, observi rapid:

  • Starea swap-ului este Error (failed?)

  • Nu este afișat niciun mesaj de eroare (asta e neobișnuit)

  • Există taxă de gaz (a ajuns pe blockchain?)

  • Este afișată o rută (simularea a fost ok?)

  • Există link-uri către exploratoare blockchain (pot verifica tx pe blockchain!).

Să verificăm intuiția ta:

  • Cuvântul Error status înseamnă că swap-ul a eșuat

  • Ar trebui să existe atât un mesaj de eroare ușor de citit de către om (tradus din cel brut), cât și cel brut. Lipsa mesajului de eroare înseamnă cu siguranță că s-a întâmplat ceva neobișnuit

  • Taxa de gaz indică într-adevăr că tranzacția a ajuns pe blockchain și s-a produs oarecare activitate on-chain (care a consumat gaz)

  • Ruta confirmă că simularea tranzacției a trecut și a rezultat într-un traseu clar către execuție

  • Link-urile exploratorului confirmă că tranzacția a ajuns pe blockchain — chiar dacă a eșuat. Ar trebui cu siguranță să deschidem unul dintre ele și să investigăm mai departe


Pasul 2 – Deschide tranzacția în explorerul blockchain

Notă despre linkurile din explorer: În cele mai recente versiuni ale aplicației, linkurile din explorer deschid deja tranzacția ta AA (UserOp). Dacă asta vezi (câmpul „From” arată adresa portofelului tău), poți trece direct la Pasul 5 – pagina cu detalii despre tranzacția AA. Pașii anteriori se aplică doar dacă linkul tău indică spre tranzacția externă a bundler-ului (unde „From” NU este portofelul tău). Oricum, este totuși o lectură utilă pentru a înțelege mai bine cum funcționează tranzacțiile SCW

Atingi linkul Etherscan pentru a vedea ce s-a întâmplat:

La prima vedere, lucrurile devin și mai confuze:

  • Starea spune ✅ Success — stai, ce?!

  • Dar știm deja că swap-ul nu a fost realizat

  • Sub câmpul “To” (EntryPoint), există un mic mesaj galben:

    Deși una sau mai multe erori au apărut [execution reverted] Contract Execution Completed

Deci ce se întâmplă de fapt aici?

Amintește-ți fluxul tranzacției SCW pe care l-am acoperit mai devreme:

  • bundler-ul împachetează swap-ul tău într-un UserOperation (un pachet de date cu logica swap-ului tău)

  • apoi îl trimite către contractul inteligent EntryPoint

  • EntryPoint îl validează (verificând soldul tău, semnătura și nonce-ul)

  • dacă totul este în regulă, execută intenția ta — apelând routere, pool-uri și mutând tokenii.

Din perspectiva blockchain-ului, însă, toată chestia asta arată doar ca „bundler trimite date către EntryPoint”.

În termeni SCW, acest pas se numește outer tranzacție.

Și acea tranzacție a avut succes: datele au fost livrate și EntryPoint a început să ruleze logica internă. De aceea apare ✅ Success în partea de sus.


Dar explorer-ul, ca să fie politicos, tot îți spune că ceva a eșuat în interiorul EntryPoint prin acea mică notă galbenă. Pentru explorer, acea eroare internă nu este suficientă pentru a marca tranzacția ca fiind eșuată.

Acum, un alt detaliu îți sare în ochi pe fila Overview:

  • Aproximativ $6 valoare în ETH a fost trimisă din portofelul tău către EntryPoint (prefundul pentru gaz).

  • Doar $2.3 valoare în ETH a fost rambursată bundler-ului.

  • Iar taxa de tranzacție afișată în partea de sus este și mai mică — aproximativ $2.15.

La prima vedere, aceste cifre nu par să se potrivească. Să desfacem asta mai întâi înainte de a continua investigația


Pasul 3 – Înțelegerea discrepanței la gaz

Iată defalcarea:

  • SCW → EntryPoint (~$6): Acesta este prefundul pentru gaz. EntryPoint colectează întotdeauna mai mult decât este necesar pentru a se asigura că UserOp-ul tău poate rula.

  • EntryPoint → Bundler (~$2.3): Aceasta este rambursarea reală a gazului. Este suma reală pe care ai plătit-o pentru această încercare eșuată.

  • Taxa de tranzacție (~$2.15): Aceasta este ceea ce a cheltuit bundler-ul pentru a trimite UserOp-ul tău către EntryPoint. Este mai mică deoarece EntryPoint în sine a folosit gaz suplimentar în timpul validării și rambursării bundler-ului — acel cost suplimentar ți-a fost imputat ție.

Regulă generală:

👉 Costul tău real de gaz este întotdeauna rambursarea EntryPoint ➜ Bundler (nu „Transaction Fee” afișată în partea de sus)

Iar diferența dintre ceea ce ai prefundat ($6) și ceea ce a fost rambursat ($2.3) nu a dispărut. A rămas în EntryPoint ca depozitul tău, care va fi aplicat automat la următoarea tranzacție.


Pasul 4 – Verifică fila AA Transactions

Pe explorer, vezi o filă AA Transactions (AA = Account Abstraction). Aici se găsește activitatea portofelelor smart contract, deoarece SCW-urile funcționează pe Account Abstraction (ERC-4337).

Hai să trecem la acea filă din Overview:

Aici vezi în sfârșit UserOperation-ul nostru listat ca o intrare separată în interiorul tranzacției outer a bundler-ului:

  • Câmpul "From" arată acum adresa portofelului nostru, confirmând că aceasta este operațiunea noastră.

  • Există un AA Txn Hash separat, diferit de hash-ul tranzacției outer. De ce?

    • Outer Txn Hash aparține tranzacției Bundler->EntryPoint care a conținut UserOp-ul tău (și ar fi putut include multiple UserOp-uri de la diferiți utilizatori).

    • AA Txn Hash este identificatorul unic pentru operațiunea ta UserOperation din interiorul acelui bundle.

Aceasta este ideea cheie a bundling-ului:

  • Un bundler poate împacheta împreună multe UserOp-uri într-o singură tranzacție.

  • Fiecare UserOp primește propriul AA Txn Hash, astfel încât poate fi urmărit separat în interiorul pachetului.

  • În cazul nostru, deoarece aceasta este o tranzacție mai veche (acum 400+ zile), SCW-urile erau încă rare și bundle-ul conținea doar UserOp-ul nostru — de aceea fila arată „AA Transactions (1).” În tranzacții mai noi, vei vedea adesea multiple UserOp-uri agregate împreună într-un singur bundle.

În această vedere, vei observa, de asemenea, o (!) lângă AA Txn Hash-ul tău — confirmarea că swap-ul tău nu s-a executat.

Următorul pas este să dai click pe AA Txn Hash. Aceasta deschide pagina dedicată UserOperation-ului, unde vei vedea detaliile complete ale încercării noastre de swap — taxă, transferuri și unde a eșuat.


Pasul 5 – Deschide pagina cu detaliile tranzacției AA

Clickarea AA Txn Hash te duce la pagina detaliată dedicată UserOperation-ului tău:

Aici poți în sfârșit vedea încercarea noastră reală de swap prezentată clar:

  • Status: x Fail (fără ambiguitate de data aceasta)

  • From: adresa portofelului tău smart contract

  • AA Transaction Fee: ~0.00231 ETH ($2.31). Acesta este costul real al gazului pe care l-ai plătit — rambursarea trimisă bundler-ului.

  • Tranzacție internă: un transfer de ~0.00145 ETH ($6.36) din SCW-ul tău către EntryPoint (prefund pentru gaz). Nu au avut loc alte transferuri, ceea ce confirmă că swap-ul în sine nu a fost executat.

  • Bundle Txn Hash: afișat de asemenea, legând înapoi la tranzacția outer a bundler-ului.

Această pagină se potrivește în sfârșit cu intuiția ta: aceasta este tranzacția reală — UserOperation-ul care a reprezentat încercarea ta de swap.

Asta aproape încheie investigația noastră. Dar deoarece am ajuns până aici, hai să dăm click și pe Internal Txns.


Pasul 6 – Verifică fila Internal Transactions

Treci la fila Internal Txns din vizualizarea AA Transaction:

Aici vezi acțiunile pas cu pas pe care EntryPoint a încercat să le efectueze în numele tău:

  1. ✅ Transfer din SCW-ul tău → EntryPoint (~0.00145 ETH, ~$6.36) = prefund pentru gaz. Acest lucru a reușit.

  2. ❌ Execute din SCW-ul tău → Uniswap Universal Router (~0.002 ETH) = swap încercat. Acesta a eșuat.

Această defalcare explică eroarea:

  • Ai trimis cu succes ETH către EntryPoint ca prefund pentru gaz.

  • Dar când EntryPoint a încercat să redirecționeze ETH către Uniswap pentru swap, tentativa a eșuat.

Pentru defalcarea cea mai detaliată, deschide fila Logs.


Pasul 7 – Inspectează fila Logs

Dă click pe Logs (3):

Aici vei găsi trei evenimente cheie:

  • Deposited → confirmă că prefundul tău pentru gaz a fost primit de EntryPoint.

  • BeforeExecution → arată că EntryPoint a început procesarea UserOperation-ului tău.

  • UserOperationEvent success: False — înregistrarea canonică on-chain că UserOp-ul tău a eșuat.


Ce s-a întâmplat cu adevărat (punând totul cap la cap)

Acest tip de eșec este specific swap-urilor cu SCW-uri pe EVM-uri unde inputul este tokenul nativ (ETH, BNB, MATIC…).

  • Lipsa: nici bundler-ul, nici EntryPoint nu verifică dacă ai suficient token nativ pentru a acoperi atât prefundul pentru gaz, cât și swap-ul împreună. Ei verifică doar separat — „suficient pentru gaz?” și „suficient pentru swap?”. De aceea simularea a trecut.

  • Am construit o măsură de siguranță în aplicație pentru aceste cazuri, te-am avertizat în interfață că gazul ar putea fi insuficient. Dar deoarece simularea părea în regulă, ai putut totuși să continui.

  • Odată ce ai confirmat, bundler-ul a trimis UserOperation-ul tău către EntryPoint.

  • EntryPoint a preluat aproximativ 6$ în ETH ca prefund.

  • Când a încercat să execute swap-ul, nu a mai rămas suficient ETH pentru a acoperi atât swap-ul și prefundul în același timp.

  • Apelul de swap a fost revertat în interiorul EntryPoint.

  • Ai plătit totuși aproximativ $2.3 în gaz (rambursarea către bundler).

  • Suma neutilizată de aproximativ $3.7 a rămas în EntryPoint ca depozitul tău, care va fi folosit automat la următoarea tranzacție.

Last updated