The issue: When using Safe Wallet, the initial transaction hash returned is a safeTxHash
which differs from the final on-chain transaction hash. This is because Safe uses a multi-signature approach where:
- The initial
safeTxHash
is generated when a transaction is proposed - This transaction needs to be confirmed by the required number of owners (based on the threshold)
- Only after sufficient confirmations and execution will there be an actual on-chain transaction with a different hash
This creates challenges when tracking transaction status using standard wagmi/viem hooks, as they look for the initial safeTxHash
on-chain which doesn't exist.
wagmi doesn't account for safe's safeTxHash
A utility library for handling Account Abstraction wallet transactions in wagmi, with initial support for Safe Wallet. Provides transaction hash resolution and confirmation tracking for Smart Contract Wallets where transaction hashes may not directly correspond to on-chain transactions.
Features:
- Detection of Safe Wallet transactions vs regular EOA transactions
- Smart polling of Safe API for multi-signature transaction confirmation
- Compatible with wagmi hooks & viem
- Handles both direct blockchain transactions and Safe's API
npm i wagmi-adapter-safe-wallet
import { isTransactionHashSafeWallet } from 'wagmi-adapter-safe-wallet';
const isSafe = await isTransactionHashSafeWallet(hash, wagmiConfig);
instead of wagmi's waitForTransactionReceipt
you can use waitForTransactionConfirmationReceipt
import { waitForTransactionConfirmationReceipt } from 'wagmi-adapter-safe-wallet';
const receipt = await waitForTransactionConfirmationReceipt(hash, wagmiConfig);