Skip to main content

Tune parent chain data fee pricing

Your Arbitrum chain charges users for the cost of posting their transaction data to the parent chain. Four ArbOwner methods control how that charge adjusts over time. Tune them when fee revenue drifts away from what your batch poster actually spends.

These parameters are separate from congestion pricing. They set what the chain charges for data, not what it charges when demand exceeds the gas target. To tune congestion pricing, refer to the Manage gas target page.

How the pricing algorithm works

ArbOS tracks a running surplus: the difference between what it has collected from users for data and what it owes the batch poster. At each update it adjusts the price per data unit to drive that surplus toward zero over a chosen time horizon.

Two of the parameters below map directly onto that algorithm:

  • Equilibration units set the time horizon for eliminating the surplus.
  • Pricing inertia smooths the adjustment so the price does not swing sharply between updates.

For the full derivation, refer to gas and fees.

The parameters

Call all four methods on the precompile ArbOwner at address 0x0000000000000000000000000000000000000070. Only a chain owner can call them. Calls from any other account revert.

MethodWhat it setsDefault
setL1PricingInertia(uint64 inertia)How much the algorithm smooths each price adjustment10
setL1PricingEquilibrationUnits(uint256 units)The time horizon, in data units, for eliminating the surplus160,000,000
setL1BaseFeeEstimateInertia(uint64 inertia)How slowly ArbOS updates its estimate of the parent chain base fee10
setAmortizedCostCapBips(uint64 cap)A ceiling on the amortized cost the chain charges, in basis points0, meaning no cap

The 160,000,000 default for equilibration units applies from ArbOS 6 onward. Chains initialized before ArbOS 6 used 96,000,000.

Warning

setL1PricingInertia and setL1BaseFeeEstimateInertia write the same stored value. To read it back, call ArbGasInfo.getL1BaseFeeEstimateInertia().

ArbGasInfo.getPricingInertia() does not return this value. It returns the congestion pricing inertia set by setL2GasPricingInertia, which is a different parameter for a different algorithm. Refer to Manage gas target.

Read the current values

All of these parameters can be read back through ArbGasInfo, at address 0x000000000000000000000000000000000000006c. The inertia value set by either setter is returned by getL1BaseFeeEstimateInertia():

cast call --rpc-url $ORBIT_RPC 0x000000000000000000000000000000000000006c "getL1PricingEquilibrationUnits()"
cast call --rpc-url $ORBIT_RPC 0x000000000000000000000000000000000000006c "getL1BaseFeeEstimateInertia()"
cast call --rpc-url $ORBIT_RPC 0x000000000000000000000000000000000000006c "getAmortizedCostCapBips()"

getL1PricingEquilibrationUnits() is available from ArbOS 20 onward.

To see whether the algorithm is currently over- or under-collecting, read the surplus:

cast call --rpc-url $ORBIT_RPC 0x000000000000000000000000000000000000006c "getL1PricingSurplus()"

A persistent positive surplus means the chain collects more for data than it owes the batch poster. A persistent negative surplus means it collects too little and the reimbursement fund is draining.

Change a value

To shorten the equilibration horizon so the algorithm corrects a surplus faster:

cast send --rpc-url $ORBIT_RPC --private-key $OWNER_KEY 0x0000000000000000000000000000000000000070 "setL1PricingEquilibrationUnits(uint256)" 80000000

Confirm the change:

cast call --rpc-url $ORBIT_RPC 0x000000000000000000000000000000000000006c "getL1PricingEquilibrationUnits()"

Change one parameter at a time and watch the surplus across several batch posting cycles before you change another. Adjusting two at once makes it hard to attribute the resulting fee behavior.

Warning

Test every change on a devnet or testnet chain first. A short equilibration horizon combined with low inertia makes data fees swing sharply between updates, which harms user experience even when the long-run average is correct.

Two more ArbOwner methods affect what the chain collects for data, covered elsewhere:

  • setL1PricePerUnit(uint256 pricePerUnit) and setPerBatchGasCharge(int64 cost), in configure and optimize gas.
  • setL1PricingRewardRate(uint64 weiPerUnit) and setL1PricingRewardRecipient(address recipient), which route the batch poster reward. Refer to revenue routing.

For the full list of ArbOwner methods, refer to the precompiles reference.