{"kind":"chain-guide","id":"MONAD-OPCODE","name":"Gas pricing on Monad","searchAliases":["Opcode Repricing"],"status":null,"chain":"monad","category":{"id":"transaction-friction","name":"Transaction Friction","description":"Reducing clicks, signatures, and mental overhead"},"journeyStages":[{"id":"gas","name":"Gas & Fees","description":"Paying for transactions"}],"uxImpact":"Monad uses a chain-specific gas schedule and charges the signed gas limit at the applicable price, so fee previews need an estimate for the actual transaction and active revision. Page and account access, operation, and state growth determine gas; a blanket Ethereum multiplier cannot describe that behavior.","officialUrl":"https://docs.monad.xyz/developer-essentials/opcode-pricing","lastReviewed":"2026-09-21","lastUpdated":"2026-09-21","hasDetailedContent":true,"content":{"id":"MONAD-OPCODE","sources":[{"label":"Formal MIP-8 specification","url":"https://github.com/monad-crypto/MIPs/blob/main/MIPs/MIP-8.md","type":"official-spec"},{"label":"Monad gas pricing documentation","url":"https://docs.monad.xyz/developer-essentials/gas-pricing","type":"official-doc"},{"label":"Monad opcode pricing documentation","url":"https://docs.monad.xyz/developer-essentials/opcode-pricing","type":"official-doc"},{"label":"Monad BFT v0.16.1 release","url":"https://github.com/category-labs/monad-bft/releases/tag/v0.16.1","type":"implementation"},{"label":"Monad revision and activation changelog","url":"https://docs.monad.xyz/developer-essentials/changelog","type":"official-doc"},{"label":"MIP-2 contract size limits","url":"https://github.com/monad-crypto/MIPs/blob/main/MIPs/MIP-2.md","type":"official-spec"},{"label":"MIP-5 opcode and ModExp changes","url":"https://github.com/monad-crypto/MIPs/blob/main/MIPs/MIP-5.md","type":"official-spec"}],"lastReviewed":"2026-09-21","lastUpdated":"2026-09-21","summary":"Monad uses a chain-specific gas schedule and charges the signed gas limit at the applicable price, so fee previews need an estimate for the actual transaction and active revision. Page and account access, operation, and state growth determine gas; a blanket Ethereum multiplier cannot describe that behavior.","designerTakeaways":["Use the selected Monad network and active revision for fee previews, and show the network, gas limit, price per gas, and total charged amount clearly.","An advanced gas panel can explain first access versus already-warm access for the same (account, page) during one transaction; warmth is not an account setup state.","Monad charges the signed gas limit at the applicable price. Do not let a failed estimate silently turn into an oversized gas limit.","Validate that estimation and simulation use the selected Monad network's opcode schedule rather than an Ethereum fork default."],"chainContext":{"behavior":"On Monad, the active chain revision supplies the gas schedule by default, including page-aware storage rules when the target revision supports them. Wallets may show only a total or expose page and opcode detail, but that presentation choice does not enable or disable the protocol schedule.","whenRelevant":["Fee previews and confirmation screens for Monad transactions.","Storage-heavy calls or contracts with arrays, structs, or mapping values where page locality changes gas.","Multichain tooling that estimates across Ethereum, Monad networks, or different Monad revisions.","Deployment tooling that validates contract code and initcode limits for the target network and creation path."],"pitfalls":["Using an Ethereum estimator or applying one multiplier to every Monad opcode, storage read, or write.","Treating cold access as a one-time account setup cost; warmth is scoped to (account, page) within a transaction and can roll back with a reverted frame.","Assuming every mapping slot shares a page; each mapping key resolves to its own page, while fields under that key can share one.","Assuming MIP-8 or another revision's behavior is active on every Monad network without checking the target chain configuration.","Treating a simulation or gas estimate as a guarantee of inclusion or execution success after state, parameters, or gas price change.","Treating page-aware pricing or an advanced breakdown as an optional wallet feature rather than default protocol behavior at the active revision."]},"prototypeFirst":[{"screen":"Monad gas estimate row","why":"The confirmation needs a fee estimate for the selected network, active revision, actual transaction, and Monad's gas-limit charging model.","covers":["Simple send","Storage-heavy call"],"include":["Network and active revision","Gas limit and price per gas","Total charged amount","Refresh estimate"]},{"screen":"Storage-access explanation","why":"Explain a higher estimate only when storage access is a verified cause.","covers":["Cold page access","Warm page access","Storage growth or page write"],"include":["Storage access identified by simulation","Warmth lasts within this transaction, not across future transactions","No blanket multiplier for every storage operation"]},{"screen":"Advanced gas breakdown","why":"Power users audit estimate components.","covers":["Expand advanced"],"include":["Operation and active revision","Page and account access details when simulation identifies them","Monad pricing source","Ethereum defaults marked as non-applicable rather than a second valid estimate"]},{"screen":"Simulation or estimate recovery","why":"State, gas price, or transaction parameters can change; a revert does not by itself prove that the estimate was too low.","covers":["Simulation failure","Stale estimate","Revert reason"],"include":["Simulation or revert reason","Refresh the chain-aware estimate","Do not silently inflate the gas limit","Retry with the updated estimate after user review"]}],"mentalModel":[{"label":"Monad gas schedule","description":"Monad changes a documented subset of Ethereum gas costs; the active Monad revision determines which schedule applies."},{"label":"Cold storage premium","description":"Storage warmth is tracked per account and 128-slot page within a transaction. SLOAD costs 8,100 gas for a first page access or 100 gas for a warm page; SSTORE has additional page-load, page-write, and state-growth components."},{"label":"Gas limit charging","description":"Monad charges gas limit multiplied by price per gas, not gas used multiplied by price per gas. An unnecessarily high gas limit can increase the fee paid."},{"label":"Compute vs storage ratio","description":"Opcode pricing varies by resource; page locality matters more than a single storage multiplier."},{"label":"Estimate source","description":"Use an estimator and simulation against the selected Monad network and active revision; do not silently fall back to an Ethereum default."},{"label":"User visibility","description":"Accurate total matters; opcode detail optional advanced."}],"statesToDesign":[{"state":"Normal estimate","trigger":"Transaction parameters and the selected network and revision are available for estimation.","userNeed":"Know the amount being charged and what it is based on.","designResponse":"Show the Monad network, active revision, gas limit, price per gas, and total charged amount."},{"state":"High storage estimate","trigger":"Simulation identifies cold page access, a page write, or state growth as a material component.","userNeed":"Understand the estimate without being given a false universal multiplier.","designResponse":"Explain the identified component and keep page details optional. Do not infer the cause from the call type alone."},{"state":"Estimate loading","trigger":"Chain-aware estimation or simulation is in progress.","userNeed":"Know whether the fee is ready and avoid a blind sign.","designResponse":"Show an estimating state and keep signing gated until the product has an acceptable estimate or an explicit fallback policy."},{"state":"Estimate failed","trigger":"The estimator or simulation rejects, reverts, or is unavailable.","userNeed":"Understand why the product cannot safely quote the transaction.","designResponse":"Show the failure reason, do not silently use an oversized gas limit, and offer edit or retry guidance."},{"state":"Estimate refreshed after simulation change","trigger":"The user refreshes, or network state, gas price, or transaction parameters change.","userNeed":"Review a current number before retrying.","designResponse":"Show the new gas limit, price, and total before retry; keep the prior simulation or revert reason separate from the refreshed estimate."}],"designDecisions":[{"question":"Show opcode repricing details?","recommendation":"Advanced only; total estimate default.","rationale":"Users need accurate total not lecture."},{"question":"When should storage costs be explained?","recommendation":"Add a brief explanation when simulation identifies storage access or growth as the reason for a changed estimate.","rationale":"Page warmth is transaction-scoped, so a later transaction can pay a cold-access cost again; calling it a one-time account setup fee would mislead users."},{"question":"Cross-chain estimate UI?","recommendation":"Separate Monad and Ethereum estimators; never mix them.","rationale":"Mixed tables cause systematic wrong estimates."},{"question":"How should the charged amount be shown?","recommendation":"Show the signed gas limit and applicable price per gas, with the total charged amount derived from those values.","rationale":"Monad's fee accounting charges the gas limit, so gas used from a receipt is not by itself the amount the user paid."}],"problemsSolved":[{"problem":"Wrong gas previews on Monad","oldWay":"Ethereum estimator on Monad txs","newWay":"Monad opcode table in estimator","impact":"critical"},{"problem":"Storage access changes the estimate","oldWay":"Apply one multiplier to all reads and writes.","newWay":"Estimate the actual operation with page access and state growth included.","impact":"high"},{"problem":"A failed simulation or stale estimate leads to blind signing","oldWay":"Show a generic failure or silently fall back to a large gas limit.","newWay":"Explain the simulation or revert reason, refresh state, and simulate again before offering retry without silently inflating the gas limit.","impact":"medium"},{"problem":"Gas used is presented as the amount Monad charges","oldWay":"Multiply receipt gasUsed by price and hide the signed gas limit.","newWay":"Show the gas-limit-based charged amount and the price assumptions used for the transaction.","impact":"high"}],"uxPatterns":[{"name":"Monad Gas Estimate Row","description":"Show a current estimate for the selected Monad transaction.","components":["NetworkLabel","RevisionLabel","GasLimit","PricePerGas","EstimateAmount","RefreshButton"],"userFlow":["Compose tx","Monad estimate loads","User sees fee","Review the fee and gas limit before signing"]},{"name":"Page-aware storage explanation","description":"Explain a storage estimate change only when simulation identifies page access, page write, or state growth as a material component.","components":["EstimateFootnote","StorageHint"],"userFlow":["Compose a storage-touching transaction","Simulation identifies a page-related component","Show the conditional explanation","User reviews or refreshes the estimate"]},{"name":"Gas-limit-aware simulation recovery","description":"Keep simulation failure, transaction execution failure, and fee estimation as distinct states before retry.","components":["SimulationStatus","RevertReason","GasLimit","RetryAction"],"userFlow":["Simulate the transaction","Show a failure reason or current estimate","Refresh state and gas price when needed","Review the gas-limit-based total before retry"]}],"antiPatterns":[{"pattern":"Ethereum gas defaults on Monad","why":"Monad's active revision changes selected account, storage, precompile, memory, and page-access costs, and its fee accounting charges the gas limit.","instead":"Estimate against the intended Monad network and current revision. Show an unavailable or failed estimate when the endpoint cannot provide one.","severity":"critical"},{"pattern":"No explanation when storage estimate spikes","why":"User thinks bug or scam","instead":"Explain the cost identified by simulation; do not call recurring cold access a one-time setup fee.","severity":"high"},{"pattern":"Hiding network on estimate row","why":"User assumes Ethereum pricing","instead":"Network: Monad label on fee row","severity":"medium"},{"pattern":"Apply a blanket cold-storage multiplier","why":"Monad charges by operation and page state: a first page access, a warm page, page writes, and state growth have different components.","instead":"Use the actual operation and access pattern from chain-aware estimation, and explain page locality only when it is evidenced.","severity":"high"},{"pattern":"Treat gas used as the amount charged","why":"Monad charges gas limit multiplied by price per gas, so a receipt's gasUsed field is not by itself the fee paid.","instead":"Show the signed gas limit, applicable price, and resulting charged amount.","severity":"high"},{"pattern":"Treat an estimate or simulation as a success guarantee","why":"State, parameters, gas price, endpoint behavior, and inclusion can change after simulation; an estimate does not prove execution or finality.","instead":"Refresh close to signing, preserve failure and revert states, and reconcile the observed transaction outcome separately.","severity":"high"}],"vocabulary":[{"use":"Estimated fee on Monad","avoid":"Opcode repricing adjusted gas","why":"Simple fee language."},{"use":"Storage access affects this estimate","avoid":"One-time setup cost","why":"Page warmth is transaction-scoped. A later transaction can pay cold-access costs again."},{"use":"Refresh estimate","avoid":"Re-simulate with Monad schedule","why":"User action language."},{"use":"Gas limit charged","avoid":"Gas used is what you pay","why":"Monad's fee formula uses the signed gas limit multiplied by price per gas."},{"use":"Warm for this transaction","avoid":"Warm forever","why":"Page warmth is transaction-scoped and can roll back with a reverted call frame."}],"onMonad":[{"aspect":"Storage reads and writes","ethereum":"SLOAD costs 2,100 gas for a cold slot and 100 gas for a warm slot; SSTORE has its own write-cost rules.","monad":"SLOAD costs 8,100 gas for a cold 128-slot page and 100 gas for a warm page. SSTORE separately includes base, page-load, page-write, and state-growth components.","designImplication":"Explain page locality and use a chain-aware estimator; do not apply a blanket multiplier."},{"aspect":"Opcode scope","ethereum":"Ethereum's gas schedule is the baseline for its network.","monad":"Monad changes a limited set of costs, including cold account and storage access, storage pages, selected precompiles, and memory expansion.","designImplication":"Identify the operation and schedule that drives a difference instead of describing all storage as uniformly repriced."},{"aspect":"Estimation","ethereum":"Use an Ethereum-aware estimator for Ethereum transactions.","monad":"Use Monad-aware simulation and estimation, including page warmth and the operation's access pattern.","designImplication":"Show the chain and the relevant page-locality explanation when an estimate changes."},{"aspect":"Fee accounting","ethereum":"Fee presentation and charging semantics must follow the selected network rather than assuming one cross-chain formula.","monad":"Monad charges `gas_limit * price_per_gas`; the price uses the active base fee and user-specified priority and max values.","designImplication":"Show the gas limit and price assumptions. Do not use receipt `gasUsed` alone as the final fee."},{"aspect":"Revision activation","ethereum":"Fork-specific behavior depends on the target network's activation schedule.","monad":"MIP-8 page-aware storage pricing is part of MONAD_TEN; the current docs associate MIP-5's Fusaka EIPs with MONAD_NINE. Mainnet and testnet use separate revision schedules.","designImplication":"Name the target network and active revision, and do not infer runtime support from proposal status alone."}],"technicalNotes":"MIP-8 Page-ified Storage State is active on Monad mainnet through MONAD_TEN at timestamp 1788359400 (2026-09-02 14:30 UTC), as recorded by the official monad-bft v0.16.1 release; testnet activated it at a separate timestamp and other networks can differ. Storage pages contain 128 consecutive slots. SLOAD costs 8,100 gas for a first page access and 100 gas for a warm page. SSTORE sums a 100-gas base, an 8,000-gas page-load charge when applicable, a 2,800-gas first-changing-write charge per page, and a 17,000-gas state-growth charge when the page's net slot count reaches a new high. Warmth is scoped to the transaction, propagates across calls, and rolls back with a reverted frame. Monad charges `gas_limit * price_per_gas`; simulation and estimation provide evidence for the selected state and parameters, not a guarantee of inclusion or successful execution. MIP-2 sets the runtime-code limit to 131,072 bytes and the initcode limit to 262,144 bytes; the deployment path and active revision still need validation. The current changelog lists MIP-5's EIP-7823, EIP-7883, and EIP-7939 changes under MONAD_NINE, covering MODEXP bounds and pricing plus CLZ support. Refresh chain-specific simulation and estimation for affected operations. These are supporting deployment and estimation details, not new wallet capabilities.","relatedStandards":[{"id":"MONAD-PARALLEL","relationship":"Execution architecture behind transaction processing"},{"id":"MONAD-7702","relationship":"Delegation txs need Monad estimates too"}]},"sources":[{"label":"Official documentation","url":"https://docs.monad.xyz/developer-essentials/opcode-pricing","type":"official-doc"},{"label":"Formal MIP-8 specification","url":"https://github.com/monad-crypto/MIPs/blob/main/MIPs/MIP-8.md","type":"official-spec"},{"label":"Monad gas pricing documentation","url":"https://docs.monad.xyz/developer-essentials/gas-pricing","type":"official-doc"},{"label":"Monad BFT v0.16.1 release","url":"https://github.com/category-labs/monad-bft/releases/tag/v0.16.1","type":"implementation"},{"label":"Monad revision and activation changelog","url":"https://docs.monad.xyz/developer-essentials/changelog","type":"official-doc"},{"label":"MIP-2 contract size limits","url":"https://github.com/monad-crypto/MIPs/blob/main/MIPs/MIP-2.md","type":"official-spec"},{"label":"MIP-5 opcode and ModExp changes","url":"https://github.com/monad-crypto/MIPs/blob/main/MIPs/MIP-5.md","type":"official-spec"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/MONAD-OPCODE","markdown":"https://www.eipsfordesigners.com/standards/MONAD-OPCODE/content.md","agent":"https://www.eipsfordesigners.com/standards/MONAD-OPCODE/agent.md","api":"https://www.eipsfordesigners.com/api/standards/MONAD-OPCODE","official":"https://docs.monad.xyz/developer-essentials/opcode-pricing"},"freshness":{"lastReviewed":"2026-09-21","lastUpdated":"2026-09-21"}}