MetaMask - RPC错误:错误:MetaMask Tx Signature:用户拒绝了交易签名。

12

在JavaScript中,我运行合约的方法

contract[methodName](...params, { from: myAccount }, (err, response) => {
    console.log('get transaction', methodName, err, response);
    if (err) return reject(err);
    resolve(response);
});

然后通过MetaMask拒绝交易。在控制台中会收到一个错误。

MetaMask - RPC Error: Error: MetaMask Tx Signature: User denied transaction signature.

但是我无法在我的代码中捕获这个错误。回调函数不起作用。

在JS中如何捕获这个错误?


1
目前也遇到了这个问题。 - Noah Passalacqua
一样的问题。在Chrome中无法运行(我正在运行Metamask 4.7),但在Firefox中可以运行(运行Metamask 3.x.x)。 它完全破坏了控制流 - 不仅异常似乎没有被抛出,而且紧随web3调用的执行代码也没有被执行。 - Patrik Stas
相同的奇怪行为,几天前还能正常工作。但现在无法捕获Metamask的异常...看起来像是Chrome插件的问题。在Firefox中仍然可以正常工作。 - Anton Pegov
是的,在Chrome + Metamask + 本地测试环境中遇到了同样的问题。希望能有Metamask开发人员进来解决。 - Yuri van Geffen
1
相同的,解决方案? - imazzara
2个回答

2

如果你正在使用Ethers库,请按照以下步骤进行操作:

contract.methodName(...params, { from: myAccount })
.then(tx => {
    //do whatever you want with tx
})
.catch(e => {
     if (e.code === 4001){
         //user rejected the transaction
     } 
});

0

我之前也遇到了同样的问题,但是通过使用这个库,我解决了它。

https://github.com/enzoferey/ethers-error-parser

npm install @enzoferey/ethers-error-parser

npm安装@enzoferey/ethers-error-parser

import { getParsedEthersError } from "@enzoferey/ethers-error-parser";

try {
  const transaction = await someContract.someMethod();
  await transaction.wait();
} catch (error) {
  const parsedEthersError = getParsedEthersError(error);
  // parsedError.errorCode - contains a well defined error code (see full list below)
  // parsedError.context - contains a context based string providing additional information
  // profit ! 
}

如果用户拒绝交易,则错误代码将为REJECTED_TRANSACTION
您可以在官方文档中找到完整的错误代码列表,链接在这里:https://github.com/MetaMask/eth-rpc-errors/blob/main/src/error-constants.ts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接