Giải mã hoán đổi SCW
Với ví hợp đồng thông minh (SCW), việc hoán đổi (swap) đi theo một con đường rất khác so với ví Ethereum/EVM truyền thống. Sự khác biệt đó có thể gây bối rối, đặc biệt khi có sự cố xảy ra. Nhưng khi bạn hiểu được các tác nhân chính trong luồng — và cách đọc những gì đã xảy ra từng bước trong ứng dụng và trên trình khám phá — mọi thứ sẽ bắt đầu rõ ràng hơn.
Hãy cùng đi qua nhé.
Từ một lần chạm đến thực thi on-chain: điều gì thực sự xảy ra
Khi bạn chạm “Swap” trong ứng dụng, cảm giác như là một hành động duy nhất. Thực tế, bạn đang khởi chạy một quy trình nhiều lớp được xây dựng trên trừu tượng hóa tài khoản của Ethereum (ERC-4337). Giao dịch của bạn không đi thẳng lên blockchain như với ví thông thường. Thay vào đó, nó đi một vòng:
Chúng tôi xây dựng lộ trình. Chúng tôi yêu cầu bộ định tuyến (như 1inch) tìm con đường tốt nhất cho lần hoán đổi của bạn và mô phỏng nó để đảm bảo nó hoạt động. Chúng tôi ước tính gas, xác thực rằng bạn có token, và đóng gói các hướng dẫn vào một định dạng đặc biệt: một
UserOperation.Một
bundlercan thiệp. Đây là một tác nhân ngoài chuỗi chịu trách nhiệm gửi UserOperations lên blockchain. Nó kiểm tra op của bạn, đảm bảo nó hợp lệ, và trả trước gas cho bạn (sau này nó được hoàn trả).UserOp của bạn vào blockchain thông qua
EntryPointhợp đồng thông minh. Hãy tưởng tượng EntryPoint như cổng mà tất cả các giao dịch SCW phải đi qua. EntryPoint thực hiện các kiểm tra cuối cùng, và nếu mọi thứ ổn…EntryPoint ra lệnh cho Ví Hợp đồng Thông minh của bạn (SCW) thực hiện hoán đổi. SCW của bạn gọi router (ví dụ: 1inch), router gọi các pool, token di chuyển, và kết quả trả về ví của bạn.
Tóm lại: bạn chạm swap → chúng tôi mô phỏng → bundler gửi → EntryPoint xác thực → SCW của bạn thực thi.
Hãy xem một ví dụ thực tế
Bây giờ khi chúng ta đã hiểu luồng ở mức cao, hãy xem cách điều này diễn ra trong một lần hoán đổi thực tế: trước tiên trong ứng dụng, sau đó trên chuỗi:

Đây là những gì chúng ta thấy:
Chúng tôi đã hoán đổi 1 USDC lấy 0.765 KTA.
Lần hoán đổi được thực hiện trên Base (lưu ý biểu tượng Base trên ký hiệu đồng tiền).
Chúng tôi đã trả:
0,03$ phí gas (bằng ETH)
0,22% phí hoán đổi cho goodcryptoX
0,05% phí router cho 1inch
Lộ trình đơn giản: 100% qua một pool Uniswap v4.
Bundler: Alchemy (xem Bước 2 ở trên để tóm tắt)
Các liên kết trình khám phá xuất hiện nếu giao dịch đã tới blockchain và được ghi lại trong block (ngay cả khi nó thất bại)
Cho đến nay, mọi thứ tốt. Tiếp theo, hãy nhấp liên kết BaseScan để xem giao dịch này trông như thế nào trên chuỗi:

