使用useWriteContracts搭配Coinbase Paymaster时如何获取交易哈希
解决方法
1. 从返回的长ID中提取UserOp哈希并查询交易哈希
你拿到的长ID是UserOperation哈希 + 索引的组合,前66个字符(0x开头加32字节)就是UserOp哈希。通过这个哈希可以查询到对应的交易收据,进而获取交易哈希:
// 截取前66位得到UserOp哈希 const userOpHash = id.slice(0, 66);
使用wagmi的useWaitForUserOperationReceipt hook获取交易收据:
import { useWaitForUserOperationReceipt } from 'wagmi'; // 在组件内使用 const { data: receipt } = useWaitForUserOperationReceipt({ hash: userOpHash, chainId: account.chainId, }); // 收据加载完成后,即可获取交易哈希 if (receipt) { console.log('真实交易哈希:', receipt.transactionHash); }
2. 利用onSuccess的上下文参数获取UserOp哈希
useWriteContracts的onSuccess回调支持第二个参数context,其中直接包含UserOp哈希,无需手动截取:
const { writeContracts } = useWriteContracts({ mutation: { onSuccess: async (id, context) => { const userOpHash = context.userOpHash; // 后续同样用useWaitForUserOperationReceipt查询交易哈希 }, onError: (err) => { console.log("Transaction Error", err); }, }, });
3. 监听合约事件获取交易哈希
如果你的合约在交易执行后会触发自定义事件,可以通过useContractEvent监听该事件,事件对象中会附带交易哈希:
import { useContractEvent } from 'wagmi'; useContractEvent({ address: contractAddress, abi: contractAbi, eventName: '你的合约事件名', // 替换为实际事件名 listener: (args, event) => { console.log('交易哈希:', event.transactionHash); }, });
内容的提问来源于stack exchange,提问作者vishwajeet
相关产品推荐
相关产品推荐

