Декодування свопів SCW

У випадку гаманців зі смарт‑контрактами (SCW) свопи проходять зовсім іншим шляхом, ніж у традиційних гаманцях Ethereum/EVM. Ця відмінність може збивати з пантелику, особливо коли щось іде не так. Але щойно ви зрозумієте ключових учасників процесу — і як крок за кроком прочитати, що сталося в додатку та на експлорері — усе починає набувати сенсу.

Давайте пройдемо це разом.


Від одного дотику до виконання в ланцюгу: що насправді відбувається

Коли ви натискаєте «Swap» в додатку, це здається одною дією. Насправді ж ви запускаєте багаторівневий процес, збудований на абстракції акаунтів Ethereum (ERC‑4337). Ваша транзакція не йде прямо в блокчейн, як у звичайному гаманці. Натомість вона робить обхід:

  1. Ми будуємо маршрут. Ми просимо маршрутизатор (наприклад, 1inch) знайти найкращий шлях для вашого свопу й симулюємо його, щоб переконатися, що все працює. Ми оцінюємо газ, перевіряємо, що у вас є токени, і пакуємо інструкції в спеціальний формат: UserOperation.

  2. A bundler втручається. Це поза‑ланцюговий учасник, відповідальний за подачу UserOperations у блокчейн. Він перевіряє вашу операцію, переконується, що вона дійсна, і попередньо оплачує газ за вас (пізніше йому відшкодують).

  3. Ваша UserOp потрапляє в блокчейн через EntryPoint смарт‑контракт. Уявіть EntryPoint як єдині ворота, через які проходять усі транзакції SCW. EntryPoint виконує фінальні перевірки, і якщо все гаразд…

  4. EntryPoint наказує вашому Смарт‑Контрактному Гаманцю (SCW) виконати своп. Ваш SCW викликає маршрутизатор (наприклад, 1inch), маршрутизатор викликає пулі, токени переміщуються, і результат повертається у ваш гаманець.

Отже підсумуємо: ви натискаєте swap → ми симулюємо → bundler відправляє → EntryPoint валідовує → ваш SCW виконує.


Давайте розглянемо реальний приклад

Тепер, коли ми розуміємо загальний потік, подивімося, як це відбувається у реальному свопі: спочатку в додатку, потім в ланцюгу:

Ось що ми бачимо:

  • Ми обміняли 1 USDC на 0.765 KTA.

  • Своп був виконаний на Base (зверніть увагу на іконку Base на символах монет).

  • Ми заплатили:

    • $0.03 за газ (в ETH)

    • 0.22% комісії за своп на користь goodcryptoX

    • 0.05% комісії маршрутизатора на користь 1inch

  • Маршрут був простим: 100% через пул Uniswap v4.

  • Bundler: Alchemy (див. Крок 2 вище для нагадування)

  • Посилання на експлорер з’являються, якщо транзакція дійшла до блокчейну і була записана в блоці (навіть якщо вона зазнала невдачі).

Поки що все гаразд. Далі натиснемо посилання BaseScan, щоб побачити, як ця транзакція виглядає в ланцюгу:

Примітка щодо посилань на оглядач: У останніх версіях додатка посилання на оглядачі вже відкривають вашу AA-транзакцію (UserOp). Якщо ви бачите саме це (поле «From» показує адресу вашого гаманця), ви можете перейти безпосередньо до Крок 5 – сторінка деталей AA-транзакції. Раніші кроки застосовні лише якщо ваше посилання вказує на зовнішню транзакцію бандлера (де «From» НЕ є вашим гаманцем). Проте все одно корисно прочитати це, щоб краще зрозуміти, як працюють транзакції SCW

Від: це не ваш гаманець — це bundler від Alchemy. Це очікувано, оскільки bundler подав транзакцію.

До: EntryPoint (v0.6.0). Знову ж таки, очікувано — всі транзакції SCW проходять через нього.

