การถอดรหัสการสว็อป SCW
ด้วยกระเป๋าเงินสมาร์ทคอนแทรค (SCWs) การ swap จะเดินทางไปในเส้นทางที่ต่างจากกระเป๋าเงินแบบดั้งเดิมของ Ethereum/EVM ความแตกต่างนี้อาจทำให้สับสน โดยเฉพาะเมื่อเกิดข้อผิดพลาด แต่เมื่อคุณเข้าใจผู้มีบทบาทหลักในลำดับขั้นตอน — และวิธีอ่านสิ่งที่เกิดขึ้นทีละขั้นในแอปและบน explorers — ทุกอย่างจะเริ่มสมเหตุสมผล
เรามาเดินผ่านมันด้วยกัน
จากการแตะครั้งเดียวถึงการดำเนินการบนเชน: สิ่งที่เกิดขึ้นจริง
เมื่อคุณแตะ “Swap” ในแอป มันดูเหมือนเป็นการกระทำเดียว แต่ในความเป็นจริง คุณกำลังเริ่มกระบวนการหลายชั้นที่สร้างบนบัญชี abstraction ของ Ethereum (ERC-4337) ธุรกรรมของคุณจะไม่ส่งตรงไปยังบล็อกเชนเหมือนกับกระเป๋าธรรมดา แทนที่จะเป็นเช่นนั้น มันจะเลี้ยวไปทางอื่น:
เราสร้างเส้นทาง เราขอให้เครื่องยนต์กำหนดเส้นทาง (เช่น 1inch) หาเส้นทางที่ดีที่สุดสำหรับการ swap ของคุณ และจำลองมันเพื่อให้แน่ใจว่าจะทำงานได้ เราประมาณค่าแก๊ส ตรวจสอบว่าคุณมีโทเค็น และจัดแพ็กคำสั่งเป็นรูปแบบพิเศษ:
UserOperation.A
bundlerเข้ามามีบทบาท นี่คือผู้กระทำภายนอกเชนที่รับผิดชอบในการส่ง UserOperations ไปยังบล็อกเชน มันตรวจสอบ op ของคุณ ให้แน่ใจว่าสมบูรณ์ และชำระค่าแก๊สล่วงหน้าให้คุณ (มันจะได้รับการชดเชยภายหลัง)UserOp ของคุณเข้าสู่บล็อกเชนผ่าน
EntryPointสมาร์ทคอนแทรค คิดว่า EntryPoint เป็นประตูเดียวที่ธุรกรรม SCW ทั้งหมดต้องผ่าน EntryPoint รันการตรวจสอบสุดท้าย และถ้าทุกอย่างดูโอเค…EntryPoint บอกให้ Smart Contract Wallet (SCW) ของคุณดำเนินการ swap SCW ของคุณเรียก router (เช่น 1inch) router เรียกพูล โทเค็นเคลื่อนที่ และผลลัพธ์ถูกส่งกลับเข้าสู่กระเป๋าของคุณ
สรุปคือ: คุณแตะ swap → เราจำลอง → bundler ส่ง → EntryPoint ยืนยัน → SCW ของคุณดำเนินการ
มาดูตัวอย่างจริงกัน
ตอนนี้เราเข้าใจกระบวนการระดับสูงแล้ว มาดูว่าเหตุการณ์นี้เกิดขึ้นจริงในการ swap อย่างไร: แรกในแอป แล้วบนเชน:

นี่คือสิ่งที่เราเห็น:
เราสว็อป 1 USDC เป็น 0.765 KTA
การ swap ถูกดำเนินการบน Base (สังเกตไอคอน Base บนสัญลักษณ์เหรียญ)
เราจ่าย:
$0.03 ค่าแก๊ส (เป็น ETH)
ค่าธรรมเนียม swap 0.22% ให้ goodcryptoX
ค่าธรรมเนียม router 0.05% ให้ 1inch
เส้นทางเรียบง่าย: 100% ผ่านพูล Uniswap v4
Bundler: Alchemy (ดูขั้นตอนที่ 2 ข้างต้นเพื่อทบทวน)
ลิงก์ของ explorer จะปรากฏหากธุรกรรมเข้าถึงบล็อกเชนและถูกบันทึกในบล็อก (แม้จะล้มเหลวก็ตาม)
จนถึงตอนนี้ ทุกอย่างดี ต่อไป ให้คลิกลิงก์ BaseScan เพื่อดูว่าธุรกรรมนี้หน้าตาอย่างไรบนเชน:

