如何处理MetaMask扩展中的拒绝交易?如何查询未确认交易状态?
1. 如何处理MetaMask扩展中的拒绝交易?
处理待确认交易的拒绝/取消操作很直接,步骤如下:
- 打开MetaMask扩展,切换到发起该交易的账户
- 进入「活动」(Activity)标签页,往下滚动找到那条待确认的交易
- 点击交易进入详情页面,你会看到「取消」或「拒绝」按钮(不同MetaMask版本的按钮文字可能略有差异)
- 点击按钮后,按照弹窗提示完成操作,这条交易就会被标记为已取消/拒绝,从待处理列表中移除
如果交易是在其他浏览器标签页发起的,你也可以回到发起交易的标签页,很多DApp会在页面上提供取消待确认交易的选项;不过最稳妥的方式还是直接在MetaMask的活动列表里操作。
2. 如何查询未确认交易是已被拒绝还是仍待确认?
分两种场景来说:
普通用户通过MetaMask界面查询
直接看MetaMask的「活动」标签页就够了:
- 如果交易状态显示为**「待确认」(Pending)**,说明它还在你的本地待确认队列里,没有被拒绝
- 如果显示为**「已取消」(Cancelled)**或「已拒绝」(Rejected),那就是已经完成了拒绝操作
开发者通过代码查询
如果你是开发DApp,想要通过代码判断状态,可以参考以下方式:
链上查询:
用户未确认的交易是不会被MetaMask广播到区块链的,所以你可以用交易哈希调用eth_getTransactionByHash方法:const txHash = "你的目标交易哈希"; const txDetails = await window.ethereum.request({ method: 'eth_getTransactionByHash', params: [txHash] });- 如果返回
null:说明这个交易从未被广播,要么是用户拒绝了,要么是用户还没确认(还在MetaMask本地队列) - 如果返回的
txDetails存在但blockNumber为null:这是用户已经确认、正在链上pending的交易,和「待用户确认」不是同一个状态
- 如果返回
监听MetaMask事件:
你可以监听MetaMask的transactionHash事件,当用户确认交易并发起广播时,这个事件会被触发:window.ethereum.on('transactionHash', (hash) => { // 这里的hash就是用户确认的交易哈希,说明交易已被确认并广播 });如果在合理时间内没有触发这个事件,要么是用户还没确认,要么是已经拒绝了——这种情况下,你可以结合前端的超时提示,引导用户去MetaMask里查看状态。
需要注意:用户未确认的交易只存在于MetaMask本地,链上完全查不到,所以没办法通过链上数据100%区分「未确认」和「已拒绝」,只能通过MetaMask的界面或者前端交互来判断。
内容的提问来源于stack exchange,提问作者Ai Diod
相关产品推荐
相关产品推荐

