Gnosis-Safe
執行 Gnosis Safe 多重簽名交易時出現 GS025 錯誤
我在 2/2 Gnosis Safe 上執行多重簽名交易時遇到問題。我已經在不同的保險庫上成功地執行了單簽名交易,但我無法讓多簽名工作:
safeTransaction
在鏈上簽名後,該safe.getOwnersWhoApprovedTx(safeTxHash)
函式返回批准交易的所有者的 2 個地址,使用safe.approveTransactionHash(safeTxHash)
. 簽名似乎已正確送出- 執行時
safe.executeTransaction
出現錯誤GS025
。交易範例:https ://rinkeby.etherscan.io/tx/0xf99d48936b4875a586a8ba32549cc677a7317658a50bd7a5c57a7f9dcdca4214- 網路:林克比
這是完整的程式碼:
const safeTransaction = await safeForTheFirstSigner.createTransaction({ to: toAddress, value: ethers.utils.parseEther(String(amount)).toString(), data: toAddress, nonce: 17, }); const safeTxHash = await safeForTheFirstSigner.getTransactionHash(safeTransaction); // Note: this returns the 2 owners after approving the tx, so the approval part definitively works const approvers = await safeForTheFirstSigner.getOwnersWhoApprovedTx(safeTxHash); await safeForTheFirstSigner.approveTransactionHash(safeTxHash); await response.transactionResponse?.wait(); const executeTxResponse = await safeForTheSecondSigner.executeTransaction(safeTransaction); await executeTxResponse.transactionResponse?.wait();
在
GnosisSafe.sol
這一行中拋出錯誤:require(msg.sender == currentOwner || approvedHashes[currentOwner][dataHash] != 0, "GS025");
我被困在如何從這裡進一步調試
我會說這是 Safe core sdk 中的一個缺點(也許值得打開一個問題)。
您使用 nonce 創建交易
17
並批准此交易。但該executeTransaction
函式不會檢查這是否是 Safe 的目前 nonce。這裡的問題是,安全合約通過 nonce 強制執行交易順序(類似於普通的乙太坊賬戶)。因此,在executeTransaction
合約方法中,它使用目前的 nonce(1
在撰寫本文時用於提到的 Safe),但它approveTransactionHash
基於使用 nonce 的交易雜湊17
。一個簡單的解決方法是不指定 nonce,然後 sdk 將自動檢索正確的 nonce。
注:
GS025
代表Hash has not been approved
. 您可以在safe-contracts repo中看到所有錯誤程式碼。