Внутрішні транзакції: показують потоки нативних токенів (ETH на Base) всередині транзакції. Ось що ми бачимо:

  • Наш гаманець (…0A5) відправив ETH в EntryPoint для оплати газу.

  • EntryPoint відшкодував bundler‑у фактичну вартість газу (оскільки bundler попередньо оплатив газ від вашого імені; див. Крок 2 вище). Будь‑який залишок ETH залишився в EntryPoint як ваш депозит для майбутніх транзакцій.

ERC‑20 перекази: показують фактичні переміщення токенів:

Наш гаманець не відправляв USDC безпосередньо. Замість цього контракт токена USDC (…2A8) обробив і здійснив перекази. Це нормально: в EVM‑ланцюгах перекази токенів виконує сам контракт токена після отримання інструкції від вашого смарт‑контрактного гаманця.

  1. Контракт USDC розподілив наш 1 USDC на три перекази:

    • 0.0022 USDC на гаманець комісій нашого протоколу (…608A)

    • 0.0005 USDC на комісійний гаманець 1inch (…1DE5)

    • Залишок 0.9973 USDC до маршрутизатора Uniswap v4 (…Universal Router)

  2. Маршрутизатор Uniswap v4 передав його до Менеджера пулів Uniswap v4 (єдиний контракт, що обробляє всі пулі v4).

  3. Менеджер пулів виконав своп: USDC в → KTA назовні.

  4. KTA було направлено назад через Aggregation Router 1inch, який переадресував його в наш гаманець (…0A5).


🧩 Як розібратися з невдалою SCW‑транзакцією

Тепер, коли ми розуміємо, як працюють свопи зі смарт‑контрактними гаманцями (SCW) — і пройшли приклад успішної торгівлі — давайте використаємо ті самі інструменти, щоб розшифрувати невдалу.

Ми візьмемо ще один реальний випадок: своп ETH → токен в Ethereum, який зазнав невдачі всередині контракту EntryPoint через те, що не було достатньо ETH, щоб покрити і своп, і плату за газ.

Отже, ви бачите у додатку статус «Error» або отримуєте push‑повідомлення, що ваш своп не вдалося. Що робити?


Крок 1 — Перевірте деталі ордера в goodcryptoX

Ось що ви бачите в цьому випадку:

Використовуючи рамки, які ми описали раніше, ви швидко помічаєте:

  • Статус свопу Error (не вдалося?)

  • Повідомлення про помилку не відображається (це незвично)

  • Є плата за газ (досягло блокчейну?)

  • Показано маршрут (симуляція пройшла успішно?)

  • Є посилання на блокчейн‑експлорери (я можу перевірити транзакцію в блокчейні!).

Перевіримо вашу інтуїцію:

  • Цей Error статус означає, що своп не вдалося

  • Повинно бути як зрозуміле для людини повідомлення про помилку (перекладене з сирого), так і сире повідомлення. Відсутність повідомлення про помилку однозначно означає, що сталося щось незвичне

  • Наявність плати за газ справді означає, що транзакція дісталася до блокчейну і відбулася певна ончейн‑активність (яка спожила газ)

  • Маршрут підтверджує, що симуляція пройшла і утворився чіткий шлях до виконання

  • Посилання на експлорери підтверджують, що транзакція дісталася блокчейну — навіть якщо вона зазнала невдачі. Ми обов’язково маємо відкрити одне з них і розслідувати далі


Крок 2 – Відкрийте транзакцію в блокчейн‑експлорері

Примітка щодо посилань на оглядач: У останніх версіях додатка посилання на оглядачі вже відкривають вашу AA-транзакцію (UserOp). Якщо ви бачите саме це (поле «From» показує адресу вашого гаманця), ви можете перейти безпосередньо до Крок 5 – сторінка деталей AA-транзакції. Раніші кроки застосовні лише якщо ваше посилання вказує на зовнішню транзакцію бандлера (де «From» НЕ є вашим гаманцем). Проте все одно корисно прочитати це, щоб краще зрозуміти, як працюють транзакції SCW

Ви натискаєте посилання Etherscan, щоб подивитися, що сталося:

