Dekodowanie swapów SCW
W przypadku portfeli opartych na smart kontraktach (SCW) wymiany przebiegają zupełnie inaczej niż w tradycyjnych portfelach Ethereum/EVM. Ta różnica może być myląca, szczególnie gdy coś pójdzie nie tak. Jednak gdy zrozumiesz kluczowych uczestników procesu — i jak krok po kroku odczytać, co się stało w aplikacji i w eksploratorze — wszystko zaczyna nabierać sensu.
Przejdźmy przez to razem.
Od jednego tapnięcia do wykonania on-chain: co tak naprawdę się dzieje
Gdy stukniesz „Swap” w aplikacji, wydaje się to jedną akcją. W rzeczywistości uruchamiasz wielowarstwowy proces oparty na account abstraction Ethereum (ERC-4337). Twoja transakcja nie trafia bezpośrednio na blockchain jak w zwykłym portfelu. Zamiast tego robi objazd:
My budujemy trasę. Prosimo silnik routingu (np. 1inch) o znalezienie najlepszej ścieżki dla twojej wymiany i symulujemy ją, żeby upewnić się, że działa. Szacujemy gaz, sprawdzamy, czy masz tokeny, i pakujemy instrukcje w specjalny format:
UserOperation.A
bundlerwchodzi do akcji. Jest to podmiot działający poza łańcuchem odpowiedzialny za przesyłanie UserOperations do blockchaina. Sprawdza twój op, upewnia się, że jest ważny, i przedpłaca gaz za ciebie (następnie otrzymuje zwrot).Twój UserOp trafia na blockchain przez
EntryPointsmart kontrakt. Pomyśl o EntryPoint jako jednej bramie, przez którą przechodzą wszystkie transakcje SCW. EntryPoint wykonuje końcowe kontrole, a jeśli wszystko wygląda dobrze…EntryPoint każe twojemu Smart Contract Wallet (SCW) wykonać wymianę. Twój SCW wywołuje router (np. 1inch), router wywołuje pule, tokeny się przemieszczają, a wynik trafia z powrotem do twojego portfela.
Podsumowując: stukasz swap → symulujemy → bundler wysyła → EntryPoint waliduje → twój SCW wykonuje.
Spójrzmy na prawdziwy przykład
Teraz, gdy rozumiemy ogólny przebieg, zobaczmy jak to wygląda w rzeczywistej wymianie: najpierw w aplikacji, potem on-chain:

Oto co widzimy:
Wymieniliśmy 1 USDC na 0,765 KTA.
Wymiana została wykonana na Base (zwróć uwagę na ikonę Base przy symbolach monet).
Zapłaciliśmy:
0,03 USD za gaz (w ETH)
0,22% opłaty za swap dla goodcryptoX
0,05% opłaty routera dla 1inch
Trasa była prosta: 100% przez pulę Uniswap v4.
Bundler: Alchemy (zobacz Krok 2 powyżej dla przypomnienia)
Linki do eksploratora pojawiają się, jeśli transakcja dotarła do blockchaina i została zarejestrowana w bloku (nawet jeśli się nie powiodła)
Jak dotąd wszystko w porządku. Następnie kliknijmy link BaseScan, aby zobaczyć, jak ta transakcja wygląda on-chain:

