# 解碼 SCW 交換

用智能合約錢包（SCW）做換幣，流程同傳統 Ethereum/EVM 錢包好唔同。呢個分別有時會令人迷惘，特別係出事嗰陣。但只要你明白流程入面嘅關鍵角色——同點樣一步步喺 app 同區塊瀏覽器讀到發生咩事——一切就會開始合理。

一齊行一轉啦。

***

#### 由一下手指到上鏈執行：其實發生咗乜

你喺 app 撳「Swap」個刻，好似只係一個動作。其實你係啟動緊一個建基於 Ethereum 帳戶抽象（ERC-4337）之上的多層流程。你嘅交易唔會似一般錢包咁直入區塊鏈，反而會兜個圈：

1. 我哋砌路線。我哋問路由引擎（例如 1inch）幫你搵最佳路徑，並做模擬確保可行。我哋估 gas、核對你有冇足夠代幣，然後將指令打包成一個特別格式：一個 `UserOperation（用戶操作）`.
2. 有個 `bundler（打包者）` 出場。呢個係鏈下角色，負責將 UserOperation 提交去區塊鏈。佢會檢查你嘅 op、確保有效，並幫你預付 gas（之後會攞回）。
3. 你嘅 UserOp 會經由 `EntryPoint` 智能合約進入區塊鏈。可以將 EntryPoint 當係所有 SCW 交易必經嘅閘口。EntryPoint 做最後檢查，如果一切 OK…
4. EntryPoint 叫你嘅智能合約錢包（SCW）去執行換幣。你嘅 SCW call 路由器（例如 1inch），路由器再 call liquidity pools，代幣移動，最後輸出返落你嘅錢包。

總結：你撳 swap → 我哋模擬 → bundler 提交 → EntryPoint 驗證 → 你嘅 SCW 執行。

***

#### 睇個真實例子

而家明咗高層流程，睇下真實換幣點走：先喺 app 入面，之後上鏈：

<figure><img src="https://62489144-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrFKhEXxJL95YqC19XHlF%2Fuploads%2FU1GSRk2DpRQfQX1RZwSK%2Fimage.png?alt=media&#x26;token=a86ea5fd-705e-43ce-b5a2-c30f8cfcc5ec" alt=""><figcaption></figcaption></figure>

我哋見到：

* 我哋用 1 USDC 換到 0.765 KTA。
* 換幣喺 Base 上執行（留意幣種符號上嘅 Base 圖示）。
* 我哋支付咗：
  * $0.03 gas（以 ETH 計）
  * 0.22% 換幣費俾 goodcryptoX
  * 0.05% 路由費俾 1inch
* 路線好簡單：100% 經 Uniswap v4 池。
* Bundler：Alchemy（見上面第 2 步回顧）
* 如果交易已經上到鏈並記錄喺區塊（就算失敗），就會顯示區塊瀏覽器連結

到目前為止一切正常。下一步，撳 BaseScan 連結睇下呢單交易喺鏈上點樣：

<figure><img src="https://62489144-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrFKhEXxJL95YqC19XHlF%2Fuploads%2FzZOTevTgzK4edwRl4iCw%2Fimage.png?alt=media&#x26;token=16995823-34da-4628-b17f-6fe314fbaa1f" alt=""><figcaption></figcaption></figure>

**From：** 呢個唔係你嘅錢包——係 Alchemy 嘅 bundler。合理，因為係 bundler 提交咗交易。

**To：** EntryPoint（v0.6.0）。再一次，合理——所有 SCW 交易都係由呢度入。

**Internal Transactions：** 顯示交易入面原生代幣（喺 Base 上係 ETH）嘅流向。以下係我哋見到嘅：

* 我哋個錢包（…0A5）畀咗 ETH 去 EntryPoint 作為 gas 費。
* EntryPoint 以實際 gas 成本補償返畀 bundler（因為 bundler 幫你預付咗；見上面第 2 步）。任何剩低嘅 ETH 會留喺 EntryPoint，當作你之後交易嘅按金。

**ERC-20 Transfers：** 顯示實際代幣移動：

