You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Nethereum.Web3在PancakeSwap交换代币?代码异常求助

问题诊断与修复方案

核心问题分析

你的交易触发合约部署而非调用PancakeSwap Router,核心错误有两个:

  1. 未指定交易目标地址
    以太坊规则中,交易To字段为空时会被判定为合约创建操作。你的代码里TransactionInput没有设置To为Router合约地址,导致节点将这笔交易识别为部署新合约,而非调用已存在的Router。

  2. 误用交换函数
    你要执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:07:40