Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion evm/evm-parity/evm-compatibility.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
description: 'EVM feature support on Sei — what works, what differs from Ethereum, and what is not available'
---

# EVM Compatibility

Check warning on line 7 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L7

Use sentence case for headings: 'EVM Compatibility'.

This page documents Sei's EVM feature support. Each row shows whether a capability works as on standard Ethereum, behaves differently in a documented way, or is not available on Sei.

Standard EVM tooling — viem, wagmi, ethers, Foundry, Hardhat — works on Sei for all rows marked **Supported**. Where Sei differs from Ethereum, the difference is noted so you can account for it in your application.

## Status Legend

Check warning on line 13 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L13

Use sentence case for headings: 'Status Legend'.

| Status | Meaning |
| --- | --- |
Expand All @@ -29,7 +29,7 @@
| EIP-4844 blob transactions (type 3) | Not supported | Sei runs Pectra without blob transactions. [See Transaction Types.](/evm/evm-parity/transaction-types) |
| EIP-7702 set-code transactions (type 4) | Supported | |

## Account and State

Check warning on line 32 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L32

Use sentence case for headings: 'Account and State'.

| Feature | Sei status | Notes |
| --- | --- | --- |
Expand All @@ -37,9 +37,9 @@
| `eth_getTransactionCount` (nonce) | Supported | |
| `eth_getCode` | Supported | |
| `eth_getStorageAt` | Supported — differences | SSTORE cost is governance-adjustable; do not hard-code gas assumptions. [See Gas and Fees.](/evm/evm-parity/gas-and-fees) |
| `eth_getProof` | Supported — differences | Returns IAVL proof data rather than Ethereum Merkle Patricia Trie proofs. Proof verification logic must account for this. [See State Proofs.](/evm/evm-parity/state-proofs) |
| `eth_getProof` | Supported — differences | Returns IAVL proof data rather than Ethereum Merkle Patricia Trie proofs. Proof verification logic must account for this. Proofs resolve across supported store backends (classic IAVL, store/v2 memiavl, and other proof-capable queryable stores), so the method works across a broader range of node configurations. [See State Proofs.](/evm/evm-parity/state-proofs) |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] This sentence puts storage-engine internals into an app-developer RPC compatibility table, using terms that appear nowhere else in the developer docs:

  • store/v2 — zero occurrences in any .mdx in this repo.
  • memiavl — used only in node/ operator pages (node-operators.mdx, giga-storage-migration.mdx), never in evm/.
  • "classic IAVL" and "proof-capable queryable stores" — introduced here without definition.

For the audience of this table (people deciding whether eth_getProof works for their integration), the actionable content is already in the preceding two sentences; "works across a broader range of node configurations" is not something a dapp developer can act on, since they don't control the RPC node's backend.

Suggest dropping the sentence from this table. If the backend-coverage detail is worth keeping, it belongs on /evm/evm-parity/state-proofs — and per the blocker above, it needs a v6.6.0 citation first, since the PR description lists this file as having "no falsifiable constant" while this sentence names three.


## Blocks and Finality

Check warning on line 42 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L42

Use sentence case for headings: 'Blocks and Finality'.

| Feature | Sei status | Notes |
| --- | --- | --- |
Expand All @@ -48,7 +48,7 @@
| Finality tags (`latest`, `safe`, `finalized`) | Supported — differences | Sei has instant finality. All three tags refer to the same commitment level. [See Finality.](/evm/evm-parity/finality) |
| Pending block state | Supported — differences | Ethereum-style pending state visibility is not guaranteed. Do not rely on pending transaction ordering. [See Finality.](/evm/evm-parity/finality) |

## Logs, Filters, and Subscriptions

Check warning on line 51 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L51

Use sentence case for headings: 'Logs, Filters, and Subscriptions'.

| Feature | Sei status | Notes |
| --- | --- | --- |
Expand All @@ -56,7 +56,7 @@
| Filter lifecycle (`eth_newFilter`, `eth_getFilterChanges`, `eth_getFilterLogs`, `eth_uninstallFilter`) | Supported | |
| WebSocket subscriptions (`eth_subscribe`) | Supported | [See WebSocket Connections.](/evm/evm-parity/websocket) |

## Execution and Simulation

Check warning on line 59 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L59

Use sentence case for headings: 'Execution and Simulation'.

| Feature | Sei status | Notes |
| --- | --- | --- |
Expand All @@ -74,7 +74,7 @@
| EIP-712 typed data signing (`eth_signTypedData_v4`) | Supported | Depends on the connected wallet exposing the method. [See Signing.](/evm/evm-parity/signing) |
| EIP-1271 contract signature validation | Supported | [See Signing.](/evm/evm-parity/signing) |

## Token Standards

Check warning on line 77 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L77

Use sentence case for headings: 'Token Standards'.

| Feature | Sei status | Notes |
| --- | --- | --- |
Expand All @@ -82,19 +82,19 @@
| ERC-721 | Supported | |
| ERC-1155 | Supported | |

## Account Abstraction

Check warning on line 85 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L85

Use sentence case for headings: 'Account Abstraction'.

| Feature | Sei status | Notes |
| --- | --- | --- |
| ERC-4337 | Supported | Requires a compatible bundler. Sei EVM is ERC-4337 compatible. |

## Name Services

Check warning on line 91 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L91

Use sentence case for headings: 'Name Services'.

| Feature | Sei status | Notes |
| --- | --- | --- |
| ENS | Not supported | Sei does not run Ethereum mainnet ENS. Application-level name services can be deployed as contracts. |

## Sei Extensions

Check warning on line 97 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L97

Use sentence case for headings: 'Sei Extensions'.

These capabilities are Sei-specific and have no standard Ethereum equivalent. They are exposed through `@sei-js` packages layered on top of standard EVM tooling.

Expand All @@ -104,7 +104,7 @@
| Pointer contracts (CW20 ↔ ERC-20, CW721 ↔ ERC-721) | Bridge between CosmWasm and EVM token standards. Standard ERC interfaces work against pointer contracts. |
| Native address association (EVM ↔ Cosmos address) | Links an EVM address and a Cosmos address for the same account. Required before some Sei-native flows. |

## Unsupported RPC Methods

Check warning on line 107 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L107

Use sentence case for headings: 'Unsupported RPC Methods'.

The following JSON-RPC methods are either not available on Sei or will return errors:

Expand All @@ -115,7 +115,7 @@
| `eth_blobBaseFee` | Sei runs Pectra without blob transaction support. This method does not exist on Sei. |
| `engine_getBlobsV1` | Blob data availability endpoints are not supported. |

### Pending State

Check warning on line 118 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L118

Use sentence case for headings: 'Pending State'.

| Method | Behavior on Sei |
| --- | --- |
Expand All @@ -124,13 +124,13 @@
| `eth_newPendingTransactionFilter` | The filter can be created but will not reliably emit pending transactions. Use `eth_newBlockFilter` or WebSocket block subscriptions instead. |
| `eth_subscribe("newPendingTransactions")` | Supported at the RPC level but Sei does not guarantee Ethereum-style pending transaction visibility. Treat results as best-effort. |

### Proof Verification

Check warning on line 127 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L127

Use sentence case for headings: 'Proof Verification'.

| Method | Behavior on Sei |
| --- | --- |
| `eth_getProof` | Returns IAVL tree proofs, not Ethereum Merkle Patricia Trie proofs. The method itself works, but the proof format is incompatible with standard Ethereum MPT verifiers. [See State Proofs.](/evm/evm-parity/state-proofs) |

### Deprecated / Removed Opcodes

Check warning on line 133 in evm/evm-parity/evm-compatibility.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/evm-compatibility.mdx#L133

Use sentence case for headings: 'Deprecated / Removed Opcodes'.

| Method | Reason |
| --- | --- |
Expand Down
8 changes: 8 additions & 0 deletions evm/evm-parity/gas-and-fees.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
description: 'Sei gas price floor, EIP-1559 fee model differences, and SSTORE cost'
---

# Gas and Fees

Check warning on line 6 in evm/evm-parity/gas-and-fees.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/gas-and-fees.mdx#L6

Use sentence case for headings: 'Gas and Fees'.

Sei supports both legacy and EIP-1559 transactions, but the fee model differs from Ethereum in three ways that affect how you estimate and set gas.

## Legacy Gas Price Floor

Check warning on line 10 in evm/evm-parity/gas-and-fees.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/gas-and-fees.mdx#L10

Use sentence case for headings: 'Legacy Gas Price Floor'.

Legacy transactions (type 0) on Sei must meet a minimum gas price set by on-chain governance. This floor can change via governance proposals — do not hard-code a specific value.

Expand All @@ -33,7 +33,7 @@

</CodeGroup>

## EIP-1559 Fee Model

Check warning on line 36 in evm/evm-parity/gas-and-fees.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/gas-and-fees.mdx#L36

Use sentence case for headings: 'EIP-1559 Fee Model'.

Sei supports EIP-1559 transactions (type 2), but does not burn the base fee. Fees go entirely to validators rather than being partially burned as on Ethereum.

Expand All @@ -53,7 +53,15 @@

</CodeGroup>


### Effective Gas Price on Receipts

Check warning on line 57 in evm/evm-parity/gas-and-fees.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/gas-and-fees.mdx#L57

Use sentence case for headings: 'Effective Gas Price on Receipts'.

Check warning on line 57 in evm/evm-parity/gas-and-fees.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] evm/evm-parity/gas-and-fees.mdx#L57

[Sei.Headings] Use sentence case for headings: 'Effective Gas Price on Receipts'.
Raw output
{"message": "[Sei.Headings] Use sentence case for headings: 'Effective Gas Price on Receipts'.", "location": {"path": "evm/evm-parity/gas-and-fees.mdx", "range": {"start": {"line": 57, "column": 5}}}, "severity": "WARNING"}

For dynamic-fee (type 2) transactions, the transaction receipt's `effectiveGasPrice` field reports the **actual price charged** — `min(baseFee + maxPriorityFeePerGas, maxFeePerGas)` — not the fee cap. This matches standard EIP-1559 semantics, so clients such as ethers and hardhat see the same `effectiveGasPrice` behavior they expect from Ethereum.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] "This matches standard EIP-1559 semantics" is true of the pricing formula but sits in slight tension with transaction-types.mdx:16, which tells readers type 2 is "Supported — base fee is not burned" on Sei. A reader who has seen that row may take this sentence as walking it back.

A half-clause resolves it — e.g. "...matches standard EIP-1559 pricing semantics (Sei diverges only in not burning the base fee)" — and gives you a natural place to cross-link the divergence page.


In practice, when your priority tip plus the base fee stays below `maxFeePerGas`, the receipt reports `baseFee + maxPriorityFeePerGas` rather than `maxFeePerGas`. Use the receipt's `effectiveGasPrice` (not `maxFeePerGas`) when computing what a transaction actually paid.


## SSTORE Cost

Check warning on line 64 in evm/evm-parity/gas-and-fees.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/gas-and-fees.mdx#L64

Use sentence case for headings: 'SSTORE Cost'.

The gas cost of `SSTORE` (writing to contract storage) is governance-adjustable on Sei. It is currently **72,000 gas** — the same on mainnet and testnet (see [Divergence from Ethereum](/evm/differences-with-ethereum#sstore-gas-cost)) — but treat that as the current value, not a constant: do not hard-code storage write estimates in your application.

Expand Down
7 changes: 7 additions & 0 deletions evm/evm-parity/state-proofs.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
description: 'How eth_getProof differs on Sei due to IAVL tree storage'
---

# State Proofs

Check warning on line 6 in evm/evm-parity/state-proofs.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/state-proofs.mdx#L6

Use sentence case for headings: 'State Proofs'.

Sei supports `eth_getProof` but returns a different proof format from Ethereum. If your application verifies proofs on-chain or off-chain, you need to account for this difference.

## The Difference

Check warning on line 10 in evm/evm-parity/state-proofs.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/state-proofs.mdx#L10

Use sentence case for headings: 'The Difference'.

Ethereum stores state in a Merkle Patricia Trie (MPT) and `eth_getProof` returns MPT inclusion proofs. Sei stores state in an IAVL tree and returns IAVL proofs instead.

The RPC method exists and responds correctly, but the proof data structure is not compatible with Ethereum MPT proof verifiers.

## What This Affects

Check warning on line 16 in evm/evm-parity/state-proofs.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/state-proofs.mdx#L16

Use sentence case for headings: 'What This Affects'.

Most applications do not call `eth_getProof` directly. It is primarily used by:

Expand All @@ -23,8 +23,15 @@

If you are doing standard contract reads, event queries, or transaction lookups, this difference does not affect you.

## Calling eth_getProof

Check warning on line 26 in evm/evm-parity/state-proofs.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/state-proofs.mdx#L26

Use sentence case for headings: 'Calling eth_getProof'.

### Storage key requirements

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] Inserting this ### directly under ## Calling eth_getProof re-parents the content that follows: "The call works through standard libraries:" and the viem/ethers <CodeGroup> (lines 35–68) now render inside "Storage key requirements", and the page's on-page nav will point at a heading whose body is mostly a code example.

Move the new subsection below the </CodeGroup> at line 68, or keep it here and add a sibling ### Example before line 35 so the code sample gets its own heading.


Before calling `eth_getProof`, note two requirements Sei enforces on the `storageKeys` argument:

- **Keys must be hex-encoded.** Each storage key must be a valid hex-encoded value (for example `0x0000000000000000000000000000000000000000000000000000000000000001`). Keys are decoded and left-padded to 32 bytes. A malformed, non-hex key is rejected with an `invalid storage key` error. Raw byte strings, which were previously accepted, no longer work.
- **At most 1024 keys per request.** A single proof request may include a maximum of 1024 storage keys. Requesting more returns a `too many storage keys` error. Split larger sets across multiple requests.

The call works through standard libraries:

<CodeGroup>
Expand Down Expand Up @@ -60,7 +67,7 @@

</CodeGroup>

## Verifying Proofs

Check warning on line 70 in evm/evm-parity/state-proofs.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/state-proofs.mdx#L70

Use sentence case for headings: 'Verifying Proofs'.

To verify Sei state proofs, use an IAVL-compatible verifier. Standard Ethereum MPT verifier libraries (e.g. those used in Solidity or in Ethereum bridge contracts) will reject Sei proofs.

Expand Down
7 changes: 7 additions & 0 deletions evm/evm-parity/transaction-types.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
description: 'Which Ethereum transaction types are supported on Sei'
---

# Transaction Types

Check warning on line 6 in evm/evm-parity/transaction-types.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/transaction-types.mdx#L6

Use sentence case for headings: 'Transaction Types'.

Sei supports most Ethereum transaction types. The one notable exception is blob transactions.

## Supported Types

Check warning on line 10 in evm/evm-parity/transaction-types.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/transaction-types.mdx#L10

Use sentence case for headings: 'Supported Types'.

| Type | EIP | Name | Sei support |
| --- | --- | --- | --- |
Expand All @@ -16,19 +16,26 @@
| 2 | EIP-1559 | Fee market | Supported — base fee is not burned |
| 4 | EIP-7702 | Set code | Supported |


### Set Code (EIP-7702) Auth List Requirement

Check warning on line 20 in evm/evm-parity/transaction-types.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/transaction-types.mdx#L20

Use sentence case for headings: 'Set Code (EIP-7702) Auth List Requirement'.

Check warning on line 20 in evm/evm-parity/transaction-types.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] evm/evm-parity/transaction-types.mdx#L20

[Sei.Headings] Use sentence case for headings: 'Set Code (EIP-7702) Auth List Requirement'.
Raw output
{"message": "[Sei.Headings] Use sentence case for headings: 'Set Code (EIP-7702) Auth List Requirement'.", "location": {"path": "evm/evm-parity/transaction-types.mdx", "range": {"start": {"line": 20, "column": 5}}}, "severity": "WARNING"}

Type 4 (EIP-7702) SetCode transactions must include a non-empty authorization list. A transaction with an empty or nil auth list is rejected during validation with the error `auth list cannot be empty`.

Each authorization entry must also carry a valid (non-nil) chain ID. If you are constructing SetCode transactions directly, ensure at least one authorization is present before submitting.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] Two problems with this line:

  1. Not covered by the PR's evidence. The description's table verifies only auth list cannot be empty from semantic_validation.go. The chain-ID requirement is an additional falsifiable claim with no cited source.
  2. "non-nil" is a Go implementation detail that will mislead readers. EIP-7702 explicitly permits chainId == 0, meaning "valid on any chain", and callers using viem's signAuthorization or ethers can legitimately produce that. A reader sees "must carry a valid (non-nil) chain ID" and reasonably concludes 0 is rejected. If the actual check is a nil *big.Int pointer guard, say so in user terms — e.g. "each authorization must set a chain ID field (0 is permitted and means any chain)".

Also, the second sentence ("ensure at least one authorization is present") restates the paragraph above rather than following from the chain-ID point — the two claims read as spliced together.


## Not Supported

Check warning on line 26 in evm/evm-parity/transaction-types.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/transaction-types.mdx#L26

Use sentence case for headings: 'Not Supported'.

| Type | EIP | Name | Notes |
| --- | --- | --- | --- |
| 3 | EIP-4844 | Blob | Not supported — Sei runs Pectra without blob transactions |

## Blob Transactions

Check warning on line 32 in evm/evm-parity/transaction-types.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/transaction-types.mdx#L32

Use sentence case for headings: 'Blob Transactions'.

Sei runs the Pectra hardfork without blob transaction support. Attempting to send a type 3 transaction will be rejected at the RPC level.

If you are porting code from Ethereum that uses blob transactions (e.g. rollup data availability), that path does not apply to Sei.

## Sending Transactions

Check warning on line 38 in evm/evm-parity/transaction-types.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/transaction-types.mdx#L38

Use sentence case for headings: 'Sending Transactions'.

Standard library defaults work correctly. viem, wagmi, and ethers all default to type 2 (EIP-1559) transactions on chains that support it, which Sei does.

Expand Down
17 changes: 17 additions & 0 deletions evm/evm-parity/websocket.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
description: 'Connecting to Sei via WebSocket for real-time block and event subscriptions'
---

# WebSocket Connections

Check warning on line 6 in evm/evm-parity/websocket.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/websocket.mdx#L6

Use sentence case for headings: 'WebSocket Connections'.

Sei supports `eth_subscribe` over WebSocket. You can subscribe to new blocks, event logs, and pending transactions using standard library WebSocket transports.

Expand Down Expand Up @@ -37,7 +37,7 @@

</CodeGroup>

## Watching New Blocks

Check warning on line 40 in evm/evm-parity/websocket.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/websocket.mdx#L40

Use sentence case for headings: 'Watching New Blocks'.

<CodeGroup>

Expand All @@ -63,7 +63,7 @@

</CodeGroup>

## Watching Contract Events

Check warning on line 66 in evm/evm-parity/websocket.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/websocket.mdx#L66

Use sentence case for headings: 'Watching Contract Events'.

<CodeGroup>

Expand Down Expand Up @@ -95,7 +95,7 @@

</CodeGroup>

## Watching ERC-20 Transfers Across All Contracts

Check warning on line 98 in evm/evm-parity/websocket.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/websocket.mdx#L98

Use sentence case for headings: 'Watching ERC-20 Transfers Across All Contracts'.

```ts viem
import { parseAbiItem } from 'viem';
Expand All @@ -114,3 +114,20 @@

- Sei's instant finality means every block emitted over WebSocket is already final — no need to wait for additional confirmations before acting on an event.
- Pending transaction subscriptions (`newPendingTransactions`) are supported at the RPC level but Sei does not guarantee Ethereum-style pending state visibility.



## `newHeads` Under Autobahn Consensus

Check warning on line 120 in evm/evm-parity/websocket.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/evm-parity/websocket.mdx#L120

Use sentence case for headings: '******** Under Autobahn Consensus'.

Check warning on line 120 in evm/evm-parity/websocket.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] evm/evm-parity/websocket.mdx#L120

[Sei.Headings] Use sentence case for headings: '******** Under Autobahn Consensus'.
Raw output
{"message": "[Sei.Headings] Use sentence case for headings: '******** Under Autobahn Consensus'.", "location": {"path": "evm/evm-parity/websocket.mdx", "range": {"start": {"line": 120, "column": 1}}}, "severity": "WARNING"}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blocker] This section documents Autobahn as a configuration a reader can be running today, but everywhere else in these docs Autobahn is explicitly future work:

  • learn/sei-giga.mdx:14 — "Advanced features including Autobahn consensus ... are in development"
  • learn/sei-giga.mdx:97 — "The Autobahn consensus protocol described here represents upcoming enhancements. The current system uses optimized Tendermint consensus (Twin Turbo)."
  • learn/sei-giga-specs.mdx:47 — "Upcoming: Autobahn Consensus"

A developer reading only this page has no way to know whether these newHeads caveats apply to mainnet RPC today, and there is no link back to the Autobahn overview. Two things needed:

  1. A <Warning> matching the framing already used on the learn/ pages, or explicit wording on which node configuration/release enables the Autobahn path (the only operator-facing hook I can find is the Autobahn (GigaRouter) JSON config at node/node-operators.mdx:1311, which says "Leave empty to disable Autobahn" — i.e. off by default).
  2. A cross-link to /learn/sei-giga#autobahn-consensus-protocol-upcoming.

The zeroed-parentHash guidance is genuinely useful for anyone building on it — the problem is only that it reads as current default behavior.


When a node runs under Autobahn consensus, `eth_subscribe("newHeads")` notifications are delivered from an in-process notifier that publishes committed-block headers directly, rather than from the legacy consensus event bus. Subscribers still only observe headers for fully committed blocks, but the header payload differs from the legacy path in a few ways:

- **`parentHash`, `receiptsRoot`, and `transactionsRoot` are returned as zero hashes** (`0x0000…0000`). The Autobahn block-execution path does not build a Tendermint-style hash chain, so there is no meaningful value to surface for these fields.
- **`stateRoot`** is sourced from the finalized block's `AppHash` (the post-execution application hash), rather than from a pre-execution header field.
- **`hash`** is the Autobahn block-header hash — the same value reported as `blockHash` by `eth_getBlockByNumber` and the receipt APIs, keeping `newHeads` consistent with the rest of the EVM RPC surface.
- **`gasUsed`** is an approximation (summed from per-transaction results) to keep the notification cheap.

Because of these differences:

- Subscribers that chain-validate the head stream by linking `parentHash` values cannot rely on `newHeads` under Autobahn and need a different mechanism.
- If you need exact `gasUsed` or the omitted hash fields, fetch the block explicitly with `eth_getBlockByNumber`.

4 changes: 4 additions & 0 deletions evm/precompiles/json.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

<Info>**What is a precompile?** A precompile is a special smart contract deployed at a fixed address by the Sei protocol itself, that exposes custom native chain logic to EVM-based applications. It acts like a regular contract from the EVM's perspective, but executes privileged, low-level logic efficiently.</Info>

## How Does the JSON Precompile Work?

Check warning on line 13 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L13

Use sentence case for headings: 'How Does the JSON Precompile Work?'.

The JSON precompile at address `0x0000000000000000000000000000000000001003` exposes functions like `extractAsBytes()`, `extractAsBytesList()`, and `extractAsUint256()`.

Expand All @@ -18,7 +18,7 @@
- **Native Execution:** JSON parsing is executed at the native level for maximum efficiency.
- **Seamless Bridge:** No need for complex workarounds or external libraries for JSON handling.

## Use Cases

Check warning on line 21 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L21

Use sentence case for headings: 'Use Cases'.

- **Oracle Integration:** Parse complex oracle responses containing multiple data points.
- **DeFi Applications:** Process structured price feeds and market data.
Expand All @@ -30,7 +30,7 @@

The JSON precompile exposes the following functions:

### Query Functions

Check warning on line 33 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L33

Use sentence case for headings: 'Query Functions'.

```solidity
/// Extracts data as bytes from the input using the specified key.
Expand Down Expand Up @@ -61,7 +61,7 @@
) external view returns (uint256 response);
```

## Using the Precompile

Check warning on line 64 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L64

Use sentence case for headings: 'Using the Precompile'.

### Setup

Expand All @@ -74,7 +74,7 @@
- **MetaMask** or compatible EVM wallet configured for Sei Mainnet
- **SEI tokens** for gas

#### Install Dependencies

Check warning on line 77 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L77

Use sentence case for headings: 'Install Dependencies'.

Install the required packages for interacting with Sei precompiles:

Expand All @@ -89,7 +89,7 @@
npm install dotenv
```

#### Import Precompile Components

Check warning on line 92 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L92

Use sentence case for headings: 'Import Precompile Components'.

```typescript
// Import JSON precompile address and ABI
Expand Down Expand Up @@ -118,11 +118,11 @@
const jsonPrecompile = new ethers.Contract(JSON_PRECOMPILE_ADDRESS, JSON_PRECOMPILE_ABI, signer);
```

## Data Type Handling

Check warning on line 121 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L121

Use sentence case for headings: 'Data Type Handling'.

The JSON precompile has specific limitations for different data types:

### Supported Data Types

Check warning on line 125 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L125

Use sentence case for headings: 'Supported Data Types'.

| Function | Supports | Limitations |
| --- | --- | --- |
Expand All @@ -131,7 +131,11 @@
| extractAsBytesList | Arrays of strings/objects | Each element returned as bytes |



<Warning>**Value Length Limit:** `extractAsUint256` rejects value strings longer than 100 characters. If the numeric string extracted for the given key exceeds 100 characters, the call fails with `value string too long`. Ensure the numeric values you pass stay within this limit.</Warning>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] The scope of the limit is worth double-checking against the source: the description's evidence is a bare if len(strValue) > 100 at precompiles/json/json.go:175, which does not by itself establish that the guard is inside extractAsUint256 rather than a shared extraction helper also reached by extractAsBytes/extractAsBytesList. If it is shared, this Warning under-reports it.

Also, the closing advice reads oddly: uint256 maxes out at 78 decimal digits, so any value over 100 characters is already out of range for the return type. "Ensure the numeric values you pass stay within this limit" implies a constraint a caller with legitimate data could hit, when in practice the check only fires on values that could never succeed. Framing it as the error you get for oversized/malformed numeric strings would be more useful than framing it as a budget to stay under.



### Data Type Conversion Strategies

Check warning on line 138 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L138

Use sentence case for headings: 'Data Type Conversion Strategies'.

```typescript
// For decimal numbers - store as integers with known precision
Expand All @@ -151,7 +155,7 @@
const userObject = JSON.parse(userString);
```

## Error Handling Utilities

Check warning on line 158 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L158

Use sentence case for headings: 'Error Handling Utilities'.

Create comprehensive error handling for all extraction functions:

Expand Down Expand Up @@ -193,9 +197,9 @@
}
```

## Step-by-Step Guide: Using the JSON Precompile

Check warning on line 200 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L200

Use sentence case for headings: 'Step-by-Step Guide: Using the JSON Precompile'.

### Extract String Data

Check warning on line 202 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L202

Use sentence case for headings: 'Extract String Data'.

```typescript
// JSON data with string values
Expand All @@ -216,7 +220,7 @@
}
```

### Extract Numeric Data

Check warning on line 223 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L223

Use sentence case for headings: 'Extract Numeric Data'.

```typescript
// JSON data with numbers (integers only)
Expand All @@ -234,7 +238,7 @@
console.log('Rate:', actualRate);
```

### Extract Array Data

Check warning on line 241 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L241

Use sentence case for headings: 'Extract Array Data'.

```typescript
// JSON data with array
Expand All @@ -253,7 +257,7 @@
console.log('Mixed values:', valuesArray); // Output: [42, "test", 100]
```

### Extract Nested Data

Check warning on line 260 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L260

Use sentence case for headings: 'Extract Nested Data'.

<Warning>**Important:** The JSON precompile does not support dot notation for nested objects. Instead, extract the parent object and parse it manually.</Warning>

Expand Down Expand Up @@ -286,7 +290,7 @@
console.log('Wallet data:', walletData); // Output: { balance: 1000, currency: "SEI" }
```

## Complete Integration Example

Check warning on line 293 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L293

Use sentence case for headings: 'Complete Integration Example'.

Create a comprehensive JSON parsing application for mainnet:

Expand Down Expand Up @@ -489,7 +493,7 @@
main().catch(console.error);
```

### Running the Mainnet Example

Check warning on line 496 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L496

Use sentence case for headings: 'Running the Mainnet Example'.

1. **Create a new directory and initialize npm:**

Expand Down Expand Up @@ -526,7 +530,7 @@
node json-precompile-mainnet.js
```

### Expected Output

Check warning on line 533 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L533

Use sentence case for headings: 'Expected Output'.

```
🌐 Connecting to Sei Mainnet...
Expand Down Expand Up @@ -602,9 +606,9 @@
🎉 === JSON Precompile Demo Completed Successfully! ===
```

## Advanced Usage Examples

Check warning on line 609 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L609

Use sentence case for headings: 'Advanced Usage Examples'.

### Oracle Price Feed Integration

Check warning on line 611 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L611

Use sentence case for headings: 'Oracle Price Feed Integration'.

```typescript
// Advanced oracle integration with comprehensive error handling
Expand Down Expand Up @@ -656,9 +660,9 @@

## Troubleshooting

### Common Issues and Solutions

Check warning on line 663 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L663

Use sentence case for headings: 'Common Issues and Solutions'.

#### Key Not Found

Check warning on line 665 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L665

Use sentence case for headings: 'Key Not Found'.

```typescript
// Comprehensive error handling for missing keys
Expand All @@ -680,7 +684,7 @@
}
```

### Error Code Reference

Check warning on line 687 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L687

Use sentence case for headings: 'Error Code Reference'.

| Error | Cause | Solution |
| --- | --- | --- |
Expand All @@ -691,7 +695,7 @@
| `out of gas` | Insufficient gas for large JSON | Use `calculateGasLimit()` for dynamic estimation |


## Key Considerations and Tricks

Check warning on line 698 in evm/precompiles/json.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/precompiles/json.mdx#L698

Use sentence case for headings: 'Key Considerations and Tricks'.

<Info>

Expand Down
2 changes: 1 addition & 1 deletion evm/transactions.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

Sei supports EVM transactions, allowing compatibility with Ethereum-based tools and contracts. Transactions are signed messages originating from an externally owned account (EOA) that trigger state changes on the blockchain.

## Transaction Lifecycle

Check warning on line 10 in evm/transactions.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/transactions.mdx#L10

Use sentence case for headings: 'Transaction Lifecycle'.

| Stage | Description |
| ----------------- | -------------------------------------------------------------------------------------------------------------------- |
Expand All @@ -24,7 +24,7 @@
Unlike other EVM chains where you need to wait for multiple confirmations, Sei's consensus mechanism provides immediate transaction finality. Once a transaction is included in a block, it cannot be reversed.
</Info>

## Gas Mechanics

Check warning on line 27 in evm/transactions.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/transactions.mdx#L27

Use sentence case for headings: 'Gas Mechanics'.

Gas is a unit of computational work in the EVM that helps prevent spam and allocate resources efficiently:

Expand All @@ -44,7 +44,7 @@
- Always estimate gas before sending transactions using `eth_estimateGas`
</Warning>

## Transaction Structure

Check warning on line 47 in evm/transactions.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/transactions.mdx#L47

Use sentence case for headings: 'Transaction Structure'.

EVM transactions in Sei follow the Ethereum transaction format with standard properties:

Expand Down Expand Up @@ -258,7 +258,7 @@
"logs": [],
"status": "0x1",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"effectiveGasPrice": "0x1234",
"effectiveGasPrice": "0x77359400",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blocker] This value makes the example self-contradictory, and it contradicts the rule this same PR adds.

0x77359400 is 2 gwei (2,000,000,000 wei). But the eth_getTransactionByHash response immediately above (lines 219, 233–234) still has "gasPrice": "0x1234", "maxFeePerGas": "0x1234", and "maxPriorityFeePerGas": "0x1234" — 4,660 wei. So the receipt now reports an effective price ~429,000× the transaction's own fee cap.

Per the formula added in gas-and-fees.mdx:59 in this very PR — effectiveGasPrice = min(baseFee + maxPriorityFeePerGas, maxFeePerGas)effectiveGasPrice can never exceed maxFeePerGas. A reader who follows the new section to this example sees the invariant violated. Separately, geth-compatible nodes report gasPrice on an included type-2 transaction as the effective gas price, so line 219 should agree with line 261 too.

Fix by raising the fee-cap fields in the same Tabs block to realistic Sei values rather than changing only the receipt — e.g. maxFeePerGas: "0x77359400" (2 gwei), maxPriorityFeePerGas: "0x3B9ACA00" (1 gwei), and gasPrice: "0x77359400" — so the example satisfies min(baseFee + tip, maxFeePerGas).

"type": "0x2"
}
}
Expand All @@ -266,7 +266,7 @@
</Tab>
</Tabs>

## Transaction Guidelines

Check warning on line 269 in evm/transactions.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/transactions.mdx#L269

Use sentence case for headings: 'Transaction Guidelines'.

<Info>
**Transaction Best Practices:**
Expand All @@ -285,7 +285,7 @@
| Out of Gas | Gas limit too low for the operation | Use `eth_estimateGas` to set appropriate limit |
| Contract Execution Failed | Contract function reverted | Test with `eth_call` before sending transaction |

## Additional Resources

Check warning on line 288 in evm/transactions.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

evm/transactions.mdx#L288

Use sentence case for headings: 'Additional Resources'.

<CardGroup cols={3}>
<Card horizontal title="RPC Reference" icon="circle-info" href="/evm/reference">
Expand Down
2 changes: 1 addition & 1 deletion learn/twin-turbo-consensus.mdx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
---

Check warning on line 1 in learn/twin-turbo-consensus.mdx

View workflow job for this annotation

GitHub Actions / audit

Description is 198 chars (ideal 50-160)
title: "Twin Turbo Consensus: Sei's High-Speed Blockchain Consensus"
sidebarTitle: 'Consensus'
description: "Explore how Sei's Twin Turbo consensus mechanism achieves higher transaction throughput by separating block building from consensus, with detailed explanations of the protocol's design and benefits."
Expand All @@ -8,13 +8,13 @@

Sei's consensus mechanism, often referred to as Twin Turbo Consensus, represents a suite of optimizations designed to achieve exceptionally low block finality times, targeting approximately 400 milliseconds. This rapid finality is not achieved through a novel consensus algorithm but rather through significant enhancements to the underlying Tendermint Byzantine Fault Tolerant (BFT) consensus engine, aggressive configuration tuning, and tight integration with Sei's parallel execution layer and SeiDB storage system. The goal is to provide near-instant transaction confirmation, enabling a new class of high-performance decentralized applications, particularly those built for the EVM.

## Core Concept: Pipelined & Parallelized Consensus

Check warning on line 11 in learn/twin-turbo-consensus.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

learn/twin-turbo-consensus.mdx#L11

Use sentence case for headings: 'Core Concept: Pipelined & Parallelized Consensus'.

The key to achieving sub-second finality lies in aggressively optimizing and parallelizing the standard BFT consensus flow. While traditional Tendermint proceeds through distinct rounds of propose, prevote, precommit, and commit somewhat sequentially for each block height, Sei's approach heavily pipelines these operations and integrates them closely with parallel transaction execution.

This optimized flow involves several key enhancements:

1. **Aggressive Timeout Configuration:** Sei utilizes heavily tuned Tendermint consensus parameters. Configuration settings (e.g., `UnsafeProposeTimeoutOverride`, `UnsafeCommitTimeoutOverride`) enforce much shorter durations for block proposal, voting, and commit rounds compared to standard Tendermint configurations, directly contributing to the sub-second target block time. Faster gossip propagation for consensus messages further reduces communication latency between validators.
1. **Aggressive Timeout Configuration:** Sei utilizes heavily tuned Tendermint consensus parameters. Configuration settings (e.g., `UnsafeProposeTimeoutOverride`, `UnsafeCommitTimeoutOverride`) can enforce much shorter durations for block proposal, voting, and commit rounds compared to standard Tendermint configurations, directly contributing to the sub-second target block time. These `Unsafe*TimeoutOverride` fields are gated by the `unsafe-overrides-enabled` flag under the `[consensus]` section of the node config. This flag defaults to `false`, meaning the overrides are ignored and the on-chain timeout consensus parameters are used instead. The overrides are only applied when `unsafe-overrides-enabled` is set to `true` (or, during the transition period, while the on-chain timeout params still match the legacy values). In practice, timeout tuning should be governed by the on-chain consensus parameters rather than these unsafe per-node overrides. Faster gossip propagation for consensus messages further reduces communication latency between validators.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] The correction itself is right and worth making — enforcecan enforce plus the unsafe-overrides-enabled gating is a real accuracy fix. Two follow-ups:

  1. This is now a ~7-sentence run-on inside a numbered list item, mixing the architectural point (aggressive timeouts) with node-config guidance and a gossip sentence stranded at the end. Consider keeping the list item to the architecture and moving the gating detail into a short note or a link to the node config reference.
  2. "or, during the transition period, while the on-chain timeout params still match the legacy values" is undated and unexplained — a reader has no way to know whether that transition period is current, or what "the legacy values" are. Either name the release window and the values, or drop the parenthetical and keep the false-by-default statement, which is the part operators need.

2. **Intelligent Mempool Management & Transaction Preparation:** Even before a block proposal is formally initiated for height `H`, validators can begin processing transactions intended for that block. This involves collecting transactions from the network, decoding them concurrently (`DecodeTransactionsConcurrently`), analyzing potential state dependencies (`GenerateEstimatedWritesets`), and potentially pre-fetching required state data from SeiDB. This "pre-consensus" preparation minimizes the work needed once the actual proposal for height `H` arrives.
3. **Optimized BFT Rounds with Parallel Execution Integration:** The critical optimization is the deep integration with Sei's parallelization engine. When a validator receives a block proposal for height `H`, it doesn't necessarily wait for the prevote/precommit rounds to complete before starting execution. Instead:
- The block's transactions are dispatched to the parallel execution engine (`ProcessTXsWithOCC`, `DeliverTxBatch`).
Expand Down Expand Up @@ -51,7 +51,7 @@

These performance gains are delivered while preserving core EVM compatibility, including standard gas models and support for Solidity/Vyper and common Ethereum development tools.

### Leveraging Fast Finality in Solidity

Check warning on line 54 in learn/twin-turbo-consensus.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

learn/twin-turbo-consensus.mdx#L54

Use sentence case for headings: 'Leveraging Fast Finality in Solidity'.

The rapid block times enable and encourage specific development patterns:

Expand Down Expand Up @@ -121,7 +121,7 @@
}
```

### Compatibility and Future Directions

Check warning on line 124 in learn/twin-turbo-consensus.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

learn/twin-turbo-consensus.mdx#L124

Use sentence case for headings: 'Compatibility and Future Directions'.

Sei's consensus optimizations are implemented while maintaining full compatibility with the EVM standard. Existing smart contracts, dApps, and developer tools function smoothly.

Expand Down
8 changes: 8 additions & 0 deletions node/rocksdb-backend.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,15 @@

In Sei’s benchmarks, RocksDB achieved up to **10–30× faster traceBlock iteration times** compared to PebbleDB, with even greater benefits observed on archive nodes.



### PebbleDB descending-version encoding

Check warning on line 31 in node/rocksdb-backend.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/rocksdb-backend.mdx#L31

Use sentence case for headings: 'PebbleDB descending-version encoding'.

Check warning on line 31 in node/rocksdb-backend.mdx

View workflow job for this annotation

GitHub Actions / vale

[vale] node/rocksdb-backend.mdx#L31

[Sei.Headings] Use sentence case for headings: 'PebbleDB descending-version encoding'.
Raw output
{"message": "[Sei.Headings] Use sentence case for headings: 'PebbleDB descending-version encoding'.", "location": {"path": "node/rocksdb-backend.mdx", "range": {"start": {"line": 31, "column": 5}}}, "severity": "WARNING"}

Recent PebbleDB builds partly narrow this gap for latest-version reads. Because PebbleDB has no native MVCC, Sei encodes the version into each key. Freshly created PebbleDB state stores now use a **descending-version MVCC encoding**, which sorts newer versions before older ones for the same logical key. This lets latest-version reads land directly on the newest visible version instead of scanning through older versions, improving read performance on the fast path. Fresh stores are marked on disk with a sentinel key (`s/_mvcc_descending`) so the mode is detected automatically on open.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[suggestion] "Recent PebbleDB builds" is ambiguous in a way that matters operationally: an operator cannot tell whether their existing store is on the descending or ascending path without knowing which sei-db/sei-chain release drew the line. Since the paragraph goes on to tell them recreating the store is the only way onto the fast path, that version boundary is the single most important fact here — name the release.

Minor: s/_mvcc_descending is an internal on-disk sentinel. Mentioning it is fine as evidence, but consider framing it as "detected automatically on open" without asking operators to reason about the key itself, since it is not a supported interface they should inspect or set.


Legacy PebbleDB stores written by earlier builds use the older **ascending-version encoding**. These are detected automatically on open and read using the legacy ascending path—no error is raised—but they stay unmarked and cannot benefit from the descending fast path unless the store is recreated or migrated. This mirrors the migration constraint on RocksDB: archive nodes that cannot recreate their state store will continue running on the slower legacy path. Note that even with descending encoding, PebbleDB still lacks native MVCC and column-family support, so RocksDB remains the recommended backend for iteration-heavy archive and long-history RPC workloads.

## Example: TraceBlock Latency Comparison

Check warning on line 37 in node/rocksdb-backend.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/rocksdb-backend.mdx#L37

Use sentence case for headings: 'Example: TraceBlock Latency Comparison'.

The following chart compares iteration (trace time) performance between **PebbleDB** and **RocksDB** over a 3 million block history:

Expand Down Expand Up @@ -81,7 +89,7 @@
ss-backend = "rocksdb"
```

### Node Setup Notes

Check warning on line 92 in node/rocksdb-backend.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/rocksdb-backend.mdx#L92

Use sentence case for headings: 'Node Setup Notes'.

- RPC Nodes — must perform a state sync when spinning up a new node configured with RocksDB.
- Archive Nodes — currently, RocksDB is not supported for existing data unless syncing from genesis. A migration route from PebbleDB to RocksDB is being developed and will be shared soon.
Expand All @@ -95,7 +103,7 @@
| Iteration Speed (Large State) | Slows with history | ✅ Up to 30× faster |
| Installation | Default | One-time build (`make build-rocksdb`) |

## TL;DR

Check warning on line 106 in node/rocksdb-backend.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/rocksdb-backend.mdx#L106

Use sentence case for headings: 'TL;DR'.

- RocksDB backend drastically improves trace iteration and historical query performance.
- Install once, then run:
Expand Down
2 changes: 1 addition & 1 deletion node/seictl.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

## Installation

### Pre-built Binaries (Recommended)

Check warning on line 23 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L23

Use sentence case for headings: 'Pre-built Binaries (Recommended)'.

Pre-built binaries are available for Linux, macOS, and Windows. Download the latest release from
the [releases page](https://github.com/sei-protocol/seictl/releases).
Expand Down Expand Up @@ -87,7 +87,7 @@
seictl --version
```

#### Verify Download (Optional)

Check warning on line 90 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L90

Use sentence case for headings: 'Verify Download (Optional)'.

All releases include a `checksums.txt` file for verification, e.g.:

Expand All @@ -99,7 +99,7 @@
sha256sum -c checksums.txt 2>&1 | grep seictl_Linux_x86_64.tar.gz
```

### Build from Source

Check warning on line 102 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L102

Use sentence case for headings: 'Build from Source'.

If you prefer to build from source or need a specific configuration:

Expand All @@ -115,7 +115,7 @@
go build -o seictl
```

### Install via Go

Check warning on line 118 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L118

Use sentence case for headings: 'Install via Go'.

```bash
go install github.com/sei-protocol/seictl@latest
Expand All @@ -127,13 +127,13 @@
seictl [global options] command [command options] [arguments...]
```

### Global Options

Check warning on line 130 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L130

Use sentence case for headings: 'Global Options'.

- `--home <path>`: Sei home directory (default: `~/.sei`, can be set via `SEI_HOME` environment variable)

## Commands

### Patch Command

Check warning on line 136 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L136

Use sentence case for headings: 'Patch Command'.

#### `patch`

Expand Down Expand Up @@ -168,7 +168,7 @@

**Note:** The file extension (`.toml` or `.json`) is used to determine the format automatically.

### Genesis Commands

Check warning on line 171 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L171

Use sentence case for headings: 'Genesis Commands'.

#### `genesis patch`

Expand Down Expand Up @@ -199,7 +199,7 @@
seictl genesis patch patch.json -i
```

### Config Commands

Check warning on line 202 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L202

Use sentence case for headings: 'Config Commands'.

#### `config patch`

Expand Down Expand Up @@ -235,7 +235,7 @@
seictl config patch patch.toml -o /path/to/output.toml
```

## Configuration Targets

Check warning on line 238 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L238

Use sentence case for headings: 'Configuration Targets'.

The `config` command can work with three different configuration files:

Expand Down Expand Up @@ -264,14 +264,14 @@

Node-level configuration including:

- Proxy app and database settings
- Database settings

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] Dropping "Proxy app and" removes information without explanation, and the PR description does not mention this file's change beyond listing seictl as "descriptive or cosmetic". proxy-app is still a real config.toml field in sei-tendermint, and this bullet list describes what node-level config seictl covers.

If the removal is because seictl no longer manages that field, that is a behavior change worth stating rather than eliding. If it is because proxy_app was removed from the config in v6.6.0, that is a bigger note than a bullet trim. Either way, please say which — as written the diff is indistinguishable from an accidental deletion.

- Logging configuration
- RPC and P2P settings
- Mempool and consensus parameters
- State sync and block sync
- Transaction indexing

## Merge Patch Behavior

Check warning on line 274 in node/seictl.mdx

View check run for this annotation

Mintlify / Mintlify Validation (seilabs) - vale-spellcheck

node/seictl.mdx#L274

Use sentence case for headings: 'Merge Patch Behavior'.

The merge patch algorithm works as follows:

Expand Down
Loading