Từ: đây không phải là ví của bạn — đó là bundler của Alchemy. Điều đó là mong đợi, vì bundler đã gửi giao dịch.
Tới: EntryPoint (v0.6.0). Một lần nữa, điều này là mong đợi — tất cả các giao dịch SCW đều đi qua đây.
Giao dịch nội bộ: hiển thị luồng token native (ETH trên Base) trong giao dịch. Đây là những gì chúng ta thấy:
Ví của chúng tôi (…0A5) đã gửi ETH tới EntryPoint để trả phí gas.
EntryPoint hoàn trả cho bundler chi phí gas thực tế (vì bundler đã trả trước gas thay bạn; xem Bước 2 ở trên). Bất kỳ ETH thừa nào vẫn ở lại EntryPoint như khoản tiền gửi của bạn cho các giao dịch tương lai.
Chuyển ERC-20: hiển thị các chuyển động token thực tế:
Ví của chúng tôi không gửi USDC trực tiếp. Thay vào đó, hợp đồng token USDC (…2A8) đã xử lý và phát đi các chuyển khoản. Điều này là bình thường: trên các chuỗi EVM, chuyển token được xử lý bởi chính hợp đồng token sau khi nhận lệnh từ ví hợp đồng thông minh của bạn.
Hợp đồng USDC đã chia 1 USDC của chúng tôi thành ba chuyển khoản:
0.0022 USDC đến ví phí của giao thức chúng tôi (…608A)
0.0005 USDC đến ví phí của 1inch (…1DE5)
0.9973 USDC còn lại đến router Uniswap v4 (…Universal Router)
Router Uniswap v4 chuyển nó cho Quản lý Pool Uniswap v4 (hợp đồng đơn xử lý tất cả các pool v4).
Pool Manager thực hiện hoán đổi: USDC vào → KTA ra.
KTA được định tuyến trở lại qua Aggregation Router của 1inch, router này chuyển tiếp nó về ví của chúng tôi (…0A5).
🧩 Cách giải mã một giao dịch SCW bị thất bại
Bây giờ chúng ta đã hiểu cách hoạt động của hoán đổi bằng ví hợp đồng thông minh (SCW) — và đã đi qua một giao dịch thành công — hãy dùng cùng các công cụ đó để giải mã một giao dịch thất bại.
Chúng tôi sẽ dùng một trường hợp thực tế khác: một hoán đổi ETH → token trên Ethereum đã thất bại bên trong hợp đồng EntryPoint vì không có đủ ETH để trả cả hoán đổi và phí gas.
OK, nên bạn thấy “Error” là trạng thái hoán đổi trong ứng dụng hoặc nhận thông báo push rằng hoán đổi của bạn thất bại. Bạn sẽ làm gì?
Bước 1 — Kiểm tra chi tiết đơn hàng trong goodcryptoX
Đây là những gì bạn thấy trong trường hợp này:

Sử dụng khung phân tích chúng tôi đã phát triển trước đó, bạn nhanh chóng nhận ra:
Trạng thái hoán đổi là
Error(thất bại?)Không có thông báo lỗi hiện ra (điều đó bất thường)
Có phí gas (đã tới blockchain?)
Có lộ trình được hiển thị (mô phỏng ổn?)
Có các liên kết tới trình khám phá blockchain (Tôi có thể kiểm tra tx trên blockchain!).
Hãy kiểm tra trực giác của bạn:
Token
Errortrạng thái có nghĩa là hoán đổi thất bạiPhải có cả thông báo lỗi dễ đọc cho người dùng (được chuyển ngữ từ bản thô) và bản thô. Thiếu thông báo lỗi chắc chắn có nghĩa là đã có điều gì đó bất thường xảy ra
Có phí gas thực sự có nghĩa là giao dịch đã tới blockchain và đã có hoạt động on-chain (tiêu gas)
Lộ trình xác nhận rằng mô phỏng giao dịch đã thành công và dẫn đến một con đường rõ ràng để thực thi
Các liên kết trình khám phá xác nhận giao dịch đã tới blockchain — ngay cả khi nó thất bại. Chúng ta nên mở một trong số chúng và điều tra thêm
Bước 2 – Mở giao dịch trong trình khám phá blockchain
Bạn chạm vào liên kết Etherscan để xem chuyện gì đã xảy ra:

