eth_maxPriorityFeePerGas - Arc RPC Method
Get the suggested priority fee (tip) per gas for EIP-1559 transactions on Arc. Essential for gas estimation, fee optimization, and time-sensitive transaction pricing.
Returns the current suggested priority fee (tip) per gas in wei on Arc. This is the amount paid directly to validators to incentivize faster transaction inclusion in EIP-1559 compatible blocks.
Why Arc? Build on Circle's stablecoin-native Layer 1 where USDC is the gas token and BFT consensus gives sub-second deterministic finality with USDC as the native gas token, sub-second irreversible finality, an EWMA-smoothed fee market with a 20 Gwei floor, and EIP-7708 Transfer logs for native value movement.
When to Use This Method
eth_maxPriorityFeePerGas is essential for payment platforms, stablecoin issuers, exchange and treasury teams, and Solidity developers building on Arc:
- EIP-1559 Transaction Building - Get the recommended tip to include in
maxPriorityFeePerGaswhen constructing type-2 transactions on Arc - Fee Optimization - Balance transaction speed against cost by adjusting the priority fee relative to the suggested value
- Time-Sensitive Transactions - Increase the tip above the suggested value for DEX swaps, liquidations, or other latency-sensitive operations on crossborder settlement, merchant payments, institutional clearing, and USDC-denominated financial applications
- Gas Price Estimation - Combine with
baseFeePerGasfrom the latest block to calculate the totalmaxFeePerGasfor accurate fee estimation
Code Examples
Common Use Cases
1. Build an EIP-1559 Transaction
Construct a properly priced type-2 transaction on Arc:
import { JsonRpcProvider, Wallet, parseEther } from 'ethers';
const provider = new JsonRpcProvider('https://api-arc-mainnet.n.dwellir.com/YOUR_API_KEY');
async function buildEIP1559Transaction(privateKey, to, valueEth) {
const wallet = new Wallet(privateKey, provider);
// Get current fee data
const feeData = await provider.getFeeData();
const latestBlock = await provider.getBlock('latest');
const baseFee = latestBlock.baseFeePerGas;
// Set maxPriorityFeePerGas from the suggestion
const maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;
// maxFeePerGas = 2 * baseFee + maxPriorityFeePerGas (buffer for base fee increases)
const maxFeePerGas = baseFee * 2n + maxPriorityFeePerGas;
const tx = await wallet.sendTransaction({
to,
value: parseEther(valueEth),
type: 2,
maxPriorityFeePerGas,
maxFeePerGas
});
console.log('Sent with priority fee:', Number(maxPriorityFeePerGas) / 1e9, 'Gwei');
return tx;
}2. Dynamic Fee Strategy
Adjust priority fees based on transaction urgency:
async function getFeeByUrgency(provider, urgency = 'standard') {
const feeData = await provider.getFeeData();
const basePriorityFee = feeData.maxPriorityFeePerGas;
const multipliers = {
low: 0.8, // Willing to wait
standard: 1.0, // Normal speed
fast: 1.5, // Faster inclusion
urgent: 2.0 // Next-block target
};
const multiplier = multipliers[urgency] || 1.0;
const adjustedFee = BigInt(Math.ceil(Number(basePriorityFee) * multiplier));
const block = await provider.getBlock('latest');
const maxFeePerGas = block.baseFeePerGas * 2n + adjustedFee;
return {
maxPriorityFeePerGas: adjustedFee,
maxFeePerGas
};
}
// Usage
const fees = await getFeeByUrgency(provider, 'fast');
console.log('Priority fee:', Number(fees.maxPriorityFeePerGas) / 1e9, 'Gwei');
console.log('Max fee:', Number(fees.maxFeePerGas) / 1e9, 'Gwei');3. Priority Fee Monitor
Track priority fee changes over time on Arc:
async function monitorPriorityFee(provider, interval = 12000) {
let previousFee = null;
setInterval(async () => {
const feeData = await provider.getFeeData();
const currentFee = feeData.maxPriorityFeePerGas;
const feeGwei = Number(currentFee) / 1e9;
if (previousFee !== null) {
const change = Number(currentFee - previousFee) / Number(previousFee) * 100;
const direction = change > 0 ? 'UP' : change < 0 ? 'DOWN' : 'STABLE';
console.log(`Priority fee: ${feeGwei.toFixed(4)} Gwei (${direction} ${Math.abs(change).toFixed(1)}%)`);
} else {
console.log(`Priority fee: ${feeGwei.toFixed(4)} Gwei`);
}
previousFee = currentFee;
}, interval);
}Best Practices
- Use
eth_feeHistorywith percentile rewards for a more accurate priority fee estimate than the node's suggestion alone - The suggested priority fee is the minimum for timely inclusion -- multiply by 1.5-2x for faster confirmation on congested networks
- Fall back to
eth_gasPriceifeth_maxPriorityFeePerGasreturns method not found (-32601) on non-EIP-1559 nodes - For L2 chains, the priority fee is typically much lower than L1 -- never reuse L1 gas parameters on L2
- Cache with a short TTL (12 seconds, one block time) since priority fees change with each block
Arc fee market
Arc denominates gas in USDC and replaces Ethereum's per-block EIP-1559 recalculation with an EWMA-smoothed base fee, so quotes move gradually rather than spiking with a single busy block.
| Parameter | Value |
|---|---|
| Minimum base fee | 20 Gwei (protocol floor) |
| Maximum base fee | 20,000 Gwei |
| Base fee target | ~$0.01 per transaction under normal load |
| Gas throughput | 30M gas per block |
| Base fee destination | Paid to the block beneficiary, not burned |
Two consequences matter when you use this value:
- Always clamp to the floor. A quote below 20 Gwei is unusable. Transactions whose
maxFeePerGasis under the floor are dropped by the mempool without an error receipt and never appear in a block. - The next block's base fee is published in advance. Arc writes it into the parent header's
extra_dataas an 8-byte big-endian value, so you can read the upcoming base fee straight from the block header instead of extrapolating.
Because fees are dollar-denominated, show users the USDC cost rather than raw Gwei. See Arc's gas and fees reference for the current parameter set.
Error Handling
Common errors and solutions:
| Error Code | Description | Solution |
|---|---|---|
| -32601 | Method not found | The node may not support EIP-1559 - fall back to eth_gasPrice |
| -32603 | Internal error | Retry with exponential backoff |
| -32005 | Rate limit exceeded | Implement rate limiting and caching client-side |
async function getSafePriorityFee(provider, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const feeData = await provider.getFeeData();
if (feeData.maxPriorityFeePerGas !== null) {
return feeData.maxPriorityFeePerGas;
}
// Fallback: derive from legacy gas price
const gasPrice = await provider.send('eth_gasPrice', []);
return BigInt(gasPrice);
} catch (error) {
if (error.code === -32601) {
// EIP-1559 not supported - use legacy gas price
const gasPrice = await provider.send('eth_gasPrice', []);
return BigInt(gasPrice);
}
if (i === maxRetries - 1) throw error;
await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000));
}
}
}Related Methods
eth_gasPrice- Get the legacy gas priceeth_feeHistory- Get historical fee data for trend analysiseth_estimateGas- Estimate gas units required for a transactioneth_getBlockByNumber- Get block details includingbaseFeePerGas
eth_gasPrice
Get current gas price on Arc. Essential for transaction cost estimation for crossborder settlement, merchant payments, institutional clearing, and USDC-denominated financial applications.
eth_feeHistory
Get historical gas fee data on Arc including base fees and priority fee percentiles. Essential for gas price prediction, fee estimation UIs, and network congestion monitoring.