繼昨天的實作,今天如期藉由提高 callGasLimit 成功送出 User Operation,本篇簡單紀錄一些程式碼修正、一些疑問,以及探索 ERC-4337 的資源。
今天成功的交易和 UserOp:
因為是送出第二筆 UserOp,nonce 要做更新,否則會有 AA25 invalid account nonce:
nonce: IEntryPoint(entryPoint).getNonce(account, 0),
由於昨天在 SCA 在 EntryPoint 的存款還有 927,128,因此今天的這筆就不需要在 depositTo
EntryPoint,成功將 0.01 Ether 從 SCA 轉出去後,補償 43,629 wei 給受益人。
今日交易的 Gas Profiler:
我的疑問是,為什麼昨天的 UserOp 需要 82,871,今天只需要 43,629?
我猜是少了 depositTo
的轉帳,因為 SCA 有存款在 EntryPoint,因此不需要再投入 prefund,但又覺得 gas 花費差太多。
--
順帶筆記,UserOperation 物件內其中一欄 callData,是放 EntryPoint 呼叫 SCA 的 Input Data,因此要記得如果 SCA 要跟合約互動,要 encode 兩次,第一次是 SCA 要呼叫的 calldata,接著放入 EntryPoint 要呼叫 SCA 的 calldata,後者才是 UserOperation 的 callData。
因此,SCA 在設計上,用於執行交易的 execute 函式是能夠任意設計的,只要 EntryPoint 能夠用 callData 成功呼叫 SCA 就行。
--
最後,我要來呼應 Anton 從抽象帳戶到 ERC4337 文末的推薦:
這四篇講解清晰,Part 1 讀完,後面就比較輕鬆了,非常後悔當初沒有先讀這四篇: