> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sei.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Sei EVM vs Ethereum: Key Differences

> A comparison of Sei EVM and Ethereum, highlighting Sei's advantages in blocktime, throughput, finality, and execution environment, as well as technical differences in opcodes, state storage, and other features.

export const SstoreGasLive = ({network = 'mainnet'}) => {
  const COLD = '0x50025cb2';
  const PARAM = '0x095f88b9';
  const RPC = {
    mainnet: {
      url: 'https://evm-rpc.sei-apis.com',
      chain: 'pacific-1',
      id: 1329,
      probe: '0xeeB428bcf499D0A1c401f123F64BFf754a5de57A',
      explorer: 'https://seiscan.io/address/0xeeB428bcf499D0A1c401f123F64BFf754a5de57A'
    },
    testnet: {
      url: 'https://evm-rpc-testnet.sei-apis.com',
      chain: 'atlantic-2',
      id: 1328,
      probe: '0xE5A35b2457E1C3cfF2F6527fAA32DE0B2a8e28E0',
      explorer: 'https://testnet.seiscan.io/address/0xE5A35b2457E1C3cfF2F6527fAA32DE0B2a8e28E0'
    }
  };
  const [net, setNet] = useState(network === 'testnet' ? 'testnet' : 'mainnet');
  const [data, setData] = useState(null);
  const [err, setErr] = useState(null);
  const [loading, setLoading] = useState(true);
  const ethCall = async (url, to, data) => {
    const res = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        jsonrpc: '2.0',
        id: 1,
        method: 'eth_call',
        params: [{
          to,
          data
        }, 'latest']
      })
    });
    const json = await res.json();
    if (json.error) throw new Error(json.error.message || 'eth_call failed');
    return parseInt(json.result, 16);
  };
  const load = async which => {
    setLoading(true);
    setErr(null);
    try {
      const {url, probe} = RPC[which];
      const [param, cold] = await Promise.all([ethCall(url, probe, PARAM), ethCall(url, probe, COLD)]);
      setData({
        param,
        cold
      });
    } catch (e) {
      setErr(e && e.message ? e.message : 'Failed to query RPC');
      setData(null);
    } finally {
      setLoading(false);
    }
  };
  useEffect(() => {
    load(net);
  }, [net]);
  const fmt = n => n == null ? '—' : n.toLocaleString('en-US');
  const TabButton = ({value, children}) => {
    const active = net === value;
    return <button type="button" onClick={() => setNet(value)} className="px-3 py-1 transition-colors" style={{
      fontFamily: 'var(--sei-font-mono)',
      fontSize: '11px',
      textTransform: 'uppercase',
      letterSpacing: '0.04em',
      color: active ? '#ffffff' : 'var(--sei-maroon-100)',
      backgroundColor: active ? 'var(--sei-maroon-100)' : 'transparent',
      border: '1px solid var(--sei-maroon-100)',
      cursor: active ? 'default' : 'pointer'
    }}>
        {children}
      </button>;
  };
  const Stat = ({label, value, sub}) => <div className="flex flex-col gap-0.5">
      <span className="text-[11px] uppercase tracking-wide text-neutral-500 dark:text-neutral-400" style={{
    fontFamily: 'var(--sei-font-mono)'
  }}>
        {label}
      </span>
      <span className="text-2xl font-semibold text-neutral-900 dark:text-neutral-50 tabular-nums" style={{
    fontFamily: 'var(--sei-font-mono)'
  }}>
        {loading ? '…' : value}
        <span className="text-sm font-normal text-neutral-500 dark:text-neutral-400"> gas</span>
      </span>
      {sub && <span className="text-[11px] text-neutral-500 dark:text-neutral-400">{sub}</span>}
    </div>;
  return <div className="not-prose w-full rounded-lg border border-neutral-200 dark:border-neutral-700 p-4" style={{
    backgroundColor: 'rgba(127,127,127,0.04)'
  }}>
      <div className="flex items-center justify-between gap-3 mb-3">
        <span className="text-[12px] font-semibold text-neutral-700 dark:text-neutral-200" style={{
    fontFamily: 'var(--sei-font-mono)'
  }}>
          Live SSTORE gas — measured on-chain
        </span>
        <div className="inline-flex">
          <TabButton value="mainnet">Mainnet</TabButton>
          <TabButton value="testnet">Testnet</TabButton>
        </div>
      </div>

      {err ? <div className="text-[12px] text-red-600 dark:text-red-400" style={{
    fontFamily: 'var(--sei-font-mono)'
  }}>
          Could not reach {RPC[net].chain} RPC: {err}{' '}
          <button type="button" onClick={() => load(net)} className="underline">
            retry
          </button>
        </div> : <div className="flex flex-wrap gap-x-10 gap-y-3">
          <Stat label="SSTORE_SET parameter" value={fmt((data && data.param) - 8)} sub="governance value (≈ 72,000)" />
          <Stat label="Cold first write" value={fmt((data && data.cold) - 7)} sub="SSTORE_SET + EIP-2929 cold access (2,100)" />
        </div>}

      <div className="mt-3 text-[11px] text-neutral-500 dark:text-neutral-400">
        {RPC[net].chain} ({RPC[net].id}) · read via <code>eth_call</code> from the verified{' '}
        <a href={RPC[net].explorer} target="_blank" rel="noopener noreferrer" className="underline">
          SstoreGasProbe
        </a>{' '}
        contract. Governance-adjustable — set by{' '}
        <a href="https://www.mintscan.io/sei/proposals/109" target="_blank" rel="noopener noreferrer" className="underline">
          Proposal #109
        </a>
        .
      </div>
    </div>;
};

While Sei features full EVM compatibility, there are some distinctions between
Sei's EVM and Ethereum itself:

| Feature                   | Sei EVM                                                                           | Ethereum                                                       |
| ------------------------- | --------------------------------------------------------------------------------- | -------------------------------------------------------------- |
| Blocktime                 | 400 ms                                                                            | 12 s                                                           |
| Gas per Second            | \~ 100 MegaGas/s                                                                  | \~ 5 MegaGas/s                                                 |
| Finality                  | Instant (\~400 ms)                                                                | Various commitment levels (safe, latest, justified, finalized) |
| Parallelized Execution    | Yes                                                                               | No                                                             |
| EVM Tooling Compatibility | 100%                                                                              | 100%                                                           |
| EVM Version               | Pectra (w/o blobs)                                                                | Fusaka                                                         |
| Gas Limit                 | 12.5 M (block cap)                                                                | 60 M (block); \~16.7 M per-tx (EIP-7825)                       |
| Per-Tx Gas Cap            | 12.5 M (block limit)                                                              | \~16.7 M (EIP-7825)                                            |
| Byte Size Limit           | 21 MB                                                                             | No byte-denominated limits                                     |
| Execution Environment     | EVM and Cosmos-SDK                                                                | EVM                                                            |
| Address Space             | Dual ECDSA-derived addresses; Cosmos Bech32 (sei…) + EVM-compatible address (0x…) | ECDSA-derived address (0x…)                                    |
| State Storage             | AVL-tree (global root)                                                            | Merkle Patricia Trie (MPT)                                     |
| SSTORE Gas Cost           | 72k (on-chain param, governance-adjustable)                                       | 20k (fixed)                                                    |

* Sei uses the Pectra (Prague + Electra) version of EVM, excluding blob transactions. Ethereum has since upgraded to Fusaka (December 2025), which introduced PeerDAS for enhanced data availability.
* Sei's gas limit is 12.5 M as opposed to Ethereum's 60 M (increased from 45 M in the Fusaka upgrade via EIP-7935). Sei also has a byte size limit of 21MB.
* Sei has instant finality — a transaction is final as soon as its block is committed (\~400 ms). This means the various commitment levels typical for Ethereum (i.e., safe, latest, justified) do not apply on Sei.

<Danger>
  **Deprecation Notice**

  Cosmos SDK and CosmWasm functionality is being deprecated in favor of EVM-only. For more details, see [SIP-3](https://github.com/sei-protocol/sips/blob/main/sips/sip-3.md) and [Proposal 99](https://www.mintscan.io/sei/proposals/99).

  [Proposal 115](https://www.mintscan.io/sei/proposals/115) further disables CosmWasm code uploads and contract instantiations chain-wide — no new CosmWasm contracts can be deployed. Only `execute` and `query` against pre-existing CosmWasm contracts remain available.

  [Proposal 116](https://www.mintscan.io/sei/proposals/116) additionally disables inbound IBC transfers — IBC assets bridged from Cosmos chains can no longer arrive on Sei after this passes and is activated. See the [SIP-03 Migration Guide](/learn/sip-03-migration) for affected assets and migration routes.
</Danger>

* **Sei is a dual-execution environment (EVM and Cosmos-SDK).** This means:
  * Non-EVM transactions can update EVM-accessible state.
    * For example, an account's SEI balance can be affected by both Cosmos (bank send, wasm execute) transactions as well as EVM send transactions
  * Sei assets can exist as EVM tokens (ERC20/721/1155), as legacy CosmWasm tokens (CW20/CW721/CW1155, no longer deployable per Prop 115), or as "native" Bank Module assets (Sei).
  * User accounts on Sei have [two addresses](/learn/accounts) derived from the same public key (Cosmos Bech32 and EVM-compatible 0x…)
  * Interoperability between EVM and Cosmos-SDK modules is governed and navigated via [precompiles](/evm/precompiles/example-usage) and [pointer contracts](/learn/pointers)

## Sei EVM Release

Sei EVM was originally deployed at the following block heights and versions:

### Testnet

* **Name:** `v5.5.1`
* **Height:** `90526031`
* **Changelog:** [https://github.com/sei-protocol/sei-chain/blob/main/CHANGELOG.md#v5.5.1](https://github.com/sei-protocol/sei-chain/blob/main/CHANGELOG.md#v5.5.1)

### Mainnet

* **Name:** `v5.5.2`
* **Height:** `79123881`
* **Changelog:** [https://github.com/sei-protocol/sei-chain/blob/main/CHANGELOG.md#v552](https://github.com/sei-protocol/sei-chain/blob/main/CHANGELOG.md#v552)

## Opcode Differences

| Opcode               | Sei EVM                                             | Ethereum                                                 | Notes                                                                                                                      |
| -------------------- | --------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| PREVRANDAO           | Returns a value derived from the current block time | Returns the RANDAO mix (EIP‑4399)                        | Not a randomness source; use an oracle/VRF. `DIFFICULTY` aliases to this.                                                  |
| COINBASE             | Always the global fee collector address             | Block proposer (miner) address                           | Do not assume it is the validator address.                                                                                 |
| BASEFEE              | Returns current base fee; no burn                   | Returns current base fee; a portion is burned (EIP‑1559) | Legacy tx must meet Sei's governance-set minimum gas price (currently `50 gwei`); query `eth_gasPrice` for the live value. |
| BLOCKHASH            | Hash of the Tendermint header; different encoding   | Keccak of the Ethereum block header                      | Usable for recent blocks only; values are not interchangeable across chains.                                               |
| GASLIMIT             | = 12,500,000 per block                              | = 60,000,000 per block                                   | Represents block gas limit in both chains.                                                                                 |
| TIMESTAMP            | Tendermint block time                               | Proposer-chosen block time                               | Same semantics; do not use as randomness.                                                                                  |
| DIFFICULTY           | Alias of PREVRANDAO                                 | Alias of PREVRANDAO (EIP‑4399)                           | Returns the same value as PREVRANDAO.                                                                                      |
| Blob‑related opcodes | Not supported (Pectra without blobs)                | Supported post‑Cancun (EIP‑4844)                         | Blob transactions are not enabled on Sei.                                                                                  |

### PREVRANDAO

Since Sei doesn't rely on the same pseudo‑randomness way of determining the next
validator like Proof of Stake (PoS) Ethereum does, it doesn't have the
"randomness" artifact that can be set as `PREVRANDAO`'s return value. On Sei,
`PREVRANDAO` returns a value derived from the current block time. For strong
randomness needs in contract logic, use a verifiable randomness oracle (as is
advised on Ethereum itself).

### COINBASE

Coinbase address on Sei is always set to (the EVM address of) the global fee
collector.

## State Root

Since Sei uses AVL-tree instead of Merkle Patricia Trie (MPT) for data storage,
Sei doesn't have per-account state root. The global state root is the AVL-tree
root which is also not equivalent to Ethereum's overall state root (which is a
MPT root)

## Block Hash

The block hash on Sei is computed based on the block header in Tendermint data
format, and is different from Ethereum's block Hash as a result.

## Base Fee & Tips

Sei supports all non‑blob transaction types, including the Pectra `SetCode` transaction (EIP‑7702). However for a legacy (non EIP‑1559) type
transaction, you must specify a gas price at or above Sei's governance-set minimum gas price (currently `50 gwei` on mainnet). Query the live value with `eth_gasPrice` rather than hard-coding it. In addition to this, excess
"gas wanted/gas limit" beyond the actual "gas used" may not be refunded in full
or in part.

Current EIP1559 parameters can be fetched from the `seid` SDK tool:

```sh theme={"dark"}
seid q params subspace evm KeyTargetGasUsedPerBlock

key: KeyTargetGasUsedPerBlock
subspace: evm
value: '"850000"'
```

```sh theme={"dark"}
seid q params subspace evm KeyMaxDynamicBaseFeeUpwardAdjustment

key: KeyMaxDynamicBaseFeeUpwardAdjustment
subspace: evm
value: '"0.007500000000000000"'
```

## Non-EVM Transactions

On Sei there exists non-EVM transactions which may update states accessible by
EVM transactions. The simplest example would be bank balances, which may be
updated by both native Cosmos bank send transactions and EVM send transactions.
As a result, if certain offchain applications only parse EVM transactions, they
may find certain state changes unattributable to any EVM transaction.

## Finality

Sei has instant finality — a transaction is final as soon as its block is
committed (\~400 ms) — meaning that commitment levels of "safe", "latest",
"justified", and "finalized" on Ethereum are all the same thing on Sei.

## Pending State

On Ethereum the block proposer would execute its proposed block first (and
update its local state) before broadcasting the proposal to others (the updated
state would be marked "pending" until the node is accepted by other nodes).

However, on Sei, the block proposer would broadcast first and only execute the
proposal if it's accepted (i.e. every node would execute the block at roughly
the same time), so Sei does not have a window when "pending state"
exists.

## Gas Model & Fees

Sei does not implement base‑fee burning. There is no base‑fee burn; all transaction fees accrue to validators. Fees are calculated as:

Transaction Fee = Gas Used × Gas Price

**Practical implications**

* **Simpler fee handling:** Use `gasPrice` (you can omit `maxFeePerGas` / `maxPriorityFeePerGas`).
* **More stable fees:** Higher throughput reduces fee spikes during busy periods.
* **Typically lower cost:** Many workloads that are costly on Ethereum become economical on Sei.

<Info>
  **Useful Infos**

  * **Does Sei burn a base fee (EIP‑1559)?** No.
  * **Who receives fees?** Validators.
  * **Are Sei fees lower?** Yes, due to higher throughput and parallel execution.
</Info>

## SSTORE Gas Cost

On Sei, the `SSTORE` opcode gas cost is configurable as an on-chain parameter, meaning it can be adjusted via governance proposal without requiring a chain upgrade. This provides flexibility to tune storage costs based on EVM state size and network conditions.

Currently, the `SSTORE` gas cost is set to the non-standard value of **72,000 gas**. This value is the same on both mainnet (`pacific-1`) and testnet (`atlantic-2`). It was set by governance [Proposal #109](https://www.mintscan.io/sei/proposals/109) ("Update EVM SSTORE set gas to 72000"), which changed the `evm` module parameter `KeySeiSstoreSetGasEIP2200` to `72000`.

The values below are read **live** from the Sei EVM:

<SstoreGasLive network="mainnet" />

To confirm the real cost yourself, use a live `eth_estimateGas` call against a Sei RPC. Note that a Foundry `forge test --gas-report --fork-url <sei rpc>` report forks chain *state* but applies revm's standard EVM gas schedule, so it reports the Ethereum cost (\~22,100) rather than Sei's — it is useful for relative profiling of your own logic, not for the absolute storage-write cost.

<Info>Since `SSTORE` is a governance-controlled parameter, this value may change in the future through a governance proposal.</Info>

## ERC Token Standards Compatibility

Sei’s EVM fully supports the common token standards:

* **ERC‑20** (fungible tokens)
* **ERC‑721** (NFTs)
* **ERC‑1155** (multi‑token)

Existing OpenZeppelin contracts and tools work unchanged.

## Testing & Migration Checklist

* ✅ Re‑deploy your Solidity code to Sei testnet; most contracts need no changes.
* ✅ If you used SELFDESTRUCT, refactor to a soft‑close pattern.
* ✅ Remove EIP‑1559 fee UI complexity; use a single `gasPrice` input in frontends.
* ✅ If you rely on on‑chain “randomness,” integrate an oracle/VRF.
* ✅ Size your `gasLimit` with a modest buffer (parallel execution can slightly vary estimates).
