Polygon(Matic)链上Web3发送至QuickSwap的交易卡住无法执行如何解决
问题原因及解决方案
核心错误点
- Web3实例未初始化:你创建了HDWalletProvider后未将其传入Web3构造函数,代码中使用的
web3变量未定义,会直接导致交易构造异常。 - gasPrice单位错误:代码中填写的
gasPrice: "25"单位为wei,远低于Polygon主网当前最低打包要求(通常为30~50 gwei,1 gwei = 10^9 wei),矿工不会优先打包如此低gasPrice的交易,是交易卡住的核心原因。 - 交易参数不合理:
swapExactETHForTokens第一个参数设为0,意味着你放弃滑点保护,即使交易执行时你只能拿到极少的目标代币也会成交,极易出现交易打包后执行失败的问题;deadline参数设置过大,交易长时间pending后执行会面临极高的价格偏离风险。
已卡住交易的处理方法
- 加速交易:构造一笔和卡住交易相同nonce的swap交易,将gasPrice设置为当前网络推荐值的1.1倍以上,广播后会顶替原来的pending交易,矿工优先打包高gasPrice的交易。
- 取消交易:构造一笔和卡住交易相同nonce的转账交易,给自己地址转0ETH,gasPrice设置为当前网络推荐值的1.1倍以上,广播后会顶替原来的pending交易,原swap交易作废。
代码修正示例
const Web3 = require('web3') const HDWalletProvider = require('@truffle/hdwallet-provider'); var provider = new HDWalletProvider(privateKey, rpcEndpoint); // 补全Web3实例初始化 const web3 = new Web3(provider) const init = async () => { const QuickSwap = new web3.eth.Contract(contracts.QuickSwap.ABI, contracts.QuickSwap.address) const path = ["0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270", "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619"] // 动态获取当前网络gasPrice,也可以手动设置为web3.utils.toWei('35', 'gwei') const gasPrice = await web3.eth.getGasPrice() // 按1%滑点计算最小获得代币数量,实际使用时可根据接受的滑点阈值调整系数 const amountsOut = await QuickSwap.methods.getAmountsOut("10000000000000", path).call() const amountOutMin = Math.floor(amountsOut[1] * 0.99) // 设置10分钟交易有效期 const deadline = Math.floor(Date.now() / 1000) + 60 * 10 // 预估gasLimit const gasLimit = await QuickSwap.methods.swapExactETHForTokens(amountOutMin, path, addr, deadline).estimateGas({ value: "10000000000000", from: addr }) await QuickSwap.methods.swapExactETHForTokens(amountOutMin, path, addr, deadline).send({ value: "10000000000000", from: addr, gasPrice: gasPrice, gas: Math.floor(gasLimit * 1.2) // 加20%冗余避免gas不足导致交易失败 }).on('transactionHash', function(hash){ console.log(hash) }).on('confirmation', () => { console.log("Transaction confirmed") }) }
内容的提问来源于stack exchange,提问作者Riccardo Perego
相关产品推荐
相关产品推荐

