Mandala Chain
Build on Mandala

Differences from Ethereum

What changes when you deploy to Mandala instead of Ethereum. Five gotchas in plain language.

Mandala is EVM-equivalent. Everything that compiles on Ethereum compiles here, with the same opcodes, the same ABI, the same wallets. Five things behave differently, and missing them costs time.

Gas is paid in KPG, not ETH

Every transaction fee is denominated in KPG. Your wallet shows balances in KPG, your gas price is in KPG-gwei, your dApp fee estimates are KPG. KPG and ETH are different tokens with different USD values. Budget accordingly.

Full fee mechanics: Gas & Fees.

Blocks are produced on demand

There is no fixed block time. The sequencer emits a block when at least one transaction has been submitted. If the chain is idle, no blocks are produced.

For your contracts:

  • Do not use block.number as a clock. It does not advance at a fixed rate.
  • block.timestamp can jump by seconds, minutes, or hours between adjacent blocks. Time-based logic should use block.timestamp deltas and be tested under irregular intervals.
  • Per-block emission rates (X tokens per block) behave differently from a fixed-slot chain. Convert to per-second where possible.
  • On-chain randomness from block.timestamp or blockhash is even less reliable than usual. Use VRF or commit-reveal.

Full block model: Block Production & Finality.

Withdrawals to Ethereum take ~7 days

Standard optimistic-rollup challenge window. Funds bridged from Mandala to Ethereum are released on L1 after the dispute period passes. Plan UX for users who expect L1 funds.

Third-party fast bridges sell the wait time at a fee. The canonical bridge does not have a fast path. Withdraw to Ethereum covers both.

L2-to-L1 messages go through ArbSys

To send a message from a Mandala contract to Ethereum L1, call the ArbSys precompile at 0x0000000000000000000000000000000000000064. Same address on every Arbitrum Orbit chain.

interface ArbSys {
    function sendTxToL1(address destination, bytes calldata data)
        external payable returns (uint256);
}

ArbSys(0x0000000000000000000000000000000000000064)
    .sendTxToL1(myL1Contract, payload);

After the ~7-day challenge window, anyone can finalize the message on L1 through the Outbox at 0x004eF39261cee56409Dbd26040a33Eca8326490C.

Full ArbSys API: Arbitrum's precompiles reference.

The sequencer is centralized today

A single sequencer operated by the Mandala team and AltLayer orders transactions. It cannot steal funds. It can censor.

If your transaction is censored or the sequencer is down, submit directly to the L1 Inbox at 0x62DfD05c460C7E55DA85B39EaD3eBc6e0CcdD0d5. After a delay, anyone can force-include the transaction via the SequencerInbox at 0x325acf46079d3f750D5D7E6182E094B1fD0AC2F4.

Full trust model: Trust & Security Model.

What does not change

Solidity, EVM opcodes, ABI encoding, function selectors, event topics, ERC standards, wallet flows, the gas-accounting shape, and every standard precompile (ecrecover, sha256, modular exponentiation). If you do not see it on this page, assume it works the same as Ethereum.

On this page