Summary
Monad, like Ethereum, charges for processing transactions based on the complexity of the transaction. Complexity is measured in units of gas. This page summarizes how gas is charged, i.e. the conversion between the gas of a transaction and the amount of MON that a user will have to pay. A separate page, Opcode Pricing, describes how much each opcode costs in units of gas.These changes are covered formally in the
Monad Initial Spec Proposal
How much does a transaction cost?
A typical 200,000-gas transaction on Monad costs about $0.0005 at the minimum base fee of 100 MON-gwei, and a simple MON transfer (21,000 gas) costs about $0.00005, a fraction of a cent. Fees are paid in MON, so these dollar amounts are approximate; the MON cost is exact. The cost of a transaction is the gas it is charged multiplied by the price paid per unit of gas. At the minimum base fee of 100 MON-gwei and no priority fee, a 200,000-gas transaction costs 0.02 MON, or about $0.0005: 200,000 gas is a common reference size for a swap or comparable contract call; a transaction’s actual gas depends on what it does. The table below lists representative sizes.Monad charges the gas limit you set, not the gas actually used
(details), so these amounts can’t rise after execution the way a
gas-used estimate can. They are the most you would pay while the base fee is at its floor. Under
sustained network load the base fee can rise above 100 MON-gwei
(see base fee controller). A native MON transfer always uses
exactly 21,000 gas; gas for token transfers and swaps varies by contract.
Gas definitions
A common point of confusion among users is the distinction between gas of a transaction (units of work) and the gas price of a transaction (price in native tokens per unit of work).Gas limit, not gas used
In Monad, the gas charged for a transaction is the gas limit set in the transaction, rather than the gas used in the course of execution. This is a design decision to support asynchronous execution. Under asynchronous execution, leaders build blocks (and validators vote on block validity) prior to executing. If the protocol chargedgas_used, a user could submit a transaction with a large gas_limit
that actually consumes very little gas. This transaction would take up a lot of space toward the
block gas limit but wouldn’t pay very much for taking up that space, opening up a DOS vector.
EIP-1559 Compatibility
Monad supports EIP-1559. EIP-1559 (type 2) transactions have the parameterspriority_price_per_gas and
max_price_per_gas, which, together with base_price_per_gas (a system parameter that changes
each block), determine the gas bid for the transaction:
base_price_per_gasis a system parameter that changes each block. Every transaction in the same block will have the samebase_price_per_gas- Users specify
priority_price_per_gasandmax_price_per_gaswhen signing a transaction - Since everyone in the same block will pay the same
base_price_per_gas, thepriority_price_per_gasis a way for users to pay more to prioritize their transactions. - Since users don’t determine
base_price_per_gas, themax_price_per_gasis a safeguard that limits the amount they may end up paying. Of course, if that value is set too low, the transaction will not end up being chosen for inclusion.
base_price_per_gas controller
Monad uses a different controller for base_price_per_gas than Ethereum:
This inductive formula starts with
and with the following parameters:
And
Compared to the base_price_per_gas controller in Ethereum, this controller increases more
slowly and decreases more quickly. This is to avoid underutilization of blockspace due to an overpriced base_price_per_gas.
For a more comprehensive discussion of Monad controller design considerations and behavior, check out this blog post from Category Labs.
Recommendations for developers
Set the gas limit explicitly if it is constant
Many on-chain actions have a fixed gas cost. The simplest example is that a transfer of native tokens always costs 21,000 gas, but there are many others. For actions where the gas cost of the transaction is known ahead of time, it is recommended to set it directly prior to handing the transaction off to the wallet. This offers several benefits:- It reduces latency and gives users a better experience, since the wallet doesn’t have to call
eth_estimateGasand wait for the RPC to respond. - It retains greater control over the user experience, avoiding cases where the wallet sets a high gas limit in a corner case as described in the warning below.

