Skip to main content
Estimates the gas fee for an EVM transaction without running a full simulation. Returns fee data in native units (wei), human-readable format (ETH), and optionally USD — but no asset diffs or security validation. Use this when you need a fee estimate only. Use simulateEvmTransaction when you also want to preview asset changes and security validation.

Installation

npm install @dynamic-labs-sdk/evm

Usage

import { calculateEvmTransactionFee } from '@dynamic-labs-sdk/evm';
import { getNetworksData } from '@dynamic-labs-sdk/client';
import { parseEther } from 'viem';

const networks = getNetworksData();
const networkData = networks.find((n) => n.networkId === '1'); // Ethereum mainnet

if (networkData) {
  const feeData = await calculateEvmTransactionFee({
    transaction: {
      from: walletAccount.address,
      to: recipientAddress,
      value: parseEther('0.1'),
    },
    networkData,
  });

  console.log(`Estimated fee: ${feeData.humanReadableAmount} ETH`);
}

Parameters

ParameterTypeDescription
transactionobjectThe transaction to estimate fees for
transaction.fromstringThe sender address
transaction.tostringThe recipient or contract address
transaction.valuebigint (optional)Native token amount in wei
transaction.datastring (optional)Encoded contract call data
networkDataNetworkDataNetwork configuration. Get this from getNetworksData()
nativeTokenPriceUsdnumber (optional)USD price of the native token, used to calculate usdAmount

Returns

Promise<EvmTransactionFeeData>:
FieldTypeDescription
nativeAmountbigintTotal fee in wei
humanReadableAmountstringFee in ETH, formatted for display
usdAmountstring (optional)Fee in USD. Present only when nativeTokenPriceUsd is provided
gasEstimatebigintEstimated gas units
maxFeePerGasbigint (optional)EIP-1559 max fee per gas
maxPriorityFeePerGasbigint (optional)EIP-1559 priority fee per gas
gasPricebigint (optional)Legacy gas price. Present when EIP-1559 is not available

Examples

Simple ETH transfer

const feeData = await calculateEvmTransactionFee({
  transaction: {
    from: walletAccount.address,
    to: recipientAddress,
    value: parseEther('1'),
  },
  networkData,
});

console.log(`Fee: ${feeData.humanReadableAmount} ETH`);
console.log(`Gas units: ${feeData.gasEstimate}`);

With USD conversion

const ETH_PRICE_USD = 3200;

const feeData = await calculateEvmTransactionFee({
  transaction: {
    from: walletAccount.address,
    to: recipientAddress,
    value: parseEther('0.5'),
  },
  networkData,
  nativeTokenPriceUsd: ETH_PRICE_USD,
});

console.log(`Fee: ${feeData.humanReadableAmount} ETH`);
console.log(`≈ $${feeData.usdAmount}`);

Contract interaction

import { encodeFunctionData } from 'viem';

const feeData = await calculateEvmTransactionFee({
  transaction: {
    from: walletAccount.address,
    to: tokenContractAddress,
    data: encodeFunctionData({
      abi: erc20Abi,
      functionName: 'transfer',
      args: [recipientAddress, parseUnits('100', 18)],
    }),
  },
  networkData,
});

Error handling

import { FeeEstimationFailedError } from '@dynamic-labs-sdk/client';

try {
  const feeData = await calculateEvmTransactionFee({ transaction, networkData });
} catch (error) {
  if (error instanceof FeeEstimationFailedError) {
    console.error('Fee estimation failed:', error.message);
  }
}