如何用Nethereum.Web3在PancakeSwap交换代币?代码异常求助
问题诊断与修复方案
核心问题分析
你的交易触发合约部署而非调用PancakeSwap Router,核心错误有两个:
未指定交易目标地址
以太坊规则中,交易To字段为空时会被判定为合约创建操作。你的代码里TransactionInput没有设置To为Router合约地址,导致节点将这笔交易识别为部署新合约,而非调用已存在的Router。误用交换函数
你要执行ETH换USDC的操作,应调用swapExactETHForTokens(ETH专用交换函数),但代码里误用了swapExactTokensForTokens(该函数用于代币到代币的交换,需先对Router授权代币额度)。
修复后的完整代码
using System.Numerics; using Nethereum.Hex.HexTypes; using Nethereum.RPC.Eth.DTOs; using Nethereum.Web3; using Nethereum.Web3.Accounts; using System.IO; public class UniswapV2Router { public async Task SwapExactETHForTokens() { string privateKey = "my_private_key"; string ethereumRpcUrl = "https://rpc.ankr.com/eth/xxx"; var account = new Account(privateKey); var web3 = new Web3(account, ethereumRpcUrl) { TransactionManager = { UseLegacyAsDefault = false, // 使用EIP-1559交易类型 }, }; // PancakeSwap Router合约地址(以太坊主网) string routerAddress = "0xEfF92A263d31888d860bD50809A8D171709b7b1c"; string routerAbi = await File.ReadAllTextAsync("PancakeSwapAbi.txt"); var contract = web3.Eth.GetContract(routerAbi, routerAddress); // 改用ETH换代币的专用函数 var swapFunction = contract.GetFunction("swapExactETHForTokens"); string usdcAddress = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; // USDC地址 // USDC是6位小数,示例设置最小期望1 USDC(对应1*10^6) var minUsdcAmountExpected = BigInteger.Parse("1000000"); var ethAmount = Web3.Convert.ToWei(0.001); var deadline = new BigInteger(DateTimeOffset.UtcNow.AddMinutes(5).ToUnixTimeSeconds()); // swapExactETHForTokens参数顺序:最小输出、路径、接收地址、截止时间 var encodedData = swapFunction.GetData( minUsdcAmountExpected, new[] { "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", usdcAddress }, account.Address, deadline ); var transactionInput = new TransactionInput { From = account.Address, To = routerAddress, // 必须指定目标为Router合约地址 Value = new HexBigInteger(ethAmount), // 转入的ETH金额 Data = encodedData, Gas = new HexBigInteger(200000), // 调高Gas限额,避免Gas不足 }; var transactionHash = await web3.Eth.TransactionManager.SendTransactionAsync(transactionInput); } }
额外注意事项
- Gas限额调整:原代码设置的100000 Gas可能不足以完成交换,建议调高至200000左右,或通过
EstimateGasAsync自动估算所需Gas。 - 滑点设置:
minUsdcAmountExpected不能设为1(USDC是6位小数,1对应0.000001 USDC),需根据当前价格计算合理的最小输出值,避免因滑点过大导致交易失败。 - ABI正确性:确保
PancakeSwapAbi.txt包含完整的Router合约ABI,尤其是swapExactETHForTokens函数的定义。
内容的提问来源于stack exchange,提问作者Arsen Ablaev
相关产品推荐
相关产品推荐

