使用Moralis 1inch插件时如何捕获用户拒绝交易的报错
你目前的代码有两个需要调整的点:
- 异常捕获范围没有覆盖授权操作:
Moralis.Plugins.oneInch.approve调用会触发钱包授权弹窗,用户拒绝授权也会抛出错误,这部分逻辑当前没有被try/catch包裹 - 捕获逻辑没有区分错误类型:用户拒绝交易的RPC错误码固定为
4001,你可以通过这个字段判断对应场景
修复后代码
async function trySwap() { try { let address = Moralis.User.current().get("ethAddress"); let amount = Number(fromAmount) * 10**fromTokenDecimals; if (tokenSymbol !== "ETH") { const allowance = await Moralis.Plugins.oneInch.hasAllowance({ chain: "eth", fromTokenAddress: tokenAddress, fromAddress: address, amount: amount, }); if (!allowance) { await Moralis.Plugins.oneInch.approve({ chain: "eth", tokenAddress: tokenAddress, fromAddress: address, }); } } await doSwap(address, amount); alert("兑换完成"); } catch (error) { console.log(error) // 判断是否为用户主动拒绝交易 if (error.code === 4001) { alert("您已拒绝本次交易"); } else { // 其他错误场景可根据业务需求扩展 alert('ETH余额不足') } } } function doSwap(userAddress, amount) { return Moralis.Plugins.oneInch.swap({ chain: "eth", fromTokenAddress: tokenAddress, toTokenAddress: totokenAddress, amount: amount, fromAddress: userAddress, slippage: 1, }) }
补充说明
所有需要用户钱包签名的操作(包括授权、兑换、转账等)都会触发钱包弹窗,只要用户主动拒绝,都会返回code为4001的标准RPC错误,上述修改已经覆盖了授权和兑换两个场景的异常捕获,可以正确捕获用户拒绝的情况并弹出对应提示。
内容的提问来源于stack exchange,提问作者JimJam
相关产品推荐
相关产品推荐