我哋個錢包並無直接送出 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 Pool Manager（單一合約處理所有 v4 池）。
3. Pool Manager 執行咗換幣：USDC 入 → KTA 出。
4. KTA 經 1inch 嘅 Aggregation Router 路回我哋個錢包（…0A5）。

***

### 🧩 點樣解讀失敗嘅 SCW 交易

而家明咗 SCW 換幣點運作——亦都走過一單成功交易——用同一套工具去拆解一單失敗嘅。

再用另一個真實案例：喺 Ethereum 上做 ETH → 代幣嘅換幣，喺 EntryPoint 合約入面失敗，因為冇足夠 ETH 同時覆蓋換幣同 gas 費。

好，你喺 app 見到換幣狀態係「Error」或者收到推送話你嘅換幣失敗。可以點做？

***

#### 步驟 1 — 喺 goodcryptoX 檢查訂單詳情

呢個情況你會見到：

<figure><img src="https://62489144-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrFKhEXxJL95YqC19XHlF%2Fuploads%2FwrYogeeljYqmlMsWsucl%2Fimage.png?alt=media&#x26;token=a5b58912-2a41-4e26-91ad-e5f53da6d335" alt=""><figcaption></figcaption></figure>

用我哋啱啱建立嘅框架，你會好快留意到：

* 換幣狀態係 `Error` *（失敗？）*  &#x20;
* 冇顯示錯誤訊息 *（唔常見）*
* 有 gas 費 *（上到鏈？）*
* 有顯示路線 *（模擬冇問題？）*
* 有區塊瀏覽器連結 *（我可以喺鏈上查 tx！）*

一齊驗證你嘅直覺：

* GOOD 代幣 `Error` status 代表換幣失敗
* 應該會有可讀嘅錯誤訊息（由 raw 轉譯）同埋原始錯誤。冇錯誤訊息基本上代表有啲非一般嘅情況發生
* 有 gas 費確實代表交易上到鏈，並且發生咗某啲消耗 gas 嘅鏈上行為
* Route 證實交易模擬通過，並產生清晰嘅執行路徑
* Explorer 連結證實交易已到達區塊鏈——即使失敗。我哋一定要開其中一個繼續查

***

**步驟 2 – 喺區塊鏈瀏覽器打開呢筆交易**

你撳 Etherscan 連結睇下發生咗乜：

<figure><img src="https://62489144-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrFKhEXxJL95YqC19XHlF%2Fuploads%2FAQ6NDCTqMrDc6JkAvTVw%2Fimage.png?alt=media&#x26;token=4da84760-6804-4583-8224-2b0dea1a5cea" alt=""><figcaption></figcaption></figure>

第一眼望落去，更加迷惘：

* 狀態寫住 ✅ Success *— 等等，咩話？！*
* 但我哋已經知道換幣 **冇完成**
* 喺「To」欄（EntryPoint）下面，有一段黃色細字：

  > *「<mark style="color:$warning;">雖然發生一個或多個錯誤【執行回退】合約執行已完成</mark>」*

咁其實發生緊咩事？

記得之前講過嘅 SCW 交易流程：

* bundler 會將你嘅換幣包成一個 `UserOperation（用戶操作）` （帶有你換幣邏輯嘅數據包）
* 然後送去 EntryPoint 智能合約
* EntryPoint 會驗證（檢查你嘅餘額、簽名同 nonce）
* 如果全部通過，就會執行你嘅意圖——call 路由器、池，移動代幣。

但喺區塊鏈角度睇，成件事只係「bundler 傳數據去 EntryPoint」。&#x20;

用 SCW 嘅術語，呢步叫做 `外層` 交易。

而嗰筆交易確實係成功嘅：數據送到，EntryPoint 開始跑內部邏輯。所以上面先會顯示 ✅ Success。

***

但瀏覽器都好有禮貌噉提示你有啲嘢喺 *內部* EntryPoint 入面失敗。對瀏覽器嚟講，呢個內部失敗唔足以將交易標記為失敗。

而家，Overview 分頁有另一個細節彈出嚟：

