MetaMask - RPC 错误:错误:MetaMask Tx 签名:用户拒绝交易签名
Posted
技术标签:
【中文标题】MetaMask - RPC 错误:错误:MetaMask Tx 签名:用户拒绝交易签名【英文标题】:MetaMask - RPC Error: Error: MetaMask Tx Signature: User denied transaction signature 【发布时间】:2018-11-10 07:50:15 【问题描述】:在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 中捕捉到这个错误?
【问题讨论】:
目前也有这个问题.. 这里也一样。在 Chrome 中不起作用(我正在运行 Metamask 4.7)但在 Firefox 中起作用(运行 Metamask 3.xx)它完全破坏了控制流 - 不仅似乎没有抛出异常,而且遵循 web3 的执行代码也没有打电话。 同样奇怪的行为,几天前还可以正常工作。但现在不可能捕捉到 Metamask 的异常......看起来像 Chrome 插件问题。在 Firefox 中仍然运行良好。 Jup,在 Chrome + Metamask + 本地测试环境中有同样的问题。如果能在这里找到一位 Metamask 开发人员,那就太好了。 同样,解决方案? 【参考方案1】:如果您使用的是 Ethers 库,请执行此操作:
contract.methodName(...params, from: myAccount )
.then(tx =>
//do whatever you want with tx
)
.catch(e =>
if (e.code === 4001)
//user rejected the transaction
);
【讨论】:
【参考方案2】:以下代码示例在 macOS 上使用 Chrome (v78.0) 和 Firefox (v70.0) 中的 Metamask 插件进行了测试,并在交易被用户拒绝的情况下为您提供预期的错误消息:
createContract: function ()
let myContract = new web3.eth.Contract(ABI, CONTRACT_ADDRESS,
from: account,
gasLimit: web3.utils.toHex(7900000),
gasPrice: web3.utils.toHex(1000000000)
);
myContract.methods.myMethodName().send().on("receipt", (receipt) =>
// Transaction succeeded
myContract.getPastEvents(
"myEventName",
fromBlock: receipt.blockNumber,
toBlock: receipt.blockNumber
, (errors, events) =>
for (let event in events)
let returnValues = events[event].returnValues;
// Now do something with the event
);
).catch(function (e)
// Transaction rejected or failed
console.log(e);
);
Firefox 控制台中的结果将符合预期(请参阅最后一行 app.js:218):
Chrome 控制台中的结果将符合预期(请参阅最后一行 app.js:218):
【讨论】:
以上是关于MetaMask - RPC 错误:错误:MetaMask Tx 签名:用户拒绝交易签名的主要内容,如果未能解决你的问题,请参考以下文章
MetaMask - RPC 错误:权限请求已经挂起,在 Angular 10 中
MetaMask - RPC 错误:无法设置未定义的属性(设置“加载默认值”)错误
MetaMask/json-rpc-middleware-stream