> For the complete documentation index, see [llms.txt](https://docs.goodcrypto.app/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.goodcrypto.app/goodcryptox-yue/qian-bao/nei-zhi-qian-bao/zhi-neng-he-yue-qian-bao/jie-ma-scw-dui-huan.md).

# 解碼 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="/files/196b34ac2a0552026bb6527ca8e6db1b7d0784a9" 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="/files/8c995c624d6dd41afa4b43adf3e6120409d9b3c6" 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="/files/cc7a26eab3ec8d7a10ab3e2a81812566b29a2f25" alt=""><figcaption></figcaption></figure>

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

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

一齊驗證你嘅直覺：

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

***

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

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

<figure><img src="/files/3f6a0b346cf1b6b3b01b91453ebc5c1f8b8970d5" 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="/files/4ca47451aa0b64425c884850763ff96d8d8f957b" 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="/files/953b0e8d13e073ed8f7ed2965fdbf4653a4c5ad2" 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="/files/4f5bc9d88a9542fe7ea2042a27179a81cc13c4c7" 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="/files/57a1da9ed718dfad459b316b70edeed9dac318ca" 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 作為你嘅按金，會自動用喺你下一筆交易。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.goodcrypto.app/goodcryptox-yue/qian-bao/nei-zhi-qian-bao/zhi-neng-he-yue-qian-bao/jie-ma-scw-dui-huan.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
