Gas

Ethers jsestimateGas() 無需 ETH 入賬

  • June 14, 2021

我正在嘗試估算用於 uniswap 交易的氣體。我可以在 Kovan 測試網上執行此操作,但是當我嘗試在主網上執行相同的腳本時,它會引發錯誤,“錯誤:內在交易成本的資金不足”。我知道問題是我的帳戶中沒有足夠的 eth 來執行交易,但我不想實際發送任何 eth。我的程式碼是:

const {ChainId, Fetcher, WETH, Route, Trade, TokenAmount, TradeType, Percent} = require('@uniswap/sdk');
const {ethers} = require("ethers");
let Web3 = require('web3');

let web3 = new Web3(new Web3.providers.HttpProvider("INFURA_ADDRESS"));
const provider = new ethers.providers.EtherscanProvider('homestead', 'API_KEY');

function toHex(Amount) {
   return `0x${Amount.raw.toString(16)}`;
}

const chainId = ChainId.MAINNET; 
const tokenAddress = '0x6b175474e89094c44da98b954eedeac495271d0f'; 

const init = async () => {
   const gas = await web3.eth.getGasPrice();
   const token = await Fetcher.fetchTokenData(chainId, tokenAddress, provider);

   const weth = WETH[token.chainId];
   const pair = await Fetcher.fetchPairData(token, weth, provider);
   const amountIn = '1200000000000000';
   const route = new Route([pair], weth);

   const trade = new Trade(route, new TokenAmount(weth, amountIn), TradeType.EXACT_INPUT);
  
   const slippageTolerance = new Percent('1', '100');
   const amountOutMin = toHex(trade.minimumAmountOut(slippageTolerance));
   const path = [weth.address, token.address];
   const to = 'PUBLIC_ADDRESS';
   const deadline = Math.floor(Date.now()/1000) + 60*20;
   const value = toHex(trade.inputAmount);

   const signer = new ethers.Wallet('PRIVATE_KEY'); 
   const account = signer.connect(provider);
   const uniswap = new ethers.Contract(
       '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D',
       ['function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)'],
       account
   );

   const gasCost = await uniswap.estimateGas.swapExactETHForTokens(
       amountOutMin,
       path,
       to,
       deadline,
       {value, gasPrice: gas}
   );     
   console.log(parseInt(gasCost, 10));

}

init();

當在具有足夠 eth 的帳戶上執行時(例如在測試網中),它可以工作。有什麼方法可以在不需要 eth 進入帳戶的情況下估算氣體?或者,是否有另一種方法可以完全計算賬戶中不需要 eth 的氣體?我對此很陌生,因此將不勝感激任何幫助!提前致謝!

在您的估計 gas 查詢中,gas 價格幾乎不起作用,除非您與之互動的智能合約使用0x3A(`` opcode) 進行某些邏輯。

的邏輯swapExactETHForTokens不使用GASPRICE,因此即使您將gasPrice 傳遞為0,也不會影響估計。因此,即使您的賬戶中沒有 ETH,您也可以獲得估算值。

引用自:https://ethereum.stackexchange.com/questions/101505