* 大約 **$6** 咁多 ETH 由你個錢包送到 EntryPoint（gas 預存）。
* 只有 **$2.3** 咁多 ETH 補償返畀 bundler。
* 而頂部顯示嘅 Transaction Fee 仲更低——大約 **$2.15**.

第一眼睇落，呢啲數好似對唔上。喺繼續調查之前先拆解呢點。

***

**步驟 3 – 理解 gas 差異**

分解如下：

* **SCW → EntryPoint** （約 $6）：呢個係 gas 預存。EntryPoint 永遠會收多啲去確保你嘅 UserOp 可以跑得郁。
* **EntryPoint → Bundler** （約 $2.3）：呢個係實際 gas 補償。呢個係你 **實際支付嘅數** ，對應今次失敗嘗試。
* **Transaction Fee** （約 $2.15）：呢個係 bundler 為將你嘅 UserOp 送去 EntryPoint 所花嘅費。會低啲，因為 EntryPoint 自己喺驗證同補償 bundler 嘅時候用多咗 gas——嗰部分由你埋單。

經驗法則：

> 👉 你真正嘅 gas 成本永遠係 EntryPoint ➜ Bundler 嗰筆補償（唔係頂部顯示嘅「Transaction Fee」）

而你預存（$6）同實際補償（$2.3）之間嘅差額冇消失。佢留喺 EntryPoint 入面，作為你嘅按金，自動用喺你下一筆交易。

***

**步驟 4 – 睇 AA Transactions 分頁**

喺瀏覽器，你會見到一個 **AA Transactions** 分頁（AA = 帳戶抽象）。智能合約錢包嘅活動就喺度，因為 SCW 係跑喺帳戶抽象（ERC-4337）之上。

由 Overview 轉去嗰個分頁：

<figure><img src="https://62489144-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrFKhEXxJL95YqC19XHlF%2Fuploads%2FLq4ENlLCtkNHsoErHzEO%2Fimage.png?alt=media&#x26;token=8a448a6d-9bed-43e1-a297-0d3f62e7d095" alt=""><figcaption></figcaption></figure>

你終於會見到我哋嘅 UserOperation 以獨立條目出現喺 bundler 外層交易入面：

* 「From」欄而家顯示 *我哋嘅錢包地址*，確認呢個就係我哋嘅操作。
* 有個獨立嘅 AA Txn Hash，同外層交易 hash 唔同。點解？
  * 外層 Txn Hash 係 Bundler->EntryPoint 嗰筆載住你 UserOp 嘅交易（亦可能載住多個用戶嘅 UserOp）。
  * AA Txn Hash 係 *你嘅* UserOperation 喺嗰個 bundle 入面嘅唯一識別符。

呢個就係打包嘅關鍵概念：

* 一個 bundler 可以將好多 UserOp 一齊打包成一筆交易。
* 每個 UserOp 都有自己嘅 AA Txn Hash，可以喺 bundle 入面獨立追蹤。
* 喺我哋呢個案例，因為係舊交易（400+ 日前），SCW 仲罕有，個 bundle 只包含我哋嘅 UserOp——所以分頁先寫住「AA Transactions (1)」。新啲嘅交易你經常會見到多個 UserOp 一齊打包。

喺呢個視圖，你仲會見到一個 <mark style="color:紅色;">(!)</mark> icon 喺你嘅 AA Txn Hash 旁邊——確認你嘅換幣冇執行。

下一步就係撳入 AA Txn Hash。會打開專屬嘅 UserOperation 頁面，你會見到我哋換幣嘗試嘅全部細節——費用、轉賬、同埋喺邊度失敗。

***

#### 步驟 5 – 打開 AA 交易詳情頁

撳 AA Txn Hash 之後會去到你 UserOperation 嘅專屬詳情頁：

<figure><img src="https://62489144-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrFKhEXxJL95YqC19XHlF%2Fuploads%2F2huUaBF185U2YMTYKRzI%2Fimage.png?alt=media&#x26;token=867651bc-cda8-411e-88f6-f19cb71003fe" alt=""><figcaption></figcaption></figure>