จาก: นี่ไม่ใช่กระเป๋าของคุณ — นั่นคือ bundler ของ Alchemy ซึ่งเป็นเรื่องปกติ เนื่องจาก bundler เป็นผู้ส่งธุรกรรม
ถึง: EntryPoint (v0.6.0). อีกครั้ง เป็นเรื่องที่คาดหวัง — ธุรกรรม SCW ทั้งหมดผ่านที่นี่
Internal Transactions: แสดงการไหลของโทเค็นเนทีฟ (ETH บน Base) ภายในธุรกรรม นี่คือสิ่งที่เราเห็น:
กระเป๋าของเรา (…0A5) ส่ง ETH ไปยัง EntryPoint สำหรับค่าแก๊ส
EntryPoint ชดเชยค่าแก๊สให้ bundler ด้วยค่าแก๊สจริง (เนื่องจาก bundler ชำระค่าแก๊สล่วงหน้าให้คุณ; ดูขั้นตอนที่ 2 ข้างต้น) ETH ส่วนที่เหลือคงอยู่ใน EntryPoint เป็นเงินฝากของคุณสำหรับธุรกรรมในอนาคต
ERC-20 Transfers: แสดงการเคลื่อนย้ายโทเค็นจริง:
กระเป๋าของเราไม่ได้ส่ง USDC โดยตรง แทนที่นั้น สัญญาโทเค็น USDC (…2A8) ประมวลผลและกระจายการโอน นี่เป็นเรื่องปกติ: บนเชน EVM การโอนโทเค็นถูกจัดการโดยสัญญาโทเค็นเองหลังจากได้รับคำสั่งจาก smart contract wallet ของคุณ
สัญญา USDC แบ่ง 1 USDC ของเราเป็นสามการโอน:
0.0022 USDC ไปยังกระเป๋าค่าธรรมเนียมของโปรโตคอลของเรา (…608A)
0.0005 USDC ไปยังกระเป๋าค่าธรรมเนียมของ 1inch (…1DE5)
ที่เหลือ 0.9973 USDC ไปยัง Uniswap v4 router (…Universal Router)
Uniswap v4 router ส่งให้ Pool Manager ของ Uniswap v4 (สัญญาเดี่ยวที่จัดการพูล v4 ทั้งหมด)
Pool Manager ดำเนินการ swap: USDC เข้า → KTA ออก
KTA ถูกส่งกลับผ่าน Aggregation Router ของ 1inch ซึ่งส่งต่อไปยังกระเป๋าของเรา (…0A5)
🧩 วิธีถอดรหัสธุรกรรม SCW ที่ล้มเหลว
ตอนนี้เราเข้าใจการทำงานของการ swap ด้วย smart-contract-wallet (SCW) — และเราได้เดินผ่านการเทรดที่ประสบความสำเร็จ — ให้เราใช้เครื่องมือเดียวกันเพื่อถอดรหัสการเทรดที่ล้มเหลว
เราจะใช้กรณีจริงอีกกรณี: การ swap จาก ETH → โทเค็นบน Ethereum ที่ล้มเหลวภายในสัญญา EntryPoint เพราะไม่มี ETH เพียงพอที่จะครอบคลุมทั้งการ swap และค่าแก๊ส
โอเค ดังนั้นคุณเห็น "Error" เป็นสถานะการ swap ในแอปหรือได้รับการแจ้งเตือนว่าการ swap ของคุณล้มเหลว คุณควรทำอย่างไร?
ขั้นตอนที่ 1 — ตรวจสอบรายละเอียดคำสั่งใน goodcryptoX
นี่คือสิ่งที่คุณเห็นในกรณีนี้:

โดยใช้กรอบงานที่เราพัฒนาขึ้นก่อนหน้านี้ คุณจะสังเกตได้อย่างรวดเร็วว่า:
สถานะการ swap คือ
Error(ล้มเหลว?)ไม่มีข้อความแสดงข้อผิดพลาดปรากฏ (นั่นผิดปกติ)
มีค่าแก๊ส (เข้าถึงบล็อกเชนแล้ว?)
มีเส้นทางแสดง (การจำลองผ่านใช่ไหม?)
มีลิงก์ไปยัง explorers ของบล็อกเชน (ฉันสามารถตรวจสอบ tx บนบล็อกเชนได้!).
มาลองตรวจสอบสัญชาตญาณของคุณ:
โทเค็น
Errorสถานะ หมายความว่าการ swap ล้มเหลวควรมีทั้งข้อความข้อผิดพลาดที่อ่านได้สำหรับมนุษย์ (แปลจาก raw) และข้อความ raw หากไม่มีข้อความข้อผิดพลาด นั่นหมายความว่าเกิดสิ่งผิดปกติแน่นอน
ค่าแก๊สหมายความว่าธุรกรรมเข้าถึงบล็อกเชนและมีกิจกรรมบนเชนบางอย่างเกิดขึ้น (ซึ่งใช้แก๊ส)
เส้นทางยืนยันว่าการจำลองผ่านและให้เส้นทางที่ชัดเจนไปสู่การดำเนินการ
ลิงก์ explorer ยืนยันว่าธุรกรรมเข้าถึงบล็อกเชน — แม้ว่าจะล้มเหลวก็ตาม เราควรเปิดหนึ่งในนั้นและสืบสวนเพิ่มเติม
ขั้นตอนที่ 2 – เปิดธุรกรรมใน blockchain explorer
คุณแตะลิงก์ Etherscan เพื่อดูว่าเกิดอะไรขึ้น:

เมื่อมองแวบแรก สิ่งต่าง ๆ ยิ่งทำให้สับสนมากขึ้น:
สถานะบอกว่า ✅ Success — เดี๋ยวนะ อะไรนะ?!
แต่เรารู้แล้วว่า swap ไม่ได้สำเร็จ
ภายใต้ช่อง “To” (EntryPoint) มีข้อความสีเหลืองเล็ก ๆ:
“Although one or more errors occurred [execution reverted] Contract Execution Completed”
แล้วสิ่งที่เกิดขึ้นจริงคืออะไร?
จำลำดับธุรกรรม SCW ที่เราอธิบายก่อนหน้านี้ได้ไหม:
bundler ห่อการ swap ของคุณเป็น
UserOperation(แพ็กเกจข้อมูลที่มีตรรกะการ swap ของคุณ)แล้วส่งไปยังสัญญา EntryPoint
EntryPoint ตรวจสอบมัน (เช็คยอดคงเหลือ ลายเซ็น และ nonce ของคุณ)
ถ้าทุกอย่างถูกต้อง มันจะดำเนินตามเจตนาของคุณ — เรียก routers, pools และย้ายโทเค็น
จากมุมมองของบล็อกเชน ทั้งหมดนี้ดูเหมือนแค่ “bundler ส่งข้อมูลไปยัง EntryPoint”
ในศัพท์ของ SCW ขั้นตอนนี้เรียกว่า outer transaction.
และธุรกรรมนั้นประสบความสำเร็จ: ข้อมูลถูกส่งมอบ และ EntryPoint เริ่มรันตรรกะภายในของมัน ดังนั้นจึงมี ✅ Success ที่ด้านบน
แต่ explorer ด้วยมารยาท ก็ยังบอกคุณว่ายังมีบางอย่างล้มเหลว ภายใน EntryPoint ด้วยบันทึกสีเหลืองเล็ก ๆ นั้น สำหรับ explorer ความล้มเหลวภายในนั้นยังไม่เพียงพอที่จะทำให้ธุรกรรมถูกทำเครื่องหมายว่าล้มเหลว
ตอนนี้ รายละเอียดอีกอย่างโผล่ออกมาบนแท็บ Overview:
ประมาณ $6 มูลค่า ETH ถูกส่งจากกระเป๋าของคุณไปยัง EntryPoint (ค่าแก๊สที่ชำระล่วงหน้า)
มีเพียง $2.3 มูลค่า ETH ถูกชดเชยกลับไปยัง bundler
และค่าธรรมเนียมธุรกรรมที่แสดงด้านบนยังต่ำกว่าอีก — ประมาณ $2.15.
เมื่อตาดูแวบแรก ตัวเลขเหล่านี้ดูเหมือนไม่ลงตัว เรามาแยกส่วนเรื่องนี้ก่อนจะสืบสวนต่อ
ขั้นตอนที่ 3 – ทำความเข้าใจความแตกต่างของค่าแก๊ส
นี่คือการแยกย่อย:
SCW → EntryPoint (~$6): นี่คือการชำระค่าแก๊สล่วงหน้า EntryPoint มักเก็บมากกว่าที่ต้องการเพื่อให้แน่ใจว่า UserOp ของคุณสามารถรันได้
EntryPoint → Bundler (~$2.3): นี่คือการชดเชยค่าแก๊สจริง เป็น จำนวนจริงที่คุณจ่าย สำหรับความพยายามที่ล้มเหลวนี้
Transaction Fee (~$2.15): นี่คือสิ่งที่ bundler ใช้จ่ายเพื่อส่ง UserOp ของคุณไปยัง EntryPoint มันต่ำกว่าเพราะ EntryPoint เองใช้แก๊สเพิ่มเติมในขณะที่ตรวจสอบและชดเชย bundler — ค่าใช้จ่ายเพิ่มเติมนั้นถูกเรียกเก็บกับคุณ
กฎโดยสรุป:
👉 ต้นทุนค่าแก๊สที่แท้จริงของคุณคือการชดเชย EntryPoint ➜ Bundler เสมอ (ไม่ใช่ “Transaction Fee” ที่แสดงด้านบน)
และความแตกต่างระหว่างสิ่งที่คุณชำระล่วงหน้า ($6) กับสิ่งที่ถูกชดเชย ($2.3) ไม่ได้หายไป มันคงอยู่ใน EntryPoint เป็นเงินฝากของคุณ ซึ่งจะถูกนำไปใช้โดยอัตโนมัติในธุรกรรมถัดไปของคุณ
ขั้นตอนที่ 4 – ตรวจสอบแท็บ AA Transactions
บน explorer คุณจะเห็นแท็บ AA Transactions (AA = Account Abstraction) นี่คือที่กิจกรรมของ smart contract wallet อยู่ เพราะ SCW รันบน Account Abstraction (ERC-4337)
ให้เปลี่ยนไปยังแท็บนั้นจาก Overview:

