Uniswap swapExactTokensForTokens交易成功但代币未兑换问题排查
问题排查与修复方案
你的代码存在多个核心逻辑错误,所有扣减的ETH均为交易Gas费,未实际触发兑换逻辑,具体问题如下:
- 兑换方法选择错误
你调用的swapExactTokensForTokens是ERC20代币互兑的接口,不支持ETH作为输入资产。你要实现ETH兑代币的需求,应该使用swapExactETHForTokens方法。 - 合约地址传参错误
buyListedTokenWithEth函数的第二个入参要求传入Uniswap Router合约地址,你实际调用时传入的是个人钱包地址,导致交互对象错误,没有触发Uniswap的兑换逻辑。 - 接收地址配置错误
兑换方法的to参数你填了Uniswap Router的地址,就算兑换成功,代币也会打到Router合约,不会进入你的个人钱包,此处应该填写你自己的钱包地址。 - 兑换路径配置错误
如果要实现ETH兑换目标代币,路径应该设置为[WETH合约地址, 目标代币地址];如果要做FLOG和GCOIN的互兑,需要提前给Uniswap Router授权对应额度的输入代币,否则兑换会失败。 - ETH兑换缺少value参数
如果使用ETH作为兑换输入,需要在交易配置项中添加value: ethAmount参数,将对应数量的ETH发送给Router合约执行兑换。
// 核心修复示例 const uniswapRouterAbi = [ // 新增ETH兑代币的方法ABI "function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)", ]; const WETH_ROPSTEN_ADDRESS = "0xc778417E063141139Fce010982780140Aa0cD5Ab"; async function buyListedTokenWithEth( amountEthFloat, uniswapRouterAddress, targetTokenAddress, provider ) { let privateKey = "private_key"; let provider2 = ethers.providers.getDefaultProvider({name: 'ropsten', chainId: 3}); let wallet = new ethers.Wallet(privateKey, provider2); const signer = wallet.connect(provider2); const exchangeContract = new ethers.Contract( uniswapRouterAddress, uniswapRouterAbi, signer ); const ethAmount = ethers.utils.parseEther(amountEthFloat); const tx = await exchangeContract.swapExactETHForTokens( 1, // 实际使用时建议设置合理滑点,避免三明治攻击 [WETH_ROPSTEN_ADDRESS, targetTokenAddress], wallet.address, // 接收地址填自己的钱包 Date.now() + 1000 * 60 * 10, { 'gasLimit': 300000, 'gasPrice': ethers.utils.parseUnits('500', 'gwei'), 'value': ethAmount // 传入要兑换的ETH数量 }); console.log("交易哈希:" + tx.hash); } // 调用时传入正确的Uniswap Router地址和目标代币地址 buyListedTokenWithEth('1', ropstenUniswap, GCOINErc20Address, provider);
内容的提问来源于stack exchange,提问作者ofirthedev
相关产品推荐
相关产品推荐