Lúc đầu nhìn qua, mọi thứ càng rối hơn:
Trạng thái nói ✅ Success — đợi đã, cái gì?!
Nhưng chúng ta đã biết hoán đổi không thành công
Dưới trường “To” (EntryPoint), có một thông báo nhỏ màu vàng:
“Although one or more errors occurred [execution reverted] Contract Execution Completed”
Vậy thật sự đang xảy ra chuyện gì ở đây?
Hãy nhớ luồng giao dịch SCW mà chúng ta đã trình bày trước đó:
bundler gói lần hoán đổi của bạn vào một
UserOperation(một gói dữ liệu chứa logic hoán đổi của bạn)rồi gửi nó tới hợp đồng EntryPoint
EntryPoint xác thực nó (kiểm tra số dư, chữ ký và nonce của bạn)
nếu mọi thứ ổn, nó thực hiện ý định của bạn — gọi router, pool và di chuyển token.
Từ góc nhìn của blockchain, toàn bộ việc này trông chỉ như “bundler gửi dữ liệu tới EntryPoint”.
Trong thuật ngữ SCW, bước này được gọi là giao dịch bên ngoài.
Và giao dịch đó đã thành công: dữ liệu được chuyển giao, và EntryPoint bắt đầu chạy logic nội bộ của nó. Do đó mới có ✅ Success ở trên cùng.
Nhưng trình khám phá, để lịch sự, vẫn cho bạn biết rằng có điều gì đó đã thất bại bên trong EntryPoint với cái ghi chú màu vàng nhỏ đó. Đối với trình khám phá, thất bại nội bộ đó không đủ để đánh dấu giao dịch là thất bại.
Bây giờ, một chi tiết khác nổi bật trên tab Overview:
Khoảng $6 giá trị ETH đã được gửi từ ví của bạn tới EntryPoint (tiền trả trước gas).
Chỉ $2.3 giá trị ETH đã được hoàn trả cho bundler.
Và phí giao dịch hiển thị ở trên cùng còn thấp hơn nữa — khoảng $2.15.
Lúc đầu, những con số này dường như không khớp. Hãy bóc tách điều đó trước khi tiếp tục điều tra
Bước 3 – Hiểu sự chênh lệch gas
Đây là phân tích:
SCW → EntryPoint (~$6): Đây là tiền trả trước gas. EntryPoint luôn thu nhiều hơn cần thiết để đảm bảo UserOp của bạn có thể chạy.
EntryPoint → Bundler (~$2.3): Đây là khoản hoàn trả gas thực tế. Đó là số tiền thực bạn đã trả cho lần cố gắng thất bại này.
Phí giao dịch (~$2.15): Đây là những gì bundler đã chi để gửi UserOp của bạn tới EntryPoint. Con số này thấp hơn vì chính EntryPoint đã dùng thêm gas trong quá trình xác thực và hoàn trả cho bundler — chi phí thêm đó được tính cho bạn.
Quy tắc chung:
👉 Chi phí gas thực sự của bạn luôn là khoản EntryPoint ➜ Bundler được hoàn trả (không phải “Transaction Fee” hiển thị ở trên cùng)
Và phần chênh lệch giữa số bạn trả trước (~$6) và số được hoàn trả (~$2.3) không biến mất. Nó vẫn nằm trong EntryPoint như tiền đặt cọc của bạn, sẽ tự động được áp dụng cho giao dịch tiếp theo.
Bước 4 – Kiểm tra tab AA Transactions
Trên trình khám phá, bạn sẽ thấy một tab AA Transactions (AA = Account Abstraction). Đây là nơi hoạt động ví hợp đồng thông minh xuất hiện, vì SCW chạy trên Account Abstraction (ERC-4337).
Hãy chuyển sang tab đó từ Overview:

Ở đây bạn cuối cùng thấy UserOperation của chúng tôi được liệt kê như một mục riêng bên trong giao dịch bên ngoài của bundler:
Trường "From" bây giờ hiển thị địa chỉ ví của chúng tôi, xác nhận đây là thao tác của chúng tôi.
Có một AA Txn Hash riêng, khác với hash của giao dịch bên ngoài. Tại sao?
Outer Txn Hash thuộc về giao dịch Bundler->EntryPoint chứa UserOp của bạn (và có thể đã bao gồm nhiều UserOp từ nhiều người dùng khác nhau).
AA Txn Hash là định danh duy nhất cho UserOperation của bạn bên trong bundle đó.
Đây là ý tưởng chủ chốt của việc đóng gói:
Một bundler có thể đóng gói nhiều UserOp vào một giao dịch duy nhất.
Mỗi UserOp có AA Txn Hash riêng, nên nó có thể được theo dõi tách biệt bên trong bundle.
Trong trường hợp của chúng tôi, vì đây là một giao dịch cũ (hơn 400 ngày trước), SCW vẫn còn hiếm và bundle chỉ chứa UserOp của chúng tôi — đó là lý do tab hiển thị “AA Transactions (1).” Trong các giao dịch mới hơn, bạn thường thấy nhiều UserOp được gộp cùng trong một bundle.
Trong chế độ xem này, bạn cũng sẽ nhận thấy một (!) màu đỏ cạnh AA Txn Hash của bạn — xác nhận rằng lần hoán đổi của bạn đã không được thực thi.
Bước tiếp theo là nhấp vào AA Txn Hash. Điều đó mở trang UserOperation chuyên dụng, nơi bạn sẽ thấy đầy đủ chi tiết về lần thử hoán đổi của chúng tôi — phí, chuyển khoản, và nơi nó thất bại.
Bước 5 – Mở trang chi tiết AA Transaction
Nhấp vào AA Txn Hash đưa bạn đến trang chi tiết dành cho UserOperation của bạn:

