Fee Market — x/feemarket (EIP-1559 BaseFee)

mechanism economics

EIP-1559–compatible base fee market for OKRW gas. Senders pay base fee + priority tip, both in atokrw.

Maroo's x/feemarket module implements an EIP-1559–compatible base fee for OKRW gas. Senders submit transactions with maxFeePerGas and maxPriorityFeePerGas, and standard EVM tooling fills them in without configuration. Three things work differently from Ethereum: the gas charged includes the compliance (PCL) and agent checks that run after a transaction and is never less than half its gas limit; the fee is paid in atokrw and distributed to stakers rather than burned; and on Maroo Testnet the base fee stays at its floor, min_gas_price (8,000 gwei).

How charging works

For each transaction PCL admits to a block:

1. Effective gas price = min(maxFeePerGas, baseFee + maxPriorityFeePerGas).
2. Gas charged = the larger of the gas the transaction used — including the compliance (PCL) and agent checks that run after it — and half its gas limit (min_gas_multiplier = 0.5). Only the part of the limit above that is refunded, so a limit far above the estimate costs up to half of it.
3. Total fee = effective gas price × gas charged, in atokrw.
4. The whole fee — base portion and tip alike — goes to the fee collector, and x/distribution pays it out to validators and their delegators by stake. Nothing is burned, and the block proposer gets no extra share (base_proposer_reward and bonus_proposer_reward are 0).

Senders never pay more than maxFeePerGas × gas charged.

Tooling implications — Hardhat, Foundry, ethers.js

Because the fee market is EIP-1559–compatible, all standard EVM tooling works without modification:

  • eth_gasPrice returns a sensible legacy gas price (computed as baseFee + suggested priority fee).
  • eth_feeHistory returns the rolling window of recent base fees and reward percentiles, exactly as on Ethereum.
  • eth_maxPriorityFeePerGas returns the suggested priority tip.


Tools like Hardhat's --network maroo, Foundry's forge create --rpc-url, and ethers.js's provider.getFeeData() will populate maxFeePerGas and maxPriorityFeePerGas correctly. You don't need a custom fee strategy.

If you've previously read older Maroo docs that mentioned NoBaseFee = true, that was an early prototype configuration that never shipped to the canonical chain. The active configuration uses x/feemarket with BaseFee enabled.

Parameter visibility and tunability

x/feemarket exposes the standard EIP-1559 parameters as on-chain module params:

  • base_fee — current base fee (atokrw per gas). Read it from a block's baseFeePerGas (eth_getBlockByNumber); eth_gasPrice returns the base fee plus the suggested tip. On Maroo Testnet blocks never approach the gas target (the block gas limit is effectively unlimited), so the base fee stays at min_gas_price.
  • min_gas_price — floor below which the base fee won't drop (8 × 10^12 atokrw per gas, i.e. 8,000 gwei, on Maroo Testnet). Governance-controllable.
  • min_gas_multiplier — the share of the gas limit charged even when a transaction uses less (0.5 on Maroo Testnet). Governance-controllable.
  • elasticity_multiplier and base_fee_change_denominator — control how aggressively the base fee adjusts to gas usage. Governance-controllable.


For day-to-day dapp work, you only need base_fee (and the standard JSON-RPC will give it to you). The other parameters are knobs for chain operators tuning fee responsiveness.
ESC
Type to search