使用Nethereum估算UniSwap V3 Router exactInputSingle燃气量遇RPC错误
UniSwap V3 Router exactInputSingle 燃气估算失败排查与参数修正
核心问题排查
你的代码触发execution reverted: eth_estimateGas错误,主要源于以下3个关键问题:
1. amountIn 参数单位错误
EVM上的代币金额均以**最小单位(wei)**表示,直接用new BigInteger(0.2)会导致数值被截断为0(BigInteger仅处理整数)。需根据代币的小数位数转换:比如USDT是6位小数,0.2 USDT应转换为200000(即0.2 * 10^6);BNB是18位小数,0.2 BNB则为200000000000000000(0.2 * 10^18)。
2. 参数重复编码导致格式错误
EstimateGasAsync方法可直接接收参数对象,无需提前调用GetData生成编码数据。重复编码会让合约接收到错误的参数结构,触发revert。
3. 缺失代币授权
调用exactInputSingle前,必须先给Router合约授权转移你的tokenIn代币额度。未授权时,合约无法转移代币,燃气估算直接失败。
修正后的代码
var web3 = new Web3(account, "BSC endpoint"); var routerContract = web3.Eth.GetContract(pcsRouterAbi, pcsRouterAddress); var exactInputSingleFunction = routerContract.GetFunction("exactInputSingle"); // 1. 先执行代币授权(仅需一次,额度足够可跳过) var tokenInContract = web3.Eth.GetContract(erc20Abi, "0x55d398326f99059fF775485246999027B3197955"); var approveFunction = tokenInContract.GetFunction("approve"); // 授权200000个最小单位的tokenIn(以USDT为例) var approveTx = await approveFunction.SendTransactionAsync(account.Address, null, null, pcsRouterAddress, new BigInteger(200000)); await web3.Eth.Transactions.WaitForTransactionReceiptAsync(approveTx); // 2. 准备正确的参数 var deadline = UtilityMethods.DateTimeToUnixTimestamp(DateTime.UtcNow.AddMinutes(3)); // 根据tokenIn小数位数调整amountIn,此处以USDT(6位小数)的0.2为例 var amountIn = new BigInteger(200000); var parms = new { tokenIn = "0x55d398326f99059fF775485246999027B3197955", tokenOut = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", fee = new BigInteger(500), recipient = walletBsc.address, deadline = new BigInteger(deadline), amountIn = amountIn, amountOutMinimum = new BigInteger(0), sqrtPriceLimitX96 = new BigInteger(0) }; // 3. 直接估算燃气,无需提前编码参数 var gas = await exactInputSingleFunction.EstimateGasAsync(parms);
额外注意事项
- 确认
tokenIn和tokenOut的地址为BSC链上的正确地址,避免误用以太坊主网地址。 fee参数需使用UniSwap V3/PancakeSwap V3支持的费率:500对应0.05%、3000对应0.3%、10000对应1%。- 若仍出现revert,可尝试使用BSC测试网或本地节点调试,通过
TraceCall获取更详细的执行日志定位问题。
内容的提问来源于stack exchange,提问作者Calculon
相关产品推荐
相关产品推荐