Ở đây bạn cuối cùng có thể thấy lần thử hoán đổi của chúng tôi được trình bày rõ ràng:
Trạng thái: x Fail (lần này không mơ hồ)
From: địa chỉ ví hợp đồng thông minh của bạn
Phí Giao dịch AA: ~0.00231 ETH (2,31$). Đây là chi phí gas thực sự bạn đã trả — khoản hoàn trả gửi tới bundler.
Giao dịch nội bộ: một chuyển khoản ~0.00145 ETH (~6,36$) từ SCW của bạn tới EntryPoint (tiền trả trước gas). Không có chuyển khoản nào khác xảy ra, xác nhận rằng bản thân hoán đổi không bao giờ được thực hiện.
Bundle Txn Hash: cũng được hiển thị, liên kết trở lại giao dịch bundler bên ngoài.
Trang này cuối cùng khớp với trực giác của bạn: đây là giao dịch thực sự — UserOperation đại diện cho lần thử hoán đổi của bạn.
Gần như kết thúc điều tra của chúng ta. Nhưng vì đã đi tới đây, hãy cùng nhấp vào Internal Txns.
Bước 6 – Kiểm tra tab Internal Transactions
Chuyển sang tab Internal Txns bên trong chế độ xem AA Transaction:

Ở đây bạn thấy các hành động từng bước mà EntryPoint đã cố gắng thực hiện thay bạn:
✅ Chuyển từ SCW của bạn → EntryPoint (~0.00145 ETH, ~6,36$) = tiền trả trước gas. Điều này đã thành công.
❌ Thực thi từ SCW của bạn → Uniswap Universal Router (~0.002 ETH) = thử hoán đổi. Điều này thất bại.
Phân tích này giải thích lý do thất bại:
Bạn đã gửi ETH tới EntryPoint như tiền trả trước gas thành công.
Nhưng khi EntryPoint cố chuyển ETH tới Uniswap để hoán đổi, lần thử đã thất bại.
Để có phân tích chi tiết nhất, mở tab Logs.
Bước 7 – Kiểm tra tab Logs
Nhấp vào Logs (3):

Ở đây bạn sẽ tìm thấy ba sự kiện chính:
Deposited → xác nhận rằng tiền trả trước gas của bạn đã được EntryPoint nhận.
BeforeExecution → cho thấy EntryPoint đã bắt đầu xử lý UserOperation của bạn.
UserOperationEvent →
success: False— bản ghi chuẩn trên chuỗi rằng UserOp của bạn đã thất bại.
Điều gì thực sự đã xảy ra (tổng hợp lại)
Loại thất bại này đặc thù cho các hoán đổi với SCW trên EVM khi đầu vào là token native (ETH, BNB, MATIC…).
Lỗ hổng: cả bundler lẫn EntryPoint đều không kiểm tra xem bạn có đủ token native để chi trả cả tiền trả trước gas và hoán đổi cùng lúc hay không. Họ chỉ kiểm tra từng cái riêng rẽ — “đủ cho gas?” và “đủ cho hoán đổi?”. Đó là lý do vì sao mô phỏng vượt qua.
Chúng tôi đã xây một cơ chế an toàn trong ứng dụng cho các trường hợp này, cảnh báo bạn trong giao diện rằng gas có thể không đủ. Nhưng vì mô phỏng trông ổn, bạn vẫn có thể xác nhận tiếp.
Khi bạn xác nhận, bundler đã gửi UserOperation của bạn tới EntryPoint.
EntryPoint đã rút khoảng $6 giá trị ETH làm tiền trả trước.
Khi nó cố thực hiện hoán đổi, không còn đủ ETH để chi trả cả hoán đổi và và tiền trả trước cùng lúc.
Lời gọi hoán đổi bị đảo lại (reverted) bên trong EntryPoint.
Bạn vẫn trả khoảng $2.3 cho gas (khoản hoàn trả cho bundler).
Khoảng ~$3.7 không dùng tới vẫn ở lại EntryPoint như tiền đặt cọc của bạn, sẽ được sử dụng tự động cho giao dịch tiếp theo.
Last updated