Constraints
Important limits and boundaries when building on Rome EVM. Understanding these constraints helps you design contracts that work reliably.
Solana Transaction Limits
Transaction size
1,232 bytes
Large EVM txs are split across holder accounts (transparent)
Compute units per tx
~1.4M CU
Operations exceeding this use iterative mode
Accounts per tx (no ALT)
28
Use Address Lookup Tables for more
Accounts per tx (with ALT)
64+
ALT automatically used when > 28 accounts
Max holder size
80 KB
Max RLP size for a single EVM transaction
EVM Execution Limits
Contract storage slots
256 per storage account
Multiple storage accounts can be created per contract
Opcodes per iteration
~500
For iterative (VmIt) mode
Account lock TTL
3-4 seconds
During iterative execution
Treasury wallets
64
Fee pool wallets
Contract size limit
480 KB
Raised from Ethereum's 24 KB (OP-Geth mode)
CPI Constraints
CPI depth
4 levels max
Solana's CPI depth limit
Accounts per CPI call
Limited by Solana tx size
Practically ~20 accounts per CPI
CPI + Transfer Hook depth
Uses CPI levels
Transfer hooks from inside CPI may exceed depth
CPI depth is the most critical constraint. Rome EVM consumes one CPI level when Solana calls the Rome program. If your Solidity contract then calls another Solana program via CPI, that's level 2. If that program calls another, that's level 3. You have at most 4 levels total.
Token-2022 Transfer Hook Constraints
One hook per mint
Meta-Hook Router solves this (up to 8 sub-hooks)
transfer_checked only
Hooks don't fire on plain transfer. Rome bridge MUST use transfer_checked
Mint/burn not hooked
Controlled via mint authority, not hooks
Single-state mode only
OP-Geth unreachable from inside Solana tx
Token wrapping escape
Users can wrap tokens to bypass hooks. Mitigated via wrapper blacklist + PermanentDelegate
Gas and Pricing Constraints
Gas pricing source
Meteora DAMM V1 pool (SPL gas token)
Gas price multiplier
Configurable per proxy (gas_price_mul)
Minimum gas price
Set by proxy configuration
Gas estimation
Performed off-chain via Mollusk emulator before submission
Network-Specific Constraints
Local
1001
Set in rome-setup config
Devnet (montispl)
200002
RD2Gg7Lcnv62XmRHAzxh6fQQfMRzHtN5LeKPVBhYU5S
Testnet (Martius)
121214
Check deployment config
Testnet (Caelian)
121215
Check deployment config
Precompile Constraints
Modexp (0x05)
Disabled — can be enabled via feature flag
BN254 ecPairing (0x08)
High CU cost — typically requires iterative mode (~200K CU)
CPI precompile (0xFF...08)
Accounts must be declared upfront in the Solana transaction
Oracle Constraints
Default max staleness
60 seconds
Historical round data
Not supported — getRoundData(roundId) reverts
Switchboard EMA
Not supported — latestEMAData() reverts on SwitchboardV3
Parser offsets
Empirically validated — must re-validate before redeployment
Design Recommendations
Keep CPI depth shallow. Design contracts to minimize nesting. If you're calling Jupiter which calls Raydium which calls SPL Token, you're at 3 levels — dangerously close to the limit.
Prefer atomic mode. Design operations to fit within ~1.4M CU. Iterative mode adds latency (3-4 second locks) and complexity.
Declare accounts upfront. All Solana accounts touched by CPI must be known at transaction creation time. Dynamic account discovery within a CPI call is not possible.
Use
transfer_checked. If you're building anything that touches Token-2022 tokens, always usetransfer_checkedto ensure hooks fire.Test CU consumption. Use
eth_estimateGasduring development. Optimize with Yul for hot paths. See CU Optimization.
What's Next
Compute Budget — detailed CU costs per operation
Token Interop — ERC-20 ↔ SPL bridging model
CU Optimization Guide — practical optimization techniques
Last updated
Was this helpful?