З першого погляду ситуація стає ще заплутанішою:

  • Статус каже ✅ Success — почекайте, що?!

  • Але ми вже знаємо, що своп не відбувся

  • Під полем «To» (EntryPoint) є маленьке жовте повідомлення:

    Хоча сталася одна або кілька помилок [execution reverted] Виконання контракту завершено

То що тут насправді відбувається?

Пам’ятайте потік транзакцій SCW, який ми розглядали раніше:

  • bundler упаковує ваш своп у UserOperation (пакет даних з вашою логікою свопу)

  • потім відправляє його у смарт‑контракт EntryPoint

  • EntryPoint валідовує його (перевіряючи ваш баланс, підпис і nonce)

  • якщо все проходить перевірку, він виконує ваш намір — викликаючи маршрутизатори, пулі і переміщуючи токени.

З погляду блокчейну, однак, усе це виглядає просто як «bundler відправляє дані в EntryPoint».

У термінах SCW цей крок називається зовнішньою транзакцією.

І ця транзакція справді вдалася: дані були доставлені, і EntryPoint почав виконувати внутрішню логіку. Отже ✅ Success зверху.


Але експлорер, будучи чемним, все ж дає знати, що щось не спрацювало всередині EntryPoint тим малим жовтим повідомленням. Для експлорера ця внутрішня помилка недостатня, щоби позначити транзакцію як невдалу.

Тепер на вкладці Overview випадає ще одна деталь:

  • Близько $6 вартості ETH було надіслано з вашого гаманця в EntryPoint (передоплата газу).

  • Лише $2.3 вартості ETH було відшкодовано bundler‑у.

  • А показана зверху плата за транзакцію ще менша — близько $2.15.

З першого погляду ці числа не здаються узгодженими. Розберімо це спочатку, перш ніж продовжувати розслідування


Крок 3 – Розуміння розбіжності в газі

Ось розподіл:

  • SCW → EntryPoint (~$6): Це передоплата газу. EntryPoint завжди збирає більше, ніж потрібно, щоб упевнитися, що ваша UserOp може виконатися.

  • EntryPoint → Bundler (~$2.3): Це фактичне відшкодування газу. Це реальна сума, яку ви заплатили за цю невдалу спробу.

  • Плата за транзакцію (~$2.15): Це те, що витратив bundler, щоб відправити вашу UserOp до EntryPoint. Вона нижча, оскільки сам EntryPoint використав додатковий газ під час валідації й відшкодування bundler‑у — ця додаткова вартість була списана з вас.

Правило великого пальця:

👉 Ваша реальна вартість газу завжди — це відшкодування EntryPoint ➜ Bundler (не «Плата за транзакцію», показана вгорі)

А різниця між тим, що ви передоплатили (~$6), і тим, що було відшкодовано (~$2.3), не зникла. Вона залишилася в EntryPoint як ваш депозит, який автоматично буде застосований до вашої наступної транзакції.


Крок 4 – Перевірте вкладку AA Transactions

В експлорері ви бачите вкладку AA Transactions (AA = Account Abstraction). Тут знаходиться активність смарт‑контрактних гаманців, оскільки SCW працюють на Account Abstraction (ERC‑4337).

Переключимося на цю вкладку замість Overview:

Тут ви нарешті бачите нашу UserOperation, зазначену як окремий запис всередині зовнішньої транзакції bundler‑а:

  • Поле «From» тепер показує адресу нашого гаманця, підтверджуючи, що це наша операція.

  • Є окремий AA Txn Hash, відмінний від хешу зовнішньої транзакції. Чому?

    • Зовнішній Txn Hash належить транзакції Bundler->EntryPoint, яка містила вашу UserOp (і могла містити кілька UserOp від різних користувачів).

    • AA Txn Hash — це унікальний ідентифікатор для вашої UserOperation всередині того пакета.

Це ключова ідея бандлінгу:

  • Bundler може упакувати багато UserOps в одну транзакцію.

  • Кожна UserOp отримує свій власний AA Txn Hash, щоб її можна було відстежувати окремо всередині пакета.

  • У нашому випадку, оскільки це стара транзакція (понад 400 днів тому), SCW все ще були рідкісні й пакет містив лише нашу UserOp — тому вкладка показує «AA Transactions (1)». У новіших транзакціях ви часто побачите кілька UserOp, згрупованих в одному пакеті.