喺度你終於可以清楚見到實際換幣嘗試：

* Status：  <mark style="color:紅色;">x Fail</mark> （今次冇歧義）
* From：你嘅智能合約錢包地址
* AA Transaction Fee：\~0.00231 ETH（$2.31）。呢個就係你實際支付嘅 gas 成本——補償俾 bundler 嗰筆。
* Internal transaction：一筆 \~0.00145 ETH（$6.36）由你嘅 SCW 到 EntryPoint（gas 預存）。冇其他轉賬，證實換幣本身未有執行。
* Bundle Txn Hash：亦會顯示，連回外層 bundler 交易。

呢個頁面終於同你嘅直覺一致：呢個先係真正嘅交易——代表你換幣嘗試嘅 UserOperation。

差唔多查清晒。不過既然嚟到呢度，都撳埋 **Internal Txns**.

***

#### 步驟 6 – 檢查 Internal Transactions 分頁

喺 AA 交易視圖內切到 Internal Txns 分頁：

<figure><img src="https://62489144-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrFKhEXxJL95YqC19XHlF%2Fuploads%2FCcF9ImaaPnfejqHUaJjE%2Fimage.png?alt=media&#x26;token=35999475-ef65-4c23-bde0-799f89faedad" alt=""><figcaption></figcaption></figure>

你會見到 EntryPoint 代你嘗試做嘅逐步動作：

1. ✅ 由你嘅 SCW → EntryPoint 轉賬（\~0.00145 ETH，\~$6.36）＝ gas 預存。呢步成功。
2. ❌ 由你嘅 SCW → Uniswap Universal Router 執行（\~0.002 ETH）＝ 嘗試換幣。呢步失敗。

呢個分解解釋咗點解會失敗：

* 你成功將 ETH 畀咗 EntryPoint 作為 gas 預存。
* 但到 EntryPoint 嘗試將 ETH 轉去 Uniswap 做換幣嗰刻，個嘗試失敗。

想要最詳細嘅分解，就開 Logs 分頁。

***

#### 步驟 7 – 檢視 Logs 分頁

撳 Logs（3）：

<figure><img src="https://62489144-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrFKhEXxJL95YqC19XHlF%2Fuploads%2F3ltsX1it8b1PqwjZFZkk%2Fimage.png?alt=media&#x26;token=e70b7c8b-dcbb-4aa5-aa39-3a9a3e588908" alt=""><figcaption></figcaption></figure>

你會見到三個關鍵事件：

* **Deposited** → 確認你嘅 gas 預存已被 EntryPoint 收到。
* **BeforeExecution** → 顯示 EntryPoint 已開始處理你嘅 UserOperation。
* **UserOperationEvent** → `success：False` — 鏈上標準記錄，表明你嘅 UserOp 失敗。

***

**實際發生嘅事（全部串埋）**

呢種類型嘅失敗係 SCW 喺 EVM 上，以原生代幣（ETH、BNB、MATIC…）作輸入去換幣時特有。

* 盲點：無論係 bundler 定 EntryPoint 都冇檢查你係咪有足夠 **原生代幣** 可以同時覆蓋 gas 預存同換幣兩者。佢哋淨係分開檢查——「夠唔夠俾 gas？」同「夠唔夠做換幣？」。所以模擬會通過。
* 我哋喺 app 入面為呢啲情況加咗保險，喺介面度警告你 gas 可能不足。但因為模擬睇落冇問題，你仍然可以繼續。
* 你確認之後，bundler 就將你嘅 UserOperation 提交去 EntryPoint。
* EntryPoint 抽咗大約 $6 等值嘅 ETH 作為預存。
* 到佢嘗試執行換幣時，已經冇足夠 ETH 可以同時覆蓋換幣同 *同* 預存。
* 換幣嘅 call 喺 EntryPoint 入面回退。
* 你仍然支付咗大約 $2.3 嘅 gas（補償畀 bundler）。
* 未用嘅大約 $3.7 留喺 EntryPoint 作為你嘅按金，會自動用喺你下一筆交易。