Od: to nie jest twój portfel — to bundler Alchemy. To oczekiwane, ponieważ bundler wysłał transakcję.
Do: EntryPoint (v0.6.0). Ponownie, oczekiwane — wszystkie transakcje SCW przechodzą przez to miejsce.
Transakcje wewnętrzne: pokazuje przepływy natywnych tokenów (ETH na Base) wewnątrz transakcji. Oto co widzimy:
Nasz portfel (…0A5) wysłał ETH do EntryPoint jako opłatę za gaz.
EntryPoint zwrócił bundlerowi rzeczywisty koszt gazu (ponieważ bundler przedpłacił gaz w twoim imieniu; zobacz Krok 2 powyżej). Wszelkie pozostałe ETH pozostały w EntryPoint jako twój depozyt na przyszłe transakcje.
Przelewy ERC-20: pokazuje rzeczywiste ruchy tokenów:
Nasz portfel nie wysłał USDC bezpośrednio. Zamiast tego kontrakt tokena USDC (…2A8) przetworzył i wysłał transfery. To normalne: na łańcuchach EVM transfery tokenów są obsługiwane przez sam kontrakt tokena po otrzymaniu instrukcji od twojego smart kontraktowego portfela.
Kontrakt USDC podzielił nasze 1 USDC na trzy transfery:
0,0022 USDC do portfela opłat naszego protokołu (…608A)
0,0005 USDC do portfela opłat 1inch (…1DE5)
Pozostałe 0,9973 USDC do routera Uniswap v4 (…Universal Router)
Router Uniswap v4 przekazał je do Pool Managera Uniswap v4 (pojedynczy kontrakt obsługujący wszystkie pule v4).
Pool Manager wykonał swap: USDC in → KTA out.
KTA zostało przekierowane z powrotem przez Aggregation Router 1inch, który przesłał je do naszego portfela (…0A5).
🧩 Jak zdekodować nieudaną transakcję SCW
Skoro rozumiemy, jak działają wymiany SCW — i przeszliśmy przez udaną transakcję — użyjmy tych samych narzędzi, aby rozszyfrować nieudaną.
Użyjemy innego rzeczywistego przypadku: wymiany ETH → token na Ethereum, która nie powiodła się wewnątrz kontraktu EntryPoint, ponieważ nie było wystarczająco dużo ETH, aby pokryć zarówno swap, jak i opłatę za gaz.
Ok, widzisz „Error” jako status swojej wymiany w aplikacji lub otrzymujesz powiadomienie push, że wymiana się nie powiodła. Co robisz?
Krok 1 — Sprawdź szczegóły zamówienia w goodcryptoX
Oto co widzisz w tym przypadku:

Korzystając z ram, które wcześniej opracowaliśmy, szybko zauważasz:
Status wymiany to
Error(nieudane?)Nie pokazano komunikatu o błędzie (to nietypowe)
Jest opłata za gaz (dotarło do blockchaina?)
Jest pokazana trasa (symulacja przeszła ok?)
Są linki do eksploratorów blockchaina (mogę sprawdzić tx na blockchainie!).
Sprawdźmy twoją intuicję:
Ten
Errorstatus oznacza, że wymiana się nie powiodłaPowinien być zarówno czytelny komunikat o błędzie (przetłumaczony z surowego), jak i surowy komunikat. Brak komunikatu o błędzie zdecydowanie oznacza, że zdarzyło się coś nietypowego
Opłata za gaz faktycznie oznacza, że transakcja dotarła do blockchaina i wystąpiła jakaś aktywność on-chain (która zużyła gaz)
Trasa potwierdza, że symulacja transakcji przeszła i miała jasną ścieżkę do wykonania
Linki do eksploratora potwierdzają, że transakcja dotarła do blockchaina — nawet jeśli się nie powiodła. Powinniśmy koniecznie otworzyć jeden z nich i zbadać dalej
Krok 2 – Otwórz transakcję w eksploratorze blockchaina
Klikasz link Etherscan, aby zobaczyć, co się stało:

Na pierwszy rzut oka sprawy stają się jeszcze bardziej mylące:
Status mówi ✅ Success — zaraz, co?!
Ale już wiemy, że swap nie przeszedł
Pod polem „To” (EntryPoint) jest mała żółta wiadomość:
“Chociaż wystąpił jeden lub więcej błędów [execution reverted] Wykonanie kontraktu zakończone”
Co więc się tu właściwie dzieje?
Pamiętaj przepływ transakcji SCW, który omówiliśmy wcześniej:
bundler pakuje twój swap w
UserOperation(pakiet danych z logiką twojego swapu)następnie wysyła go do smart kontraktu EntryPoint
EntryPoint waliduje go (sprawdzając twój balans, podpis i nonce)
jeśli wszystko się zgadza, wykonuje twoją intencję — wywołując routery, pule i przemieszczając tokeny.
Z perspektywy blockchaina, jednak, cała ta rzecz wygląda po prostu jak „bundler wysyła dane do EntryPoint”.
W terminologii SCW ten krok nazywa się zewnętrzną transakcją.
I ta transakcja rzeczywiście powiodła się: dane zostały dostarczone, a EntryPoint rozpoczął wykonywanie swojej wewnętrznej logiki. Stąd ✅ Success u góry.
Ale eksplorator, będąc uprzejmy, informuje cię nadal, że coś się nie powiodło wewnątrz EntryPoint tym małym żółtym notatnikiem. Dla eksploratora ta wewnętrzna awaria nie wystarcza, by oznaczyć całą transakcję jako nieudaną.
Teraz na karcie Overview wyskakuje jeszcze jedna szczegół:
Około $6 wartości ETH zostało wysłane z twojego portfela do EntryPoint (prefund na gaz).
Tylko $2.3 wartości ETH zostało zwrócone bundlerowi.
A opłata transakcyjna pokazana u góry jest jeszcze niższa — około $2.15.
Na pierwszy rzut oka te liczby wydają się się nie zgadzać. Rozpakujmy to najpierw zanim przejdziemy dalej z dochodzeniem
Krok 3 – Zrozumienie rozbieżności gazu
Oto rozbicie:
SCW → EntryPoint (~6 USD): To jest prefund na gaz. EntryPoint zawsze zbiera więcej niż potrzeba, aby upewnić się, że twój UserOp może się wykonać.
EntryPoint → Bundler (~2,3 USD): To jest rzeczywisty zwrot kosztów gazu. To jest rzeczywista kwota, którą zapłaciłeś za tę nieudaną próbę.
Opłata transakcyjna (~2,15 USD): To jest to, co bundler wydał, aby wysłać twój UserOp do EntryPoint. Jest niższa, ponieważ sam EntryPoint użył dodatkowego gazu podczas walidacji i zwracania bundlerowi — ten dodatkowy koszt został obciążony tobie.
Zasada ogólna:
👉 Twoje prawdziwe koszty gazu to zawsze zwrot z EntryPoint ➜ Bundler (nie „Opłata transakcyjna” pokazywana u góry)
A różnica między tym, co przedpłaciłeś (6 USD), a tym, co zwrócono (2,3 USD) nie zniknęła. Pozostała w EntryPoint jako twój depozyt, który zostanie automatycznie wykorzystany przy następnej transakcji.
Krok 4 – Sprawdź kartę AA Transactions
W eksploratorze widzisz kartę AA Transactions (AA = Account Abstraction). To tutaj znajduje się aktywność portfeli smart contract, ponieważ SCW działają na Account Abstraction (ERC-4337).
Przełączmy się na tę kartę z Overview:

Tutaj wreszcie widzisz nasz UserOperation wymieniony jako oddzielny wpis wewnątrz zewnętrznej transakcji bundlera:
Pole "From" teraz pokazuje adres naszego portfela, potwierdzając, że to nasza operacja.
Istnieje oddzielny AA Txn Hash, inny niż hash zewnętrznej transakcji. Dlaczego?
Hash zewnętrznej transakcji należy do transakcji Bundler->EntryPoint, która zawierała twój UserOp (i mogła zawierać wiele UserOp od różnych użytkowników).
AA Txn Hash jest unikalnym identyfikatorem dla twojego UserOperation wewnątrz tego pakietu.
To jest kluczowa idea bundlingu:
Bundler może spakować razem wiele UserOps w jedną transakcję.
Każdy UserOp otrzymuje swój własny AA Txn Hash, aby można go było śledzić oddzielnie wewnątrz pakietu.
W naszym przypadku, ponieważ jest to starsza transakcja (sprzed ponad 400 dni), SCW były wciąż rzadkie i pakiet zawierał tylko nasz UserOp — dlatego karta pokazuje „AA Transactions (1).” W nowszych transakcjach często zobaczysz wiele UserOp zgrupowanych razem w jednym pakiecie.
W tym widoku zauważysz również (!) ikonę obok twojego AA Txn Hash — potwierdzenie, że twój swap się nie wykonał.
Następnym krokiem jest kliknięcie AA Txn Hash. To otworzy dedykowaną stronę UserOperation, gdzie zobaczysz pełne szczegóły naszej próby swapu — opłatę, transfery i miejsce, w którym się nie powiodło.
Krok 5 – Otwórz stronę ze szczegółami transakcji AA
Kliknięcie AA Txn Hash przenosi cię do dedykowanej strony szczegółów dla twojego UserOperation:

