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 中捕捉到这个错误?

4

2 回答 2

0

如果您使用的是 Ethers 库,请执行此操作:

contract.methodName(...params, { from: myAccount })
.then(tx => {
    //do whatever you want with tx
})
.catch(e => {
     if (e.code === 4001){
         //user rejected the transaction
     } 
});
于 2021-11-12T09:16:24.367 回答
-1

以下代码示例在 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):

在此处输入图像描述

于 2019-11-01T18:02:29.193 回答