PancakeSwap手动交易机器人JS代码EVM回滚错误排查求助
PancakeSwap交易机器人EVM回滚错误排查
我正在开发PancakeSwap手动交易机器人,JavaScript代码运行后出现EVM回滚错误,调整变量后问题仍未解决,附上代码请求定位错误原因。
错误信息
EVM回滚错误:交易执行失败,合约调用无效(根据原截图内容翻译)
代码实现
const Web3 = require('web3'); async function swapToken(privateKeys, tokenAddress, amount, bnbAddress) { // 初始化BSC网络的web3实例 const web3 = new Web3(new Web3.providers.HttpProvider('https://bsc-dataseed.binance.org/')); // 获取当前Gas价格 const gasPrice = await web3.eth.getGasPrice(); // 遍历所有私钥 for (const privateKey of privateKeys) { // 通过私钥获取账户 const account = web3.eth.accounts.privateKeyToAccount(privateKey); // 定义交易选项 const options = { from: account.address, to: tokenAddress, value: 0, gasPrice: gasPrice, gas: '200000', data: bnbAddress, }; // 签名并发送交易 const signedTransaction = await web3.eth.accounts.signTransaction(options, privateKey); web3.eth.sendSignedTransaction(signedTransaction.rawTransaction); } } // 多钱包私钥列表 const privateKeys = [ 'my private key' ]; // 交易的代币地址(BSC链) const tokenAddress = '0xe9e7cea3dedca5984780bafc599bd69add087d56'; // 交易数量 const amount = '2'; // 目标代币地址(BNB) const bnbAddress = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c'; swapToken(privateKeys, tokenAddress, amount, bnbAddress);
错误原因定位
代码存在几个核心问题,直接触发EVM回滚:
交易目标地址错误
PancakeSwap代币交换不能直接调用代币合约地址,必须调用PancakeSwap Router合约(BSC主网地址:0x10ED43C718714eb63d5aA57B78B54704E256024E),你当前把to设为代币地址,属于无效调用。data字段格式完全错误
你直接将BNB地址作为data传入,不符合合约调用的ABI编码规则。代币交换需要调用Router合约的swapExactETHForTokens或swapExactTokensForETH方法,并用Web3对方法和参数进行ABI编码,生成合法的data字段。交易金额未正确配置
如果是用BNB兑换其他代币,value字段需要设置为交易的BNB数量(转成wei单位),你当前设为0,没有资产转入,交易必然失败。异步逻辑未处理
web3.eth.sendSignedTransaction是异步操作,你没加await等待结果,无法获取具体错误详情,也无法确保交易处理流程完整。
修复建议
核心修复点如下:
- 替换交易目标地址为PancakeSwap Router合约地址
- 导入Router合约ABI,用Web3编码交换方法的参数生成
data字段 - 正确设置
value(BNB买入场景)或先完成代币授权(代币卖出BNB场景) - 添加
await处理交易发送,并捕获错误输出详情
示例修复片段:
// 导入PancakeSwap Router完整ABI(可从区块链浏览器获取) const routerABI = [...]; const routerAddress = '0x10ED43C718714eb63d5aA57B78B54704E256024E'; // 编码swapExactETHForTokens方法参数 const routerContract = new web3.eth.Contract(routerABI, routerAddress); const amountOutMin = web3.utils.toWei('0', 'ether'); // 设置最小接收代币量(可根据滑点调整) const path = [bnbAddress, tokenAddress]; // 交易路径:BNB -> 目标代币 const deadline = Math.floor(Date.now() / 1000) + 60 * 20; // 交易有效期20分钟 const data = routerContract.methods.swapExactETHForTokens( amountOutMin, path, account.address, deadline ).encodeABI(); // 修正交易选项 const options = { from: account.address, to: routerAddress, value: web3.utils.toWei(amount, 'ether'), // 转换BNB数量为wei单位 gasPrice: gasPrice, gas: '500000', // 交换交易需更高Gas额度 data: data, }; // 发送交易并处理结果 try { const receipt = await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction); console.log('交易成功:', receipt.transactionHash); } catch (error) { console.error('交易失败:', error); }
内容的提问来源于stack exchange,提问作者Vinicius Lopes
相关产品推荐
相关产品推荐