Tutaj wreszcie możesz zobaczyć naszą rzeczywistą próbę swapu jasno przedstawioną:
Status: x Fail (tym razem bez niejednoznaczności)
From: adres twojego smart kontraktowego portfela
Opłata AA Transaction: ~0,00231 ETH (2,31 USD). To jest rzeczywisty koszt gazu, który zapłaciłeś — zwrot wysłany do bundlera.
Transakcja wewnętrzna: jeden transfer ~0,00145 ETH (6,36 USD) z twojego SCW do EntryPoint (prefund na gaz). Nie wystąpiły inne transfery, co potwierdza, że sam swap nigdy się nie wykonał.
Bundle Txn Hash: również pokazany, łączący z powrotem do zewnętrznej transakcji bundlera.
Ta strona wreszcie pasuje do twojej intuicji: to jest prawdziwa transakcja — UserOperation, która reprezentowała twoją próbę swapu.
To prawie kończy nasze dochodzenie. Ale skoro dotarliśmy tak daleko, kliknijmy także Internal Txns.
Krok 6 – Sprawdź kartę Internal Transactions
Przełącz się na kartę Internal Txns w widoku transakcji AA:

Tutaj widzisz krok po kroku działania, które EntryPoint próbował wykonać w twoim imieniu:
✅ Transfer z twojego SCW → EntryPoint (~0,00145 ETH, ~6,36 USD) = prefund na gaz. To się powiodło.
❌ Execute z twojego SCW → Uniswap Universal Router (~0,002 ETH) = próbowany swap. To się nie powiodło.
To rozbicie wyjaśnia niepowodzenie:
Pomyślnie wysłałeś ETH do EntryPoint jako prefund na gaz.
Ale gdy EntryPoint próbował przekazać ETH do Uniswap na swap, próba nie powiodła się.
Dla najbardziej szczegółowego rozbicia otwórz kartę Logs.
Krok 7 – Zbadaj kartę Logs
Kliknij Logs (3):

Tutaj znajdziesz trzy kluczowe zdarzenia:
Deposited → potwierdza, że twój prefund na gaz został otrzymany przez EntryPoint.
BeforeExecution → pokazuje, że EntryPoint rozpoczął przetwarzanie twojego UserOperation.
UserOperationEvent →
success: False— kanoniczny zapis on-chain, że twój UserOp się nie powiódł.
Co się tak naprawdę stało (łącząc wszystko razem)
Ten typ awarii jest specyficzny dla swapów z SCW na EVM, gdzie wejściem jest natywny token (ETH, BNB, MATIC…).
Luka: ani bundler, ani EntryPoint nie sprawdzają, czy masz wystarczająco natywnego tokena aby pokryć jednocześnie i prefund na gaz, i sam swap. Sprawdzają to tylko oddzielnie — „wystarczająco na gaz?” i „wystarczająco na swap?”. Dlatego symulacja przeszła.
W aplikacji zbudowaliśmy zabezpieczenie na takie przypadki i ostrzegliśmy cię w interfejsie, że gaz może być niewystarczający. Ale ponieważ symulacja wyglądała dobrze, mogłeś mimo to kontynuować.
Gdy potwierdziłeś, bundler przesłał twój UserOperation do EntryPoint.
EntryPoint pobrał około 6 USD w ETH jako prefund.
Gdy próbował wykonać swap, nie pozostało wystarczająco ETH, aby pokryć jednocześnie zarówno swap i jak i prefund.
Wywołanie swapu cofnęło się wewnątrz EntryPoint.
Nadal zapłaciłeś ~2,3 USD za gaz (zwrot dla bundlera).
Niewykorzystane ~3,7 USD pozostało w EntryPoint jako twój depozyt, który zostanie automatycznie użyty przy następnej transakcji.
Last updated