Gnosis-Safe

執行 Gnosis Safe 多重簽名交易時出現 GS025 錯誤

  • January 12, 2022

我在 2/2 Gnosis Safe 上執行多重簽名交易時遇到問題。我已經在不同的保險庫上成功地執行了單簽名交易,但我無法讓多簽名工作:

這是完整的程式碼:

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");

https://github.dev/gnosis/safe-contracts/blob/1448705d9cee77c912ff808ad9d9b77491ab4182/contracts/GnosisSafe.sol#L291

我被困在如何從這裡進一步調試

我會說這是 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中看到所有錯誤程式碼。

引用自:https://ethereum.stackexchange.com/questions/116968