У цьому поданні ви також помітите (!) іконку поряд з вашим AA Txn Hash — підтвердження того, що ваш своп не виконався.

Наступним кроком є натискання AA Txn Hash. Це відкриває присвячену сторінку UserOperation, де ви побачите повні деталі нашої спроби свопу — комісію, перекази і те, де сталася помилка.


Крок 5 – Відкрийте сторінку деталей AA Transaction

Натискання AA Txn Hash переводить вас на присвячену сторінку з деталями вашої UserOperation:

Тут ви нарешті можете чітко побачити нашу фактичну спробу свопу:

  • Статус: x Fail (цього разу без двозначностей)

  • From: адреса вашого смарт‑контрактного гаманця

  • AA Transaction Fee: ~0.00231 ETH ($2.31). Це реальна вартість газу, яку ви заплатили — відшкодування, відправлене bundler‑у.

  • Внутрішня транзакція: один переказ ~0.00145 ETH ($6.36) від вашого SCW в EntryPoint (передоплата газу). Жодних інших переказів не було, що підтверджує, що сам своп не виконався.

  • Bundle Txn Hash: також показано, з посиланням на зовнішню транзакцію bundler‑а.

Ця сторінка нарешті відповідає вашій інтуїції: це реальна транзакція — UserOperation, що представляла вашу спробу свопу.

Це майже завершило наше розслідування. Але раз ми вже дісталися сюди, давайте також натиснемо на Internal Txns.


Крок 6 – Перевірте вкладку Internal Transactions

Переключіться на вкладку Internal Txns у поданні AA Transaction:

Тут ви бачите покрокові дії, які EntryPoint намагався виконати від вашого імені:

  1. ✅ Переказ від вашого SCW → EntryPoint (~0.00145 ETH, ~$6.36) = передоплата газу. Це вдалося.

  2. ❌ Виконання від вашого SCW → Uniswap Universal Router (~0.002 ETH) = спроба свопу. Це зазнало невдачі.

Цей розподіл пояснює причину невдачі:

  • Ви успішно відправили ETH в EntryPoint як передоплату газу.

  • Але коли EntryPoint спробував переадресувати ETH на Uniswap для свопу, спроба зазнала невдачі.

Для найдетальнішого розбору відкрийте вкладку Logs.


Крок 7 – Перевірте вкладку Logs

Натисніть Logs (3):

Тут ви знайдете три ключових події:

  • Deposited → підтверджує, що ваша передоплата газу була отримана EntryPoint.

  • BeforeExecution → показує, що EntryPoint почав обробляти вашу UserOperation.

  • UserOperationEvent success: False — канонічний ончейн‑запис про те, що ваша UserOp зазнала невдачі.


Що насправді сталося (підсумовуючи)

Такий тип помилки характерний для свопів зі SCW на EVM, де вхідним активом є нативний токен (ETH, BNB, MATIC…).

  • Розрив: ні bundler, ні EntryPoint не перевіряють, чи достатньо у вас нативного токена щоб покрити одночасно і передоплату газу, і сам своп. Вони перевіряють це окремо — «достатньо для газу?» і «достатньо для свопу?». Ось чому симуляція пройшла.

  • Ми заклали у додаток запобіжник для таких випадків і попередили вас в інтерфейсі, що газ може бути недостатньо. Але оскільки симуляція виглядала нормальною, ви все одно могли підтвердити.

  • Після підтвердження bundler подав вашу UserOperation до EntryPoint.

  • EntryPoint зібрав близько $6 в ETH як передоплату.

  • Коли він намагався виконати своп, не залишилося достатньо ETH, щоб одночасно покрити і своп і передоплату.

  • Виклик свопу відкотився всередині EntryPoint.

  • Ви все одно заплатили приблизно $2.3 за газ (відшкодування bundler‑у).

  • Невикористані приблизно $3.7 залишилися в EntryPoint як ваш депозит і будуть автоматично використані для вашої наступної транзакції.

Last updated