ที่นี่คุณจะเห็น UserOperation ของเราแสดงเป็นรายการแยกต่างหากภายในธุรกรรม outer ของ bundler:
ช่อง "From" ตอนนี้แสดง ที่อยู่กระเป๋าของเรา, ยืนยันว่านี่คือ operation ของเรา
มี AA Txn Hash แยกต่างหาก ซึ่งแตกต่างจาก outer transaction hash ทำไม?
Outer Txn Hash เป็นของธุรกรรม Bundler->EntryPoint ที่บรรจุ UserOp ของคุณ (และอาจรวม UserOps หลายรายการจากผู้ใช้ต่าง ๆ)
AA Txn Hash เป็นตัวระบุเฉพาะสำหรับ ของคุณ UserOperation ภายใน bundle นั้น
นี่คือแนวคิดสำคัญของการ bundling:
Bundler สามารถจัดแพ็ก UserOps จำนวนมากรวมกันเป็นหนึ่งธุรกรรม
แต่ละ UserOp จะมี AA Txn Hash ของตัวเอง ดังนั้นจึงสามารถติดตามแยกภายใน bundle ได้
ในกรณีของเรา เพราะนี่เป็นธุรกรรมเก่ากว่า (กว่า 400 วันที่ผ่านมา) SCW ยังหายากและ bundle ประกอบด้วยแค่ UserOp ของเรา — นั่นคือเหตุผลที่แท็บแสดง “AA Transactions (1)” ในธุรกรรมใหม่ ๆ คุณมักจะเห็น UserOps หลายรายการถูกรวมกันใน bundle เดียว
ในมุมมองนี้ คุณจะสังเกตด้วยว่า มี (!) ถัดไปกับ AA Txn Hash ของคุณ — การยืนยันว่าการ swap ของคุณไม่ได้ดำเนินการ
ขั้นตอนต่อไปคือคลิก AA Txn Hash นั้น ซึ่งจะเปิดหน้าที่อุทิศให้กับ UserOperation ที่คุณจะเห็นรายละเอียดเต็มของการพยายาม swap ของเรา — ค่าธรรมเนียม การโอน และจุดที่เกิดความล้มเหลว
ขั้นตอนที่ 5 – เปิดหน้ารายละเอียด AA Transaction
การคลิก AA Txn Hash จะพาคุณไปยังหน้ารายละเอียดที่อุทิศให้กับ UserOperation ของคุณ:

ที่นี่คุณจะเห็นการพยายาม swap ของเราแสดงอย่างชัดเจน:
สถานะ: x Fail (ครั้งนี้ไม่มีความกำกวม)
From: ที่อยู่ smart contract wallet ของคุณ
AA Transaction Fee: ~0.00231 ETH ($2.31). นี่คือต้นทุนแก๊สจริงที่คุณจ่าย — การชดเชยที่ส่งไปยัง bundler
Internal transaction: การโอนหนึ่งรายการ ~0.00145 ETH ($6.36) จาก SCW ของคุณไปยัง EntryPoint (การชำระค่าแก๊สล่วงหน้า) ไม่มีการโอนอื่นเกิดขึ้น ซึ่งยืนยันว่าการ swap เองไม่ได้ดำเนินการ
Bundle Txn Hash: แสดงด้วย ลิงก์กลับไปยังธุรกรรม outer ของ bundler
หน้านี้ในที่สุดตรงกับสัญชาตญาณของคุณ: นี่คือธุรกรรมจริง — UserOperation ที่เป็นตัวแทนการพยายาม swap ของคุณ
นี่เกือบจะสรุปการสืบสวนของเราแล้ว แต่เนื่องจากเรามาถึงจุดนี้แล้ว ให้เราคลิกที่ Internal Txns.
ขั้นตอนที่ 6 – ตรวจสอบแท็บ Internal Transactions
สลับไปยังแท็บ Internal Txns ภายในมุมมอง AA Transaction:

ที่นี่คุณจะเห็นการกระทำทีละขั้นตอนที่ EntryPoint พยายามทำในนามของคุณ:
✅ โอนจาก SCW ของคุณ → EntryPoint (~0.00145 ETH, ~$6.36) = การชำระค่าแก๊สล่วงหน้า สำเร็จแล้ว
❌ Execute จาก SCW ของคุณ → Uniswap Universal Router (~0.002 ETH) = การพยายาม swap ล้มเหลว
การแยกย่อยนี้อธิบายความล้มเหลว:
คุณส่ง ETH ไปยัง EntryPoint เป็นการชำระค่าแก๊สล่วงหน้าเรียบร้อยแล้ว
แต่เมื่อ EntryPoint พยายามส่งต่อ ETH ไปยัง Uniswap เพื่อทำการ swap ความพยายามนั้นล้มเหลว
สำหรับการแยกย่อยที่ละเอียดที่สุด ให้เปิดแท็บ Logs
ขั้นตอนที่ 7 – ตรวจสอบแท็บ Logs
คลิกที่ Logs (3):

ที่นี่คุณจะพบเหตุการณ์สำคัญสามรายการ:
Deposited → ยืนยันว่าการชำระค่าแก๊สล่วงหน้าของคุณถูก EntryPoint รับไว้แล้ว
BeforeExecution → แสดงว่า EntryPoint เริ่มประมวลผล UserOperation ของคุณ
UserOperationEvent →
success: False— บันทึก canonical บนเชนว่าการ UserOp ของคุณล้มเหลว
สิ่งที่เกิดขึ้นจริง (สรุปทั้งหมดเข้าด้วยกัน)
ความล้มเหลวประเภทนี้เฉพาะกับการ swap ด้วย SCWs บน EVM เมื่ออินพุตเป็นโทเค็นเนทีฟ (ETH, BNB, MATIC… )
ช่องว่าง: ทั้ง bundler และ EntryPoint ไม่ได้ตรวจสอบว่าคุณมี โทเค็นเนทีฟ เพียงพอที่จะครอบคลุมทั้งการชำระล่วงหน้าแก๊สและการ swap พร้อมกัน พวกมันตรวจสอบแยกกันเท่านั้น — “พอสำหรับแก๊สไหม?” และ “พอสำหรับการ swap ไหม?” นั่นคือเหตุผลที่การจำลองผ่าน
เราได้สร้างกลไกป้องกันในแอปสำหรับกรณีเหล่านี้ เตือนคุณในอินเทอร์เฟซว่าค่าแก๊สอาจไม่เพียงพอ แต่เนื่องจากการจำลองดูเหมือนโอเค คุณยังสามารถคลิกผ่านได้
เมื่อคุณยืนยัน bundler ก็ส่ง UserOperation ของคุณไปยัง EntryPoint
EntryPoint ดึง ETH มูลค่าประมาณ $6 เป็นการชำระล่วงหน้า
เมื่อมันพยายามดำเนินการ swap ไม่มี ETH เหลือเพียงพอที่จะครอบคลุมทั้งการ swap และ และการชำระล่วงหน้าในเวลาเดียวกัน
การเรียก swap ถูก revert ภายใน EntryPoint
คุณยังจ่ายประมาณ $2.3 เป็นค่าแก๊ส (การชดเชยให้ bundler)
ประมาณ $3.7 ที่ไม่ได้ใช้คงอยู่ใน EntryPoint เป็นเงินฝากของคุณ เพื่อใช้โดยอัตโนมัติในธุรกรรมถัดไปของคุณ
Last updated