diff --git a/ai/agentic-wallets.mdx b/ai/agentic-wallets.mdx
index 96afce8..81649be 100644
--- a/ai/agentic-wallets.mdx
+++ b/ai/agentic-wallets.mdx
@@ -3,21 +3,21 @@ title: 'Agentic Wallets'
description: 'Build AI agents with secure, programmable wallets on Sei using Coinbase AgentKit or Privy server wallets. Includes setup guides, policy engines, and a full feature comparison.'
keywords: ['agentic wallets', 'ai agents', 'coinbase agentkit', 'privy', 'server wallets', 'sei ai', 'agent wallet', 'cdp wallet', 'wallet policy engine']
---
-Agentic wallets give AI agents the ability to hold funds, sign transactions, and interact with smart contracts autonomously — without exposing private keys to the agent or the LLM. This page covers the two leading solutions that work on Sei today: **Coinbase AgentKit** and **Privy server wallets**.
+Agentic wallets let AI agents hold funds, sign transactions, and interact with smart contracts autonomously. They do this without exposing private keys to the agent or the LLM. This page covers the two leading solutions that work on Sei today: Coinbase AgentKit and Privy server wallets.
-Both platforms support Sei as an EVM-compatible chain. No special integration is required — you point the wallet provider at Sei's RPC and chain ID and everything works out of the box.
+Both platforms support Sei as an EVM-compatible chain. You do not need a special integration. Point the wallet provider at Sei's RPC and chain ID, and everything works with no other setup.
-## How It Works
+## How it works
An agentic wallet sits between your AI agent and the blockchain:
-1. **Agent decides** — The LLM reasons about what onchain action to take (e.g. "send 5 USDC to 0x...").
-2. **SDK prepares** — The wallet SDK constructs and validates the transaction.
-3. **Policy check** — The policy engine evaluates the transaction against spending limits, allowlists, and other guardrails.
-4. **TEE signs** — The private key, isolated in a Trusted Execution Environment, signs the transaction. The key is never exposed to the agent.
-5. **Broadcast** — The signed transaction is submitted to Sei's EVM RPC.
+1. **Agent decides**: The LLM reasons about what onchain action to take (for example, "send 5 USDC to 0x...").
+2. **SDK prepares**: The wallet SDK builds and validates the transaction.
+3. **Policy check**: The policy engine evaluates the transaction against spending limits, allowlists, and other guardrails.
+4. **TEE signs**: The private key is isolated in a Trusted Execution Environment (TEE) and signs the transaction there. The key is never exposed to the agent.
+5. **Broadcast**: The signed transaction is submitted to Sei's EVM RPC.
```
┌─────────┐ ┌───────────┐ ┌──────────────┐ ┌─────────┐ ┌──────────┐
@@ -26,41 +26,41 @@ An agentic wallet sits between your AI agent and the blockchain:
└─────────┘ └───────────┘ └──────────────┘ └─────────┘ └──────────┘
```
-## Quick Comparison
+## Quick comparison
-| Dimension | Coinbase AgentKit | Privy Server Wallets |
+| Dimension | Coinbase AgentKit | Privy server wallets |
| --- | --- | --- |
-| **Type** | Open-source SDK + wallet infra | Wallet-as-a-service API |
-| **Key isolation** | Self-custodial on Sei (bring-your-own key via Viem). CDP's TEE-managed signer does not support Sei. | TEE + Shamir secret sharing |
-| **Sei support** | Via `ViemWalletProvider` (TS) or `EthAccountWalletProvider` (Python) | Via CAIP-2 `eip155:1329` |
+| **Type** | Open-source SDK + wallet infrastructure | Wallet-as-a-service API |
+| **Key isolation** | Self-custodial on Sei (bring-your-own key with Viem). CDP's TEE-managed signer does not support Sei. | TEE + Shamir secret sharing |
+| **Sei support** | With `ViemWalletProvider` (TS) or `EthAccountWalletProvider` (Python) | With CAIP-2 `eip155:1329` |
| **Policy engine** | Spending limits, address/contract allowlists, network restrictions | All of the above + time-based controls, key quorums |
-| **Built-in actions** | 40+ action providers (wallet, ERC-20, ERC-721, Pyth on Sei; many others Base/Ethereum-only) | Wallet operations only (create, sign, send) |
+| **Built-in actions** | 40+ action providers. Wallet, ERC-20, ERC-721, and Pyth work on Sei. Many others are Base/Ethereum-only. | Wallet operations only (create, sign, send) |
| **AI frameworks** | LangChain, Vercel AI SDK, OpenAI Agents SDK, MCP | LangChain (`langchain-privy`) |
| **Server SDKs** | TypeScript, Python | TypeScript, Python, Java, Rust, Go + REST API |
-| **Open source** | Yes (MIT) | Partial (`langchain-privy` is OSS) |
-| **Pricing** | Free SDK; CDP wallets $0.005/op (5K free/mo) | Free 50K sigs/mo; paid tiers from $299/mo |
+| **Open source** | Yes (MIT) | Partial (`langchain-privy` is open source) |
+| **Pricing** | Free SDK. CDP wallets $0.005/op (5K free/mo). | Free 50K sigs/mo. Paid tiers from $299/mo. |
-**Use both together:** AgentKit ships with a built-in `PrivyWalletProvider`, so you can combine Privy's policy engine with AgentKit's 40+ action providers.
+You can also use both together. AgentKit includes a built-in `PrivyWalletProvider`, so you can combine Privy's policy engine with AgentKit's 40+ action providers.
---
## Coinbase AgentKit on Sei
-[AgentKit](https://github.com/coinbase/agentkit) is Coinbase's open-source toolkit for giving AI agents crypto wallets and onchain capabilities. It is framework-agnostic (LangChain, Vercel AI SDK, OpenAI Agents SDK, MCP) and wallet-agnostic (CDP wallets, Privy, Viem, and more).
+[AgentKit](https://github.com/coinbase/agentkit) is Coinbase's open-source toolkit that gives AI agents crypto wallets and onchain capabilities. It is framework-agnostic (LangChain, Vercel AI SDK, OpenAI Agents SDK, MCP) and wallet-agnostic (CDP wallets, Privy, Viem, and others).
### Architecture
AgentKit is organized around three concepts:
-- **Wallet Providers** — Abstraction over different wallet implementations. For Sei, use `ViemWalletProvider` (TypeScript) or `EthAccountWalletProvider` (Python).
-- **Action Providers** — Units of onchain functionality (ERC-20 transfers, ERC-721 ops, Pyth price feeds, etc.). Generic EVM providers work on Sei; providers with hard-coded chain allowlists (e.g. `x402ActionProvider`, `wethActionProvider`, CDP-managed ones) do not — see the support matrix below.
-- **Framework Extensions** — Adapters that turn AgentKit actions into tools for your AI framework of choice.
+- **Wallet providers**: An abstraction over different wallet implementations. For Sei, use `ViemWalletProvider` (TypeScript) or `EthAccountWalletProvider` (Python).
+- **Action providers**: Units of onchain functionality, such as ERC-20 transfers, ERC-721 operations, and Pyth price feeds. Generic EVM providers work on Sei, but providers with hard-coded chain allowlists do not. These include `x402ActionProvider`, `wethActionProvider`, and CDP-managed providers. See the support matrix below.
+- **Framework extensions**: Adapters that turn AgentKit actions into tools for your AI framework.
### Prerequisites
- Node.js v22+ (TypeScript) or Python 3.10+
-- A [CDP Secret API Key](https://portal.cdp.coinbase.com/) (for CDP wallet providers; not required for Viem)
+- A [CDP Secret API Key](https://portal.cdp.coinbase.com/) (for CDP wallet providers, not required for Viem)
- A funded wallet on Sei
### Setup
@@ -77,7 +77,7 @@ npm install @coinbase/agentkit @coinbase/agentkit-langchain viem
-Viem ships with `sei` (id `1329`) and `seiTestnet` (id `1328`) out of the box, so you can import them directly from `viem/chains`.
+Viem includes `sei` (chain ID `1329`) and `seiTestnet` (chain ID `1328`), so you can import them directly from `viem/chains`.
```typescript
import { AgentKit, ViemWalletProvider, walletActionProvider, erc20ActionProvider } from '@coinbase/agentkit';
@@ -192,50 +192,50 @@ result = agent.invoke({
-### Available Action Providers on Sei
+### Available action providers on Sei
-Not every AgentKit action provider works on Sei — some are chain-specific. Here's what you can use:
+Not every AgentKit action provider works on Sei, because some are chain-specific. This table shows which providers you can use:
-| Action Provider | Works on Sei | Notes |
+| Action provider | Works on Sei | Notes |
| --- | --- | --- |
| `walletActionProvider` | Yes | Balance, transfers, native SEI operations |
-| `erc20ActionProvider` | Yes | Any ERC-20 token (USDC, WSEI, etc.) |
+| `erc20ActionProvider` | Yes | Any ERC-20 token, such as USDC or WSEI |
| `erc721ActionProvider` | Yes | NFT minting, transfers |
-| `pythActionProvider` | Yes | Pyth price feeds via Hermes (off-chain, chain-agnostic) |
-| `wethActionProvider` | No | Hard-coded WETH addresses; no WSEI entry. Use `erc20ActionProvider` against Sei's WSEI contract instead. |
-| `x402ActionProvider` | No | Provider's `SUPPORTED_NETWORKS` allowlist is limited to `base-mainnet`, `base-sepolia`, `solana-mainnet`, and `solana-devnet`. The x402 protocol itself is chain-agnostic — write a custom action provider or call the facilitator directly if you need x402 on Sei. |
-| `cdpApiActionProvider` | No | Requires a Coinbase `networkId`; Sei isn't in AgentKit's chain map. |
-| `morphoActionProvider` | No | Morpho contracts not deployed on Sei |
-| `moonwellActionProvider` | No | Moonwell contracts not deployed on Sei |
+| `pythActionProvider` | Yes | Pyth price feeds through Hermes (off-chain, chain-agnostic) |
+| `wethActionProvider` | No | Hard-coded WETH addresses with no WSEI entry. Use `erc20ActionProvider` with Sei's WSEI contract instead. |
+| `x402ActionProvider` | No | The provider's `SUPPORTED_NETWORKS` allowlist is limited to `base-mainnet`, `base-sepolia`, `solana-mainnet`, and `solana-devnet`. The x402 protocol itself is chain-agnostic. If you need x402 on Sei, write a custom action provider or call the facilitator directly. |
+| `cdpApiActionProvider` | No | Requires a Coinbase `networkId`. Sei is not in AgentKit's chain map. |
+| `morphoActionProvider` | No | Morpho contracts are not deployed on Sei |
+| `moonwellActionProvider` | No | Moonwell contracts are not deployed on Sei |
-For Sei-native DeFi actions (swaps on Symphony/DragonSwap, staking via Silo, lending via Takara), use the [Cambrian Agent Kit](/ai/cambrian-agent-kit) alongside AgentKit, or write custom action providers.
+Sei-native DeFi actions include swaps on Symphony or DragonSwap, staking through Silo, and lending through Takara. For these actions, use the [Cambrian Agent Kit](/ai/cambrian-agent-kit) alongside AgentKit, or write custom action providers.
-### Known Quirks on Sei
+### Known quirks on Sei
-Verified by running AgentKit `0.10.4` against Sei Testnet (`chain 1328`). These quirks sit in AgentKit's network and action-provider layer and apply to **both** `ViemWalletProvider` and `PrivyWalletProvider`:
+These quirks were verified with AgentKit `0.10.4` against Sei Testnet (`chain 1328`). They are in AgentKit's network and action-provider layer, and they apply to both `ViemWalletProvider` and `PrivyWalletProvider`:
-- **Balances are labeled "ETH" in action output.** `walletActionProvider` hard-codes the native-currency symbol, so `get_wallet_details` returns strings like `Native Balance: 512993.50 ETH` and `native_transfer` responses say `Transferred 0.05 ETH to 0x...` even on Sei. Signing and arithmetic are unaffected — it's a display-only quirk. If the LLM will quote balances or transfer confirmations to users, add a post-processing step or a system-prompt instruction to rewrite `ETH` → `SEI` when `chain_id == 1329 || 1328`.
-- **`networkId` is `undefined`.** Coinbase's internal `CHAIN_ID_TO_NETWORK_ID` map only includes Ethereum, Polygon, Base, Arbitrum, and Optimism (mainnet + testnet). Sei's chain IDs aren't in it, so `walletProvider.getNetwork()` returns `{ protocolFamily: 'evm', chainId: '1328', networkId: undefined }`. This is harmless for signing/sending, but **any action provider that branches on `networkId`** will refuse to run on Sei. In practice, `AgentKit.from({...})` prints a warning like `The following action providers are not supported on the current network and will be unavailable: weth, x402` and silently drops them — if you expect an action and it's missing from `agentKit.getActions()`, check this warning first.
+- **Balances are labeled "ETH" in action output.** `walletActionProvider` hard-codes the native-currency symbol. Even on Sei, `get_wallet_details` returns strings like `Native Balance: 512993.50 ETH`, and `native_transfer` responses say `Transferred 0.05 ETH to 0x...`. The quirk affects only the display, not signing or arithmetic. If the LLM quotes balances or transfer confirmations to users, rewrite `ETH` to `SEI` when `chain_id == 1329 || 1328`. Use a post-processing step or a system-prompt instruction.
+- **`networkId` is `undefined`.** Coinbase's internal `CHAIN_ID_TO_NETWORK_ID` map includes only Ethereum, Polygon, Base, Arbitrum, and Optimism (mainnet and testnet). Sei's chain IDs are not in the map, so `walletProvider.getNetwork()` returns `{ protocolFamily: 'evm', chainId: '1328', networkId: undefined }`. This is harmless for signing and sending, but any action provider that branches on `networkId` refuses to run on Sei. In practice, `AgentKit.from({...})` prints a warning like `The following action providers are not supported on the current network and will be unavailable: weth, x402` and silently drops those providers. If you expect an action and it is missing from `agentKit.getActions()`, check this warning first.
-### CDP-Managed Wallets and Sei
+### CDP-managed wallets and Sei
-AgentKit's `CdpEvmWalletProvider` (CDP-managed server wallets with built-in policies) is currently scoped to `base`, `base-sepolia`, `ethereum`, `ethereum-sepolia`, `polygon`, `arbitrum`, and `optimism` — **Sei is not a supported network**.
+AgentKit's `CdpEvmWalletProvider` (CDP-managed server wallets with built-in policies) currently supports only `base`, `base-sepolia`, `ethereum`, `ethereum-sepolia`, `polygon`, `arbitrum`, and `optimism`. **Sei is not a supported network.**
-For managed cloud custody with a policy engine on Sei, use one of:
+For managed cloud custody with a policy engine on Sei, use one of these options:
-- **Privy server wallets** (below) — TEE-isolated keys with a policy engine that works on any EVM chain, including Sei.
-- **AgentKit + Privy combined** — use `PrivyWalletProvider` inside AgentKit to keep the 40+ action providers while delegating custody and policy enforcement to Privy. See [Using AgentKit with Privy (Combined)](#using-agentkit-with-privy-combined) below.
+- **Privy server wallets** (below): TEE-isolated keys with a policy engine that works on any EVM chain, including Sei.
+- **AgentKit and Privy combined**: Use `PrivyWalletProvider` inside AgentKit. You keep the 40+ action providers, and Privy handles custody and policy enforcement. See [Using AgentKit with Privy (combined)](#using-agentkit-with-privy-combined) below.
-If you only need self-custodial keys (no TEE, you hold the private key), use `ViemWalletProvider` as shown above and enforce limits in your own application logic.
+If you only need self-custodial keys, use `ViemWalletProvider` as shown above. In this setup, you hold the private key and there is no TEE. Enforce limits in your own application logic.
---
-## Privy Server Wallets on Sei
+## Privy server wallets on Sei
-[Privy](https://docs.privy.io/) provides wallet-as-a-service infrastructure for AI agents. Server wallets are programmatically managed wallets designed for backend use — no user interaction required. Keys are isolated in TEEs with Shamir secret sharing and never leave secure enclaves.
+[Privy](https://docs.privy.io/) offers wallet-as-a-service infrastructure for AI agents. Server wallets are programmatically managed wallets designed for backend use. They do not require user interaction. Keys are isolated in TEEs with Shamir secret sharing and never leave secure enclaves.
### Prerequisites
@@ -273,7 +273,7 @@ Response:
-Use `eip155:1329` (CAIP-2 format) to target Sei Mainnet:
+To target Sei Mainnet, use `eip155:1329` (CAIP-2 format):
```bash
curl --request POST https://api.privy.io/v1/wallets/wallet_abc123/rpc \
@@ -399,16 +399,16 @@ print(f"Transaction hash: {result.hash}")
-### Known Quirks on Sei (Privy)
+### Known quirks on Sei (Privy)
-Verified by running `@privy-io/server-auth` `1.32.5` against Sei Testnet (`eip155:1328`):
+These quirks were verified with `@privy-io/server-auth` `1.32.5` against Sei Testnet (`eip155:1328`):
-- **`value` must be a hex string, not a `BigInt`.** Privy's request signer uses RFC 8785 JSON canonicalization (`canonicalize`), which throws `TypeError: Do not know how to serialize a BigInt` if you pass a `BigInt` in any field of the `transaction` object. Convert viem's `parseEther(...)` output with `'0x' + parseEther('0.01').toString(16)` before sending.
-- **`authorizationKeyIds` on `createWallet` expects the public-key registration ID, not the dashboard key ID.** Passing the ID shown next to a key in the Privy dashboard can fail with `400 Invalid authorization key IDs`. If you only need an app-owned wallet (app credentials + `authorizationPrivateKey` for request signing), omit `authorizationKeyIds` — the wallet is still fully operable.
+- **`value` must be a hex string, not a `BigInt`.** Privy's request signer uses RFC 8785 JSON canonicalization (`canonicalize`). If you pass a `BigInt` in any field of the `transaction` object, the signer throws `TypeError: Do not know how to serialize a BigInt`. Before you send, convert viem's `parseEther(...)` output with `'0x' + parseEther('0.01').toString(16)`.
+- **`authorizationKeyIds` on `createWallet` expects the public-key registration ID, not the dashboard key ID.** If you pass the ID shown next to a key in the Privy dashboard, the call can fail with `400 Invalid authorization key IDs`. If you only need an app-owned wallet (app credentials and `authorizationPrivateKey` for request signing), omit `authorizationKeyIds`. The wallet is still fully operable.
### Privy with LangChain
-Privy publishes a LangChain integration (`langchain-privy`) that exposes wallet operations as a single LangChain tool. The tool reads `PRIVY_APP_ID` and `PRIVY_APP_SECRET` from the environment and is bound directly to the LLM:
+Privy publishes a LangChain integration (`langchain-privy`) that exposes wallet operations as a single LangChain tool. The tool reads `PRIVY_APP_ID` and `PRIVY_APP_SECRET` from the environment. You bind it directly to the LLM:
```python
import os
@@ -428,18 +428,20 @@ response = llm_with_tools.invoke("What is my wallet address?")
```
-As of `langchain-privy@0.1.0`, the library's `Chain` enum does not include Sei — the built-in tool only targets Ethereum, Base, Optimism, Arbitrum, Polygon, Zora, Avalanche, BSC, Celo, Linea, Solana, and Bitcoin. For Sei, either:
+For Sei, use one of these options instead of the built-in LangChain tool:
-- Call Privy's REST API / server-auth SDK directly with `caip2: eip155:1329` (shown above), or
-- Use AgentKit's `PrivyWalletProvider` with a LangChain adapter (`@coinbase/agentkit-langchain`) — see the [Combined](#using-agentkit-with-privy-combined) section below.
+- Call Privy's REST API or server-auth SDK directly with `caip2: eip155:1329`, as shown above.
+- Use AgentKit's `PrivyWalletProvider` with a LangChain adapter (`@coinbase/agentkit-langchain`). See [Using AgentKit with Privy (combined)](#using-agentkit-with-privy-combined) below.
+
+As of `langchain-privy@0.1.0`, the library's `Chain` enum does not include Sei. The built-in tool targets only Ethereum, Base, Optimism, Arbitrum, Polygon, Zora, Avalanche, BSC, Celo, Linea, Solana, and Bitcoin.
-### Privy Policy Engine
+### Privy policy engine
-Privy's policy engine evaluates policies server-side before signing. Each rule pairs an `ALLOW`/`DENY` action with an RPC `method` and a list of `conditions` on transaction fields. Attach one or more policies to a wallet via `updateWallet`.
+Privy's policy engine evaluates policies server-side before signing. Each rule pairs an `ALLOW` or `DENY` action with an RPC `method` and a list of `conditions` on transaction fields. To attach one or more policies to a wallet, use `updateWallet`.
-**Privy's engine is default-deny.** A request is allowed only when at least one `ALLOW` rule matches and no `DENY` rule matches. A policy built from `DENY`-only rules blocks every transaction — including ones you expect to pass. Always start from an explicit `ALLOW` rule that describes the happy path, then layer `DENY` rules on top.
+Always start from an explicit `ALLOW` rule that describes the happy path. Then add `DENY` rules on top. **Privy's engine is default-deny.** It allows a request only when at least one `ALLOW` rule matches and no `DENY` rule matches. A policy built only from `DENY` rules blocks every transaction, including transactions you expect to pass.
```typescript
@@ -488,21 +490,21 @@ await privy.walletApi.updateWallet({
```
-Conditions support the `eq`, `gt`, `gte`, `lt`, `lte`, and `in` operators against `ethereum_transaction` fields (`to`, `value`) or `ethereum_calldata` fields. Operand order is `tx_field rule_value` — e.g. `operator: 'lte'` with `value: '10000000000000000000'` means "transaction value ≤ 10 SEI". `method` must be `eth_sendTransaction` or `eth_signTransaction`. Chain restriction is not a policy condition — enforce `caip2: 'eip155:1329'` at the call site to keep an agent on Sei.
+Conditions support the `eq`, `gt`, `gte`, `lt`, `lte`, and `in` operators against `ethereum_transaction` fields (`to`, `value`) or `ethereum_calldata` fields. The operand order is `tx_field rule_value`. For example, `operator: 'lte'` with `value: '10000000000000000000'` means "transaction value ≤ 10 SEI". `method` must be `eth_sendTransaction` or `eth_signTransaction`. Chain restriction is not a policy condition. To keep an agent on Sei, enforce `caip2: 'eip155:1329'` at the call site.
-Privy also offers features beyond the policy engine:
+Privy also has features beyond the policy engine:
-- **Key quorums** — require multiple authorization keys to approve high-value transactions
-- **Webhook notifications** — get notified of all wallet activity (works chain-agnostically)
+- **Key quorums**: require multiple authorization keys to approve high-value transactions
+- **Webhook notifications**: get notifications for all wallet activity, on any chain
---
-## Using AgentKit with Privy (Combined)
+## Using AgentKit with Privy (combined)
-AgentKit includes a built-in `PrivyWalletProvider`, so you can use Privy's wallet infrastructure and policy engine as the backend while using AgentKit's 40+ action providers for onchain operations.
+AgentKit includes a built-in `PrivyWalletProvider`. With it, you can use Privy's wallet infrastructure and policy engine as the backend, and AgentKit's 40+ action providers for onchain operations.
-Because of the `authorizationKeyIds` quirk noted above, the simplest working pattern is to create the wallet once via the Privy SDK (or the dashboard) and then hand the resulting `walletId` to AgentKit:
+Because of the `authorizationKeyIds` quirk noted above, the simplest working pattern has two steps. First, create the wallet once with the Privy SDK (or the dashboard). Then pass the resulting `walletId` to AgentKit:
```typescript
import { AgentKit, PrivyWalletProvider, walletActionProvider, erc20ActionProvider } from '@coinbase/agentkit';
@@ -533,104 +535,104 @@ const agentKit = await AgentKit.from({
});
```
-This gives you the best of both worlds: Privy's fine-grained policies and key quorums with AgentKit's rich action library.
+This setup combines Privy's fine-grained policies and key quorums with AgentKit's action library.
-If you call `PrivyWalletProvider.configureWithWallet` **without** a `walletId`, AgentKit will attempt to create a new wallet for you and pass `authorizationKeyId` through to Privy — which hits the same `400 Invalid authorization key IDs` failure described in Privy's Known Quirks. Always pre-create the wallet and pass `walletId`.
+Always create the wallet first and pass `walletId`. If you call `PrivyWalletProvider.configureWithWallet` **without** a `walletId`, AgentKit tries to create a new wallet for you. It passes `authorizationKeyId` through to Privy, which causes the same `400 Invalid authorization key IDs` failure described in the Privy quirks above.
---
-## Feature Matrix
+## Feature matrix
-### Wallet Creation & Key Management
+### Wallet creation & key management
| Capability | Coinbase AgentKit | Privy |
| --- | --- | --- |
-| Programmatic wallet creation on Sei | Yes — self-custodial via `ViemWalletProvider` (you hold the key). CDP-managed server wallets do not currently support Sei. | Yes — Server wallets on any EVM |
-| TEE-secured key isolation on Sei | No — CDP's TEE signer is scoped to Base/Ethereum/Polygon/Arbitrum/Optimism. Use Privy (standalone or via `PrivyWalletProvider` in AgentKit). | Yes — TEE + key sharding |
-| Managed cloud custody on Sei | No via CDP. Yes via `PrivyWalletProvider`. | Yes — Server wallets with `eip155:1329` |
-| Multi-party key quorum | No | Yes — Authorization key quorums via dashboard |
+| Programmatic wallet creation on Sei | Yes, self-custodial with `ViemWalletProvider` (you hold the key). CDP-managed server wallets do not currently support Sei. | Yes, with server wallets on any EVM chain |
+| TEE-secured key isolation on Sei | No. CDP's TEE signer is scoped to Base/Ethereum/Polygon/Arbitrum/Optimism. Use Privy (standalone or through `PrivyWalletProvider` in AgentKit). | Yes, with TEE + key sharding |
+| Managed cloud custody on Sei | Not through CDP. Yes, through `PrivyWalletProvider`. | Yes, with server wallets and `eip155:1329` |
+| Multi-party key quorum | No | Yes, with authorization key quorums through the dashboard |
| Key export / portability | Yes | Yes |
-### Policy Engine & Guardrails
+### Policy engine & guardrails
| Capability | Coinbase AgentKit | Privy |
| --- | --- | --- |
-| Spending limits (per-tx) on Sei | Only via app-level checks with `ViemWalletProvider`. CDP's `ethValue` policy doesn't apply on Sei. | Yes — Policy engine, any chain |
-| Contract / address allowlisting on Sei | Only via app-level checks with `ViemWalletProvider`. CDP's `evmAddress` policy doesn't apply on Sei. | Yes — Contract allowlist rules |
-| Network restriction policies on Sei | N/A — CDP networkIds don't include Sei | Yes — Chain restrictions |
+| Spending limits (per-tx) on Sei | Only through app-level checks with `ViemWalletProvider`. CDP's `ethValue` policy does not apply on Sei. | Yes, with the policy engine on any chain |
+| Contract / address allowlisting on Sei | Only through app-level checks with `ViemWalletProvider`. CDP's `evmAddress` policy does not apply on Sei. | Yes, with contract allowlist rules |
+| Network restriction policies on Sei | N/A. CDP networkIds do not include Sei. | Yes, with chain restrictions |
| Time-based access controls | No | Yes |
-| Transaction simulation | No | No — Needs Sei-specific RPC |
+| Transaction simulation | No | No. Needs a Sei-specific RPC. |
-### Gas & Transaction Management
+### Gas & transaction management
| Capability | Coinbase AgentKit | Privy |
| --- | --- | --- |
-| Gasless / sponsored transactions on Sei | No — Gasless is Base-only | No — Requires Sei-native paymaster |
-| Smart wallet (ERC-4337) on Sei | No — Smart Accounts don't include Sei | No — Possible via ZeroDev or Biconomy integration |
-| Batch transactions on Sei | No — Requires Smart Accounts | Yes |
+| Gasless / sponsored transactions on Sei | No. Gasless is Base-only. | No. Requires a Sei-native paymaster. |
+| Smart wallet (ERC-4337) on Sei | No. Smart Accounts do not include Sei. | No, but possible through a ZeroDev or Biconomy integration |
+| Batch transactions on Sei | No. Requires Smart Accounts. | Yes |
| Basic send / transfer on Sei | Yes | Yes |
-| ERC-20 token operations on Sei | Yes — `erc20ActionProvider` | Yes — Standard EVM ops |
+| ERC-20 token operations on Sei | Yes, with `erc20ActionProvider` | Yes, with standard EVM operations |
-### Agentic DeFi Actions
+### Agentic DeFi actions
| Capability | Coinbase AgentKit | Privy |
| --- | --- | --- |
-| Token swaps on Sei DEXs | No — Built-in swap providers (Jupiter, 0x, Sushi, Enso) don't route Sei DEXs | No |
-| Yield / lending on Sei | No — Built-in lending providers (Morpho, Moonwell, Compound, Yelay) aren't deployed on Sei | No |
+| Token swaps on Sei DEXs | No. Built-in swap providers (Jupiter, 0x, Sushi, Enso) do not route Sei DEXs. | No |
+| Yield / lending on Sei | No. Built-in lending providers (Morpho, Moonwell, Compound, Yelay) are not deployed on Sei. | No |
| Liquidity provision on Sei | No | No |
-| Cross-chain bridge to/from Sei | No — Sei not a listed Across route | No |
-| Pyth oracle price feeds | Yes — `pythActionProvider` works on Sei | No |
+| Cross-chain bridge to/from Sei | No. Sei is not a listed Across route. | No |
+| Pyth oracle price feeds | Yes, `pythActionProvider` works on Sei | No |
-For Sei-native DeFi actions, use the [Cambrian Agent Kit](/ai/cambrian-agent-kit) which includes built-in integrations for Symphony, DragonSwap, Silo, Takara, and Citrex.
+For Sei-native DeFi actions, use the [Cambrian Agent Kit](/ai/cambrian-agent-kit). It includes built-in integrations for Symphony, DragonSwap, Silo, Takara, and Citrex.
-### x402 & Machine-to-Machine Payments
+### x402 & machine-to-machine payments
| Capability | Coinbase AgentKit | Privy |
| --- | --- | --- |
-| x402 protocol support on Sei | No via built-in `x402ActionProvider` (allowlist is Base + Solana only) — possible via a custom action provider | Yes — Works wherever agent holds stablecoins |
-| Agent-to-agent USDC transfers | Yes — ERC-20 transfers with Sei USDC | Yes — Server wallet transfers |
-| Stablecoin operations on Sei | Yes — `erc20ActionProvider` + Sei USDC | Yes — Standard ERC-20 ops |
+| x402 protocol support on Sei | Not with the built-in `x402ActionProvider` (its allowlist is Base + Solana only). Possible with a custom action provider. | Yes. Works wherever the agent holds stablecoins. |
+| Agent-to-agent USDC transfers | Yes, with ERC-20 transfers of Sei USDC | Yes, with server wallet transfers |
+| Stablecoin operations on Sei | Yes, with `erc20ActionProvider` + Sei USDC | Yes, with standard ERC-20 operations |
-### Developer Experience
+### Developer experience
| Capability | Coinbase AgentKit | Privy |
| --- | --- | --- |
-| MCP server integration | Yes — AgentKit MCP framework extension | No |
-| LangChain / Vercel AI SDK | Yes — Framework extensions for both | Yes — `langchain-privy` |
-| OpenAI Agents SDK | Yes — Native extension | No |
-| Webhook / event monitoring on Sei | No — Webhooks for supported networks only | Yes — Chain-agnostic webhooks |
+| MCP server integration | Yes, through the AgentKit MCP framework extension | No |
+| LangChain / Vercel AI SDK | Yes, with framework extensions for both | Yes, with `langchain-privy` |
+| OpenAI Agents SDK | Yes, with a native extension | No |
+| Webhook / event monitoring on Sei | No. Webhooks are for supported networks only. | Yes, with chain-agnostic webhooks |
| Multi-language SDKs | TypeScript, Python | TypeScript, Python, Java, Rust, Go + REST |
---
-## Other Agentic Wallet Solutions
+## Other agentic wallet solutions
-While Coinbase AgentKit and Privy are the most mature options for Sei, several other platforms support agentic wallet use cases:
+Coinbase AgentKit and Privy are the most mature options for Sei. Several other platforms also support agentic wallet use cases:
-| Platform | Approach | Sei Support | Best For |
+| Platform | Approach | Sei support | Best for |
| --- | --- | --- | --- |
-| [Turnkey](https://docs.turnkey.com/products/embedded-wallets/features/agentic-wallets) | TEE-based key isolation, sub-100ms signing, granular policies | Yes (any EVM) | Enterprise agents needing fine-grained policies |
+| [Turnkey](https://docs.turnkey.com/products/embedded-wallets/features/agentic-wallets) | TEE-based key isolation, sub-100ms signing, granular policies | Yes (any EVM) | Enterprise agents that need fine-grained policies |
| [Lit Protocol](https://developer.litprotocol.com/) | Decentralized key management (DKG), programmable key pairs as NFTs | Yes (any EVM) | Decentralized, user-owned agent delegation |
-| [Dynamic](https://www.dynamic.xyz/ecosystems/sei) | MPC or smart contract wallets, strong onboarding UX | Yes (explicit Sei support) | Apps serving both humans and agents |
+| [Dynamic](https://www.dynamic.xyz/ecosystems/sei) | MPC or smart contract wallets, strong onboarding UX | Yes (explicit Sei support) | dApps that serve both humans and agents |
| [thirdweb](https://thirdweb.com/) | Backend wallets + account abstraction, session keys | Yes (any EVM) | Broadest AI framework support (6+ frameworks) |
| [Openfort](https://www.openfort.io/solutions/ai-agents) | TEE server wallets, sub-125ms signing, 25+ EVM chains | Yes (any EVM) | Gaming and high-throughput agent workloads |
---
-## Sei Network Configuration Reference
+## Sei network configuration reference
-Use these values when configuring any agentic wallet provider for Sei:
+Use these values when you configure any agentic wallet provider for Sei:
| Parameter | Mainnet | Testnet |
| --- | --- | --- |
@@ -639,16 +641,16 @@ Use these values when configuring any agentic wallet provider for Sei:
| **CAIP-2** | `eip155:1329` | `eip155:1328` |
| **RPC URL** | `https://evm-rpc.sei-apis.com` | `https://evm-rpc-testnet.sei-apis.com` |
| **Currency** | SEI (18 decimals) | SEI (18 decimals) |
-| **Block Explorer** | [seiscan.io](https://seiscan.io) | [seiscan.io](https://testnet.seiscan.io) |
+| **Block explorer** | [seiscan.io](https://seiscan.io) | [testnet.seiscan.io](https://testnet.seiscan.io) |
| **Finality** | ~400ms | ~400ms |
-**Security Reminders:**
+**Security reminders:**
-- Never expose private keys or authorization secrets to the LLM/agent process.
-- Always use dedicated wallets for agent operations — never your main wallet.
-- Start with testnet (`eip155:1328`) before deploying to mainnet.
-- Set spending limits and contract allowlists via the policy engine before going live.
-- Monitor agent wallet activity via block explorers or webhook notifications.
+- Never expose private keys or authorization secrets to the LLM or agent process.
+- Always use dedicated wallets for agent operations. Never use your main wallet.
+- Start on Sei Testnet (`eip155:1328`) before you deploy to Sei Mainnet.
+- Before you go live, set spending limits and contract allowlists in the policy engine.
+- Monitor agent wallet activity with block explorers or webhook notifications.
diff --git a/ai/cambrian-agent-kit.mdx b/ai/cambrian-agent-kit.mdx
index 04e281d..3c7033f 100644
--- a/ai/cambrian-agent-kit.mdx
+++ b/ai/cambrian-agent-kit.mdx
@@ -6,54 +6,52 @@ keywords: ['cambrian agent kit', 'sei blockchain', 'ai agents', 'defi protocols'
---
## Overview
-Cambrian Agent Kit is a developer SDK for building powerful, autonomous AI agents and agentic chatbots on the SEI blockchain. It lets you interact with DeFi protocols (Takara, Silo, Citrex, Symphony), manage SEI tokens and NFTs, and seamlessly integrate AI workflows. In this tutorial, you'll learn how to set up the kit, run your first agent, and use it for real DeFi use cases—customized for your needs. To understand more and deep dive into how it works under the hood, please refer to the [Cambrian Agent Kit Documentation](https://deepwiki.com/CambrianAgents/sei-agent-kit/1-overview).
+Cambrian Agent Kit is a developer SDK to build autonomous AI agents and agentic chatbots on Sei. It lets you interact with DeFi protocols (Takara, Silo, Citrex, Symphony), manage SEI tokens and NFTs, and integrate AI workflows. This tutorial shows how to set up the kit, run your first agent, and adapt it to real DeFi use cases. For details about how the kit works internally, see the [Cambrian Agent Kit documentation](https://deepwiki.com/CambrianAgents/sei-agent-kit/1-overview).
-## Supported Features
+## Supported features
-The SEI Agent Kit supports a comprehensive set of features for blockchain agent development:
+For blockchain agent development, you can use the kit to:
-- Token Operations: Complete SEI ERC-20 and ERC-721 token management
-- DeFi Protocol Integration: Seamless interaction with SEI's DeFi ecosystem
-- Swap Functionality: Token swapping through Symphony aggregator
-- Liquidity Management: Add and remove liquidity with DragonSwap
-- Lending & Borrowing: Interact with Takara protocol for lending operations
-- Staking Operations: Stake and unstake SEI tokens with Silo
-- LangChain Integration: Build AI agents with LangChain and LangGraph
+- Manage ERC-20 and ERC-721 tokens on Sei
+- Interact with the Sei DeFi ecosystem
+- Swap tokens through the Symphony aggregator
+- Add and remove liquidity with DragonSwap
+- Lend and borrow with the Takara protocol
+- Stake and unstake SEI tokens with Silo
+- Build AI agents with LangChain and LangGraph
## What this guide teaches you:
-This tutorial guides you through:
-
-- **Setup**: Install and configure the Agent Kit, connect your wallet and API keys.
-- **Core Concepts**: Understand agents, supported protocols, and how these components fit together.
-- **End-to-End Examples**: You'll run practical code to:
- - Check your token/NFT balances.
- - Swap tokens using Symphony.
- - Stake/unstake SEI in Silo.
- - Lend/borrow with Takara.
- - Trade perps with Citrex.
-- **Customization**: Learn to adapt the kit for your own protocol or workflow.
+- Install and configure the kit, and connect your wallet and API keys.
+- Understand the core concepts: agents, supported protocols, and how these components fit together.
+- Run end-to-end code examples to:
+ - Check your token and NFT balances.
+ - Swap tokens with Symphony.
+ - Stake and unstake SEI in Silo.
+ - Lend and borrow with Takara.
+ - Trade perpetuals with Citrex.
+- Adapt the kit for your own protocol or workflow.
-**Some Use Cases:**
+**Example use cases:**
-- **Autonomous DeFi Agents**: Agents that can automatically manage token positions, provide liquidity, or engage in lending activities
-- **AI-Assisted Wallets**: Conversational interfaces for blockchain operations
-- **Financial Assistant Agents**: AI agents that can analyze market conditions and execute trades
-- **Portfolio Management Agents**: Automated management of crypto asset portfolios
+- **Autonomous DeFi agents**: Agents that can automatically manage token positions, provide liquidity, or take part in lending
+- **AI-assisted wallets**: Conversational interfaces for blockchain operations
+- **Financial assistant agents**: AI agents that can analyze market conditions and execute trades
+- **Portfolio management agents**: Agents that manage crypto asset portfolios automatically
-## Hands-on Tutorial
+## Hands-on tutorial
### 1. Prerequisites
-- Node.js & npm installed
-- SEI wallet private key
-- OpenAI API key (for AI integrations)
-- **Minimum SEI balance**: Ensure you have sufficient SEI for gas
+- Node.js and npm installed
+- A private key for your Sei wallet
+- An OpenAI API key (for AI integrations)
+- Enough SEI in your wallet to pay for gas
-### 2. Project Setup
+### 2. Project setup
```bash
git clone https://github.com/CambrianAgents/sei-agent-kit.git
@@ -71,19 +69,17 @@ RPC_URL=https://evm-rpc.sei-apis.com
```
-**Important Security Notes:**
-
-- **Never share your private key**: Your private key controls your funds
+Never share your private key. Your private key controls your funds.
-### 3. Running Your First Agent
+### 3. Running your first agent
```bash
npm run test
```
-The following is the output and interaction with the Cambrian Agent:
+This is the command output and a sample chat with the Cambrian Agent:
```bash
npm run test
@@ -159,17 +155,17 @@ You: bye
```
-**Understanding the Transaction:**
+**About the transaction:**
-- **SEI Address**: `0x0` represents native SEI token in the agent kit
-- **Transaction Hash**: Can be verified on [Seiscan](https://seiscan.io/)
-- **Gas Fees**: Automatically calculated and deducted from your balance
+- **SEI address**: `0x0` represents the native SEI token in the agent kit.
+- **Transaction hash**: You can verify it on [Seiscan](https://seiscan.io/).
+- **Transaction fees**: Fees are calculated automatically and deducted from your balance.
-### 4. Explore Core Features & Protocols
+### 4. Explore core features & protocols
-#### a) Check Token Balance with Error Handling
+#### a) Check token balance with error handling
```typescript
import { SeiAgentKit } from './src/agent';
@@ -199,7 +195,7 @@ async function checkBalanceWithErrorHandling() {
}
```
-#### b) Safe Token Swapping with Symphony
+#### b) Safe token swapping with Symphony
```typescript
async function safeSwap() {
@@ -242,15 +238,15 @@ async function safeSwap() {
```
-**Swap Safety Tips:**
+**Swap safety tips:**
-- **SEI Native Token**: Use "0x0" as the address for native SEI token while using the agent kit
-- **Slippage Protection**: Always set appropriate slippage tolerance
-- **Price Impact**: Monitor price impact before large swaps
+- In the agent kit, use `0x0` as the address for the native SEI token.
+- Always set an appropriate slippage tolerance.
+- Monitor the price impact before large swaps.
-#### c) Liquid Staking with Silo Protocol
+#### c) Liquid staking with Silo protocol
```typescript
async function stakingWithSilo() {
@@ -283,16 +279,16 @@ async function stakingWithSilo() {
```
-**Silo Staking Details:**
+**Silo staking details:**
-- **iSEI Token**: [Represents your staked SEI plus auto-compounded rewards](https://silostaking.gitbook.io/silo-staking/general-faq)
-- **No Unbonding Period**: [Immediate liquidity unlike traditional staking](https://medium.com/@nordicmoney22/unleashing-the-power-of-liquid-staking-on-sei-4a1d045232e1)
-- **5% Fee**: [Annual management fee of 5% on rewards](https://silostaking.gitbook.io/silo-staking/general-faq)
-- **MEV Benefits**: [Validators share MEV profits with stakers](https://www.silostaking.io/)
+- **iSEI token**: [Represents your staked SEI plus auto-compounded rewards](https://silostaking.gitbook.io/silo-staking/general-faq)
+- **No unbonding period**: [Immediate liquidity, unlike traditional staking](https://medium.com/@nordicmoney22/unleashing-the-power-of-liquid-staking-on-sei-4a1d045232e1)
+- **5% fee**: [Annual management fee of 5% on rewards](https://silostaking.gitbook.io/silo-staking/general-faq)
+- **MEV benefits**: [Validators share MEV profits with stakers](https://www.silostaking.io/)
-#### d) Lending/Borrowing with Takara Protocol
+#### d) Lending/borrowing with Takara protocol
```typescript
async function takaraLending() {
@@ -332,7 +328,7 @@ async function takaraLending() {
}
```
-#### e) Perpetual Trading with Citrex Markets
+#### e) Perpetual trading with Citrex Markets
```typescript
async function citrexTrading() {
@@ -368,14 +364,14 @@ async function citrexTrading() {
}
```
-See `/tools/` for more advanced protocol integrations!
+For more advanced protocol integrations, see `/tools/`.
-## Error Handling & Troubleshooting
+## Error handling & troubleshooting
-### Common Error Types
+### Common error types
-**Comprehensive Error Handling Examples:**
+**Error handling examples:**
```typescript
// Robust error handling for all operations
@@ -416,7 +412,7 @@ async function robustAgentOperation() {
-### Transaction Monitoring
+### Transaction monitoring
```typescript
async function monitorTransaction(txHash: string) {
@@ -450,18 +446,18 @@ async function monitorTransaction(txHash: string) {
}
```
-### Troubleshooting Guide
+### Troubleshooting guide
| Issue | Cause | Solution |
| --- | --- | --- |
| "Insufficient funds" | Low SEI balance | Add more SEI to your wallet |
-| "Transaction failed" | Gas estimation error | Reduce transaction amount |
-| "Network error" | RPC connection issue | Check RPC URL in .env |
-| "Slippage too high" | Price moved during swap | Increase slippage tolerance |
-| "Invalid private key" | Incorrect key format | Verify private key format |
+| "Transaction failed" | Gas estimation error | Reduce the transaction amount |
+| "Network error" | RPC connection issue | Check the RPC URL in `.env` |
+| "Slippage too high" | Price moved during swap | Increase the slippage tolerance |
+| "Invalid private key" | Incorrect key format | Check the private key format |
-**Debug Commands:**
+**Debug commands:**
```bash
# Check network connection
@@ -473,9 +469,9 @@ curl -X POST https://evm-rpc.sei-apis.com \
# Use Seiscan: https://seiscan.io/
```
-### 5. Advanced Features & Customization
+### 5. Advanced features & customization
-#### Multi-Protocol Strategy Example
+#### Multi-protocol strategy example
```typescript
async function deFiStrategy() {
@@ -507,7 +503,7 @@ async function deFiStrategy() {
}
```
-#### Monitoring & Alerts:
+#### Monitoring & alerts:
```typescript
// Set up monitoring for your agent
@@ -531,6 +527,6 @@ async function setupMonitoring() {
}
```
-#### Custom Protocol Integration
+#### Custom protocol integration
-To extend the Cambrian Agent Kit for your own protocol, please follow this repository which explains how to add plugins to the agent kit so that it can support your protocol: [Cambrian Agents Plugin Guide](https://github.com/CambrianAgents/cambrian-plugin)
+To extend the Cambrian Agent Kit for your own protocol, follow the [Cambrian Agents Plugin Guide](https://github.com/CambrianAgents/cambrian-plugin). This repository explains how to add plugins to the agent kit so that it can support your protocol.
diff --git a/ai/index.mdx b/ai/index.mdx
index a4f35e9..0e04c04 100644
--- a/ai/index.mdx
+++ b/ai/index.mdx
@@ -5,33 +5,33 @@ description: 'AI tools for building on Sei — from knowledge injection that mak
keywords: ['sei ai', 'ai development', 'sei-skill', 'mcp server', 'ai agents', 'blockchain ai']
---
-AI coding assistants are powerful — but they weren't trained on Sei's specifics. Without context, they'll give you generic Ethereum answers: wrong gas patterns, missing dual-address handling, outdated package names, and assumptions about finality that don't hold on a 400ms chain.
+AI coding assistants were not trained on the specifics of Sei. Without context, they give you generic Ethereum answers. These answers get gas patterns wrong, miss dual-address handling, and use outdated package names. They also make assumptions about finality that do not hold on a 400ms chain.
-Sei provides two complementary tools to fix this.
+Sei has two complementary tools to fix this.
## Two tools, two roles
- **Knowledge injection.** Teaches your AI assistant everything about Sei — architecture, precompiles, wallet patterns, gas behavior, and ecosystem — so every answer it gives is Sei-specific from the start.
+ **Knowledge injection.** Teaches your AI assistant everything about Sei: architecture, precompiles, wallet patterns, gas behavior, and the ecosystem. As a result, every answer it gives is Sei-specific from the start.
**Live blockchain access.** Gives your AI assistant tools to read and write on-chain: query balances, send transactions, interact with contracts, and monitor network state in real time.
-Use them together: sei-skill makes your assistant think in Sei, the MCP Server lets it act on Sei. To give your assistant just one area of Sei, such as contracts or bridges, install a focused skill from the [skills registry](/ai/skills).
+Use them together: sei-skill gives your assistant knowledge of Sei, and the MCP Server lets it act on Sei. For a single area of Sei, such as contracts or bridges, install a focused skill from the [skills registry](/ai/skills).
## Build AI agents on Sei
- SDK for building autonomous AI agents with DeFi integrations — staking, lending, swaps, liquidity — powered by LangChain.
+ LangChain-based SDK for building autonomous AI agents with DeFi integrations for staking, lending, swaps, and liquidity.
-
+
Wallet infrastructure designed for AI agents: programmable signing, session keys, and policy controls.
-
- HTTP-native micropayments so agents can pay per-inference for LLM APIs, data feeds, and other monetized services.
+
+ HTTP-native micropayments that let agents pay per inference for LLM APIs, data feeds, and other monetized services.
diff --git a/ai/mcp-server.mdx b/ai/mcp-server.mdx
index f86a6ab..9e3f7ad 100644
--- a/ai/mcp-server.mdx
+++ b/ai/mcp-server.mdx
@@ -3,32 +3,32 @@ title: 'MCP Server'
description: 'Enable AI assistants to interact with Sei networks through natural language using the Model Context Protocol'
keywords: ['mcp', 'ai', 'model context protocol', 'claude', 'cursor', 'windsurf', 'blockchain ai']
---
-The Sei Model Context Protocol (MCP) Server enables AI assistants to interact with Sei networks through natural language. Built on the [Model Context Protocol](https://modelcontextprotocol.io/) standard, it provides blockchain tools for AI coding assistants.
+The Sei Model Context Protocol (MCP) Server lets AI assistants interact with Sei networks through natural language. It is built on the [Model Context Protocol](https://modelcontextprotocol.io/) standard and gives AI coding assistants blockchain tools.
The Sei MCP Server is open source. Contribute at [github.com/sei-protocol/sei-js](https://github.com/sei-protocol/sei-js/tree/main/packages/mcp-server). `@sei-js/mcp-server@1` requires Node.js 20 or newer.
-The server starts in read-only mode. Wallet tools that sign or broadcast are hidden unless you set `WALLET_MODE=private-key` and `PRIVATE_KEY` on the default stdio transport.
+The server starts in read-only mode. It hides wallet tools that sign or broadcast unless you set `WALLET_MODE=private-key` and `PRIVATE_KEY` on the default stdio transport.
## What is MCP?
-The Model Context Protocol is an open standard that connects AI systems with external tools and data sources. It enables:
+The Model Context Protocol is an open standard that connects AI systems with external tools and data sources. With MCP, an AI system can:
-- Real-time data access from external services
-- Function execution and operations
-- Context preservation across interactions
-- Specialized capabilities beyond base training
+- Access real-time data from external services
+- Execute functions and operations
+- Keep context across interactions
+- Use specialized capabilities beyond its base training
-The Sei MCP Server leverages this protocol to bring blockchain functionality directly to your AI assistant.
+The Sei MCP Server uses this protocol to bring blockchain functionality directly to your AI assistant.
## Capabilities
| Category | Features |
| --- | --- |
-| Account Management | Wallet addresses • Balance queries • Contract verification |
-| Token Operations | SEI, ERC-20, ERC-721, and ERC-1155 reads. Transfers and approvals need wallet mode. |
-| Blockchain Data | Block information • Transaction details • Network status |
-| Smart Contracts | State queries. Function execution and contract deploys need wallet mode. |
-| Networks | Mainnet • Testnet |
+| Account management | Wallet addresses, balance queries, contract verification |
+| Token operations | SEI, ERC-20, ERC-721, and ERC-1155 reads. Transfers and approvals need wallet mode. |
+| Blockchain data | Block information, transaction details, network status |
+| Smart contracts | State queries. Function execution and contract deploys need wallet mode. |
+| Networks | Sei Mainnet, Sei Testnet |
## Setup guide
@@ -36,16 +36,16 @@ The Sei MCP Server leverages this protocol to bring blockchain functionality dir
-### Cursor Setup
+### Cursor setup
-Navigate to `Cursor → Settings → Cursor Settings → MCP`
+Go to `Cursor → Settings → Cursor Settings → MCP`.
-
-Click **"Add new Global MCP server"** and add this configuration to `mcp.json`:
+
+Click **Add new Global MCP server**. Then add this configuration to `mcp.json`:
```json
{
@@ -60,7 +60,7 @@ Click **"Add new Global MCP server"** and add this configuration to `mcp.json`:
-Restart Cursor to activate the MCP server. You'll see a notification when it's ready.
+Restart Cursor to activate the MCP server. Cursor shows a notification when the server is ready.
@@ -68,15 +68,15 @@ Restart Cursor to activate the MCP server. You'll see a notification when it's r
-### Windsurf Setup
+### Windsurf setup
-Navigate to `Windsurf → Settings → Windsurf Settings → Cascade`
+Go to `Windsurf → Settings → Windsurf Settings → Cascade`.
-
+
Add the Sei MCP Server to your configuration:
```json
@@ -92,7 +92,7 @@ Add the Sei MCP Server to your configuration:
-Save and restart Windsurf. The server loads automatically.
+Save the configuration and restart Windsurf. The server loads automatically.
@@ -100,7 +100,7 @@ Save and restart Windsurf. The server loads automatically.
-### Claude Desktop Setup
+### Claude Desktop setup
@@ -108,8 +108,8 @@ Save and restart Windsurf. The server loads automatically.
Download [Claude Desktop](https://claude.ai/download) from Anthropic.
-
-Open **Settings** → **Developer** → **Edit Config** and add:
+
+Open **Settings** → **Developer** → **Edit Config**, and add this configuration:
```json
{
@@ -124,7 +124,7 @@ Open **Settings** → **Developer** → **Edit Config** and add:
-Save and restart Claude Desktop to enable Sei tools.
+Save the configuration and restart Claude Desktop to enable the Sei tools.
@@ -132,7 +132,7 @@ Save and restart Claude Desktop to enable Sei tools.
-### Claude CLI Setup
+### Claude CLI setup
@@ -142,13 +142,13 @@ npm install -g @anthropic-ai/claude-code
```
-
+
```bash
claude mcp add sei-mcp-server npx @sei-js/mcp-server
```
-
+
```bash
claude
```
@@ -180,16 +180,16 @@ The server starts in read-only mode. To enable wallet tools over the default std
}
```
-Create a dedicated wallet for MCP operations. Never use your main wallet's private key. The `0x` prefix on `PRIVATE_KEY` is optional. Wallet mode is blocked on HTTP transports. Startup fails if private-key mode is misconfigured instead of silently disabling wallet tools.
+Create a dedicated wallet for MCP operations. Never use your main wallet's private key. The `0x` prefix on `PRIVATE_KEY` is optional. HTTP transports block wallet mode. If private-key mode is misconfigured, startup fails. The server does not silently disable wallet tools.
Export your private key from your wallet:
-- Look for **Export Private Key** or **Show Private Key** in wallet settings
-- Fund the wallet with small amounts for testing
+- Look for **Export Private Key** or **Show Private Key** in the wallet settings.
+- Fund the wallet with small amounts for testing.
## Features
-The Sei MCP Server enables your AI assistant to:
+With the Sei MCP Server, your AI assistant can:
- Query account balances, tokens, NFTs, blocks, and transactions (read-only)
- Search the official Sei docs, including `@sei-js` references (`search_docs`)
@@ -198,9 +198,9 @@ The Sei MCP Server enables your AI assistant to:
## Available tools
-Read-only tools stay registered when wallet mode is disabled. Signing and broadcasting tools are hidden until you enable wallet mode on stdio.
+Read-only tools stay registered when wallet mode is disabled. The server hides signing and broadcasting tools until you enable wallet mode on stdio.
-Network arguments accept `sei`, `sei-testnet`, `1329`, `1328`, `0x531`, or `0x530`. Unknown networks are rejected. Chain-info responses omit RPC URLs.
+Network arguments accept `sei`, `sei-testnet`, `1329`, `1328`, `0x531`, or `0x530`. The server rejects unknown networks. Chain-info responses omit RPC URLs.
`search_docs` queries [docs.sei.io](/). There is no `search_sei_js_docs` tool.
@@ -215,7 +215,7 @@ Network arguments accept `sei`, `sei-testnet`, `1329`, `1328`, `0x531`, or `0x53
| `is_contract` | Verify a contract address | "Is 0x789... a contract?" | No |
| `read_contract` | Call a read-only contract function | "Read DEX reserves" | No |
| `estimate_gas` | Estimate gas for a call | "How much gas does this transfer need?" | No |
-| `get_address_from_private_key` | Address for the configured key | "What's my wallet address?" | Required |
+| `get_address_from_private_key` | Address for the configured key | "What is my wallet address?" | Required |
| `transfer_sei` | Send SEI | "Send 1 SEI to 0x456..." | Required |
| `write_contract` | Call a state-changing contract function | "Call transfer on this contract" | Required |
| `deploy_contract` | Deploy bytecode | "Deploy this contract" | Required |
@@ -229,21 +229,24 @@ Network arguments accept `sei`, `sei-testnet`, `1329`, `1328`, `0x531`, or `0x53
| `transfer_token` | ERC-20 transfer (`tokenAddress`, `toAddress`, `amount`) | "Send 100 USDC to 0x123..." | Required |
| `approve_token_spending` | ERC-20 approval | "Approve a DEX for USDC" | Required |
-Reach for `get_token_balance` and `transfer_token`. The server also registers aliases for backward compatibility: `get_erc20_balance` and `get_token_balance_erc20` behave like `get_token_balance` but name the holder argument `address` instead of `ownerAddress`, and `transfer_erc20` is `transfer_token` under a different name with the same arguments.
+Use `get_token_balance` and `transfer_token`. The server also registers these aliases for backward compatibility:
+
+- `get_erc20_balance` and `get_token_balance_erc20` behave like `get_token_balance`, but they name the holder argument `address` instead of `ownerAddress`.
+- `transfer_erc20` is `transfer_token` under a different name, with the same arguments.
### NFT and ERC-1155
| Tool | Purpose | Example | Wallet mode |
| --- | --- | --- | --- |
| `get_nft_info` | ERC-721 metadata | "Show NFT #123 details" | No |
-| `check_nft_ownership` | ERC-721 owner check (`ownerAddress` in, boolean out). Failures error instead of returning `false`. | "Does 0x… own NFT #456?" | No |
+| `check_nft_ownership` | ERC-721 owner check (`ownerAddress` in, boolean out). Failures return an error instead of `false`. | "Does 0x… own NFT #456?" | No |
| `get_nft_balance` | ERC-721 collection balance | "How many NFTs do I own?" | No |
| `get_erc1155_balance` | ERC-1155 balance | "Check my ERC-1155 balance" | No |
| `get_erc1155_token_uri` | ERC-1155 token URI | "Get the URI for this ERC-1155" | No |
| `transfer_nft` | ERC-721 `safeTransferFrom` | "Send NFT #789 to 0xABC..." | Required |
| `transfer_erc1155` | ERC-1155 transfer | "Send this ERC-1155 to 0xABC..." | Required |
-NFT ownership lookup failures propagate as errors instead of reporting `false`. ERC-721 transfers use `safeTransferFrom`, so contract recipients must implement `onERC721Received`.
+Failed NFT ownership lookups propagate as errors instead of reporting `false`. ERC-721 transfers use `safeTransferFrom`, so contract recipients must implement `onERC721Received`.
### Blocks and transactions
@@ -272,7 +275,7 @@ These prompts are always available, including in read-only mode:
Summarize token metadata and balances
- Walk through calling a contract
+ Guide you through a contract call
Explain an EVM concept in context
@@ -300,7 +303,7 @@ These prompts require wallet mode on the stdio transport:
- "What's my SEI balance?"
+ "What is my SEI balance?"
Calls `get_balance` and returns the wallet balance and address.
@@ -343,7 +346,7 @@ evm://sei/nft/0xNFT_ADDRESS/123/isOwnedBy/0x742d...
## Configuration
-Client-launched servers (`npx` from Cursor, Claude Desktop, or similar) read variables from the MCP client's `env` object. A project-local `.env` is loaded only when the process starts in a directory that contains one, such as a local checkout.
+Client-launched servers (`npx` from Cursor, Claude Desktop, or a similar client) read variables from the MCP client's `env` object. The server loads a project-local `.env` file only when the process starts in a directory that contains one, such as a local checkout.
```bash
# Default: read-only mode
@@ -361,7 +364,7 @@ TESTNET_RPC_URL=https://your-testnet-rpc.example
| Variable | Default | Notes |
| --- | --- | --- |
| `WALLET_MODE` | `disabled` | `private-key` enables signing tools on stdio |
-| `PRIVATE_KEY` | unset | Required when `WALLET_MODE=private-key`. `0x` prefix optional |
+| `PRIVATE_KEY` | unset | Required when `WALLET_MODE=private-key`. The `0x` prefix is optional |
| `MAINNET_RPC_URL` | public mainnet RPC | Used only for upstream connections |
| `TESTNET_RPC_URL` | public testnet RPC | Used only for upstream connections |
| `SERVER_TRANSPORT` | `stdio` | `streamable-http` or `http-sse` for HTTP |
@@ -371,7 +374,7 @@ TESTNET_RPC_URL=https://your-testnet-rpc.example
| `SSE_MAX_SESSIONS` | `100` | Legacy SSE concurrent session cap |
| `STREAMABLE_HTTP_MAX_REQUESTS` | `100` | Streamable HTTP concurrent request cap |
-CLI flags such as `--http` are not supported. Set `SERVER_TRANSPORT` instead. Run `npx -y @sei-js/mcp-server --help` for the current reference.
+The server does not support CLI flags such as `--http`. Set `SERVER_TRANSPORT` instead. For the current reference, run `npx -y @sei-js/mcp-server --help`.
### HTTP server mode
@@ -384,7 +387,7 @@ SERVER_PORT=8080 \
npx -y @sei-js/mcp-server
```
-Connect to `http://127.0.0.1:8080/mcp`. Change the listener with `SERVER_HOST`, `SERVER_PORT`, and `SERVER_PATH`.
+Connect to `http://127.0.0.1:8080/mcp`. To change the listener, set `SERVER_HOST`, `SERVER_PORT`, and `SERVER_PATH`.
Legacy HTTP/SSE is available for older clients:
@@ -397,22 +400,26 @@ npx -y @sei-js/mcp-server
For `http-sse`, GET `{SERVER_PATH}` is the event stream. Clients POST messages to `{SERVER_PATH}/message?sessionId=`.
-HTTP transports reject wallet mode. They do not authenticate callers or validate `Origin`/`Host`. Bind to `127.0.0.1` for local use, and put any public exposure behind an authenticating reverse proxy.
+For local use, bind to `127.0.0.1`. Put any public exposure behind an authenticating reverse proxy. HTTP transports do not authenticate callers or validate `Origin` or `Host`. They also reject wallet mode.
## Security guidelines
-Use a dedicated wallet with only the funds you need for testing. Set `PRIVATE_KEY` through environment variables or the MCP client's `env` object. Never commit it. Review transaction history on that wallet regularly.
+Use a dedicated wallet with only the funds you need for testing. Set `PRIVATE_KEY` through environment variables or the MCP client's `env` object. Never commit it. Review the transaction history of that wallet regularly.
-Beyond a throwaway test wallet, treat the signing key as production infrastructure: cap the value any single transaction can move, hold funds in a multi-signature wallet and let the agent operate a low-balance hot wallet, restrict the agent to an allowlist of contract addresses, and rate-limit the tools that sign or broadcast.
+For anything beyond a throwaway test wallet, treat the signing key as production infrastructure:
+
+- Cap the value that any single transaction can move.
+- Hold funds in a multi-signature wallet, and let the agent operate a low-balance hot wallet.
+- Restrict the agent to an allowlist of contract addresses.
+- Rate-limit the tools that sign or broadcast.
## Troubleshooting
-**Connection issues**: Verify Node.js 20 or later is installed and restart your AI assistant.
+**Connection issues**: Verify that Node.js 20 or later is installed. Then restart your AI assistant.
-**Private key errors**: Set `WALLET_MODE=private-key`, provide a valid 32-byte secp256k1 key (`0x` prefix optional), and use the default stdio transport.
+**Private key errors**: Set `WALLET_MODE=private-key`. Make sure the key is a valid 32-byte secp256k1 key (the `0x` prefix is optional). Use the default stdio transport.
-**Cursor: The model returned an error. Try disabling the MCP servers, or switch models**: Disable "Auto" in the model
-menu and select a specific model e.g. `claude-4-sonnet`
+**Cursor: The model returned an error. Try disabling the MCP servers, or switch models**: Disable **Auto** in the model menu. Then select a specific model, for example `claude-4-sonnet`.
diff --git a/ai/sei-skill/index.mdx b/ai/sei-skill/index.mdx
index e4bcfd8..04e99eb 100644
--- a/ai/sei-skill/index.mdx
+++ b/ai/sei-skill/index.mdx
@@ -5,51 +5,51 @@ description: 'A knowledge base that makes AI coding assistants Sei-aware — cov
keywords: ['sei-skill', 'ai knowledge base', 'claude', 'cursor', 'copilot', 'windsurf', 'sei development']
---
-sei-skill is open source. Contribute at [github.com/sei-protocol/sei-skill](https://github.com/sei-protocol/sei-skill)
+sei-skill is open source. Contribute at [github.com/sei-protocol/sei-skill](https://github.com/sei-protocol/sei-skill).
-sei-skill is a structured knowledge base for AI coding assistants. Install it once and your assistant — Claude Code, Cursor, Copilot, Windsurf, or any other — will answer Sei questions with Sei-specific accuracy instead of generic Ethereum defaults.
+sei-skill is a structured knowledge base for AI coding assistants. Install it once, and your assistant gives accurate, Sei-specific answers to Sei questions instead of generic Ethereum defaults. It works with Claude Code, Cursor, Copilot, Windsurf, or any other assistant.
## Why this matters
-AI assistants are trained on broad Ethereum knowledge, not Sei's specifics. Without sei-skill, they'll confidently give you wrong answers:
+AI assistants are trained on broad Ethereum knowledge, not Sei's specifics. Without sei-skill, they confidently give you wrong answers like these:
| Without sei-skill | With sei-skill |
|---|---|
-| `maxFeePerGas` in transactions | Legacy `gasPrice` (Sei doesn't use EIP-1559 basefee) |
-| "Finality takes ~12 confirmations" | Instant finality — 1 confirmation is final |
-| SSTORE costs 20,000 gas | SSTORE costs 72,000 gas — the same on mainnet and testnet (governance-adjustable on-chain parameter; [reference](/evm/differences-with-ethereum#sstore-gas-cost)) |
-| `PREVRANDAO` for randomness | PREVRANDAO is not random on Sei — use Pyth VRF or Chainlink VRF |
+| `maxFeePerGas` in transactions | Legacy `gasPrice` (Sei does not use the EIP-1559 base fee) |
+| "Finality takes ~12 confirmations" | Instant finality: 1 confirmation is final |
+| SSTORE costs 20,000 gas | SSTORE costs 72,000 gas, the same on Sei Mainnet and Sei Testnet. It is an on-chain parameter that governance can adjust ([reference](/evm/differences-with-ethereum#sstore-gas-cost)). |
+| `PREVRANDAO` for randomness | PREVRANDAO is not random on Sei. Use Pyth VRF or Chainlink VRF. |
| Generic ERC-20 patterns | Sei precompiles, pointer contracts, dual-address UX |
| `@sei-js/evm` imports | `@sei-js/precompiles` (the current package name) |
## Three knowledge domains
-sei-skill covers three areas. You can install all three or just the ones you need.
+sei-skill covers three areas. You can install all three or only the ones that you need.
-**Contracts** — EVM smart contract development on Sei:
+**Contracts** covers EVM smart contract development on Sei:
- Foundry and Hardhat setup for Sei networks
- All Sei precompiles (Staking, Governance, Bank, Distribution, JSON, P256)
- Pointer contracts for cross-VM asset bridging
-- Gas optimization, OCC parallel execution awareness
-- Account abstraction (ERC-4337), contract upgradeability
+- Gas optimization and awareness of OCC parallel execution
+- Account abstraction (ERC-4337) and contract upgradeability
- Verification workflows on Seiscan
- Security patterns and common errors
-**Frontend** — dApp UI development:
-- Wagmi + Viem setup with Sei chain config
+**Frontend** covers dApp UI development:
+- wagmi and viem setup with the Sei chain config
- Wallet integration (Sei Global Wallet, MetaMask, Compass, Ledger, EIP-6963)
-- Dual-address UX (`sei1...` ↔ `0x...` from the same key)
+- Dual-address UX (`sei1...` and `0x...` addresses from the same key)
- Fast-finality patterns for 400ms blocks
- RainbowKit and ConnectKit integration
-**Ecosystem** — infrastructure and integrations:
+**Ecosystem** covers infrastructure and integrations:
- RPC endpoints (public, community, paid SaaS)
- Bridges (LayerZero V2, Circle CCTP v2 for native USDC)
- IBC is [disabled in both directions](/learn/sip-03-migration#ibc-is-disabled)
- Oracles (Chainlink, Pyth, API3, RedStone)
- Indexers (The Graph, Goldsky, Dune, Moralis)
- DeFi protocols (DragonSwap, Yei, Takara, Saphyre)
-- Validators, node operations, grants
+- Validators, node operations, and grants
## Quick install
@@ -59,15 +59,15 @@ cd sei-skill
./install.sh
```
-This installs to `~/.claude/skills/sei/` by default (Claude Code). For other AI assistants, see the [Installation Guide](/ai/sei-skill/install).
+By default, the script installs the skill for Claude Code in `~/.claude/skills/sei/`. For other AI assistants, see the [installation guide](/ai/sei-skill/install).
## Next steps
-
- Install for Claude Code, Cursor, Copilot, Windsurf, and more. Choose your variant.
+
+ Install sei-skill for Claude Code, Cursor, Copilot, Windsurf, and other assistants. Choose your variant.
-
- See what better answers look like — prompts across contracts, frontend, and ecosystem.
+
+ See what better answers look like. The prompts cover contracts, frontend, and ecosystem.
diff --git a/ai/sei-skill/install.mdx b/ai/sei-skill/install.mdx
index 3c913bf..087ce40 100644
--- a/ai/sei-skill/install.mdx
+++ b/ai/sei-skill/install.mdx
@@ -18,13 +18,13 @@ cd sei-skill
-The default install targets Claude Code, placing the skill in `~/.claude/skills/sei/`:
+The default install targets Claude Code and puts the skill in `~/.claude/skills/sei/`:
```bash
./install.sh
```
-The skill loads automatically in every Claude Code session. To verify it's active, ask: *"What is the SSTORE gas cost on Sei Testnet?"*
+The skill loads automatically in every Claude Code session. To check that the skill is active, ask: *"What is the SSTORE gas cost on Sei Testnet?"*
@@ -34,7 +34,7 @@ The skill loads automatically in every Claude Code session. To verify it's activ
./install.sh --agent codex
```
-Installs to `AGENTS.md` in your project root. Codex CLI reads this file automatically.
+This command installs the skill to `AGENTS.md` in your project root. Codex CLI reads this file automatically.
@@ -44,7 +44,7 @@ Installs to `AGENTS.md` in your project root. Codex CLI reads this file automati
./install.sh --agent cursor
```
-Installs to `.cursor/rules/sei.mdc` in your project. Cursor picks it up automatically as a rule file.
+This command installs the skill to `.cursor/rules/sei.mdc` in your project. Cursor loads it automatically as a rule file.
@@ -54,7 +54,7 @@ Installs to `.cursor/rules/sei.mdc` in your project. Cursor picks it up automati
./install.sh --agent copilot
```
-Installs to `.github/copilot-instructions.md`. Copilot uses this file as custom instructions for the repository.
+This command installs the skill to `.github/copilot-instructions.md`. Copilot uses this file as custom instructions for the repository.
@@ -64,7 +64,7 @@ Installs to `.github/copilot-instructions.md`. Copilot uses this file as custom
./install.sh --agent windsurf
```
-Installs to `.windsurf/rules/sei.md`. Windsurf's Cascade reads this automatically.
+This command installs the skill to `.windsurf/rules/sei.md`. Windsurf's Cascade reads this file automatically.
@@ -74,7 +74,7 @@ Installs to `.windsurf/rules/sei.md`. Windsurf's Cascade reads this automaticall
./install.sh --agent aider
```
-Installs to `~/.aider/sei.md`. Aider loads it as persistent context.
+This command installs the skill to `~/.aider/sei.md`. Aider loads it as persistent context.
@@ -84,7 +84,7 @@ Installs to `~/.aider/sei.md`. Aider loads it as persistent context.
./install.sh --agent openhands
```
-Installs to `.openhands/SKILL.md` in your project.
+This command installs the skill to `.openhands/SKILL.md` in your project.
@@ -94,7 +94,7 @@ Installs to `.openhands/SKILL.md` in your project.
./install.sh --agent gemini
```
-Installs to `GEMINI.md` in your project root.
+This command installs the skill to `GEMINI.md` in your project root.
@@ -102,16 +102,16 @@ Installs to `GEMINI.md` in your project root.
## Variants
-The full skill covers all three domains (contracts, frontend, ecosystem). If you only need one area, install a variant to keep context lean:
+The full skill covers all three domains (contracts, frontend, and ecosystem). If you need only one area, install a variant to keep the context small:
| Variant | Command | Best for |
|---|---|---|
| Full (default) | `./install.sh` | General Sei development |
| Contracts | `./install.sh --variant contracts` | Smart contract engineers |
| Frontend | `./install.sh --variant frontend` | dApp and UI developers |
-| Ecosystem | `./install.sh --variant ecosystem` | Infra, integrations, research |
+| Ecosystem | `./install.sh --variant ecosystem` | Infrastructure, integrations, research |
-Combine with `--agent` to target a specific assistant:
+To target a specific assistant, combine the variant with `--agent`:
```bash
./install.sh --agent cursor --variant contracts
@@ -125,7 +125,7 @@ Combine with `--agent` to target a specific assistant:
./install.sh --project
```
-**Flatten to a single markdown file** — useful for pasting into any chat interface or custom context:
+**Flatten to a single Markdown file** (useful to paste into any chat interface or custom context):
```bash
./install.sh --flatten --output ./sei-context.md
@@ -139,10 +139,10 @@ Combine with `--agent` to target a specific assistant:
## Verify it's working
-After installing, test with a Sei-specific question that trips up unaugmented assistants:
+After you install the skill, test it with a Sei-specific question that assistants without the skill get wrong:
- *"What gas price should I use for transactions on Sei?"*
- *"Is PREVRANDAO a safe source of randomness on Sei?"*
- *"What's the difference between `sei1...` and `0x...` addresses?"*
-A Sei-aware assistant will give accurate, specific answers to all three.
+A Sei-aware assistant gives accurate, specific answers to all three.
diff --git a/ai/sei-skill/prompts.mdx b/ai/sei-skill/prompts.mdx
index 5506e51..9db7b8a 100644
--- a/ai/sei-skill/prompts.mdx
+++ b/ai/sei-skill/prompts.mdx
@@ -5,7 +5,7 @@ description: 'Prompts that unlock Sei-specific guidance from your AI assistant a
keywords: ['sei-skill prompts', 'ai prompts', 'sei development', 'smart contracts', 'frontend', 'ecosystem']
---
-Once sei-skill is installed, your AI assistant has accurate, up-to-date context on everything Sei. These prompts show what that looks like in practice — questions that would get generic (wrong) Ethereum answers without the skill, and accurate Sei-specific answers with it.
+After you install sei-skill, your AI assistant has accurate, up-to-date context about Sei. These prompts show what that looks like in practice. Without the skill, these questions would get generic (wrong) Ethereum answers. With the skill, they get accurate, Sei-specific answers.
## Contracts
diff --git a/ai/skills.mdx b/ai/skills.mdx
index ff69e26..868d0de 100644
--- a/ai/skills.mdx
+++ b/ai/skills.mdx
@@ -7,7 +7,7 @@ keywords: ['sei skills', 'agent skills', 'skill.md', 'npx skills add', 'claude c
import { SkillsRegistry } from '/snippets/skills-registry.jsx';
-Sei Foundation publishes **agent skills**: focused, installable knowledge packs that make your AI coding assistant Sei-aware. This docs site hosts them in the open [`skill.md`](https://www.mintlify.com/docs/ai/skillmd) format, so any assistant that supports agent skills, such as Claude Code or Cursor, can install them.
+Sei Foundation publishes **agent skills**: focused, installable knowledge packs that make your AI coding assistant Sei-aware. This docs site hosts them in the open [`skill.md`](https://www.mintlify.com/docs/ai/skillmd) format. Any assistant that supports agent skills, such as Claude Code or Cursor, can install them.
## Install
@@ -25,20 +25,20 @@ npx skills add https://docs.sei.io --skill sei-nodes
## Foundation skills
-Filter by area to find what fits your project. Each card copies the command that installs only that skill, which keeps your assistant's context small.
+Filter by area to find what fits your project. Each card copies the command that installs only that skill. This keeps your assistant's context small.
## How the skills work
-Each Foundation skill is a single `SKILL.md` file. Its frontmatter tells an assistant **when** to use it, and the body is a short playbook of Sei-specific facts, code, and pitfalls.
+Each Foundation skill is a single `SKILL.md` file. Its frontmatter tells an assistant when to use it. The body is a short playbook of Sei-specific facts, code, and pitfalls.
Agents can list every skill at `docs.sei.io/.well-known/agent-skills/index.json` (or the older `/.well-known/skills/index.json`) and fetch any `SKILL.md` directly, with no install step. Agents connected to the docs MCP server also get them as MCP resources.
- Skill content comes from [`sei-protocol/sei-skill`](https://github.com/sei-protocol/sei-skill). A sync workflow regenerates the files in this repo and opens a pull request for review, and the site serves them once it merges. To fix or extend a skill, open a pull request in sei-skill.
+ Skill content comes from [`sei-protocol/sei-skill`](https://github.com/sei-protocol/sei-skill). A sync workflow regenerates the files in this repo and opens a pull request for review. After the pull request merges, the site serves the files. To fix or extend a skill, open a pull request in sei-skill.
@@ -49,12 +49,12 @@ Each Foundation skill covers one area. To load one knowledge base that covers ev
| Use a Foundation skill when | Use the full [sei-skill](/ai/sei-skill) when |
|---|---|
| You work mostly in one area, such as contracts | You want every area in one install |
-| You want to keep your assistant's context small | You're starting a Sei project from scratch |
-| You're composing your own set of skills | You want the full reference files from the sei-skill repository |
+| You want to keep your assistant's context small | You start a Sei project from scratch |
+| You compose your own set of skills | You want the full reference files from the sei-skill repository |
## Publish your own skill
-Ecosystem teams can publish skills for their own protocols. Any Mintlify site serves the skills in its `.mintlify/skills/` directory, and developers install them with `npx skills add` and your docs URL. Foundation skill content lives in [`sei-protocol/sei-skill`](https://github.com/sei-protocol/sei-skill).
+Ecosystem teams can publish skills for their own protocols. Any Mintlify site serves the skills in its `.mintlify/skills/` directory. Developers install them with `npx skills add` and your docs URL. Foundation skill content lives in [`sei-protocol/sei-skill`](https://github.com/sei-protocol/sei-skill).
## Next steps
diff --git a/ai/x402.mdx b/ai/x402.mdx
index fea8c1f..769ba03 100644
--- a/ai/x402.mdx
+++ b/ai/x402.mdx
@@ -4,22 +4,22 @@ sidebarTitle: 'x402 Protocol'
description: 'Implement HTTP micropayments on Sei using x402 v2 for API monetization and digital services.'
keywords: ['x402', 'x402 v2', 'micropayments', 'HTTP 402', 'API monetization', 'Sei', 'payments', 'USDC', 'web3 payments']
---
-x402 is an open protocol for HTTP-native payments. It lets clients pay for APIs, data, content, and other web resources through the standard `402 Payment Required` flow. A service can charge for a single request without requiring the buyer to create an account, manage a subscription, or negotiate a separate billing integration.
+x402 is an open protocol for HTTP-native payments. It lets clients pay for APIs, data, content, and other web resources through the standard `402 Payment Required` flow. A service can charge for a single request. The buyer does not have to create an account, manage a subscription, or negotiate a separate billing integration.
-When a client requests a paid resource, the server responds with the price and payment terms. The client signs a payment authorization and retries the same request. The server verifies and settles the payment before returning the resource.
+When a client requests a paid resource, the server responds with the price and payment terms. The client signs a payment authorization and retries the same request. The server verifies and settles the payment before it returns the resource.
## Why x402 on Sei?
-x402 payments sit in the request path. The client receives the protected response only after the payment has been authorized and settled. Sei's fast finality reduces this wait, while its low transaction costs make small per-request payments practical.
+x402 payments sit in the request path. The client receives the protected response only after the payment is authorized and settled. Sei's fast finality reduces this wait. Its low transaction costs make small per-request payments practical.
-Sei EVM also lets you use the upstream `@x402` packages and standard EVM wallet tooling. Native USDC is already included in the x402 default asset registry for Sei Mainnet and Sei Testnet, so dollar-denominated route pricing works without a custom token mapping.
+Sei EVM also lets you use the upstream `@x402` packages and standard EVM wallet tooling. The x402 default asset registry already includes native USDC for Sei Mainnet and Sei Testnet. As a result, dollar-denominated route pricing works without a custom token mapping.
When you configure x402 on Sei:
- Sei Mainnet uses the CAIP-2 network identifier `eip155:1329`.
- Sei Testnet uses the CAIP-2 network identifier `eip155:1328`.
-- `@x402/evm` provides the EVM payment scheme implementation.
+- `@x402/evm` implements the EVM payment scheme.
## How x402 works
@@ -27,7 +27,7 @@ When you configure x402 on Sei:
Three components take part in an x402 payment:
- The **client** requests a resource and signs a payment authorization. It can be a user-facing dApp, an autonomous agent, or another service.
-- The **resource server** defines the price, validates payment, and returns the protected resource.
+- The **resource server** defines the price, validates the payment, and returns the protected resource.
- A **facilitator** can verify the authorization, submit the payment onchain, and return the settlement result. You can use a facilitator service, run your own, or settle payments directly.
@@ -66,7 +66,7 @@ The header values contain Base64-encoded JSON. The x402 SDK encodes and decodes
x402 v2 supports different settlement models:
- [`exact`](https://docs.x402.org/schemes/exact) charges a fixed amount for each request.
-- [`upto`](https://docs.x402.org/schemes/upto) lets the client authorize a maximum amount while the seller settles the actual usage.
+- [`upto`](https://docs.x402.org/schemes/upto) lets the client authorize a maximum amount. The seller then settles the actual usage.
- [`batch-settlement`](https://docs.x402.org/schemes/batch-settlement) uses an escrow deposit and signed vouchers so high-volume services can settle multiple payments together.
For a fixed-price API or paywall, start with the `exact` scheme.
@@ -74,16 +74,16 @@ For a fixed-price API or paywall, start with the `exact` scheme.
## Use cases on Sei
- Charge per request for AI inference, image generation, data feeds, or other APIs.
-- Gate individual articles, media files, and downloads without requiring a subscription.
+- Gate individual articles, media files, and downloads without a subscription.
- Let agents and backend services pay for machine-to-machine resources.
- Bill for measured infrastructure, storage, or bandwidth usage.
## Use upstream x402 v2
-The `@sei-js/x402`, `@sei-js/x402-fetch`, `@sei-js/x402-axios`, `@sei-js/x402-express`, `@sei-js/x402-hono`, and `@sei-js/x402-next` packages are deprecated and no longer maintained.
+Do not use the `@sei-js/x402`, `@sei-js/x402-fetch`, `@sei-js/x402-axios`, `@sei-js/x402-express`, `@sei-js/x402-hono`, or `@sei-js/x402-next` packages for new integrations. These packages are deprecated and no longer maintained.
-Do not use them for new integrations. Migrate existing integrations to the upstream x402 v2 packages under the `@x402` npm scope.
+Migrate existing integrations to the upstream x402 v2 packages under the `@x402` npm scope.
x402 v2 separates the protocol core, network mechanisms, and HTTP framework adapters into modular packages.
@@ -99,7 +99,7 @@ x402 v2 separates the protocol core, network mechanisms, and HTTP framework adap
## Install x402 v2
-Install the EVM mechanism package together with the adapter for your client or server.
+Install the EVM mechanism package and the adapter for your client or server.
@@ -139,11 +139,11 @@ npm install @x402/core @x402/evm @x402/next
-Follow the upstream [seller quickstart](https://docs.x402.org/getting-started/quickstart-for-sellers) or [buyer quickstart](https://docs.x402.org/getting-started/quickstart-for-buyers) for the current API.
+For the current API, follow the upstream [seller quickstart](https://docs.x402.org/getting-started/quickstart-for-sellers) or [buyer quickstart](https://docs.x402.org/getting-started/quickstart-for-buyers).
## Configure Sei
-Use the CAIP-2 identifier for your target network when you configure a route:
+When you configure a route, use the CAIP-2 identifier for your target network:
| Network | CAIP-2 identifier | Default USDC |
| --- | --- | --- |
@@ -153,20 +153,20 @@ Use the CAIP-2 identifier for your target network when you configure a route:
Because x402 registers these assets as the defaults for Sei, a price such as `"$0.001"` resolves to the USDC address for the selected network. To accept another ERC-20 token, configure an explicit token amount and its EIP-712 metadata instead.
-x402 can express and sign payments for any EVM network, but your facilitator must also support the selected Sei network. Confirm network support with your facilitator before deployment, or run your own facilitator.
+Before you deploy, confirm that your facilitator supports the selected Sei network, or run your own facilitator. x402 can express and sign payments for any EVM network, but your facilitator must also support the selected Sei network.
-See the upstream [network and token support](https://docs.x402.org/core-concepts/network-and-token-support) reference for current asset and facilitator details.
+For current asset and facilitator details, see the upstream [network and token support](https://docs.x402.org/core-concepts/network-and-token-support) reference.
### What the facilitator does
-A facilitator handles the blockchain-specific work on behalf of your resource server. It checks that the signed payload satisfies the advertised payment requirements, submits the authorized transfer, waits for the settlement result, and returns that result to your server.
+A facilitator handles the blockchain-specific work for your resource server. It checks that the signed payload satisfies the advertised payment requirements and submits the authorized transfer. It then waits for the settlement result and returns that result to your server.
Native USDC on Sei supports EIP-3009. With the `exact` EVM scheme, the buyer signs a transfer authorization instead of submitting the transfer transaction itself. The facilitator submits the transaction and pays the required gas.
## Protect an Express route
-The following x402 v2 example charges `0.001` USDC for `GET /weather` on Sei Testnet. Set `X402_FACILITATOR_URL` to a facilitator that supports `eip155:1328`.
+This x402 v2 example charges `0.001` USDC for `GET /weather` on Sei Testnet. Set `X402_FACILITATOR_URL` to a facilitator that supports `eip155:1328`.
```typescript
import express from "express";
@@ -252,20 +252,20 @@ console.log(await response.json());
```
-Do not treat a successful transaction receipt by itself as proof that a request was paid. Verification must bind the signed payload to the required network, asset, amount, recipient, resource, and validity window. Use the x402 middleware and a compatible facilitator, or implement the complete verification and settlement rules when you self-facilitate.
+Do not treat a successful transaction receipt by itself as proof that a request was paid. Verification must bind the signed payload to the required network, asset, amount, recipient, resource, and validity window. Use the x402 middleware and a compatible facilitator. If you self-facilitate, implement the complete verification and settlement rules.
## Production checks
- Use HTTPS so intermediaries cannot read or replace payment headers.
- Keep buyer wallet keys in a secret manager or another server-side secret store. Do not ship a private key in browser code.
-- Confirm facilitator support for Sei Mainnet or Sei Testnet before you deploy.
+- Before you deploy, confirm that your facilitator supports Sei Mainnet or Sei Testnet.
- Test rejected signatures, expired authorizations, failed settlement, and insufficient balances.
- Fulfill the protected request only after x402 reports a valid payment.
## Migrate from v1
-The deprecated `@sei-js/x402*` packages implement the v1 protocol. Migrating requires more than changing package names.
+The deprecated `@sei-js/x402*` packages implement the v1 protocol. To migrate, you must change more than the package names.
| v1 | v2 |
| --- | --- |
@@ -283,7 +283,7 @@ Use the official [x402 v1-to-v2 migration guide](https://docs.x402.org/guides/mi
Read the upstream protocol and SDK documentation.
- Review source code, examples, and releases.
+ Review the source code, examples, and releases.
Protect an API or web resource with x402.
diff --git a/cosmos-sdk/index.mdx b/cosmos-sdk/index.mdx
index 3e8e017..ffac824 100644
--- a/cosmos-sdk/index.mdx
+++ b/cosmos-sdk/index.mdx
@@ -8,13 +8,13 @@ canonicalUrl: "https://docs.sei.io/evm"
-**Deprecation Notice**
+**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://seistream.app/proposals/99).
-In addition, [Proposal 115](https://seistream.app/proposals/115) disables CosmWasm code uploads (`MsgStoreCode`) and contract instantiations (`MsgInstantiateContract`) chain-wide. No new CosmWasm contracts can be deployed; only `execute` and `query` against pre-existing contracts remain available via the [CosmWasm precompile](/evm/precompiles/cosmwasm-precompiles/cosmwasm).
+In addition, [Proposal 115](https://seistream.app/proposals/115) disables CosmWasm code uploads (`MsgStoreCode`) and contract instantiations (`MsgInstantiateContract`) chain-wide. No new CosmWasm contracts can be deployed. Only `execute` and `query` against pre-existing contracts remain available through the [CosmWasm precompile](/evm/precompiles/cosmwasm-precompiles/cosmwasm).
-**IBC is now disabled in both directions.** [Proposal 116](https://seistream.app/proposals/116) and [Proposal 120](https://seistream.app/proposals/120) set the `ibc` module's `InboundEnabled` parameter to `false`, and [Proposal 121](https://seistream.app/proposals/121) set `OutboundEnabled` to `false` on July 31, 2026. No asset can be bridged into or out of Sei over IBC, and IBC assets already on Sei can no longer be redeemed on their origin chain. See the [SIP-03 Migration Guide](/learn/sip-03-migration) for the full explanation and the list of affected assets.
+**IBC is now disabled in both directions.** [Proposal 116](https://seistream.app/proposals/116) and [Proposal 120](https://seistream.app/proposals/120) set the `ibc` module's `InboundEnabled` parameter to `false`, and [Proposal 121](https://seistream.app/proposals/121) set `OutboundEnabled` to `false` on July 31, 2026. No asset can be bridged into or out of Sei over IBC. IBC assets already on Sei can no longer be redeemed on their origin chain. See the [SIP-03 Migration Guide](/learn/sip-03-migration) for the full explanation and the list of affected assets.
diff --git a/evm/analytics-setup.mdx b/evm/analytics-setup.mdx
index 3463246..0522fb9 100644
--- a/evm/analytics-setup.mdx
+++ b/evm/analytics-setup.mdx
@@ -6,49 +6,49 @@ keywords: ['analytics', 'sei']
## Overview
-Setting up analytics for your project helps track user activity, transaction counts, and project growth. This guide walks you through integrating with three key platforms that provide comprehensive insights into your project's performance.
+When you set up analytics for your project, you can track user activity, transaction counts, and project growth. This guide shows how to integrate with three platforms that give insights into the performance of your project.
-**What you'll set up:**
+**What you will set up:**
- Token Terminal
- Artemis
- Dune Analytics
-**Time required:** 20-25 minutes
+**Time required:** 20 to 25 minutes
-## Step 1: Sei Ecosystem Directory + Token Terminal
+## Step 1: Sei ecosystem directory + Token Terminal
The Monday form registers your project in the Sei ecosystem directory and automatically submits it to Token Terminal.
-**Complete the Monday Form** : [Monday Form](http://forms.monday.com/forms/b6816df94378117836cd0d4046d7213b?r=apse2)
+Complete the [Monday form](http://forms.monday.com/forms/b6816df94378117836cd0d4046d7213b?r=apse2).
**What happens next:**
- Your project appears in the Sei ecosystem directory
-- Token Terminal automatically receives your project info
-- Metrics begin tracking within 48-72 hours
+- Token Terminal automatically receives your project information
+- Metric tracking starts within 48 to 72 hours
## Step 2: Artemis Analytics
-Artemis provides detailed user activity and transaction analytics for your project.
+Artemis gives detailed analytics on user activity and transactions for your project.
-**Complete Artemis Application** : [Artemis Application Form](https://ry0v9n8oa4l.typeform.com/to/sXX203Nk?typeform-source=app.artemisanalytics.com)
+Complete the [Artemis application form](https://ry0v9n8oa4l.typeform.com/to/sXX203Nk?typeform-source=app.artemisanalytics.com).
-**Processing time:** 2-4 business days for approval
+**Processing time:** 2 to 4 business days for approval
-## Step 3: Dune Dashboard
+## Step 3: Dune dashboard
Create custom analytics dashboards with detailed blockchain data.
-**Follow the Sei Dune Guide** : [Dune Guide](/evm/dune)
+Follow the [Sei Dune guide](/evm/dune).
**Setup process:**
1. Create a free Dune account
-2. Use pre-built query templates in the above guide
-3. Customize queries for your contract addresses
+2. Use the pre-built query templates in the Dune guide
+3. Customize the queries for your contract addresses
4. Build charts and visualizations
-5. Set up automated data refresh
+5. Set up an automated data refresh
**Key metrics to track:**
@@ -57,8 +57,8 @@ Create custom analytics dashboards with detailed blockchain data.
- Token transfer volumes
- Contract interaction patterns
-**Setup time:** 10-15 minutes using templates
+**Setup time:** 10 to 15 minutes with the templates
---
-These analytics platforms will provide valuable insights as your project grows and help you make data-driven decisions about development and strategy.
+As your project grows, these platforms help you make data-driven decisions about development and strategy.
diff --git a/evm/best-practices/optimizing-for-parallelization.mdx b/evm/best-practices/optimizing-for-parallelization.mdx
index a4c02fd..cab4c82 100644
--- a/evm/best-practices/optimizing-for-parallelization.mdx
+++ b/evm/best-practices/optimizing-for-parallelization.mdx
@@ -4,38 +4,38 @@ sidebarTitle: 'Optimizing for Parallelization'
description: 'Design patterns to reduce state conflicts and maximize Sei EVM parallel execution while lowering gas usage.'
keywords: ['sei evm', 'parallelization', 'gas optimization', 'storage conflicts', 'throughput', 'precompiles']
---
-Sei EVM executes non-conflicting transactions in parallel. You can significantly increase throughput and reduce gas by designing contracts that minimize shared state access and avoid unnecessary storage writes.
+Sei EVM executes non-conflicting transactions in parallel. If you design contracts that minimize shared state access and avoid unnecessary storage writes, you can increase throughput significantly and reduce gas.
- This guide is based on Sei's recommendations for reducing gas usage and enhancing parallel execution. For the engine design, see [Parallelization Engine](/learn/parallelization-engine).
+ This guide is based on Sei's recommendations to reduce gas usage and improve parallel execution. For the engine design, see the [parallelization engine](/learn/parallelization-engine) page.
-## Principles for Parallel-Friendly Contracts
+## Principles for parallel-friendly contracts
-- **Minimize shared writes**: The scheduler can parallelize transactions that do not write to the same storage keys. Avoid hot globals (e.g., a single counter updated on every call).
-- **Partition state**: Shard storage by user, asset, or id so independent transactions touch disjoint keys.
-- **Prefer pull over push**: Let users claim funds instead of mass-paying recipients in loops.
-- **Avoid unbounded loops**: Especially loops that write to storage or iterate over dynamic arrays/mappings.
-- **Batch internal work; isolate external effects**: Do heavy computation in memory and commit a minimal set of storage writes.
-- **Use precompiles when available**: Precompiles are highly optimized and cheaper than replicating logic in Solidity.
+- **Minimize shared writes**: The scheduler can parallelize transactions that do not write to the same storage keys. Avoid hot globals (for example, a single counter that every call updates).
+- **Partition state**: Shard storage by user, asset, or ID so that independent transactions touch disjoint keys.
+- **Prefer pull over push**: Let users claim funds instead of paying many recipients in a loop.
+- **Avoid unbounded loops**: This applies especially to loops that write to storage or iterate over dynamic arrays or mappings.
+- **Batch internal work and isolate external effects**: Do heavy computation in memory and commit a minimal set of storage writes.
+- **Use precompiles when available**: Precompiles are highly optimized and cost less than the same logic written in Solidity.
**Parallelization checklist:**
-- Partition storage by user/asset/id; avoid hot globals
-- Minimize number of storage writes per call; batch in-memory, commit once
-- Avoid loops with storage writes; switch to pull-based flows
+- Partition storage by user, asset, or ID, and avoid hot globals
+- Minimize the number of storage writes per call: batch work in memory and commit once
+- Avoid loops with storage writes, and switch to pull-based flows
- Favor precompiles for supported features
- Apply standard gas optimizations (`external`, packing, `unchecked`, memory-first)
-## Storage Design Patterns
+## Storage design patterns
### Partition state by key
-Isolate per-user/per-asset data instead of centralizing writes.
+Isolate per-user and per-asset data instead of centralizing writes.
```solidity
// Good: disjoint keys by user and id enable parallelism
@@ -53,13 +53,13 @@ function updatePosition(uint256 id, int256 delta) external {
Anti-patterns:
- Writing a global `totalVolume += amount;` in every transaction
-- Maintaining a single on-chain queue or registry updated by most calls
+- Maintaining a single on-chain queue or registry that most calls update
-Prefer computing aggregates off-chain from events, or update them periodically via a dedicated maintenance transaction and place them in the calldata.
+Prefer to compute aggregates off-chain from events. Alternatively, update them periodically through a dedicated maintenance transaction and place them in the calldata.
### Prefer pull payments
-Avoid writing to many recipients in a single transaction. Emit events and let recipients `withdraw()` when needed.
+Avoid writing to many recipients in a single transaction. Emit events, and let recipients call `withdraw()` when they need to.
```solidity
// Better: users pull their own rewards, isolating writes to their key
@@ -79,30 +79,30 @@ function withdraw() external {
### Avoid large storage writes in loops
-If you must process many items, keep work in memory and commit a compact result, or split work across multiple transactions keyed by different ids.
+If you must process many items, keep the work in memory and commit a compact result. Alternatively, split the work across multiple transactions keyed by different IDs.
-## Gas-Efficient Solidity Practices
+## Gas-efficient Solidity practices
-- **Use `external` for externally called functions**; mark pure/read-only with `pure`/`view`.
-- **Pack variables** to share storage slots (e.g., multiple `uint8` in one slot).
+- **Use `external` for externally called functions**. Mark pure and read-only functions with `pure` and `view`.
+- **Pack variables** to share storage slots (for example, multiple `uint8` values in one slot).
- Prefer **`bytes32` over `string`** when applicable.
- **Cache array lengths** in loops and short-circuit cheap conditions first.
- Use **`unchecked`** for arithmetic when overflow is impossible.
-- Prefer **memory** over storage for temporary data; commit only final values.
+- Prefer **memory** over storage for temporary data, and commit only final values.
-These reduce gas and often reduce storage touches, which also improves parallelism.
+These practices reduce gas and often reduce storage access, which also improves parallelism.
-## Leverage Sei Precompiles
+## Leverage Sei precompiles
-Sei provides precompiled contracts for common functionality—cheaper and simpler than custom Solidity equivalents:
+Sei has precompiled contracts for common functionality. They are cheaper and simpler than custom Solidity equivalents:
- [JSON](/evm/precompiles/json) (`0x1003`)
- [P256](/evm/precompiles/p256-precompile) (`0x1011`)
See [precompile examples](/evm/precompiles/example-usage) for quick starts.
-## Testing and Analysis
+## Testing and analysis
-- Use Foundry/Hardhat gas reporters to track changes per function.
-- Benchmark under concurrent load to detect hot keys (addresses/ids) that serialize execution.
+- Use Foundry or Hardhat gas reporters to track changes per function.
+- Benchmark under concurrent load to detect hot keys (addresses or IDs) that serialize execution.
- Inspect execution with [JavaScript tracers](/evm/tracing/javascript-tracers) and runtime logs.
diff --git a/evm/best-practices/zeroing-stale-state.mdx b/evm/best-practices/zeroing-stale-state.mdx
index f3d4e37..f832530 100644
--- a/evm/best-practices/zeroing-stale-state.mdx
+++ b/evm/best-practices/zeroing-stale-state.mdx
@@ -3,19 +3,19 @@ title: 'Zeroing Out Stale State'
description: 'Strategies for clearing unused EVM storage on Sei to reduce state growth and improve node performance.'
keywords: ['sei evm', 'state management', 'gas refund', 'storage clearing', 'contract optimization', 'stale state']
---
-Zeroing out state means setting stored contract values back to their defaults (e.g., `0`, `false`, `address(0)`) by writing `non-zero → zero` into EVM storage slots.
+Zeroing out state means setting stored contract values back to their defaults, such as `0`, `false`, or `address(0)`. To do this, you write `non-zero → zero` into EVM storage slots.
-## Why Zero Out State
+## Why zero out state
-Non-zero storage contributes to global state size. Clearing stale state reduces state growth pressure and can improve node operations, sync, and restart behavior. This matters especially on high-throughput chains like Sei where state growth can be aggressive.
+Non-zero storage adds to the global state size. When you clear stale state, you reduce pressure from state growth and can improve node operations, sync, and restart behavior. This matters especially on high-throughput chains such as Sei, where state growth can be aggressive.
Clearing a non-zero storage slot to zero earns a **4,800 gas refund** per slot.
-## Clearing State Variables, Arrays, and Maps
+## Clearing state variables, arrays, and maps
-### Simple Fixed-Size State
+### Simple fixed-size state
-For value types and fixed-size arrays, use `delete` (or assign the default) to reset values to their defaults (`0`, `address(0)`, `false`).
+For value types and fixed-size arrays, use `delete` or assign the default value. This resets the values to their defaults (`0`, `address(0)`, `false`).
```solidity
uint256 public value;
@@ -31,13 +31,13 @@ function clearSimple() external {
}
```
-### Dynamic Arrays
+### Dynamic arrays
-Using `delete` on a dynamic array resets its length to 0 and clears all elements, but this can be too expensive for large arrays and risks hitting the block gas limit.
+If you use `delete` on a dynamic array, it resets the length to 0 and clears all elements. For large arrays, this can be too expensive and can hit the block gas limit.
-The safer approach is **batched clearing** by repeatedly calling `pop()` in chunks.
+The safer approach is **batched clearing**: call `pop()` repeatedly, in chunks.
-If a dynamic array might exceed **~500 elements**, use batched clearing to avoid running out of gas.
+If a dynamic array might exceed **approximately 500 elements**, use batched clearing so that you do not run out of gas.
```solidity
uint256[] public dynamicArr;
@@ -53,9 +53,9 @@ function batchClear(uint256 batchSize) external {
### Mappings
-You can't iterate a mapping, so you can't clear it unless you can enumerate keys. The main strategy is to **maintain an index of keys** (e.g., a `holders[]` array plus an `_isHolder` flag) whenever you write, then later delete mapping entries in batches by iterating that key list.
+You cannot iterate over a mapping, so you cannot clear it unless you can enumerate its keys. The main strategy is to **maintain an index of keys** whenever you write. For example, use a `holders[]` array plus an `_isHolder` flag. Later, iterate over that key list to delete mapping entries in batches.
-Maintaining an index costs roughly one extra `SSTORE` per write (Sei: ~72,000 gas; see [EVM Differences](/evm/differences-with-ethereum#sstore-gas-cost)), but makes future clearing possible.
+Maintaining an index costs roughly one extra `SSTORE` per write, but it makes future clearing possible. On Sei, that extra write costs approximately 72,000 gas. See [EVM differences](/evm/differences-with-ethereum#sstore-gas-cost).
```solidity
mapping(address => uint256) public balances;
@@ -80,37 +80,37 @@ function batchClearBalances(uint256 start, uint256 end) external {
}
```
-## Strategies for Existing Contracts
+## Strategies for existing contracts
-### External Cleaner Contract
+### External cleaner contract
-If you control permissions and the original contract has callable setters/entrypoints, deploy a separate "cleaner" contract that loops through user/key batches and calls the original contract to set values to zero.
+If you control permissions and the original contract has callable setters or entry points, deploy a separate "cleaner" contract. The cleaner loops through batches of users or keys and calls the original contract to set values to zero.
-This only clears state reachable through the **public/external interface**. Truly internal or private state with no setters can't be touched.
+This method clears only state that is reachable through the **public or external interface**. It cannot change internal or private state that has no setters.
See [Appendix A](#appendix-a---external-cleaner-contract) for example code.
-### Proxy / Upgradeable Contract
+### Proxy / upgradeable contract
-If you have a proxy or upgradeable contract, this is the best-case scenario. Upgrade the implementation to add reset functions while **preserving storage layout**, run batched resets, then optionally upgrade again to remove the reset logic.
+If you have a proxy or upgradeable contract, this is the best case. Upgrade the implementation to add reset functions, and **preserve the storage layout** when you do. Run the batched resets. Then you can upgrade again to remove the reset logic.
See [Appendix B](#appendix-b---proxyupgradeable-contract) for example code.
-### Reconstruct Keys from Event Logs
+### Reconstruct keys from event logs
-If contract writes emit events (which is common), scan historical logs to recover mapping keys (e.g., recipients from `Transfer` events), deduplicate them, and pass that list into a batch-clear call.
+Contract writes often emit events. If they do, scan the historical logs to recover mapping keys, such as recipients from `Transfer` events. Remove duplicates, and pass the list to a batch-clear call.
-### Use a Subgraph or Custom Indexer
+### Use a subgraph or custom indexer
-For complex or nested state, use [The Graph](https://thegraph.com/) or your own indexer to build a full set of non-zero keys/entities off-chain, then feed the resulting address/key list into on-chain batch clearing. This moves enumeration complexity off-chain while the on-chain work is just applying clears.
+For complex or nested state, use [The Graph](https://thegraph.com/) or your own indexer to build a full set of non-zero keys or entities off-chain. Then pass the resulting list of addresses or keys to the on-chain batch clearing. This moves the enumeration complexity off-chain, and the on-chain work only applies the clears.
-### Brute-Force via Direct Storage Reads
+### Brute-force via direct storage reads
-If you have a candidate universe of keys (e.g., all addresses that ever interacted), compute each mapping slot (`keccak256(key, slot)` — tools like `cast index` do this), read storage via RPC, and keep only the non-zero keys to clear.
+If you have a candidate set of keys, such as all addresses that ever interacted with the contract, compute each mapping slot (`keccak256(key, slot)`). Tools such as `cast index` do this for you. Read the storage through RPC, and keep only the non-zero keys to clear.
-This approach is tedious and RPC-heavy but works when events are missing or unreliable.
+This approach is tedious and RPC-heavy, but it works when events are missing or unreliable.
-## Appendix A - External Cleaner Contract
+## Appendix A - External cleaner contract
```solidity
// SPDX-License-Identifier: MIT
@@ -135,7 +135,7 @@ contract StateCleaner {
}
```
-## Appendix B - Proxy/Upgradeable Contract
+## Appendix B - Proxy/upgradeable contract
```solidity
// SPDX-License-Identifier: MIT
diff --git a/evm/bridging/layerzero.mdx b/evm/bridging/layerzero.mdx
index 9ae321e..1736f93 100644
--- a/evm/bridging/layerzero.mdx
+++ b/evm/bridging/layerzero.mdx
@@ -6,15 +6,15 @@ keywords: ['layerzero', 'cross-chain', 'omnichain', 'bridging', 'OFT', 'token br
---
## Overview
-This guide provides a comprehensive, step-by-step tutorial for integrating LayerZero V2 with the SEI blockchain. By the end of this guide, you will understand how to create, deploy, and manage omnichain tokens that can seamlessly move between SEI and any other LayerZero-supported blockchain.
+This step-by-step guide shows how to integrate LayerZero V2 with Sei. By the end of the guide, you will know how to create, deploy, and manage omnichain tokens. These tokens can move between Sei and any other LayerZero-supported blockchain.
-### What This Guide Covers
+### What this guide covers
-- **Understanding LayerZero**: Core concepts and architecture
-- **Project Setup**: Creating a LayerZero-enabled project from scratch
-- **Smart Contracts**: Building an Omnichain Fungible Token (OFT) with detailed explanations
-- **Deployment & Configuration**: Step-by-step deployment to SEI and other chains
-- **Cross-Chain Transfers**: Creating tasks and scripts for token transfers
+- Core concepts and architecture of LayerZero
+- Creating a LayerZero-enabled project from scratch
+- Building an Omnichain Fungible Token (OFT), with detailed explanations
+- Deploying and configuring the contracts on Sei and other chains, step by step
+- Creating tasks and scripts for cross-chain token transfers
### Prerequisites
@@ -25,27 +25,27 @@ This guide provides a comprehensive, step-by-step tutorial for integrating Layer
## What is LayerZero?
-LayerZero is an **omnichain interoperability protocol** that enables secure, permissionless communication between different blockchains. Think of it as a universal translator that allows blockchains to talk to each other.
+LayerZero is an omnichain interoperability protocol for secure, permissionless communication between different blockchains. Think of it as a universal translator that lets blockchains talk to each other.
-### Core Concepts
+### Core concepts
-- **Endpoints**: Immutable smart contracts deployed on each blockchain that serve as entry/exit points for messages
-- **Messages**: Data packets sent between blockchains containing instructions or information
-- **Security Stack**: Customizable verification system ensuring message authenticity
+- **Endpoints**: Immutable smart contracts on each blockchain that are the entry and exit points for messages
+- **Messages**: Data packets, sent between blockchains, that contain instructions or information
+- **Security Stack**: A customizable verification system that makes sure messages are authentic
- **Omnichain Applications**: Smart contracts that can operate across multiple blockchains
-### Key Applications
+### Key applications
-- **Omnichain Fungible Tokens (OFT)**: Tokens that exist across multiple chains with unified supply
+- **Omnichain Fungible Tokens (OFT)**: Tokens that exist on multiple chains with a unified supply
- **Omnichain NFTs (ONFT)**: NFTs that can move between blockchains
- **Cross-chain DeFi**: Protocols that operate across multiple networks
-- **Unified Governance**: DAOs that function across chains
-- **Message Passing**: Send arbitrary data between blockchains
+- **Unified governance**: DAOs that function across chains
+- **Message passing**: Send arbitrary data between blockchains
-## SEI Network Information
+## Sei network information
-**SEI Mainnet Configuration**
+**Sei Mainnet configuration**
- Network Name: SEI EVM
- Chain ID: 1329
@@ -56,11 +56,11 @@ LayerZero is an **omnichain interoperability protocol** that enables secure, per
-### Contract Deployments
+### Contract deployments
-The following are the official LayerZero V2 protocol contract addresses deployed on Sei networks.
+These are the addresses of the official LayerZero V2 protocol contracts on Sei networks.
-
+
| Contract | Address |
| --- | --- |
| EndpointV2 | [`0x1a44076050125825900e736c501f859c50fE728c`](https://seiscan.io/address/0x1a44076050125825900e736c501f859c50fE728c) |
@@ -77,7 +77,7 @@ The following are the official LayerZero V2 protocol contract addresses deployed
-
+
| DVN | Address |
| --- | --- |
| LayerZero Labs | [`0x6788f52439aca6bff597d3eec2dc9a44b8fee842`](https://seiscan.io/address/0x6788f52439aca6bff597d3eec2dc9a44b8fee842) |
@@ -95,7 +95,7 @@ The following are the official LayerZero V2 protocol contract addresses deployed
-
+
| Contract | Address |
| --- | --- |
| EndpointV2 | [`0x6C7Ab2202C98C4227C5c46f1417D81144DA716Ff`](https://testnet.seiscan.io/address/0x6C7Ab2202C98C4227C5c46f1417D81144DA716Ff) |
@@ -108,33 +108,33 @@ The following are the official LayerZero V2 protocol contract addresses deployed
-## Step 1: Project Setup
+## Step 1: Project setup
### Project scaffold
-LayerZero's CLI lets you spin up an OFT workspace in seconds:
+LayerZero's CLI lets you create an OFT workspace in seconds:
```bash
npx create-lz-oapp@latest # choose → "OFT example"
```
-The wizard creates a repo with Hardhat + Foundry, sample contracts, tests and LayerZero helper scripts.
+The wizard creates a repo with a Hardhat and Foundry setup, sample contracts, tests, and LayerZero helper scripts.
### Add private keys
-Rename `.env.example` file to `.env` and update it with needed configurations:
+Rename the `.env.example` file to `.env`. Then add the configuration values that you need:
```bash title=".env"
PRIVATE_KEY=your_private_key
```
-At a minimum, you need to have the `PRIVATE_KEY`. RPC URLs are optional, but strongly recommended. If you don't provide them, public RPCs will be used, but public RPCs can be unreliable or slow, leading to long waiting times for transactions to be confirmed or, at worst, cause your transactions to fail.
+At a minimum, you need the `PRIVATE_KEY`. RPC URLs are optional, but strongly recommended. If you do not set them, the project uses public RPCs. Public RPCs can be unreliable or slow. Your transactions can then take a long time to confirm or, at worst, fail.
-## Step 2: Configure Networks
+## Step 2: Configure networks
### Hardhat network config
-Update your `hardhat.config.ts` file to include the networks you want to deploy your contracts to:
+In `hardhat.config.ts`, add the networks that you want to deploy your contracts to:
```typescript title="hardhat.config.ts"
networks: {
@@ -156,7 +156,7 @@ networks: {
### LayerZero wiring config
-Modify your `layerzero.config.ts` file to include the chains and channel security settings you want for each connection:
+In `layerzero.config.ts`, add the chains and the channel security settings that you want for each connection:
```typescript title="layerzero.config.ts"
import { EndpointId } from '@layerzerolabs/lz-definitions';
@@ -222,17 +222,17 @@ export default async function () {
```
-It is strongly recommended to review [LayerZero's Channel Security Model](https://docs.layerzero.network/v2/concepts/protocol/message-security#layerzero's-channel-security-model) and understand the impact of each of these configuration settings.
+Review [LayerZero's Channel Security Model](https://docs.layerzero.network/v2/concepts/protocol/message-security#layerzero's-channel-security-model) to understand the impact of each of these configuration settings.
-See [Next Steps](#next-steps) to review the available providers and security settings.
+To review the available providers and security settings, see [Next steps](#next-steps).
-## Step 3: Create Utility Tasks
+## Step 3: Create utility tasks
-Before deployment, let's create a utility task for minting tokens that we'll need later.
+Before you deploy, create a utility task that mints tokens. You need this task later.
-### Create Minting Task
+### Create minting task
Create `tasks/mint.ts`:
@@ -267,9 +267,9 @@ task('mint', 'Mint tokens to an address')
});
```
-### Update Hardhat Configuration
+### Update Hardhat configuration
-Now update your `hardhat.config.ts` to import the mint task:
+Update your `hardhat.config.ts` file to import the mint task:
```typescript title="hardhat.config.ts"
// Get the environment configuration from .env file
@@ -347,18 +347,18 @@ const config: HardhatUserConfig = {
export default config;
```
-**Important**: You must create and import the mint task before deployment, otherwise Hardhat will throw an error when trying to resolve the task dependencies during compilation.
+Create and import the mint task before you deploy. Otherwise, Hardhat throws an error when it tries to resolve the task dependencies during compilation.
-## Step 4: Smart Contract Development
+## Step 4: Smart contract development
### The token contract
-The OFT contract handles all cross-chain logic automatically. When tokens are sent:
+The OFT contract handles all cross-chain logic automatically. When you send tokens:
-1. **Source Chain**: Burns tokens from sender's balance
-2. **LayerZero Protocol**: Verifies and relays the message
-3. **Destination Chain**: Mints equivalent tokens to recipient
+1. **Source chain**: Burns the tokens from the sender's balance
+2. **LayerZero protocol**: Verifies and relays the message
+3. **Destination chain**: Mints equivalent tokens to the recipient
@@ -385,25 +385,25 @@ contract MyOFT is OFT {
```
-The OFT contract uses the ERC20 token standard. You may want to add a `mint(...)` function in the `constructor(...)` or contract body if this is your first time deploying an OFT. If you have an existing ERC20 token, you will want to use an OFT Adapter contract.
+The OFT contract uses the ERC-20 token standard. If this is your first time deploying an OFT, you may want to add a `mint(...)` function in the `constructor(...)` or contract body. If you have an existing ERC-20 token, use an OFT Adapter contract.
-You can read the general [OFT Quickstart](https://docs.layerzero.network/v2/developers/evm/oft/quickstart) for a better understanding of how OFTs work and what contracts to use.
+To learn more about how OFTs work and which contracts to use, you can read the general [OFT Quickstart](https://docs.layerzero.network/v2/developers/evm/oft/quickstart).
-### Understanding OFT Functions
+### Understanding OFT functions
-Key inherited functions from the OFT contract:
+Your contract inherits these main functions from the OFT contract:
| Function | Description |
| --- | --- |
-| `send()` | Initiates cross-chain token transfer |
-| `quoteSend()` | Estimates fees for transfer |
+| `send()` | Starts a cross-chain token transfer |
+| `quoteSend()` | Estimates the fees for a transfer |
| `_lzSend()` | Internal function that sends the message |
| `_lzReceive()` | Internal function that receives messages |
-## Step 5: Deployment Process
+## Step 5: Deployment process
### Deploy
@@ -411,13 +411,13 @@ Key inherited functions from the OFT contract:
npx hardhat lz:deploy # choose sei
```
-You will be presented with a list of networks to deploy to.
+The command shows a list of networks to deploy to.
-Fund your deployer with native gas tokens beforehand.
+Fund your deployer with native gas tokens before you deploy.
-## Step 6: Wire the Contracts
+## Step 6: Wire the contracts
-After deployment, contracts need to be connected:
+After deployment, connect the contracts:
### Connect the chains
@@ -425,32 +425,32 @@ After deployment, contracts need to be connected:
npx hardhat lz:oapp:wire --oapp-config layerzero.config.ts
```
-### Verify Configuration
+### Verify configuration
-Verify peers:
+Verify the peers:
```bash
npx hardhat lz:oapp:peers:get --oapp-config layerzero.config.ts
```
-This command will show you the current LayerZero wiring configuration, including the connected chains and their peer addresses.
+This command shows the current LayerZero wiring configuration, including the connected chains and their peer addresses.
-## Step 7: Mint Initial Tokens
+## Step 7: Mint initial tokens
-Before transferring, you need tokens to send. Let's mint some tokens on SEI:
+Before you transfer, you need tokens to send. Mint some tokens on Sei:
```bash
# Mint 10,000 tokens to your address on SEI
npx hardhat mint --to 0xYourAddress --amount 10000 --network sei-mainnet
```
-## Step 8: Transfer Tokens Cross-Chain
+## Step 8: Transfer tokens cross-chain
### Calling send
-Since the `send` logic has already been defined, we'll instead view how the function should be called.
+The OFT contract already defines the `send` logic, so this section shows how to call the function.
-#### Option 1: Hardhat Task
+#### Option 1: Hardhat task
Create `tasks/sendOFT.ts`:
@@ -536,14 +536,14 @@ task('lz:oft:send', 'Sends tokens from either OFT or OFTAdapter')
});
```
-Don't forget to import the task in your `hardhat.config.ts` (if not already added):
+If you have not already done so, import the task in your `hardhat.config.ts` file:
```typescript
// Add this import to hardhat.config.ts (should already be there from Step 3)
import './tasks/sendOFT';
```
-**Execute the transfer:**
+Send the tokens:
```bash
# Send 100 tokens from SEI to Optimism (EID: 30111)
@@ -554,7 +554,7 @@ npx hardhat lz:oft:send \
--network sei-mainnet
```
-#### Option 2: Foundry Script
+#### Option 2: Foundry script
Create `script/SendOFT.s.sol`:
@@ -618,7 +618,7 @@ contract SendOFT is Script {
}
```
-**Environment Setup:**
+Set the environment variables and run the script:
```bash
# Set environment variables
@@ -632,46 +632,46 @@ forge script script/SendOFT.s.sol:SendOFT --rpc-url $RPC_URL_SEI --broadcast
## Step 9: Done!
-You've issued an omnichain token and bridged it from Sei Mainnet to Optimism. Customize supply logic, fees, or add more chains by applying changes to the core contract, redeploying, and repeating the wiring step.
+You issued an omnichain token and bridged it from Sei Mainnet to Optimism. To customize the supply logic or fees, or to add more chains, change the core contract. Then redeploy it and repeat the wiring step.
-### Track Your Transaction
+### Track your transaction
-1. Visit https://layerzeroscan.com/tx/YOUR_TX_HASH
-2. You'll see:
+1. Go to https://layerzeroscan.com/tx/YOUR_TX_HASH
+2. The page shows:
- Source transaction
- Message status
- Destination transaction
- Time elapsed
-3. Check balances on both chains to confirm the transfer
+3. Check the balances on both chains to confirm the transfer
## Troubleshooting
-### Common Issues and Solutions
+### Common issues and solutions
-**Quote Send Reverts**
+**Quote send reverts**
-If your `quoteSend` call reverts, it usually means that your LayerZero wiring hasn't been fully configured or there's no default pathway for the chains you're trying to bridge. Here's how to diagnose and fix it:
+If your `quoteSend` call reverts, there are two usual causes. Your LayerZero wiring is not fully configured, or there is no default pathway for the chains that you are trying to bridge. Diagnose and fix the problem as follows:
-**1. Wiring Didn't Succeed:**
+**1. Wiring did not succeed:**
-Run the following to inspect your on‑chain wiring configuration:
+Run this command to inspect your on-chain wiring configuration:
```bash
npx hardhat lz:oapp:config:get --oapp-config layerzero.config.ts
```
-See that your source configuration has a valid send library, DVN address, and target eid.
+Check that your source configuration has a valid send library, DVN address, and target EID.
-**2. No Default Pathway:**
+**2. No default pathway:**
-LayerZero default settings should be considered placeholders. Sometimes the LayerZero defaults will contain a `LzDeadDVN`. Those entries indicate that a default pathway setting does not exist.
+Treat the LayerZero default settings as placeholders. Sometimes the LayerZero defaults contain a `LzDeadDVN`. These entries show that a default pathway setting does not exist.
-- **Check**: You can see if your configuration contains a LzDeadDVN by viewing the [Default Config Checker](https://layerzeroscan.com/tools/defaults?srcChainKey%5B0%5D=sei&version=V2&dstChainKey%5B0%5D=optimism) on LayerZero Scan.
+- **Check**: To see if your configuration contains a LzDeadDVN, open the [Default Config Checker](https://layerzeroscan.com/tools/defaults?srcChainKey%5B0%5D=sei&version=V2&dstChainKey%5B0%5D=optimism) on LayerZero Scan.
-- **Fix**: Open your `layerzero.config.ts` and under the relevant `pathways` entry, add working DVN providers (in the `[ requiredDVN[], [ optionalDVN[], threshold ] ]` section).
+- **Fix**: Open your `layerzero.config.ts` file. Under the relevant `pathways` entry, add working DVN providers in the `[ requiredDVN[], [ optionalDVN[], threshold ] ]` section.
-- Re-run your wiring command for the connections so that the wiring on both chains is live.
+- Run the wiring command for the connections again so that the wiring is live on both chains.
```typescript
[
@@ -683,14 +683,14 @@ LayerZero default settings should be considered placeholders. Sometimes the Laye
],
```
-Once you've updated your config, retry your `quoteSend` flow. It should now return a fee estimate instead of reverting.
+After you update your config, retry your `quoteSend` flow. It should now return a fee estimate instead of reverting.
-**Insufficient Gas**
+**Insufficient gas**
-If the transaction fails on the destination chain, try to increase the gas like this:
+If the transaction fails on the destination chain, try to increase the gas:
```typescript
// Increase gas in options
@@ -699,35 +699,35 @@ let options = Options.newOptions().addExecutorLzReceiveOption(150000, 0).toBytes
-## Next Steps
+## Next steps
-- **Add More Chains**: Expand to Arbitrum, Base, Polygon, etc.
-- **Advanced Features**: Implement rate limiting, pausable transfers, fee collection
-- **Composed Messages**: Execute actions after token arrival
-- **Build a UI**: Create a frontend for easy transfers
+- Add more chains, such as Arbitrum, Base, and Polygon.
+- Implement advanced features, such as rate limiting, pausable transfers, and fee collection.
+- Use composed messages to run actions after the tokens arrive.
+- Build a frontend UI that makes transfers easy.
-### Learn More
+### Learn more
-- See the [Configuring Pathways](https://docs.layerzero.network/v2/get-started/create-lz-oapp/configuring-pathways) section to learn more about managing your OFTs across the entire network mesh.
-- See the [Available DVNs](https://docs.layerzero.network/v2/deployments/dvn-addresses?chains=sei) and [Executor](https://docs.layerzero.network/v2/deployments/deployed-contracts?chains=sei) to configure between.
-- Learn how the protocol works by reading the [Core Concepts](https://docs.layerzero.network/v2/concepts/getting-started/what-is-layerzero) section.
-- Learn more about how the OFT contract works on the EVM by reading the [OFT Quickstart](https://docs.layerzero.network/v2/developers/evm/oft/quickstart) in the EVM section.
+- To learn more about how to manage your OFTs across the entire network mesh, see the [Configuring Pathways](https://docs.layerzero.network/v2/get-started/create-lz-oapp/configuring-pathways) section.
+- To choose which DVNs and executor to configure, see [Available DVNs](https://docs.layerzero.network/v2/deployments/dvn-addresses?chains=sei) and [Executor](https://docs.layerzero.network/v2/deployments/deployed-contracts?chains=sei).
+- To learn how the protocol works, read the [Core Concepts](https://docs.layerzero.network/v2/concepts/getting-started/what-is-layerzero) section.
+- To learn more about how the OFT contract works on the EVM, read the [OFT Quickstart](https://docs.layerzero.network/v2/developers/evm/oft/quickstart) in the EVM section.
## Resources
-- **LayerZero Documentation**: https://docs.layerzero.network/v2
+- **LayerZero documentation**: https://docs.layerzero.network/v2
- **LayerZero Scan**: https://layerzeroscan.com/
-- **SEI Explorer**: https://seiscan.io
+- **Sei explorer**: https://seiscan.io
## Summary
-You've successfully:
+In this guide, you:
-- ✅ Created an Omnichain Fungible Token project
-- ✅ Configured networks and LayerZero pathways
-- ✅ Deployed contracts to multiple chains
-- ✅ Connected the deployments via LayerZero wiring
-- ✅ Created tasks for cross-chain token transfers
-- ✅ Learned how LayerZero enables omnichain applications
+- Created an Omnichain Fungible Token project
+- Configured networks and LayerZero pathways
+- Deployed contracts to multiple chains
+- Connected the deployments through LayerZero wiring
+- Created tasks for cross-chain token transfers
+- Learned how LayerZero enables omnichain applications
-Your tokens can now move freely between SEI and any connected chain, maintaining a unified supply and enabling true cross-chain functionality!
+Your tokens can now move between Sei and any connected chain, and the total supply stays unified.
diff --git a/evm/bridging/thirdweb.mdx b/evm/bridging/thirdweb.mdx
index 8802bcd..d3630b9 100644
--- a/evm/bridging/thirdweb.mdx
+++ b/evm/bridging/thirdweb.mdx
@@ -4,28 +4,28 @@ sidebarTitle: 'Thirdweb'
description: 'Comprehensive guide on enabling onramps, swapping & bridging on Any EVM Chain on Sei. Learn key concepts, commands, and best practices.'
keywords: ['thirdweb', 'onramps', 'swapping', 'bridging', 'cross-chain', 'payments', 'sei']
---
-[**Payments**](https://thirdweb.com/payments?utm_source=sei&utm_medium=documentation&utm_campaign=chain_docs) is a comprehensive Web3 payment solution to help you monetize any app or game.
+thirdweb [Payments](https://thirdweb.com/payments?utm_source=sei&utm_medium=documentation&utm_campaign=chain_docs) is a Web3 payment solution that helps you monetize any app or game.
-With Payments, your users can **onramp, bridge, and swap** on any EVM chain — with any EVM token or fiat — thanks to its **automatic cross-chain routing**.
+With Payments, your users can onramp, bridge, and swap on any EVM chain, with any EVM token or with fiat. Automatic cross-chain routing makes this possible.
-Plus, developers can **earn from day one** using the **fee-sharing mechanism** and **easy implementation**.
+Payments is easy to implement, and its fee-sharing mechanism lets you earn from day one.
-## Payments Features
+## Payments features
- Let users pay for assets in any EVM token on any EVM chain
-- Automatic cross-chain routing for seamless transactions
-- Earn from day one with fee-sharing mechanism
-- Access ready-made UI component for easy implementation
+- Automatic cross-chain routing of transactions
+- Earn from day one with the fee-sharing mechanism
+- Access a ready-made UI component for easy implementation
-[Learn more in the full documentation on thirdweb’s Payments](https://portal.thirdweb.com/payments?utm_source=sei&utm_medium=documentation&utm_campaign=chain_docs)
+[Learn more in the full thirdweb Payments documentation](https://portal.thirdweb.com/payments?utm_source=sei&utm_medium=documentation&utm_campaign=chain_docs)
-## Get Started
+## Get started
[How to get started with Payments](https://portal.thirdweb.com/payments?utm_source=sei&utm_medium=documentation&utm_campaign=chain_docs)
-## See Payments in Action
+## See Payments in action
-Want to see how Payments works? Check it out under the hood
+This code example shows how Payments works:
```jsx
import { createThirdwebClient } from 'thirdweb';
@@ -54,4 +54,4 @@ function Example() {
}
```
-[**See how Payments works in the playground**](https://playground.thirdweb.com/payments?utm_source=sei&utm_medium=documentation&utm_campaign=chain_docs)
+[See how Payments works in the playground](https://playground.thirdweb.com/payments?utm_source=sei&utm_medium=documentation&utm_campaign=chain_docs)
diff --git a/evm/building-a-frontend.mdx b/evm/building-a-frontend.mdx
index fe08e95..5ed64de 100644
--- a/evm/building-a-frontend.mdx
+++ b/evm/building-a-frontend.mdx
@@ -4,90 +4,90 @@ sidebarTitle: 'Building a Frontend'
description: 'Comprehensive guide on Building a Frontend for Sei EVM. Learn key concepts, commands, and best practices.'
keywords: ['frontend development', 'dApp', 'ethers.js', 'viem', 'wagmi', 'react', 'wallet connection', 'sei']
---
-Developing the frontend of a dApp on Sei EVM involves connecting to wallets, interacting with the blockchain via RPC endpoints, and signing and broadcasting transactions. This tutorial will demonstrate how to build a simple ERC20 token interface using three popular libraries:
+To build the frontend of a dApp on Sei EVM, you connect to wallets and interact with the blockchain through RPC endpoints. You also sign and broadcast transactions. This tutorial shows how to build a simple ERC20 token interface with three popular libraries:
-1. [**Ethers.js**](https://docs.ethers.org/v6/) - A complete and compact library for interacting with
- EVM blockchains. Known for its simplicity and extensive functionality.
-2. [**Viem**](https://viem.sh/docs/getting-started) - A lightweight and modular TypeScript interface for Ethereum
-3. [**Wagmi**](https://wagmi.sh/) - A React hooks library built on top of Viem that simplifies wallet
- connection and interaction. Provides hooks for interacting with Ethereum
- wallets and contracts for use with modern frontend libraries and frameworks.
+1. [**ethers.js**](https://docs.ethers.org/v6/): A complete and compact library for interacting with
+ EVM blockchains. It is known for its simplicity and extensive functionality.
+2. [**viem**](https://viem.sh/docs/getting-started): A lightweight and modular TypeScript interface for Ethereum.
+3. [**wagmi**](https://wagmi.sh/): A React hooks library, built on top of viem, that simplifies wallet
+ connection and interaction. It has hooks that modern frontend libraries and frameworks can use
+ to interact with Ethereum wallets and contracts.
-We'll implement the same functionality using each library so you can compare their approaches and choose the one that best fits your development style.
+The tutorial implements the same functionality with each library. You can then compare their approaches and choose the one that best fits your development style.
-**Deploy to Testnet First**
+**Deploy to Sei Testnet first**
-It is highly recommended that you deploy to Sei Testnet first and verify everything works as expected before committing to Sei Mainnet. Doing so helps you catch bugs early, avoid unnecessary gas costs, and keep your users safe.
+It is highly recommended that you deploy to Sei Testnet first. Verify that everything works as expected before you commit to Sei Mainnet. This helps you catch bugs early, avoid unnecessary gas costs, and keep your users safe.
-## When to Use Each Library
+## When to use each library
-### Ethers.js
+### ethers.js
-Ethers.js is ideal for developers who want a comprehensive, battle-tested library with straightforward API design. It's great for both simple and complex dApps, especially when you're not using React or need custom state management.
+ethers.js is ideal for developers who want a complete, battle-tested library with a straightforward API design. It works well for both simple and complex dApps, especially when you do not use React or you need custom state management.
- **Pros**:
- - Comprehensive and easy-to-use API
- - Well-documented with a large community
+ - Complete and easy-to-use API
+ - Well documented, with a large community
- Works well with both TypeScript and JavaScript
- All-in-one solution for wallet connection and contract interaction
- **Cons**:
- - Larger bundle size compared to Viem
- - Not specifically designed for React hooks integration
+ - Larger bundle size than viem
+ - Not designed specifically for integration with React hooks
-### Viem
+### viem
-Viem is perfect for developers who want fine-grained control over their blockchain interactions and appreciate a modular, lightweight approach. It's a good choice when bundle size matters and when you have specific requirements for how contract interactions should work.
+viem suits developers who want fine-grained control over their blockchain interactions and prefer a modular, lightweight approach. It is a good choice when bundle size matters and when you have specific requirements for how contract interactions should work.
- **Pros**:
- Lightweight and modular
- Excellent TypeScript support with better type safety
- - Lower-level API gives more control
+ - Lower-level API that gives more control
- Smaller bundle size
- **Cons**:
- Steeper learning curve
- Requires more boilerplate code for some operations
- Requires separate handling for wallet connection and contract interactions
-### Wagmi
+### wagmi
-Wagmi is the best choice for React developers building dApps who want to leverage React's state management capabilities. It abstracts away much of the complexity of blockchain interactions via hooks, making it easy to build reactive UIs that respond to chain state.
+wagmi is the best choice for React developers who build dApps and want to use React's state management capabilities. Its hooks hide much of the complexity of blockchain interactions. This makes it easy to build reactive UIs that respond to chain state.
- **Pros**:
- - React-specific hooks for seamless integration
+ - React-specific hooks
- Handles complex state management for you
- - Built on top of Viem, combining its benefits
- - Convenient caching and auto-refreshing for contract data
+ - Built on top of viem, so it shares the benefits of viem
+ - Convenient caching and automatic refreshing of contract data
- **Cons**:
- Only works with React
- Adds another dependency layer
- - Opinionated about how data should be managed in your app
+ - Opinionated about how you should manage data in your app
## Requirements
-Before starting, ensure you have:
+Before you start, make sure that you have:
-- Node.js & NPM installed
-- One of the Sei wallets listed [here](/learn/wallets)
+- Node.js and npm installed
+- A wallet from the [list of Sei wallets](/learn/wallets)
-## Creating a React Project
+## Creating a React project
-Start by creating a new React project using Vite's TypeScript template for streamlined development:
+Create a new React project with Vite's TypeScript template:
```bash
npm create vite@latest sei-token-interface -- --template react-ts
```
-This command creates a new folder with a React project using TypeScript. Open `sei-token-interface` in your favorite IDE.
+This command creates a new folder with a TypeScript React project. Open `sei-token-interface` in your preferred IDE.
-This tutorial uses TypeScript. If you're not using TypeScript, you can easily adjust by removing the types.
+This tutorial uses TypeScript. If you do not use TypeScript, you can adjust the code by removing the types.
-## Project Structure
+## Project structure
-For clarity, we'll create separate components for each library implementation. First, let's set up the project structure:
+For clarity, each library implementation has its own component. First, set up the project structure:
```bash
cd sei-token-interface
@@ -100,11 +100,11 @@ touch src/shared/constants.ts
touch src/wagmi.ts
```
-## Defining the ERC20 Contract Details
+## Defining the ERC20 contract details
-Make sure to deploy your ERC20 token contract first — for example with [Hardhat](/evm/evm-hardhat) or [Foundry](/evm/evm-foundry), or generate one with the [contract wizard](/evm/evm-wizard) (see also [deploy & verify](/evm/evm-parity/examples/deploy-verify)) — and replace `TOKEN_CONTRACT_ADDRESS` in the constants file with your actual deployed contract address, and update the RPC URL in the Sei chain configuration. You can find a list of existing ERC20 contracts on Sei Mainnet here: [Sei Assets](https://seiscan.io/tokens)
+First, deploy your ERC20 token contract. For example, use [Hardhat](/evm/evm-hardhat) or [Foundry](/evm/evm-foundry), or generate a contract with the [contract wizard](/evm/evm-wizard) (see also [deploy and verify](/evm/evm-parity/examples/deploy-verify)). Then replace `TOKEN_CONTRACT_ADDRESS` in the constants file with the address of your deployed contract. Also update the RPC URL in the Sei chain configuration. For a list of existing ERC20 contracts on Sei Mainnet, see [Sei Assets](https://seiscan.io/tokens).
-Let's create a shared constants file for our project:
+Create a shared constants file for the project:
```tsx title="src/shared/constants.ts"
// Constants used across different implementations
@@ -222,7 +222,7 @@ export const ERC20_ABI = [
export const TOKEN_CONTRACT_ADDRESS = '0xYourTokenContractAddress';
```
-## Option 1: Ethers.js Implementation
+## Option 1: ethers.js implementation
Install ethers.js first:
@@ -230,13 +230,13 @@ Install ethers.js first:
npm install ethers
```
-Let's start with the Ethers.js implementation:
+Start with the ethers.js implementation. The component does these things:
-- Checks for any EVM compatible wallet extension.
-- Establishes a connection to Sei Mainnet via the connected wallet,
- using ethers.js BrowserProvider.
-- Creates an ethers.js contract instance with the signer from the wallet,
- setting it in the contract state for later use.
+- Checks for any EVM-compatible wallet extension.
+- Connects to Sei Mainnet through the connected wallet, with the ethers.js
+ `BrowserProvider`.
+- Creates an ethers.js contract instance with the signer from the wallet.
+ It stores the instance in the contract state for later use.
```tsx title="src/components/EthersInterface.tsx"
import { useState, useEffect } from 'react';
@@ -375,15 +375,15 @@ export function EthersInterface() {
}
```
-## Option 2: Viem Implementation
+## Option 2: viem implementation
-Install Viem first:
+Install viem first:
```bash
npm install viem
```
-Now implement the Viem interface:
+Now implement the viem interface:
```tsx title="src/components/ViemInterface.tsx"
import { useState, useEffect } from 'react';
@@ -553,15 +553,15 @@ export function ViemInterface() {
}
```
-## Option 3: Wagmi Implementation
+## Option 3: wagmi implementation
-Install Wagmi and configure it:
+Install wagmi and configure it:
```bash
npm install wagmi viem @tanstack/react-query
```
-First, let's create a Wagmi configuration file:
+First, create a wagmi configuration file:
```tsx title="src/wagmi.ts"
import { http, createConfig } from 'wagmi';
@@ -578,7 +578,7 @@ export const config = createConfig({
});
```
-Now implement the Wagmi interface:
+Now implement the wagmi interface:
```tsx title="src/components/WagmiInterface.tsx"
import { useState, useEffect } from 'react';
@@ -695,7 +695,7 @@ export function WagmiInterface() {
}
```
-## Updating the Main App to Display all Implementations
+## Updating the main app to display all implementations
Now update your `App.tsx` to include all three interface options:
@@ -753,9 +753,9 @@ function App() {
export default App;
```
-## Polyfills for Browser Environment
+## Polyfills for browser environment
-When developing frontend applications for the blockchain, you might need polyfills for Node.js-specific features like `Buffer`. Add these polyfills to your project:
+When you develop frontend applications for the blockchain, you might need polyfills for Node.js-specific features, such as `Buffer`. Add these polyfills to your project:
```tsx title="src/main.tsx"
import React from 'react';
@@ -778,17 +778,17 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
);
```
-## Running the Application
+## Running the application
-To see your app in action, run:
+To start your app, run this command:
```bash
npm run dev
```
-This will start a local development server, at `http://localhost:5173`. You can toggle between the different library implementations to see how each one works.
+This command starts a local development server at `http://localhost:5173`. You can switch between the library implementations to see how each one works.
-To build your application, run:
+To build your application, run this command:
```bash
npm run build
@@ -800,4 +800,4 @@ Then preview the production build locally:
npm run preview
```
-This serves the built app at `http://localhost:4173` so you can verify it before deploying. To go live, deploy the contents of the `dist` directory to any static hosting provider.
+This command serves the built app at `http://localhost:4173`, so you can verify it before you deploy. To go live, deploy the contents of the `dist` directory to any static hosting provider.
diff --git a/evm/changelog.mdx b/evm/changelog.mdx
index ffcce20..d926e02 100644
--- a/evm/changelog.mdx
+++ b/evm/changelog.mdx
@@ -6,18 +6,18 @@ keywords: ['changelog', 'updates', 'releases', 'protocol upgrades', 'sei chain']
import { Changelog } from '/snippets/changelog.jsx';
-Stay up-to-date with the latest changes, improvements, and new features in Sei.
+Stay up to date with the latest changes, improvements, and new features in Sei.
This changelog is automatically synced from the [sei-chain repository](https://github.com/sei-protocol/sei-chain/blob/main/CHANGELOG.md). For the most up-to-date information, you can also view the changelog directly on GitHub.
-**Stay Updated**
+**Stay updated**
-Want to be notified of new releases? **Watch** the [sei-protocol/sei-chain](https://github.com/sei-protocol/sei-chain) repository on GitHub or follow the release announcements in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk).
+To get notifications about new releases, **Watch** the [sei-protocol/sei-chain](https://github.com/sei-protocol/sei-chain) repository on GitHub. You can also follow the release announcements in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk).
-## Latest Changes
+## Latest changes
diff --git a/evm/debugging-contracts.mdx b/evm/debugging-contracts.mdx
index 3ee67ed..f1b3d35 100644
--- a/evm/debugging-contracts.mdx
+++ b/evm/debugging-contracts.mdx
@@ -8,23 +8,23 @@ import { RunSnippet } from '/snippets/run-snippet.jsx';
## Overview
-Debugging EVM transactions on Sei requires understanding both the transaction creation process and how to analyze transaction behavior. This guide covers advanced debugging techniques using transaction template generation, analysis tools, and comprehensive transaction inspection methods to help developers identify and resolve issues in their EVM interactions.
+To debug EVM transactions on Sei, you need to understand both how transactions are created and how to analyze their behavior. This guide covers advanced debugging techniques: transaction template generation, analysis tools, and transaction inspection methods. Use them to find and fix issues in your EVM interactions.
-## Transaction Template Generation
+## Transaction template generation
-The `--generate-only` flag transforms any Sei CLI transaction command into a template generator, creating complete transaction structures without broadcasting them. Through the `--generate-only` flag and Foundry's `cast` tool, developers can craft, analyze, and debug transactions across the EVM environment.
+The `--generate-only` flag turns any `seid` transaction command into a template generator. The command creates a complete transaction structure but does not broadcast it. With the `--generate-only` flag and Foundry's `cast` tool, you can build, analyze, and debug transactions in the EVM environment.
-### Basic Command Pattern
+### Basic command pattern
-The general pattern follows this structure:
+The general command pattern is:
```bash
seid tx --from --evm-rpc http://url-to-sei-evm-rpc --generate-only
```
-### Generating EVM Transaction Templates
+### Generating EVM transaction templates
-To generate an EVM transaction template, use the `evm` module with `--generate-only`. Here's an example sending SEI to another EVM address:
+To generate an EVM transaction template, use the `evm` module with `--generate-only`. This example sends SEI to another EVM address:
```bash
seid tx evm send 0xRecipientAddress 1000000000000000000 \
@@ -35,20 +35,20 @@ seid tx evm send 0xRecipientAddress 1000000000000000000 \
--generate-only
```
-This command returns a transaction template that you can analyze before broadcasting. The template includes all transaction details without executing the actual transaction.
+This command returns a transaction template that you can analyze before you broadcast it. The template includes all transaction details, but the command does not execute the transaction.
---
-## Analyzing EVM Transactions with Cast
+## Analyzing EVM transactions with Cast
-Once you have a transaction hash, you can use Foundry's `cast` command to inspect the transaction details:
+When you have a transaction hash, you can use Foundry's `cast` command to inspect the transaction details:
```bash
cast tx 0x5010e6600e67f04a9bc3d3b670a7c2de380b180713d9a014a5dbd76b7e2190f1 \
--rpc-url=http://url-to-sei-evm-rpc
```
-**Example Output:**
+**Example output:**
```text
blockHash 0x4696d63a9a9ae88b03bcc94ccbd87f407e994b309d1dff9c0626de51ac57b76e
@@ -69,34 +69,34 @@ type 2
value 0
```
-### Additional Analysis Commands
+### Additional analysis commands
-**Get transaction receipt:**
+**Get the transaction receipt:**
```bash
cast receipt 0x5010e6600e67f04a9bc3d3b670a7c2de380b180713d9a014a5dbd76b7e2190f1 \
--rpc-url=http://url-to-sei-evm-rpc
```
-**Decode transaction input data:**
+**Decode the transaction input data:**
```bash
cast 4byte-decode 0xc31d960f0000...
```
-All template generation commands create JSON files that you can inspect, modify, and use for debugging before executing the actual transactions.
+All template generation commands create JSON files. You can inspect, modify, and use these files for debugging before you execute the transactions.
---
-## RPC Consistency
+## RPC consistency
Always point `cast` commands to an EVM RPC endpoint (for example, `$EVM_RPC_URL`), not a Cosmos RPC URL.
---
-## Tracing and Revert Reasons
+## Tracing and revert reasons
-If your endpoint supports debug RPC methods, you can retrieve full execution traces and revert reasons:
+If your endpoint supports debug RPC methods, you can get full execution traces and revert reasons:
```bash
# Full transaction trace
@@ -110,14 +110,14 @@ cast rpc debug_traceCall '{"from":"0xFROM","to":"0xTO","data":"0xDATA"}' \
```
- Many public RPC endpoints disable debug methods. If disabled, run a local fork and trace there. See Tracing docs at /evm/tracing.
+ Many public RPC endpoints disable debug methods. If they are disabled, run a local fork and trace there. See the tracing documentation.
---
-## Reproduce with a Local Fork
+## Reproduce with a local fork
-Fork the network locally to reproduce issues deterministically and run traces even if remote debug RPC is disabled:
+Fork the network locally to reproduce issues deterministically. You can then run traces even if the remote debug RPC is disabled:
```bash
# Start a local fork
@@ -133,9 +133,9 @@ cast rpc debug_traceCall '{"to":"0xContract","data":"0xENCODED_DATA"}' \
---
-## Event Logs and Decoding
+## Event logs and decoding
-Use the receipt to inspect logs and decode with the contract ABI:
+Use the receipt to inspect the logs, and decode them with the contract ABI:
```bash
# Fetch receipt JSON and view logs
@@ -145,11 +145,11 @@ cast receipt 0xTX_HASH --rpc-url=$EVM_RPC_URL --json | jq '.logs'
cast keccak "Transfer(address,address,uint256)"
```
-Decode event topics/data using the contract ABI (from your repo or block explorer). Topic[0] equals the keccak of the event signature.
+Decode event topics and data with the contract ABI (from your repository or a block explorer). Topic[0] equals the keccak hash of the event signature.
---
-## Nonce, Balance, and Gas Diagnostics
+## Nonce, balance, and gas diagnostics
Check common failure points quickly:
@@ -163,25 +163,25 @@ cast chain-id --rpc-url=$EVM_RPC_URL
**Checklist:**
-- Incorrect nonce (pending tx in mempool)
+- Incorrect nonce (a pending transaction in the mempool)
- Insufficient native balance for gas
-- Underpriced `maxFeePerGas`/`maxPriorityFeePerGas`
+- Underpriced `maxFeePerGas` or `maxPriorityFeePerGas`
- Chain ID mismatch
## Try it live
-Each `cast` diagnostic above is a plain read-only JSON-RPC call. Run the same four against Sei Mainnet right here — the example address (`0xAa55…3d96`) is the sender from the `cast tx` output earlier on this page.
+Each `cast` diagnostic above is a plain read-only JSON-RPC call. Run four of them against Sei Mainnet here. The example address (`0xAa55…3d96`) is the sender from the `cast tx` output earlier on this page.
-
+
-
+
---
-## Offline Workflow with --generate-only
+## Offline workflow with --generate-only
-Generate, inspect, sign, and broadcast safely:
+Generate, inspect, sign, and broadcast a transaction safely:
```bash
# 1) Generate a template (no broadcast)
@@ -214,18 +214,18 @@ seid tx broadcast signed.json
---
-## Precompile Awareness
+## Precompile awareness
-Calls to system precompiles (for example, addresses like `0x...100b`) may have specific input/output formats and error behavior.
+Calls to system precompiles (for example, addresses such as `0x...100b`) may have specific input and output formats and error behavior.
-- See [EVM precompiles](/evm/precompiles/example-usage) and [EVM Cosmos precompiles](/evm/precompiles/cosmwasm-precompiles/example-usage)
+- See [EVM precompiles](/evm/precompiles/example-usage) and [CosmWasm precompiles](/evm/precompiles/cosmwasm-precompiles/example-usage)
- Cross-check expected selectors, parameter encoding, and revert messages
---
-## Storage Inspection
+## Storage inspection
-Verify on-chain state directly when debugging state changes:
+When you debug state changes, check the on-chain state directly:
```bash
cast storage 0xContract 0xSLOT --rpc-url=$EVM_RPC_URL
@@ -233,16 +233,16 @@ cast storage 0xContract 0xSLOT --rpc-url=$EVM_RPC_URL
---
-## Transaction Analysis
+## Transaction analysis
-When analyzing transactions, follow these essential practices:
+When you analyze transactions, follow these practices:
- Always verify EVM transactions thoroughly
-- Use `cast` to decode input data when working with EVM transactions
+- Use `cast` to decode the input data of EVM transactions
- Keep track of gas parameters
-- Monitor transaction status on the EVM layer
+- Monitor the transaction status on the EVM layer
-**Analysis Tips:**
+**Analysis tips:**
```bash
# Use Foundry's cast tool for detailed transaction inspection
@@ -258,14 +258,14 @@ cast 4byte-decode 0xa9059cbb000000...
```
- Transaction Analysis Checklist: Always verify transaction success before proceeding. Check gas usage to optimize future transactions. Use Foundry's cast tool for detailed transaction inspection.
+ Transaction analysis checklist: Always verify that a transaction succeeded before you continue. Check gas usage to optimize future transactions. Use Foundry's `cast` tool for detailed transaction inspection.
---
-## Error Handling
+## Error handling
-Handle potential EVM transaction issues with proper monitoring:
+Monitor EVM transactions so that you can handle potential issues:
```javascript
try {
@@ -280,22 +280,22 @@ try {
}
```
-**Best Practices for Error Handling:**
+**Best practices for error handling:**
-- Always check transaction status on both Cosmos and EVM layers
-- Use detailed error logging for debugging failed transactions
+- Always check the transaction status on both the Cosmos and EVM layers
+- Use detailed error logging to debug failed transactions
- Implement retry logic for network-related failures
- Monitor gas usage and adjust limits accordingly
---
-## Security Guidelines
+## Security guidelines
- Critical Security Requirements: Keep private keys secure and never include them in templates. Use an `.env` file or other environment variables when working with wallet keys or mnemonics. Never commit sensitive information to version control. Always verify transaction details before signing.
+ Critical security requirements: Keep private keys secure, and never include them in templates. When you work with wallet keys or mnemonics, use an `.env` file or other environment variables. Never commit sensitive information to version control. Always verify transaction details before you sign.
-**Environment Variable Setup:**
+**Environment variable setup:**
```bash
# Create .env file for sensitive data
@@ -307,7 +307,7 @@ PRIVATE_KEY=your_private_key_here
echo ".env" >> .gitignore
```
-**Secure Transaction Execution:**
+**Secure transaction execution:**
```bash
# Use environment variables in commands
diff --git a/evm/differences-with-ethereum.mdx b/evm/differences-with-ethereum.mdx
index 399d6e9..2ac584c 100644
--- a/evm/differences-with-ethereum.mdx
+++ b/evm/differences-with-ethereum.mdx
@@ -7,49 +7,48 @@ keywords: ['Sei EVM', 'Ethereum comparison', 'blockchain differences', 'EVM comp
import { SstoreGasLive } from '/snippets/sstore-gas-live.jsx';
-While Sei features full EVM compatibility, there are some distinctions between
-Sei's EVM and Ethereum itself:
+Sei has full EVM compatibility, but Sei EVM and Ethereum differ in some ways:
| Feature | Sei EVM | Ethereum |
| --- | --- | --- |
-| Blocktime | 400 ms | 12 s |
-| Gas per Second | ~ 100 MegaGas/s | ~ 5 MegaGas/s |
+| Block time | 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.
+| Parallelized execution | Yes | No |
+| EVM tooling compatibility | 100% | 100% |
+| EVM version | Pectra (without 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…) and EVM-compatible (0x…) | ECDSA-derived address (0x…) |
+| State storage | AVL tree (global root) | Merkle Patricia Trie (MPT) |
+| SSTORE gas cost | 72k (on-chain parameter, governance-adjustable) | 20k (fixed) |
+
+- Sei uses the Pectra (Prague and Electra) version of the EVM, without blob transactions. Ethereum has since upgraded to Fusaka (December 2025). Fusaka introduced PeerDAS to improve data availability.
+- Sei's gas limit is 12.5 M, compared with 60 M on Ethereum. The Fusaka upgrade increased Ethereum's limit from 45 M through EIP-7935. Sei also has a byte size limit of 21 MB.
+- Sei has instant finality. A transaction is final as soon as its block is committed (approximately 400 ms). As a result, the commitment levels typical for Ethereum (safe, latest, and justified) do not apply on Sei.
-**Deprecation Notice**
+**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://seistream.app/proposals/99).
-[Proposal 115](https://seistream.app/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 115](https://seistream.app/proposals/115) also disables CosmWasm code uploads and contract instantiations chain-wide. As a result, you cannot deploy new CosmWasm contracts. Only `execute` and `query` against existing CosmWasm contracts remain available.
-- **Sei is a dual-execution environment (EVM and Cosmos-SDK).** This means:
+- **Sei is a dual-execution environment (EVM and Cosmos SDK).** This means that:
- 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)
+ - For example, both Cosmos transactions (bank send, wasm execute) and EVM send transactions can change an account's SEI balance.
+ - Sei assets can exist as EVM tokens (ERC-20, ERC-721, and ERC-1155) or as legacy CosmWasm tokens (CW20, CW721, and CW1155). They can also exist as "native" Bank Module assets (Sei). Under Proposal 115, you can no longer deploy CosmWasm tokens.
+ - 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 works through [precompiles](/evm/precompiles/example-usage) and [pointer contracts](/learn/pointers).
-## Sei EVM Release
+## Sei EVM release
-Sei EVM was originally deployed at the following block heights and versions:
+Sei EVM was first deployed at these block heights and versions:
### Testnet
@@ -63,53 +62,53 @@ Sei EVM was originally deployed at the following block heights and versions:
- **Height:** `79123881`
- **Changelog:** https://github.com/sei-protocol/sei-chain/blob/main/CHANGELOG.md#v552
-## Opcode Differences
+## 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. |
+| 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. |
+| BASEFEE | Returns the current base fee, with no burn | Returns the current base fee. A portion is burned (EIP‑1559). | Legacy transactions 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, with a 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 the block gas limit on both chains. |
+| TIMESTAMP | Tendermint block time | Proposer-chosen block time | Same semantics. Do not use it for 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
+Proof of Stake (PoS) Ethereum uses pseudo‑randomness to determine the next
+validator. Sei does not rely on the same method, so it does not 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).
+`PREVRANDAO` returns a value derived from the current block time. If your
+contract logic needs strong randomness, use a verifiable randomness oracle.
+This is also the advice for Ethereum.
### COINBASE
-Coinbase address on Sei is always set to (the EVM address of) the global fee
+On Sei, the coinbase address is always the EVM address of the global fee
collector.
-## State Root
+## 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)
+Sei uses an AVL tree instead of a Merkle Patricia Trie (MPT) for data storage.
+Because of this, Sei does not have a per-account state root. The global state
+root is the AVL-tree root. It is also not equivalent to Ethereum's overall
+state root, which is an MPT root.
-## Block Hash
+## 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.
+Sei computes the block hash from the block header in Tendermint data format.
+As a result, it is different from Ethereum's block hash.
-## Base Fee & Tips
+## 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.
+Sei supports all non‑blob transaction types, including the Pectra `SetCode` transaction (EIP‑7702). However, for a legacy (non EIP‑1559)
+transaction, you must specify a gas price at or above Sei's governance-set minimum gas price. The minimum is currently `50 gwei` on Sei Mainnet. Query the live value with `eth_gasPrice` instead of hard-coding it. Also,
+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:
+You can fetch the current EIP-1559 parameters with `seid`:
```sh
seid q params subspace evm KeyTargetGasUsedPerBlock
@@ -127,21 +126,21 @@ subspace: evm
value: '"0.007500000000000000"'
```
-## Non-EVM Transactions
+## 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.
+On Sei, non-EVM transactions may update state that EVM transactions can
+access. The simplest example is bank balances. Both native Cosmos bank send
+transactions and EVM send transactions may update them. As a result, an
+offchain application that parses only EVM transactions may find state changes
+that it cannot attribute to any EVM transaction.
-## EVM Transaction Envelope Restrictions
+## EVM transaction envelope restrictions
-On Sei, EVM transactions are carried inside a Cosmos transaction envelope, but that envelope must remain empty of Cosmos-specific fields. This introduces the following Sei-specific divergences from a plain Ethereum transaction that tooling constructing raw transactions should be aware of:
+On Sei, EVM transactions are carried inside a Cosmos transaction envelope. That envelope must not contain any Cosmos-specific fields. Tooling that builds raw transactions should know about these Sei-specific differences from a plain Ethereum transaction:
### No Cosmos wrapper fields on EVM transactions
-An EVM transaction must not populate any of the Cosmos wrapper fields. If any of the following are set, the transaction is rejected:
+An EVM transaction must not populate any of the Cosmos wrapper fields. If any of these fields are set, Sei rejects the transaction:
- `memo`
- `timeout_height`
@@ -150,86 +149,84 @@ An EVM transaction must not populate any of the Cosmos wrapper fields. If any of
- fee amount, fee `payer`, and fee `granter`
- top-level `signatures`
-The EVM transaction's own signature (`v`, `r`, `s`) lives inside the EVM payload itself, so none of these Cosmos-level fields are needed. This check is applied uniformly to all EVM transactions.
+The EVM transaction's own signature (`v`, `r`, `s`) is inside the EVM payload itself, so the transaction does not need any of these Cosmos-level fields. Sei applies this check uniformly to all EVM transactions.
### Whole-block rejection on transaction decode failure
-During proposal processing, Sei decodes every transaction in a proposed block. If any transaction fails to decode — or panics during decode — the **entire block proposal is rejected** rather than the offending transaction being silently skipped (treated as nil) while the rest of the block proceeds.
+During proposal processing, Sei decodes every transaction in a proposed block. If any transaction fails to decode or panics during decode, Sei rejects the **entire block proposal**. It does not silently skip the offending transaction (treat it as nil) and continue with the rest of the block.
-This also affects block gas accounting: a transaction that could not be decoded no longer contributes zero gas and gets skipped; instead its presence causes the block proposal to be rejected outright.
+This also affects block gas accounting. A transaction that could not be decoded no longer contributes zero gas and gets skipped. Instead, its presence causes Sei to reject the block proposal outright.
-This is a consensus-level behavior change. Tooling that produces malformed or non-canonical transactions can no longer rely on such transactions being individually dropped from an otherwise-valid block — a single undecodable transaction now invalidates the whole proposal. Ensure your signing and broadcast tooling only submits transactions that decode cleanly.
+Make sure that your signing and broadcast tooling submits only transactions that decode cleanly. This is a consensus-level behavior change. A single undecodable transaction now invalidates the whole proposal. Tooling that produces malformed or non-canonical transactions can no longer rely on Sei to drop them individually from an otherwise-valid block.
### Rejection of bloated (non-canonical) transaction bodies
-The transaction decoder rejects "bloated" transaction bodies — those whose raw protobuf wire encoding is larger than the canonical re-marshal of the decoded body. Non-canonical encodings (for example, padded fields or an oversized `Any.Value`) are rejected on decode with a decode error. This check has been enforced since v6.5.0.
+The transaction decoder rejects "bloated" transaction bodies. A bloated body has a raw protobuf wire encoding that is larger than the canonical re-marshal of the decoded body. The decoder rejects non-canonical encodings (for example, padded fields or an oversized `Any.Value`) with a decode error. This check has been enforced since v6.5.0.
-Ensure your transaction-signing tooling produces a minimal, canonical envelope with no Cosmos wrapper fields populated.
+Make sure that your transaction-signing tooling produces a minimal, canonical envelope with no Cosmos wrapper fields populated.
## 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.
+Sei has instant finality. A transaction is final as soon as its block is
+committed (approximately 400 ms). This means that Ethereum's commitment levels
+"safe", "latest", "justified", and "finalized" are all the same on Sei.
-## Pending State
+## 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).
+On Ethereum, the block proposer executes its proposed block first and updates
+its local state. Then it broadcasts the proposal to others. The updated state
+is 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.
+However, on Sei, the block proposer broadcasts the proposal first. It executes
+the proposal only if the proposal is accepted. This means that every node
+executes the block at roughly the same time, so Sei does not have a window
+when a "pending state" exists.
-## Gas Model & Fees
+## 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:
+Sei does not burn the base fee. All transaction fees go 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.
+- Fee handling is simpler: use `gasPrice`, and you can omit `maxFeePerGas` and `maxPriorityFeePerGas`.
+- Fees are more stable, because higher throughput reduces fee spikes during busy periods.
+- Costs are typically lower. Many workloads that are costly on Ethereum become economical on Sei.
-**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.
+- **Are Sei fees lower?** Yes, because of higher throughput and parallel execution.
-## SSTORE Gas Cost
+## 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.
+On Sei, the gas cost of the `SSTORE` opcode is a configurable on-chain parameter. A governance proposal can adjust it without a chain upgrade. This lets governance 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 Sei Mainnet and Sei Testnet. It was set by governance [Proposal #109](https://seistream.app/proposals/109) ("Update EVM SSTORE set gas to 72000"), which changed the `evm` module parameter `KeySeiSstoreSetGasEIP2200` to `72000`.
+The `SSTORE` gas cost is currently set to the non-standard value of **72,000 gas**. This value is the same on Sei Mainnet and Sei Testnet. Governance [Proposal #109](https://seistream.app/proposals/109) ("Update EVM SSTORE set gas to 72000") set this value. The proposal changed the `evm` module parameter `KeySeiSstoreSetGasEIP2200` to `72000`.
-The values below are read **live** from the Sei EVM:
+The values below are read **live** from the Sei EVM:
-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 ` 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.
+To confirm the real cost yourself, make a live `eth_estimateGas` call against a Sei RPC. A Foundry `forge test --gas-report --fork-url ` report forks the chain *state*, but it applies revm's standard EVM gas schedule. As a result, it reports the Ethereum cost (approximately 22,100) instead of the Sei cost. The report is useful for relative profiling of your own logic, but not for the absolute storage-write cost.
-Since `SSTORE` is a governance-controlled parameter, this value may change in the future through a governance proposal.
+Because the `SSTORE` gas cost is a governance-controlled parameter, a governance proposal may change this value in the future.
-## ERC Token Standards Compatibility
+## ERC token standards compatibility
-Sei’s EVM fully supports the common token standards:
+Sei EVM fully supports the common token standards:
- **ERC‑20** (fungible tokens)
- **ERC‑721** (NFTs)
@@ -237,10 +234,10 @@ Sei’s EVM fully supports the common token standards:
Existing OpenZeppelin contracts and tools work unchanged.
-## Testing & Migration Checklist
+## 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).
+- Redeploy your Solidity code to Sei Testnet. Most contracts do not need changes.
+- If you used SELFDESTRUCT, refactor it to a soft‑close pattern.
+- Remove the EIP‑1559 fee complexity from your UI. Use a single `gasPrice` input in frontends.
+- If you rely on on‑chain "randomness," integrate an oracle or VRF.
+- Size your `gasLimit` with a modest buffer. Parallel execution can make estimates vary slightly.
diff --git a/evm/dune.mdx b/evm/dune.mdx
index 9eb4927..cd88367 100644
--- a/evm/dune.mdx
+++ b/evm/dune.mdx
@@ -6,15 +6,15 @@ keywords: ['dune analytics', 'blockchain analytics', 'SQL queries', 'game analyt
## What is Dune Analytics?
-Dune Analytics is a powerful blockchain analytics platform that allows you to query, visualize, and share blockchain data using SQL. For game developers, it's an invaluable tool for:
+Dune Analytics is a blockchain analytics platform. You can use it to query, visualize, and share blockchain data with SQL. Game developers can use it for:
-- **Player Analytics**: Track user acquisition, retention, and engagement
-- **Transaction Analysis**: Monitor game economy and player behavior
-- **Performance Metrics**: Measure daily/weekly active users, transaction volumes
-- **Cohort Analysis**: Understand player lifecycle and retention patterns
-- **Custom Dashboards**: Create visual reports for stakeholders
+- **Player analytics**: Track user acquisition, retention, and engagement
+- **Transaction analysis**: Monitor the game economy and player behavior
+- **Performance metrics**: Measure daily and weekly active users, and transaction volumes
+- **Cohort analysis**: Understand the player lifecycle and retention patterns
+- **Custom dashboards**: Create visual reports for stakeholders
-### Key Features:
+### Key features:
- SQL-based querying interface
- Pre-indexed blockchain data from multiple networks
@@ -25,56 +25,56 @@ Dune Analytics is a powerful blockchain analytics platform that allows you to qu
Before you begin, make sure you have:
-1. **Dune Account**: Sign up at [dune.com](https://dune.com)
-2. **Basic SQL Knowledge**: Understanding of SELECT, JOIN, WHERE, GROUP BY clauses
-3. **Contract Addresses**: Know your game's smart contract addresses
-4. **Understanding of Your Game Logic**: Know what transactions represent in your game context
+1. **Dune account**: Sign up at [dune.com](https://dune.com)
+2. **Basic SQL knowledge**: Understanding of the SELECT, JOIN, WHERE, and GROUP BY clauses
+3. **Contract addresses**: Know your game's smart contract addresses
+4. **Understanding of your game logic**: Know what each transaction represents in your game
-### SQL Knowledge Requirements:
+### SQL knowledge requirements:
- Basic `SELECT` statements
- JOINs (`INNER`, `LEFT`)
- Aggregate functions (`COUNT`, `SUM`, `AVG`)
- Date functions (`DATE_TRUNC`, `DATE_DIFF`)
-- Common Table Expressions (`WITH` clauses)
+- Common table expressions (`WITH` clauses)
-## Getting Started
+## Getting started
-### Step 1: Access the Template Dashboard
+### Step 1: Access the template dashboard
-Visit the Sei Games Query Templates: [Game Query Templates](https://dune.com/sei/sei-games-query-templates)
+Open the [Sei Games Query Templates](https://dune.com/sei/sei-games-query-templates) dashboard.
-### Step 2: Understanding the Dashboard Structure
+### Step 2: Understanding the dashboard structure
-The template dashboard contains several key metrics:
+The template dashboard contains these metrics:
- Total unique users
- Cohort retention analysis
- User acquisition trends
- Transaction volume analysis
-- Daily/Weekly active users
+- Daily and weekly active users
-Below are the SQL queries powering these metrics.
+This guide gives the SQL queries behind these metrics.
-## How to Fork and Use Query Templates
+## How to fork and use query templates
-### Forking a Query
+### Forking a query
-1. **Navigate to the Query**: Click on any visualization in the dashboard
-2. **Access Query Editor**: Click "Edit Query" or the query title
-3. **Fork the Query**: Click the "Fork" button in the top right
-4. **Rename Your Fork**: Give it a descriptive name like "MyGame - Daily Active Users"
-5. **Customize**: Replace placeholder values with your actual contract addresses
+1. To open a query, click any visualization in the dashboard.
+2. To open the query editor, click **Edit Query** or the query title.
+3. To fork the query, click **Fork** in the top right.
+4. Give your fork a descriptive name, such as "MyGame - Daily Active Users".
+5. Replace the placeholder values with your own contract addresses.
-### Making Queries Private/Public
+### Making queries private/public
-- **Private Queries**: Only visible to you
-- **Public Queries**: Visible to all Dune users
-- **Unlisted**: Not searchable but accessible via direct link
+- **Private queries**: Visible only to you
+- **Public queries**: Visible to all Dune users
+- **Unlisted**: Not searchable, but accessible through a direct link
-## Query Templates for Game Analytics
+## Query templates for game analytics
-### 1. Total Unique Users
+### 1. Total unique users
**Purpose**: Get the total number of unique players who have ever interacted with your game.
@@ -97,14 +97,14 @@ WHERE
t.success = TRUE
```
-**How to Use**:
+**How to use**:
-- Replace `0xYOUR_CONTRACT_ADDRESS_1` with your actual contract addresses
+- Replace `0xYOUR_CONTRACT_ADDRESS_1` with your own contract addresses
- Add or remove addresses as needed
---
-### 2. Cohort Retention Analysis
+### 2. Cohort retention analysis
**Purpose**: Analyze how well you retain players over time by tracking weekly cohorts.
@@ -173,17 +173,17 @@ JOIN cohort_size s ON d.cohort_week = s.cohort_week
ORDER BY 1 ASC, 3 ASC;
```
-**Key Metrics**:
+**Key metrics**:
- `cohort_week`: When users first joined
-- `week_offset`: Weeks since first interaction (0 = first week, 1 = second week, etc.)
-- `retention_percentage`: Percentage of cohort still active
+- `week_offset`: Weeks since the first interaction (0 is the first week, 1 is the second week, and so on)
+- `retention_percentage`: Percentage of the cohort still active
---
-### 3. Weekly User Acquisition
+### 3. Weekly user acquisition
-**Purpose**: Track how many new users you're acquiring each week.
+**Purpose**: Track how many new users you get each week.
```sql
WITH my_game_contracts AS (
@@ -217,7 +217,7 @@ ORDER BY 1 DESC
---
-### 4. Daily Transaction Volume
+### 4. Daily transaction volume
**Purpose**: Monitor daily transaction activity in your game.
@@ -245,7 +245,7 @@ ORDER BY 1 DESC
---
-### 5. Daily Active Users (DAU)
+### 5. Daily active users (DAU)
**Purpose**: Track unique daily active users.
@@ -273,7 +273,7 @@ ORDER BY 1 DESC
---
-### 6. Weekly Transaction Volume
+### 6. Weekly transaction volume
**Purpose**: Analyze weekly transaction patterns.
@@ -301,7 +301,7 @@ ORDER BY 1 DESC
---
-### 7. Weekly Active Users (WAU)
+### 7. Weekly active users (WAU)
**Purpose**: Track unique weekly active users.
@@ -329,9 +329,9 @@ ORDER BY 1 DESC
---
-### 8. Daily User Acquisition
+### 8. Daily user acquisition
-**Purpose**: Track new user acquisition on a daily basis.
+**Purpose**: Track how many new users you get each day.
```sql
WITH my_game_contracts AS (
@@ -363,11 +363,11 @@ GROUP BY 1
ORDER BY 1 DESC
```
-## Customizing Queries for Your Game
+## Customizing queries for your game
-### 1. Replace Contract Addresses
+### 1. Replace contract addresses
-**Find this section in each query**:
+In each query, find this section:
```sql
FROM UNNEST(ARRAY[
@@ -376,7 +376,7 @@ FROM UNNEST(ARRAY[
]) AS _u(address)
```
-**Replace with your actual addresses**:
+Replace the placeholders with your addresses, for example:
```sql
FROM UNNEST(ARRAY[
@@ -386,9 +386,9 @@ FROM UNNEST(ARRAY[
]) AS _u(address)
```
-### 2. Filter by Specific Functions
+### 2. Filter by specific functions
-To track specific game actions, add function signature filtering:
+To track specific game actions, filter by function signature:
```sql
WHERE
@@ -396,9 +396,9 @@ WHERE
AND t.data LIKE '0x12345678%' -- Replace with your function signature
```
-### 3. Add Time Filters
+### 3. Add time filters
-To analyze specific periods:
+To analyze a specific period, filter by date:
```sql
WHERE
@@ -407,16 +407,16 @@ WHERE
AND t.block_date <= '2024-12-31'
```
-## Best Practices
+## Best practices
-### Performance Optimization
+### Performance optimization
-1. **Use Date Filters**: Always include date ranges to limit data scope
-2. **Index Awareness**: Filter on indexed columns (block_date, address) first
-3. **Limit Results**: Use `LIMIT` for testing large queries
+1. Always use date filters to limit the scope of the data.
+2. Filter on indexed columns (block_date, address) first.
+3. Use `LIMIT` when you test large queries.
---
## Resources
-- [Dune Analytics Documentation](https://docs.dune.com)
+- [Dune Analytics documentation](https://docs.dune.com)
diff --git a/evm/ecosystem-contracts.mdx b/evm/ecosystem-contracts.mdx
index c735ff9..45db424 100644
--- a/evm/ecosystem-contracts.mdx
+++ b/evm/ecosystem-contracts.mdx
@@ -6,36 +6,36 @@ keywords: ['ecosystem contracts', 'smart contracts', 'contract addresses', 'DeFi
import { EcosystemContracts } from '/snippets/ecosystem-contracts.jsx';
-Discover and interact with the ecosystem building on Sei. This registry contains smart contract addresses for projects built across Sei.
+Use this registry to find and interact with projects built on Sei. It contains the smart contract addresses of these projects.
-**Work in Progress**
+**Work in progress**
-This registry is actively maintained and expanded. We're constantly adding new projects and updating contract addresses. Check back regularly for the latest additions to the Sei ecosystem.
+We actively maintain and expand this registry. We continually add new projects and update contract addresses. Check back regularly for the latest additions to the Sei ecosystem.
---
-### How to Use This Registry
+### How to use this registry
-- **Search by Project Name**: Use the search bar to quickly find contracts for specific projects.
-- **View Contract Details**: Click on the Seiscan link to see detailed information about the contract
-- **Bookmark This Page**: Keep this registry handy for quick access to the latest contract addresses and updates.
+- To find the contracts of a specific project quickly, search by project name in the search bar.
+- To see detailed information about a contract, click its Seiscan link.
+- Bookmark this page for quick access to the latest contract addresses and updates.
-**Add Your Project**
+**Add your project**
-Don't see your project listed? Want to add your contracts to this registry? **Reach out to us** in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) and we'll help get you added!
+To add your project or its contracts to this registry, contact us in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk). We will help you get listed.
-## Contract Registry
+## Contract registry
---
-Always verify contract addresses independently before interacting with them. While we strive to maintain accurate information, you should always double-check addresses through official project channels.
+Always verify contract addresses independently before you interact with them. We try to keep this information accurate, but always double-check addresses through official project channels.
diff --git a/evm/evm-foundry.mdx b/evm/evm-foundry.mdx
index 1a4126a..cfe9f21 100644
--- a/evm/evm-foundry.mdx
+++ b/evm/evm-foundry.mdx
@@ -9,29 +9,29 @@ import { RunSnippet } from '/snippets/run-snippet.jsx';
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
import { AddSeiButton } from '/snippets/add-sei-button.jsx';
-This tutorial will guide you through setting up Foundry for Sei EVM development and using OpenZeppelin contracts to build secure, standardized smart contracts. We'll cover environment setup, contract creation, deployment, and show how to leverage OpenZeppelin's pre-built components with the powerful Foundry toolkit.
+This tutorial shows how to set up Foundry for Sei EVM development. It covers environment setup, contract creation, and deployment. You use OpenZeppelin's pre-built components with the Foundry toolkit to build secure, standardized smart contracts.
Watch the video walkthrough for this topic in the [Video Tutorials](/evm/videos) section.
-**Deploy to Testnet First**
+**Deploy to Sei Testnet first**
-It is highly recommended that you deploy to Sei Testnet first and verify everything works as expected before committing to Sei Mainnet. Doing so helps you catch bugs early, avoid unnecessary gas costs, and keep your users safe.
+We highly recommend that you deploy to Sei Testnet first. Make sure that everything works as expected before you deploy to Sei Mainnet. This helps you catch bugs early, avoid unnecessary gas costs, and keep your users safe.
## Try it before you install
-Installing Foundry and scaffolding a project takes a few minutes. If you just want to see a contract deploy to Sei, you can do both of these right now in the browser.
+It takes a few minutes to install Foundry and scaffold a project. If you only want to see a contract deploy to Sei, you can do both of these steps in the browser now.
-First, confirm the RPC endpoints you'll put in `foundry.toml` respond:
+First, confirm that the RPC endpoints you will use in `foundry.toml` respond:
-
+
-
+
-Then add Sei Testnet to your wallet and deploy a minimal `Counter.sol` from Remix — no `forge`, no install. In Remix: compile under **Solidity Compiler**, then **Deploy & Run** with **Environment** set to **Injected Provider — MetaMask**.
+Then add Sei Testnet to your wallet and deploy a minimal `Counter.sol` from Remix. You do not need `forge` or a local install. In Remix, compile the contract under **Solidity Compiler**. Then deploy it under **Deploy & Run**, with **Environment** set to **Injected Provider - MetaMask**.
@@ -42,30 +42,30 @@ Then add Sei Testnet to your wallet and deploy a minimal `Counter.sol` from Remi
description="Remix IDE with a minimal Counter contract preloaded. Compile in-browser, then deploy to Sei Testnet."
/>
-## Table of Contents
+## Table of contents
- [Try it before you install](#try-it-before-you-install)
- [Prerequisites](#prerequisites)
-- [Setting Up Your Development Environment](#setting-up-your-development-environment)
+- [Setting up your development environment](#setting-up-your-development-environment)
- [Configuring Foundry for Sei EVM](#configuring-foundry-for-sei-evm)
-- [Using OpenZeppelin Contracts](#using-openzeppelin-contracts)
-- [Creating and Deploying Smart Contracts](#creating-and-deploying-smart-contracts)
-- [Testing Your Smart Contracts](#testing-your-smart-contracts)
+- [Using OpenZeppelin contracts](#using-openzeppelin-contracts)
+- [Creating and deploying smart contracts](#creating-and-deploying-smart-contracts)
+- [Testing your smart contracts](#testing-your-smart-contracts)
- [Deploying to Sei Testnet and Mainnet](#deploying-to-sei-testnet-and-mainnet)
-- [Interacting with Deployed Contracts](#interacting-with-deployed-contracts)
+- [Interacting with deployed contracts](#interacting-with-deployed-contracts)
## Prerequisites
-Before we begin, ensure you have the following:
+Before you start, make sure that you have the following:
- [Foundry](https://book.getfoundry.sh/) installed on your system
- A basic understanding of Solidity and smart contract development
- A wallet with SEI tokens for gas
- [Node.js](https://nodejs.org/) (v18.0.0 or later) for ethers.js interactions
-## Setting Up Your Development Environment
+## Setting up your development environment
-First, let's install Foundry if you haven't already. Follow the [installation guide](https://book.getfoundry.sh/getting-started/installation) or use the quick install command:
+If you have not installed Foundry yet, install it first. Follow the [installation guide](https://book.getfoundry.sh/getting-started/installation) or use the quick install command:
```bash
curl -L https://foundry.paradigm.xyz | bash
@@ -86,11 +86,11 @@ forge init --no-git
git init
```
-This will create a standard Foundry project structure with `src/`, `test/`, and `script/` directories.
+This creates a standard Foundry project structure with `src/`, `test/`, and `script/` directories.
## Configuring Foundry for Sei EVM
-Create a `foundry.toml` file in your project root to configure Foundry for Sei networks:
+To configure Foundry for Sei networks, create a `foundry.toml` file in your project root:
```toml title="foundry.toml"
[profile.default]
@@ -115,30 +115,30 @@ SEI_TESTNET_RPC=https://evm-rpc-testnet.sei-apis.com
SEI_MAINNET_RPC=https://evm-rpc.sei-apis.com
```
-Add `.env` to your `.gitignore` file to prevent committing sensitive information such as your `PRIVATE_KEY` and potentially lose funds.
+Add `.env` to your `.gitignore` file. If you commit sensitive information such as your `PRIVATE_KEY`, you can lose funds.
-## Using OpenZeppelin Contracts
+## Using OpenZeppelin contracts
-OpenZeppelin provides a library of secure, tested smart contract components. Let's install OpenZeppelin contracts:
+OpenZeppelin has a library of secure, tested smart contract components. Install the OpenZeppelin contracts:
```bash
forge install OpenZeppelin/openzeppelin-contracts
```
-Create a `remappings.txt` file to properly map the imports:
+Create a `remappings.txt` file to map the imports correctly:
```bash
forge remappings > remappings.txt
```
-## Creating and Deploying Smart Contracts
+## Creating and deploying smart contracts
-Let's create different types of smart contracts. Choose from the tabs below based on what you want to build:
+Each tab below creates a different type of smart contract. Choose the one that matches what you want to build:
-Let's start with a simple counter contract. Update the default `src/Counter.sol` file:
+Start with a simple counter contract. Update the default `src/Counter.sol` file:
```solidity title="src/Counter.sol"
// SPDX-License-Identifier: UNLICENSED
@@ -202,7 +202,7 @@ contract DeployCounter is Script {
-Create an ERC20 token using OpenZeppelin. Create `src/SeiToken.sol`:
+Create an ERC20 token with OpenZeppelin. Add the contract to `src/SeiToken.sol`:
```solidity title="src/SeiToken.sol"
// SPDX-License-Identifier: MIT
@@ -260,7 +260,7 @@ contract DeploySeiToken is Script {
-Create an ERC721 NFT contract using OpenZeppelin. Create `src/SeiNFT.sol`:
+Create an ERC721 NFT contract with OpenZeppelin. Add the contract to `src/SeiNFT.sol`:
```solidity title="src/SeiNFT.sol"
// SPDX-License-Identifier: MIT
@@ -376,9 +376,9 @@ contract DeploySeiNFT is Script {
-## Testing Your Smart Contracts
+## Testing your smart contracts
-Foundry provides excellent testing capabilities. Let's create comprehensive tests for our contracts.
+Foundry has built-in support for testing. Create tests for your contracts.
@@ -567,13 +567,13 @@ contract SeiNFTTest is Test {
-Run your tests with:
+Run your tests:
```bash
forge test
```
-For more verbose output:
+For more verbose output, run:
```bash
forge test -vvv
@@ -581,9 +581,9 @@ forge test -vvv
## Deploying to Sei Testnet and Mainnet
-Now let's deploy our contracts to the Sei networks. You can use either Forge scripts or direct deployment commands.
+You can deploy your contracts to the Sei networks with Forge scripts or with direct deployment commands.
-### Using Forge Scripts (Recommended)
+### Using Forge scripts (recommended)
Deploy to Sei Testnet:
@@ -597,7 +597,7 @@ Deploy to Sei Mainnet:
forge script script/DeployCounter.s.sol --rpc-url $SEI_MAINNET_RPC --private-key $PRIVATE_KEY --broadcast
```
-### Using Direct Forge Create Commands
+### Using direct Forge create commands
Alternatively, you can deploy directly:
@@ -612,7 +612,7 @@ forge create --rpc-url $SEI_TESTNET_RPC --private-key $PRIVATE_KEY src/SeiToken.
forge create --rpc-url $SEI_TESTNET_RPC --private-key $PRIVATE_KEY src/SeiNFT.sol:SeiNFT --constructor-args $(cast abi-encode "constructor(address,string)" "YOUR_ADDRESS" "https://your-metadata-server.com/metadata/")
```
-Successful deployment will output:
+A successful deployment prints output similar to this:
```bash
[⠒] Compiling...
@@ -622,11 +622,11 @@ Deployed to: 0xYOUR_CONTRACT_ADDRESS
Transaction hash: 0xYOUR_TX_HASH
```
-## Interacting with Deployed Contracts
+## Interacting with deployed contracts
-Once deployed, you can interact with your contracts using Foundry's `cast` tool or ethers.js.
+After deployment, you can interact with your contracts through Foundry's `cast` tool or ethers.js.
-### Using Cast Commands
+### Using Cast commands
```bash
# Query the counter value
@@ -647,7 +647,7 @@ cast send $TOKEN_ADDRESS "transfer(address,uint256)" $RECIPIENT_ADDRESS 1000 --p
### Using ethers.js
-Install ethers.js to interact with your contracts programmatically:
+To interact with your contracts programmatically, install ethers.js:
```bash
npm install ethers@latest
@@ -700,4 +700,4 @@ async function interactWithContracts() {
interactWithContracts();
```
-Foundry generates the ABI for contracts in the `out` folder. You can use this ABI to interact with contracts from other tools like `ethers.js` or `web3.js`.
+Foundry generates contract ABIs in the `out` folder. You can use these ABIs to interact with contracts from other tools, such as `ethers.js` or `web3.js`.
diff --git a/evm/evm-general.mdx b/evm/evm-general.mdx
index ca98325..39d2934 100644
--- a/evm/evm-general.mdx
+++ b/evm/evm-general.mdx
@@ -12,34 +12,32 @@ import { AddSeiButton } from '/snippets/add-sei-button.jsx';
## Overview
The Ethereum Virtual Machine (EVM) is the runtime environment for smart
-contracts, enabling compatibility with Ethereum-based dApps. Sei is an EVM
-compatible blockchain. Sei's parallelized EVM ensures high performance and
-efficiency.
+contracts. Sei is an EVM-compatible blockchain, so it supports Ethereum-based
+dApps. Sei's EVM is parallelized for high performance and efficiency.
Watch the video walkthrough for this topic in the [Video Tutorials](/evm/videos) section.
-Here are some key points about the EVM:
-
-1. **Turing Completeness**: The EVM is Turing complete, meaning it can execute
- any computable function. This allows developers to write complex smart
- contracts.
-2. **Gas**: Transactions and contract executions on the EVM compatible network
- consume gas. Gas is a measure of computational work, and users pay for it in
- usei on Sei networks. Gas ensures that malicious or inefficient code doesn't
- overload the network.
-3. **Bytecode Execution**: Smart contracts are compiled into bytecode (low-level
- machine-readable instructions) and deployed to the EVM compatible network.
+The EVM has these main properties:
+
+1. **Turing completeness**: The EVM is Turing complete, so it can execute any
+ computable function. This lets developers write complex smart contracts.
+2. **Gas**: Transactions and contract executions on an EVM-compatible network
+ consume gas. Gas measures computational work. On Sei networks, users pay for
+ gas in usei. Gas prevents malicious or inefficient code from overloading the
+ network.
+3. **Bytecode execution**: Smart contracts are compiled into bytecode (low-level,
+ machine-readable instructions) and deployed to the EVM-compatible network.
The EVM executes this bytecode.
## Try it: deploy without any setup
-You don't need a local toolchain to ship a contract to Sei. First confirm the network is live, then compile and deploy a minimal `Counter.sol` to testnet straight from the browser.
+You do not need a local toolchain to deploy a contract to Sei. First, confirm that the network is live. Then compile and deploy a minimal `Counter.sol` to Sei Testnet directly from your browser.
-
+
-
+
-Add Sei Testnet to your wallet, then deploy from Remix below — compile under **Solidity Compiler**, then **Deploy & Run** with **Environment** set to **Injected Provider — MetaMask**:
+Add Sei Testnet to your wallet. Then use Remix below to deploy the contract. Compile it under **Solidity Compiler**. Next, open **Deploy & Run** and set **Environment** to **Injected Provider - MetaMask**.
@@ -47,7 +45,7 @@ Add Sei Testnet to your wallet, then deploy from Remix below — compile under *
kind="remix"
src="https://remix.ethereum.org/?#activate=solidity,fileManager&code=Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVApwcmFnbWEgc29saWRpdHkgXjAuOC4yNDsKCi8vLyBAdGl0bGUgQ291bnRlciDigJQgbWluaW1hbCBjb250cmFjdCB0byBjb21waWxlICYgZGVwbG95IHRvIFNlaSB0ZXN0bmV0Lgpjb250cmFjdCBDb3VudGVyIHsKICAgIHVpbnQyNTYgcHVibGljIGNvdW50OwogICAgZnVuY3Rpb24gaW5jcmVtZW50KCkgZXh0ZXJuYWwgeyBjb3VudCsrOyB9CiAgICBmdW5jdGlvbiBkZWNyZW1lbnQoKSBleHRlcm5hbCB7IGNvdW50LS07IH0KfQ"
title="Counter.sol · deploy to Sei Testnet"
- description="Remix IDE with a minimal Counter contract preloaded. Compile in-browser, then deploy to Sei Testnet."
+ description="Remix IDE with a minimal Counter contract preloaded. Compile it in the browser, then deploy it to Sei Testnet."
/>
## Smart contract languages
@@ -57,17 +55,17 @@ The two most popular languages for developing smart contracts on the EVM are
### Solidity
-- Object-oriented, high-level language for implementing smart contracts.
-- Curly-bracket language that has been most profoundly influenced by C++.
+- An object-oriented, high-level language for implementing smart contracts.
+- A curly-bracket language that C++ influenced the most.
- Statically typed (the type of a variable is known at compile time).
- Supports:
- Inheritance (you can extend other contracts).
- Libraries (you can create reusable code that you can call from different
- contracts – like static functions in a static class in other object oriented
- programming languages).
+ contracts). Libraries are like static functions in a static class in other
+ object-oriented programming languages.
- Complex user-defined types.
-#### Example solidity contract
+#### Example Solidity contract
```solidity
// SPDX-License-Identifier: GPL-3.0
@@ -110,12 +108,12 @@ contract Coin {
### Vyper
-- Pythonic programming language
+- A Pythonic programming language
- Strong typing
- Small and understandable compiler code
- Efficient bytecode generation
-- Deliberately has less features than Solidity with the aim of making contracts
- more secure and easier to audit. Vyper does not support:
+- Deliberately has fewer features than Solidity, to make contracts more secure
+ and easier to audit. Vyper does not support:
- Modifiers
- Inheritance
- Inline assembly
diff --git a/evm/evm-hardhat.mdx b/evm/evm-hardhat.mdx
index 3be1986..53def0c 100644
--- a/evm/evm-hardhat.mdx
+++ b/evm/evm-hardhat.mdx
@@ -9,29 +9,29 @@ import { RunSnippet } from '/snippets/run-snippet.jsx';
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
import { AddSeiButton } from '/snippets/add-sei-button.jsx';
-This tutorial will guide you through setting up Hardhat for Sei EVM development and using OpenZeppelin contracts to build secure, standardized smart contracts. We'll cover environment setup, contract creation, deployment, and show how to leverage OpenZeppelin's pre-built components.
+This tutorial shows how to set up Hardhat for Sei EVM development. It covers environment setup, contract creation, and deployment. You use OpenZeppelin's pre-built components to build secure, standardized smart contracts.
Watch the video walkthrough for this topic in the [Video Tutorials](/evm/videos) section.
-**Deploy to Testnet First**
+**Deploy to Sei Testnet first**
-It is highly recommended that you deploy to Sei Testnet first and verify everything works as expected before committing to Sei Mainnet. Doing so helps you catch bugs early, avoid unnecessary gas costs, and keep your users safe.
+We highly recommend that you deploy to Sei Testnet first. Make sure that everything works as expected before you deploy to Sei Mainnet. This helps you catch bugs early, avoid unnecessary gas costs, and keep your users safe.
## Try it before you install
-Setting up the full toolchain takes a few minutes. If you just want to see a contract deploy to Sei, you can do both of these right now in the browser.
+The full toolchain takes a few minutes to set up. If you only want to see a contract deploy to Sei, you can do both of these steps in the browser now.
-First, confirm the RPC endpoints you'll put in `hardhat.config` respond:
+First, confirm that the RPC endpoints you will use in `hardhat.config` respond:
-
+
-
+
-Then add Sei Testnet to your wallet and deploy a minimal `Counter.sol` from Remix — no Node, no install. In Remix: compile under **Solidity Compiler**, then **Deploy & Run** with **Environment** set to **Injected Provider — MetaMask**.
+Then add Sei Testnet to your wallet and deploy a minimal `Counter.sol` from Remix. You do not need Node.js or a local install. In Remix, compile the contract under **Solidity Compiler**. Then deploy it under **Deploy & Run**, with **Environment** set to **Injected Provider - MetaMask**.
@@ -42,28 +42,28 @@ Then add Sei Testnet to your wallet and deploy a minimal `Counter.sol` from Remi
description="Remix IDE with a minimal Counter contract preloaded. Compile in-browser, then deploy to Sei Testnet."
/>
-## Table of Contents
+## Table of contents
- [Try it before you install](#try-it-before-you-install)
- [Prerequisites](#prerequisites)
-- [Setting Up Your Development Environment](#setting-up-your-development-environment)
+- [Setting up your development environment](#setting-up-your-development-environment)
- [Configuring Hardhat for Sei EVM](#configuring-hardhat-for-sei-evm)
-- [Using OpenZeppelin Contracts](#using-openzeppelin-contracts)
-- [Creating and Deploying an ERC20 Token, ERC721 NFT or an Upgradeable UUPS Token ](#creating-and-deploying-an-erc20-token)
-- [Testing Your Smart Contracts](#testing-your-smart-contracts)
+- [Using OpenZeppelin contracts](#using-openzeppelin-contracts)
+- [Creating and deploying an ERC20 token, ERC721 NFT or an upgradeable UUPS token](#creating-and-deploying-an-erc20-token)
+- [Testing your smart contracts](#testing-your-smart-contracts)
- [Deploying to Sei Testnet and Mainnet](#deploying-to-sei-testnet-and-mainnet)
## Prerequisites
-Before we begin, ensure you have the following installed:
+Before you start, make sure that you have installed these tools:
- [Node.js](https://nodejs.org/) (v18.0.0 or later)
- [npm](https://www.npmjs.com/) (v7.0.0 or later) or [yarn](https://yarnpkg.com/)
- A code editor (VS Code recommended)
-## Setting Up Your Development Environment
+## Setting up your development environment
-Let's create a new project and set up Hardhat:
+Create a new project and set up Hardhat:
```bash
# Create a new directory for your project
@@ -74,7 +74,7 @@ cd sei-hardhat-project
npx hardhat --init
```
-When prompted, choose **Hardhat 3** and **a TypeScript project using Mocha and Ethers.js**, then follow the prompts. This generates an ESM project (`"type": "module"` in `package.json`) with `@nomicfoundation/hardhat-toolbox-mocha-ethers`, `ethers`, Hardhat Ignition, TypeScript, and a ready-to-use `tsconfig.json`.
+When prompted, choose **Hardhat 3** and **a TypeScript project using Mocha and Ethers.js**. Then follow the prompts. This generates an ESM project (`"type": "module"` in `package.json`) with `@nomicfoundation/hardhat-toolbox-mocha-ethers`, `ethers`, Hardhat Ignition, TypeScript, and a ready-to-use `tsconfig.json`.
Then add the OpenZeppelin contract library:
@@ -83,7 +83,7 @@ npm install @openzeppelin/contracts
```
-Prefer a non-interactive setup (CI or scripted environments)? Do the same thing by hand — no prompts:
+For a non-interactive setup (CI or scripted environments), do the same steps manually, without prompts:
```bash
npm init -y
@@ -91,12 +91,12 @@ npm pkg set type=module
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox-mocha-ethers @openzeppelin/contracts typescript @types/node
```
-The `@nomicfoundation/hardhat-toolbox-mocha-ethers` bundle pulls in `ethers`, Ignition, Mocha/Chai, and the keystore, network-helpers, verify, and typechain plugins — so this single install covers everything in this guide. If you hit peer-dependency errors, re-run with `--legacy-peer-deps`.
+The `@nomicfoundation/hardhat-toolbox-mocha-ethers` bundle includes `ethers`, Ignition, Mocha and Chai, and the keystore, network-helpers, verify, and typechain plugins. This single install covers everything in this guide. If you get peer-dependency errors, run the install again with `--legacy-peer-deps`.
## Configuring Hardhat for Sei EVM
-Next, we'll need to configure Hardhat to work with the Sei EVM. Update your `hardhat.config.ts` file:
+Next, configure Hardhat to work with the Sei EVM. Update your `hardhat.config.ts` file:
```typescript title="hardhat.config.ts"
import type { HardhatUserConfig } from 'hardhat/config';
@@ -138,27 +138,27 @@ const config: HardhatUserConfig = {
export default config;
```
-Hardhat 3 is ESM-first and requires `"type": "module"` in `package.json` (the scaffold sets this for you). Each network needs an explicit `type: 'http'`, and plugins load via the `plugins` array rather than the Hardhat 2 side-effect `import '@nomicfoundation/hardhat-toolbox'`. A local simulated network is provided automatically — no `hardhat`/`localhost` entry required.
+Hardhat 3 is ESM-first and requires `"type": "module"` in `package.json`. The scaffold sets this for you. Each network needs an explicit `type: 'http'`. Plugins load through the `plugins` array, not through the Hardhat 2 side-effect `import '@nomicfoundation/hardhat-toolbox'`. A local simulated network is available automatically, so you do not need a `hardhat` or `localhost` entry.
-Hardhat 3 reads secrets through `configVariable(...)`, backed by an encrypted keystore — so your key is never stored in a plaintext file. Set it once:
+Hardhat 3 reads secrets through `configVariable(...)`, which reads from an encrypted keystore. Hardhat never stores your key in a plaintext file. Set the key once:
```bash
npx hardhat keystore set SEI_PRIVATE_KEY
```
-You'll be prompted to paste the private key of the account you deploy from; Hardhat stores it encrypted on your machine. For CI, export a `SEI_PRIVATE_KEY` environment variable instead — `configVariable` falls back to it.
+Hardhat prompts you to paste the private key of the account that you deploy from. It stores the key encrypted on your machine. For CI, export a `SEI_PRIVATE_KEY` environment variable instead. `configVariable` falls back to this variable.
-Use a dedicated, throwaway deploy key funded with only what you need — never a personal wallet holding real funds.
+Use a dedicated, throwaway deploy key that holds only the funds you need. Never use a personal wallet that holds real funds.
-## Using OpenZeppelin Contracts
+## Using OpenZeppelin contracts
-OpenZeppelin provides a library of secure, tested smart contract components that you can use to build your applications. The `@openzeppelin/contracts` package was already installed during setup, so you're ready to import its contracts directly.
+OpenZeppelin has a library of secure, tested smart contract components that you can use to build your dApps. You installed the `@openzeppelin/contracts` package during setup, so you can import its contracts directly.
-## Creating and Deploying an ERC20 Token, ERC721 NFT or an Upgradeable UUPS Token
+## Creating and deploying an ERC20 token, ERC721 NFT or an upgradeable UUPS token
-Let's create a simple ERC20 token using OpenZeppelin contracts. Create a new file in the `contracts` directory called `SeiToken.sol`:
+To create a simple ERC20 token with OpenZeppelin contracts, add a new file named `SeiToken.sol` to the `contracts` directory:
```solidity title="contracts/SeiToken.sol"
// SPDX-License-Identifier: MIT
@@ -188,7 +188,7 @@ contract SeiToken is ERC20, Ownable {
}
```
-Now, create a deployment script in the `ignition/modules` directory called `deploy-sei-token.ts`:
+Next, create a deployment script named `deploy-sei-token.ts` in the `ignition/modules` directory:
```typescript title="ignition/modules/deploy-sei-token.ts"
import { buildModule } from '@nomicfoundation/hardhat-ignition/modules';
@@ -202,7 +202,7 @@ export default buildModule('SeiTokenModule', (m) => {
});
```
-To deploy the token to Sei Testnet:
+To deploy the token to Sei Testnet, run this command:
```bash
npx hardhat ignition deploy ignition/modules/deploy-sei-token.ts --network seitestnet
@@ -211,7 +211,7 @@ npx hardhat ignition deploy ignition/modules/deploy-sei-token.ts --network seite
-Now, let's create an ERC721 NFT contract. Create a new file `SeiNFT.sol` in the `contracts` directory:
+To create an ERC721 NFT contract, add a new file named `SeiNFT.sol` to the `contracts` directory:
```solidity title="contracts/SeiNFT.sol"
// SPDX-License-Identifier: MIT
@@ -304,7 +304,7 @@ contract SeiNFT is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Pausable, O
}
```
-Create a deployment script `deploy-sei-nft.ts`:
+Create a deployment script named `deploy-sei-nft.ts`:
```typescript title="scripts/deploy-sei-nft.ts"
import { network } from 'hardhat';
@@ -342,21 +342,21 @@ npx hardhat run scripts/deploy-sei-nft.ts --network seitestnet
-Upgradeable contracts allow you to modify the contract's logic after deployment without changing the contract address, which is crucial for fixing bugs or adding new features. The UUPS (Universal Upgradeable Proxy Standard) pattern is a popular way to implement upgradeability.
+With an upgradeable contract, you can change the contract's logic after deployment without changing the contract address. You can use this to fix bugs or add new features. The UUPS (Universal Upgradeable Proxy Standard) pattern is a popular way to implement upgradeability.
-For upgradeable contracts, also install the upgradeable variant of the OpenZeppelin library (the `@openzeppelin/contracts` package you installed earlier supplies the ERC1967 proxy):
+The `@openzeppelin/contracts` package that you installed earlier includes the ERC1967 proxy. For upgradeable contracts, also install the upgradeable variant of the OpenZeppelin library:
```bash
npm install @openzeppelin/contracts-upgradeable
```
-OpenZeppelin's `@openzeppelin/hardhat-upgrades` plugin is built for Hardhat 2 and does not register with Hardhat 3's `plugins` array. So this guide deploys the proxy directly using the ERC1967 standard and upgrades through UUPS `upgradeToAndCall` — no extra plugin, fully Hardhat 3-native. The tradeoff: you don't get the plugin's automatic storage-layout safety checks, so make sure each new version only **appends** state variables. You can validate layouts separately with [`@openzeppelin/upgrades-core`](https://www.npmjs.com/package/@openzeppelin/upgrades-core).
+OpenZeppelin's `@openzeppelin/hardhat-upgrades` plugin is built for Hardhat 2 and does not register with Hardhat 3's `plugins` array. For this reason, this guide deploys the proxy directly with the ERC1967 standard and upgrades it through the UUPS `upgradeToAndCall` function. This method needs no extra plugin and is fully native to Hardhat 3. The tradeoff is that you do not get the plugin's automatic storage-layout safety checks. Make sure that each new version only **appends** state variables. You can validate layouts separately with [`@openzeppelin/upgrades-core`](https://www.npmjs.com/package/@openzeppelin/upgrades-core).
-No `hardhat.config.ts` changes are needed beyond the configuration shown earlier.
+You do not need to change `hardhat.config.ts` beyond the configuration shown earlier.
-Now, let's create an upgradeable ERC20 token. Create `contracts/UpgradeableSeiToken.sol`:
+Next, create the upgradeable ERC20 token in `contracts/UpgradeableSeiToken.sol`:
```solidity title="contracts/UpgradeableSeiToken.sol"
// SPDX-License-Identifier: MIT
@@ -400,9 +400,9 @@ contract UpgradeableSeiToken is Initializable, ERC20Upgradeable, OwnableUpgradea
}
```
-Note the `Initializable` base, the `initializer` modifier, the `__ERC20_init` / `__Ownable_init` calls, and the `_authorizeUpgrade` override — these are what make the contract safe to run behind a proxy. (OpenZeppelin v5's `UUPSUpgradeable` is stateless, so there is no `__UUPSUpgradeable_init` to call.)
+The `Initializable` base, the `initializer` modifier, the `__ERC20_init` and `__Ownable_init` calls, and the `_authorizeUpgrade` override make the contract safe to run behind a proxy. In OpenZeppelin v5, `UUPSUpgradeable` is stateless, so there is no `__UUPSUpgradeable_init` to call.
-Add a thin, named ERC1967 proxy so Hardhat emits an artifact you can deploy by name. Create `contracts/SeiTokenProxy.sol`:
+Add a thin, named ERC1967 proxy so that Hardhat emits an artifact that you can deploy by name. Create `contracts/SeiTokenProxy.sol`:
```solidity title="contracts/SeiTokenProxy.sol"
// SPDX-License-Identifier: MIT
@@ -417,7 +417,7 @@ contract SeiTokenProxy is ERC1967Proxy {
}
```
-Now create a deployment script `scripts/deploy-upgradeable-token.ts`. It deploys the implementation, then deploys the proxy with the `initialize` call encoded as constructor data so initialization happens atomically:
+Next, create a deployment script named `scripts/deploy-upgradeable-token.ts`. The script deploys the implementation first. Then it deploys the proxy with the `initialize` call encoded as constructor data, so initialization happens atomically:
```typescript title="scripts/deploy-upgradeable-token.ts"
import { network } from 'hardhat';
@@ -445,15 +445,15 @@ console.log('Implementation:', await implementation.getAddress());
console.log('Version:', await token.version()); // V1
```
-Deploy this to the testnet:
+Deploy the contract to Sei Testnet:
```bash
npx hardhat run scripts/deploy-upgradeable-token.ts --network seitestnet
```
-**Upgrading the Contract**
+**Upgrading the contract**
-Let's say you want to add a new feature or fix a bug. Create a new version of the contract, `contracts/UpgradeableSeiTokenV2.sol`:
+To add a new feature or fix a bug, create a new version of the contract, `contracts/UpgradeableSeiTokenV2.sol`:
```solidity title="contracts/UpgradeableSeiTokenV2.sol"
// SPDX-License-Identifier: MIT
@@ -481,7 +481,7 @@ contract UpgradeableSeiTokenV2 is UpgradeableSeiToken {
}
```
-Now, create an upgrade script `scripts/upgrade-token.ts`. **Replace `PROXY_ADDRESS` with the address printed when you deployed the proxy.**
+Next, create an upgrade script named `scripts/upgrade-token.ts`. **Replace `PROXY_ADDRESS` with the proxy address that the deployment script printed.**
```typescript title="scripts/upgrade-token.ts"
import { network } from 'hardhat';
@@ -514,14 +514,14 @@ Run the upgrade script:
npx hardhat run scripts/upgrade-token.ts --network seitestnet
```
-You have now successfully deployed and upgraded a UUPS contract on the Sei network using Hardhat and OpenZeppelin!
+You have deployed and upgraded a UUPS contract on Sei with Hardhat and OpenZeppelin.
-## Testing Your Smart Contracts
+## Testing your smart contracts
-Hardhat makes it easy to test your contracts before deploying them. Create a test file `test/sei-token-test.ts`:
+Hardhat lets you test your contracts before you deploy them. Create a test file named `test/sei-token-test.ts`:
```typescript title="test/sei-token-test.ts"
import { expect } from 'chai';
@@ -597,7 +597,7 @@ describe('SeiToken', function () {
});
```
-Run your tests with:
+Run your tests:
```bash
npx hardhat test
@@ -605,18 +605,18 @@ npx hardhat test
## Deploying to Sei Testnet and Mainnet
-Once you've tested your contracts, you can deploy them to Sei Testnet or Sei Mainnet. To deploy, you'll need:
+After you test your contracts, you can deploy them to Sei Testnet or Sei Mainnet. To deploy, you need:
1. SEI tokens in your wallet for gas
-2. Your private key stored in the encrypted keystore (`npx hardhat keystore set SEI_PRIVATE_KEY`) — or exported as a `SEI_PRIVATE_KEY` environment variable in CI
+2. Your private key stored in the encrypted keystore (`npx hardhat keystore set SEI_PRIVATE_KEY`), or exported as a `SEI_PRIVATE_KEY` environment variable in CI
-Deploy to the testnet:
+Deploy to Sei Testnet:
```bash
npx hardhat ignition deploy ignition/modules/deploy-sei-token.ts --network seitestnet
```
-Deploy to the mainnet (only when you're ready for production):
+Deploy to Sei Mainnet only when you are ready for production:
```bash
npx hardhat ignition deploy ignition/modules/deploy-sei-token.ts --network seimainnet
diff --git a/evm/evm-parity/evm-compatibility.mdx b/evm/evm-parity/evm-compatibility.mdx
index 2bdbacf..3688eb9 100644
--- a/evm/evm-parity/evm-compatibility.mdx
+++ b/evm/evm-parity/evm-compatibility.mdx
@@ -4,51 +4,51 @@ sidebarTitle: 'Compatibility Matrix'
description: 'EVM feature support on Sei — what works, what differs from Ethereum, and what is not available'
---
-# EVM Compatibility
+# 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.
+This page documents EVM feature support on Sei. Each row shows whether a feature works as it does 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.
+Standard EVM tools (viem, wagmi, ethers, Foundry, and Hardhat) work on Sei for all rows marked **Supported**. Where Sei differs from Ethereum, the notes describe the difference so that you can account for it in your application.
-## Status Legend
+## Status legend
| Status | Meaning |
| --- | --- |
| Supported | Works on Sei EVM with standard Ethereum behavior. |
-| Supported — differences | Available on Sei, but intentionally differs from Ethereum. See the notes. |
-| Sei extension | A Sei-specific capability with no standard Ethereum equivalent. |
+| Supported with differences | Available on Sei, but intentionally differs from Ethereum. See the notes. |
+| Sei extension | A Sei-specific feature with no standard Ethereum equivalent. |
| Not supported | Not available on Sei EVM. |
## Transactions
| Feature | Sei status | Notes |
| --- | --- | --- |
-| Legacy transactions (type 0) | Supported — differences | Minimum gas price is set by Sei governance parameters, not a fixed floor. [See Gas and Fees.](/evm/evm-parity/gas-and-fees) |
+| Legacy transactions (type 0) | Supported with differences | The minimum gas price comes from Sei governance parameters, not a fixed floor. [See Gas and Fees.](/evm/evm-parity/gas-and-fees) |
| EIP-2930 access list transactions (type 1) | Supported | |
-| EIP-1559 fee market transactions (type 2) | Supported — differences | No base-fee burning. Fees go to validators rather than being burned. [See Gas and Fees.](/evm/evm-parity/gas-and-fees) |
+| EIP-1559 fee market transactions (type 2) | Supported with differences | Sei does not burn the base fee. Fees go to validators instead. [See Gas and Fees.](/evm/evm-parity/gas-and-fees) |
| 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
+## Account and state
| Feature | Sei status | Notes |
| --- | --- | --- |
| `eth_getBalance` | Supported | |
| `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. 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) |
+| `eth_getStorageAt` | Supported with differences | Governance can adjust the SSTORE cost. Do not hard-code gas assumptions. [See Gas and Fees.](/evm/evm-parity/gas-and-fees) |
+| `eth_getProof` | Supported with differences | Returns IAVL proof data, not Ethereum Merkle Patricia Trie proofs. Proof verification logic must account for this. Proofs resolve across the supported store backends (classic IAVL, store/v2 memiavl, and other proof-capable queryable stores). As a result, the method works across a broader range of node configurations. [See State Proofs.](/evm/evm-parity/state-proofs) |
-## Blocks and Finality
+## Blocks and finality
| Feature | Sei status | Notes |
| --- | --- | --- |
| `eth_getBlockByHash`, `eth_getBlockByNumber` | Supported | |
| `eth_blockNumber` | Supported | |
-| 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) |
+| Finality tags (`latest`, `safe`, `finalized`) | Supported with differences | Sei has instant finality. All three tags refer to the same commitment level. [See Finality.](/evm/evm-parity/finality) |
+| Pending block state | Supported with differences | Sei does not guarantee Ethereum-style pending state visibility. Do not rely on pending transaction ordering. [See Finality.](/evm/evm-parity/finality) |
-## Logs, Filters, and Subscriptions
+## Logs, filters, and subscriptions
| Feature | Sei status | Notes |
| --- | --- | --- |
@@ -56,7 +56,7 @@ Standard EVM tooling — viem, wagmi, ethers, Foundry, Hardhat — works on Sei
| 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
+## Execution and simulation
| Feature | Sei status | Notes |
| --- | --- | --- |
@@ -70,11 +70,11 @@ Standard EVM tooling — viem, wagmi, ethers, Foundry, Hardhat — works on Sei
| Feature | Sei status | Notes |
| --- | --- | --- |
| EIP-155 replay protection | Supported | |
-| Personal sign (`personal_sign`, `eth_sign`) | Supported | Depends on the connected wallet exposing the method. [See Signing.](/evm/evm-parity/signing) |
-| EIP-712 typed data signing (`eth_signTypedData_v4`) | Supported | Depends on the connected wallet exposing the method. [See Signing.](/evm/evm-parity/signing) |
+| Personal sign (`personal_sign`, `eth_sign`) | Supported | Depends on whether the connected wallet exposes the method. [See Signing.](/evm/evm-parity/signing) |
+| EIP-712 typed data signing (`eth_signTypedData_v4`) | Supported | Depends on whether the connected wallet exposes the method. [See Signing.](/evm/evm-parity/signing) |
| EIP-1271 contract signature validation | Supported | [See Signing.](/evm/evm-parity/signing) |
-## Token Standards
+## Token standards
| Feature | Sei status | Notes |
| --- | --- | --- |
@@ -82,56 +82,56 @@ Standard EVM tooling — viem, wagmi, ethers, Foundry, Hardhat — works on Sei
| ERC-721 | Supported | |
| ERC-1155 | Supported | |
-## Account Abstraction
+## Account abstraction
| Feature | Sei status | Notes |
| --- | --- | --- |
| ERC-4337 | Supported | Requires a compatible bundler. Sei EVM is ERC-4337 compatible. |
-## Name Services
+## 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. |
+| ENS | Not supported | Sei does not run Ethereum mainnet ENS. You can deploy application-level name services as contracts. |
-## Sei Extensions
+## 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.
+These features are specific to Sei and have no standard Ethereum equivalent. The `@sei-js` packages expose them as a layer on top of standard EVM tooling.
| Feature | Notes |
| --- | --- |
-| Sei precompiles (staking, governance, distribution, P256, JSON, Solo, pointers, and the CosmWasm bridge) | EVM contracts at deterministic addresses. ABIs and contract addresses are exported from `@sei-js/precompiles` for use with any standard EVM library. The retired Oracle and disabled IBC precompiles are not exported. |
-| Pointer contracts (CW20 ↔ ERC-20, CW721 ↔ ERC-721, CW1155 ↔ ERC-1155) | Bridge between CosmWasm and EVM token standards. Standard ERC interfaces work against pointer contracts. Look up with `POINTERVIEW_PRECOMPILE_ADDRESS` (`0x…100A`). Register with `POINTER_PRECOMPILE_ADDRESS` (`0x…100B`). |
-| Native address association (EVM ↔ Cosmos address) | Links an EVM address and a Cosmos address for the same account. Required before some Sei-native flows. |
+| Sei precompiles (staking, governance, distribution, P256, JSON, Solo, pointers, and the CosmWasm bridge) | EVM contracts at deterministic addresses. `@sei-js/precompiles` exports the ABIs and contract addresses for use with any standard EVM library. It does not export the retired Oracle and disabled IBC precompiles. |
+| Pointer contracts (CW20 ↔ ERC-20, CW721 ↔ ERC-721, CW1155 ↔ ERC-1155) | Bridge between CosmWasm and EVM token standards. Standard ERC interfaces work with pointer contracts. To look up a pointer, use `POINTERVIEW_PRECOMPILE_ADDRESS` (`0x…100A`). To register a pointer, use `POINTER_PRECOMPILE_ADDRESS` (`0x…100B`). |
+| Native address association (EVM ↔ Cosmos address) | Links an EVM address and a Cosmos address for the same account. Some Sei-native flows require this association first. |
-## Unsupported RPC Methods
+## Unsupported RPC methods
-The following JSON-RPC methods are either not available on Sei or will return errors:
+These JSON-RPC methods are not available on Sei or return errors:
### Blob / EIP-4844
| Method | Reason |
| --- | --- |
| `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. |
+| `engine_getBlobsV1` | Sei does not support blob data availability endpoints. |
-### Pending State
+### Pending state
| Method | Behavior on Sei |
| --- | --- |
| `eth_getBlockByNumber("pending")` | Returns `null` or the latest committed block. Sei does not maintain an Ethereum-style pending block. |
-| `eth_getTransactionCount(address, "pending")` | Returns the same value as `"latest"`. Pending nonce does not differ from confirmed nonce on Sei. |
-| `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. |
+| `eth_getTransactionCount(address, "pending")` | Returns the same value as `"latest"`. On Sei, the pending nonce is the same as the confirmed nonce. |
+| `eth_newPendingTransactionFilter` | You can create the filter, but it does 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 the results as best effort. |
-### Proof Verification
+### 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) |
+| `eth_getProof` | Returns IAVL tree proofs, not Ethereum Merkle Patricia Trie proofs. The method works, but the proof format is not compatible with standard Ethereum MPT verifiers. [See State Proofs.](/evm/evm-parity/state-proofs) |
-### Deprecated / Removed Opcodes
+### Deprecated / removed opcodes
| Method | Reason |
| --- | --- |
-| `eth_accounts` | Returns an empty array on Sei RPC nodes. Use a wallet library (`eth_requestAccounts`) to get accounts from the connected user's wallet instead. |
+| `eth_accounts` | Returns an empty array on Sei RPC nodes. To get accounts from the connected user's wallet, use a wallet library (`eth_requestAccounts`) instead. |
diff --git a/evm/evm-parity/examples/deploy-verify.mdx b/evm/evm-parity/examples/deploy-verify.mdx
index 53e5ec3..b970f77 100644
--- a/evm/evm-parity/examples/deploy-verify.mdx
+++ b/evm/evm-parity/examples/deploy-verify.mdx
@@ -6,25 +6,32 @@ description: 'Deploying and verifying smart contracts on Sei with viem, ethers,
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
import { AddSeiButton } from '/snippets/add-sei-button.jsx';
-Sei is EVM-compatible — standard deployment tooling works without modification. This page covers deploying a contract and verifying its source on the Sei block explorer.
+Sei is EVM-compatible, so standard deployment tooling works without modification. This page shows how to deploy a contract and verify its source on the Sei block explorer.
-For a deeper look at verification options (Remix, Sourcify UI, batch verification), see the [Verify Contracts](/evm/evm-verify-contracts) page.
+For a deeper look at verification options (Remix, the Sourcify UI, and batch verification), see the [Verify Contracts](/evm/evm-verify-contracts) page.
## Try it: deploy from your browser
-No local toolchain required — compile and deploy a contract to Sei Testnet straight from the browser. The Remix sandbox below preloads a minimal `Counter.sol`.
+You do not need a local toolchain. Compile and deploy a contract to Sei Testnet directly from the browser. The Remix sandbox below preloads a minimal `Counter.sol`.
First, add Sei Testnet to your wallet:
-Then in Remix: compile under the **Solidity Compiler** tab, open **Deploy & Run**, set **Environment** to **Injected Provider — MetaMask**, and click **Deploy**. Sei has instant finality, so the deployment confirms in well under a second.
+Then, in Remix:
+
+1. Compile the contract on the **Solidity Compiler** tab.
+2. Open the **Deploy & Run** tab.
+3. Set **Environment** to **Injected Provider - MetaMask**.
+4. Click **Deploy**.
+
+Sei has instant finality, so the deployment confirms in well under a second.
## Deploying with viem or ethers
@@ -76,7 +83,7 @@ forge create src/MyContract.sol:MyContract \
--constructor-args arg1 arg2
```
-For testnet:
+For Sei Testnet:
```bash
forge create src/MyContract.sol:MyContract \
@@ -86,7 +93,7 @@ forge create src/MyContract.sol:MyContract \
## Deploying with Hardhat
-Add Sei networks to your `hardhat.config.ts` (Hardhat 3). Keep the toolbox in the `plugins` array — it ships with projects created by `npx hardhat --init` and provides Hardhat Ignition for deployments:
+Add the Sei networks to your `hardhat.config.ts` (Hardhat 3). Keep the toolbox in the `plugins` array. It comes with projects that `npx hardhat --init` creates, and it includes Hardhat Ignition for deployments:
```ts
import { defineConfig, configVariable } from 'hardhat/config';
@@ -112,7 +119,7 @@ export default defineConfig({
});
```
-Store your private key in Hardhat's encrypted keystore so it never lives in a plaintext file:
+Store your private key in the encrypted Hardhat keystore so that the key is never stored in a plaintext file:
```bash
npx hardhat keystore set SEI_PRIVATE_KEY
@@ -135,13 +142,13 @@ Then deploy it:
npx hardhat ignition deploy ignition/modules/MyContract.ts --network sei
```
-## Verifying Contracts
+## Verifying contracts
-Sei's block explorer is [Seiscan](https://seiscan.io). The recommended verification method is [Sourcify](https://sourcify.dev/) — no API key required.
+The Sei block explorer is [Seiscan](https://seiscan.io). The recommended verification method is [Sourcify](https://sourcify.dev/). It does not require an API key.
### Foundry
-Verify after deployment:
+Verify the contract after you deploy it:
```bash
forge verify-contract \
@@ -162,17 +169,17 @@ forge create src/MyContract.sol:MyContract \
--chain-id 1329
```
-For testnet, use `--chain-id 1328` and `--rpc-url https://evm-rpc-testnet.sei-apis.com`.
+For Sei Testnet, use `--chain-id 1328` and `--rpc-url https://evm-rpc-testnet.sei-apis.com`.
### Hardhat
-If you use a Hardhat toolbox (as in the config above), `hardhat-verify` is already bundled and active — skip ahead to the verify command. Without a toolbox, install the plugin:
+If you use a Hardhat toolbox (as in the config above), `hardhat-verify` is already bundled and active. Skip ahead to the verify command. Without a toolbox, install the plugin:
```bash
npm install --save-dev @nomicfoundation/hardhat-verify
```
-Then add it to the `plugins` array in `hardhat.config.ts` — Sourcify verification is enabled by default in `hardhat-verify` and needs no API key:
+Then add it to the `plugins` array in `hardhat.config.ts`. Sourcify verification is enabled by default in `hardhat-verify` and does not need an API key:
```ts
import { defineConfig, configVariable } from 'hardhat/config';
@@ -210,11 +217,11 @@ If your contract has constructor arguments:
npx hardhat verify sourcify --network sei 0xDeployedContractAddress "arg1" "arg2"
```
-Running `npx hardhat verify` without the `sourcify` subtask attempts verification on all enabled providers (Etherscan, Blockscout, and Sourcify) in a single run.
+Without the `sourcify` subtask, `npx hardhat verify` tries to verify the contract on all enabled providers (Etherscan, Blockscout, and Sourcify) in a single run.
-## Network Reference
+## Network reference
-| Network | Chain ID | RPC | Explorer |
+| Network | EVM chain ID | RPC | Explorer |
| --- | --- | --- | --- |
-| Mainnet | 1329 | `https://evm-rpc.sei-apis.com` | [seiscan.io](https://seiscan.io) |
-| Testnet | 1328 | `https://evm-rpc-testnet.sei-apis.com` | [testnet.seiscan.io](https://testnet.seiscan.io) |
+| Sei Mainnet | 1329 | `https://evm-rpc.sei-apis.com` | [seiscan.io](https://seiscan.io) |
+| Sei Testnet | 1328 | `https://evm-rpc-testnet.sei-apis.com` | [testnet.seiscan.io](https://testnet.seiscan.io) |
diff --git a/evm/evm-parity/examples/erc1155.mdx b/evm/evm-parity/examples/erc1155.mdx
index 3bf8554..8a397f4 100644
--- a/evm/evm-parity/examples/erc1155.mdx
+++ b/evm/evm-parity/examples/erc1155.mdx
@@ -6,25 +6,25 @@ description: 'Reading and writing ERC-1155 multi-token contracts on Sei with vie
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
import { AddSeiButton } from '/snippets/add-sei-button.jsx';
-# ERC-1155 Interaction
+# ERC-1155 interaction
-ERC-1155 is the multi-token standard — a single contract can hold both fungible tokens (like gold coins in a game) and non-fungible tokens (like unique items), with efficient batch operations built in. Standard ERC-1155 contracts work on Sei without modification.
+ERC-1155 is the multi-token standard. A single contract can hold both fungible tokens (like gold coins in a game) and non-fungible tokens (like unique items). The standard also has efficient batch operations built in. Standard ERC-1155 contracts work on Sei without modification.
## Try it: deploy an ERC-1155
-Compile and deploy a real ERC-1155 to Sei Testnet from the browser — the Remix sandbox preloads an OpenZeppelin-based `DemoMultiToken` with a public `mint(id, amount)`. Then point the read/write patterns below at your deployed address.
+Compile and deploy a real ERC-1155 to Sei Testnet from the browser. The Remix sandbox preloads an OpenZeppelin-based `DemoMultiToken` with a public `mint(id, amount)` function. Then use the read and write patterns below with your deployed address.
First, add Sei Testnet to your wallet:
-In Remix, compile under **Solidity Compiler**, then **Deploy & Run** with **Environment** set to **Injected Provider — MetaMask**.
+In Remix, compile the contract on the **Solidity Compiler** tab. Then deploy it from the **Deploy & Run** tab with **Environment** set to **Injected Provider - MetaMask**.
## Setup
@@ -80,7 +80,7 @@ const writeContract = new ethers.Contract(CONTRACT, ERC1155_ABI, wallet);
-## Reading a Single Balance
+## Reading a single balance
@@ -99,9 +99,9 @@ const balance = await readContract.balanceOf('0xOwnerAddress', 1n);
-## Batch Balance Query
+## Batch balance query
-`balanceOfBatch` retrieves multiple owner/ID pairs in one call — the most efficient way to load a user's inventory:
+`balanceOfBatch` fetches the balances for multiple owner and ID pairs in one call. This is the most efficient way to load a user's inventory:
@@ -127,7 +127,7 @@ const balances = await readContract.balanceOfBatch(owners, ids);
-## Reading Token Metadata URI
+## Reading token metadata URI
```ts viem
const uri = await client.readContract({
@@ -140,7 +140,7 @@ const uri = await client.readContract({
const resolvedUri = uri.replace('{id}', (1n).toString(16).padStart(64, '0'));
```
-## Transferring a Single Token
+## Transferring a single token
@@ -162,7 +162,7 @@ const receipt = await tx.wait();
-## Batch Transfer
+## Batch transfer
Send multiple token IDs in a single transaction:
@@ -195,7 +195,7 @@ const tx = await writeContract.safeBatchTransferFrom(
-## Operator Approval
+## Operator approval
@@ -225,7 +225,7 @@ const isApproved = await readContract.isApprovedForAll('0xOwnerAddress', '0xOper
-## Watching Transfer Events
+## Watching transfer events
diff --git a/evm/evm-parity/examples/erc20.mdx b/evm/evm-parity/examples/erc20.mdx
index 8f69b97..4ce4de7 100644
--- a/evm/evm-parity/examples/erc20.mdx
+++ b/evm/evm-parity/examples/erc20.mdx
@@ -6,25 +6,25 @@ description: 'Reading and writing ERC-20 tokens on Sei with viem and ethers'
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
import { AddSeiButton } from '/snippets/add-sei-button.jsx';
-# ERC-20 Interaction
+# ERC-20 interaction
-Standard ERC-20 contracts work on Sei without modification. This page covers the common read and write operations using viem and ethers.
+Standard ERC-20 contracts work on Sei without modification. This page shows the common read and write operations with viem and ethers.
## Try it: deploy an ERC-20
-Compile and deploy a real ERC-20 to Sei Testnet from the browser — the Remix sandbox preloads an OpenZeppelin-based `DemoToken`. Then point the read/write patterns below at your deployed address.
+Compile and deploy a real ERC-20 to Sei Testnet from the browser. The Remix sandbox preloads an OpenZeppelin-based `DemoToken`. Then use the read and write patterns below with your deployed address.
First, add Sei Testnet to your wallet:
-In Remix, compile under **Solidity Compiler**, then **Deploy & Run** with **Environment** set to **Injected Provider — MetaMask**.
+In Remix, compile the contract on the **Solidity Compiler** tab. Then deploy it from the **Deploy & Run** tab with **Environment** set to **Injected Provider - MetaMask**.
## Setup
@@ -84,7 +84,7 @@ const writeContract = new ethers.Contract(TOKEN, ERC20_ABI, wallet);
-## Reading Token Metadata
+## Reading token metadata
@@ -108,7 +108,7 @@ const [name, symbol, decimals, totalSupply] = await Promise.all([
-## Reading Balances and Allowances
+## Reading balances and allowances
@@ -135,7 +135,7 @@ const allowance = await readContract.allowance('0xOwnerAddress', '0xSpenderAddre
-## Transferring Tokens
+## Transferring tokens
@@ -159,7 +159,7 @@ const receipt = await tx.wait();
-## Approving a Spender
+## Approving a spender
@@ -193,7 +193,7 @@ const txMax = await writeContract.approve('0xSpenderAddress', ethers.MaxUint256)
-## Watching Transfer Events
+## Watching transfer events
@@ -224,7 +224,7 @@ readContract.off('Transfer');
-## Fetching Historical Transfers
+## Fetching historical transfers
@@ -245,6 +245,6 @@ const logs = await readContract.queryFilter(filter, 0, 'latest');
-## CosmWasm Token Compatibility
+## CosmWasm token compatibility
-CW20 tokens on Sei have ERC-20 pointer contracts that expose the standard ERC-20 interface. You can use all of the patterns above against a CW20 pointer address. See [Pointer Contracts](/evm/evm-parity/examples/pointer-contracts) for how to look up the pointer address.
+CW20 tokens on Sei have ERC-20 pointer contracts that expose the standard ERC-20 interface. You can use all of the patterns above with a CW20 pointer address. To look up the pointer address, see [Pointer Contracts](/evm/evm-parity/examples/pointer-contracts).
diff --git a/evm/evm-parity/examples/erc721.mdx b/evm/evm-parity/examples/erc721.mdx
index 97402fa..1855c8e 100644
--- a/evm/evm-parity/examples/erc721.mdx
+++ b/evm/evm-parity/examples/erc721.mdx
@@ -6,25 +6,25 @@ description: 'Reading and writing ERC-721 NFTs on Sei with viem and ethers'
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
import { AddSeiButton } from '/snippets/add-sei-button.jsx';
-# ERC-721 Interaction
+# ERC-721 interaction
-Standard ERC-721 contracts work on Sei without modification. This page covers reading token ownership, transferring NFTs, and managing approvals.
+Standard ERC-721 contracts work on Sei without modification. This page shows how to read token ownership, transfer NFTs, and manage approvals.
## Try it: deploy an ERC-721
-Compile and deploy a real ERC-721 to Sei Testnet from the browser — the Remix sandbox preloads an OpenZeppelin-based `DemoNFT` with a public `mint()`. Then point the patterns below at your deployed address.
+Compile and deploy a real ERC-721 to Sei Testnet from the browser. The Remix sandbox preloads an OpenZeppelin-based `DemoNFT` with a public `mint()` function. Then use the patterns below with your deployed address.
First, add Sei Testnet to your wallet:
-In Remix, compile under **Solidity Compiler**, then **Deploy & Run** with **Environment** set to **Injected Provider — MetaMask**.
+In Remix, compile the contract on the **Solidity Compiler** tab. Then deploy it from the **Deploy & Run** tab with **Environment** set to **Injected Provider - MetaMask**.
## Setup
@@ -90,7 +90,7 @@ const writeContract = new ethers.Contract(NFT, ERC721_ABI, wallet);
-## Reading Token Data
+## Reading token data
@@ -116,7 +116,7 @@ const [owner, uri, approved] = await Promise.all([
-## Checking Ownership Count
+## Checking ownership count
@@ -157,7 +157,7 @@ const receipt = await tx.wait();
-## Approving a Single Token
+## Approving a single token
@@ -176,7 +176,7 @@ const tx = await writeContract.approve('0xOperatorAddress', 1n);
-## Approving All Tokens (Operator)
+## Approving all tokens (operator)
@@ -208,7 +208,7 @@ const revokeTx = await writeContract.setApprovalForAll('0xOperatorAddress', fals
-## Watching Transfer Events
+## Watching transfer events
@@ -239,6 +239,6 @@ readContract.off('Transfer');
-## CosmWasm NFT Compatibility
+## CosmWasm NFT compatibility
-CW721 tokens on Sei have ERC-721 pointer contracts that expose the standard ERC-721 interface. You can use all of the patterns above against a CW721 pointer address. See [Pointer Contracts](/evm/evm-parity/examples/pointer-contracts) for how to look up the pointer address.
+CW721 tokens on Sei have ERC-721 pointer contracts that expose the standard ERC-721 interface. You can use all of the patterns above with a CW721 pointer address. To look up the pointer address, see [Pointer Contracts](/evm/evm-parity/examples/pointer-contracts).
diff --git a/evm/evm-parity/examples/error-handling.mdx b/evm/evm-parity/examples/error-handling.mdx
index ae7aac4..ff265c7 100644
--- a/evm/evm-parity/examples/error-handling.mdx
+++ b/evm/evm-parity/examples/error-handling.mdx
@@ -5,20 +5,20 @@ description: 'Decode contract reverts, handle wallet rejections, and recover fro
import { RunSnippet } from '/snippets/run-snippet.jsx';
-# Error Handling
+# Error handling
Most transaction failures fall into three categories: contract reverts, wallet rejections, and RPC errors. This page shows how to decode each type and respond correctly.
## Try it: see real errors
-The `RunSnippet` widget surfaces whatever the RPC returns — including failures. These two calls fail on purpose so you can see the exact error shape your code has to handle, live against Sei Mainnet.
+The `RunSnippet` widget shows whatever the RPC returns, including failures. These two live calls to Sei Mainnet fail on purpose. They show the exact error shape that your code has to handle.
-## Contract Reverts
+## Contract reverts
-When a transaction reverts, the error contains the revert reason if the contract provides one.
+When a transaction reverts and the contract gives a revert reason, the error contains that reason.
@@ -77,9 +77,9 @@ try {
-## Simulating Before Sending
+## Simulating before sending
-Always simulate write calls before submitting them. Simulation runs the call against current chain state and surfaces reverts before you spend gas:
+Always simulate write calls before you submit them. Simulation runs the call against the current chain state and reports reverts before you spend gas:
```ts viem
import { ContractFunctionRevertedError, BaseError } from 'viem';
@@ -92,7 +92,7 @@ async function safeWrite(params: Parameters[0
}
```
-## Wallet Rejections
+## Wallet rejections
Users can reject signature and transaction requests. These rejections have a predictable error code:
@@ -123,7 +123,7 @@ try {
-## Insufficient Funds
+## Insufficient funds
@@ -151,9 +151,9 @@ try {
-## Classifying Any Error
+## Classifying any error
-A utility to handle the most common cases in one place:
+This utility handles the most common cases in one place:
```ts
import {
@@ -178,9 +178,9 @@ function classifyError(err: unknown): string {
}
```
-## RPC Errors and Retries
+## RPC errors and retries
-Transient RPC failures (network timeouts, rate limits) can be retried. Don't retry on contract reverts or user rejections — those are deterministic.
+You can retry transient RPC failures, such as network timeouts and rate limits. Do not retry contract reverts or user rejections. Those failures are deterministic.
```ts
async function withRetry(fn: () => Promise, maxAttempts = 3): Promise {
diff --git a/evm/evm-parity/examples/ethers-quickstart.mdx b/evm/evm-parity/examples/ethers-quickstart.mdx
index ca77879..51ce8cf 100644
--- a/evm/evm-parity/examples/ethers-quickstart.mdx
+++ b/evm/evm-parity/examples/ethers-quickstart.mdx
@@ -6,9 +6,9 @@ description: 'Using ethers v6 with Sei in a Node.js script or browser context'
import { RunSnippet } from '/snippets/run-snippet.jsx';
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
-# ethers v6 Quickstart
+# ethers v6 quickstart
-This example covers ethers v6 with Sei. The patterns apply whether you are writing a Node.js script, a CLI tool, or a browser app.
+This example shows how to use ethers v6 with Sei. The patterns apply whether you write a Node.js script, a CLI tool, or a browser dApp.
## Install
@@ -16,13 +16,13 @@ This example covers ethers v6 with Sei. The patterns apply whether you are writi
npm install ethers
```
-These snippets are TypeScript. Run any of them with no separate build step using [`tsx`](https://www.npmjs.com/package/tsx) (Node 18+):
+These snippets are TypeScript. To run any of them without a separate build step, use [`tsx`](https://www.npmjs.com/package/tsx) (Node 18+):
```bash
npx tsx script.ts
```
-## Read-Only Provider
+## Read-only provider
```ts
import { ethers } from 'ethers';
@@ -30,9 +30,9 @@ import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://evm-rpc.sei-apis.com');
```
-## Reading Chain Data
+## Reading chain data
-This is the first milestone — it needs no private key.
+This is the first milestone. It does not need a private key.
```ts
// Any valid Sei EVM address — swap in your own
@@ -48,7 +48,7 @@ const nonce = await provider.getTransactionCount(address); // number
console.log('Nonce:', nonce);
```
-**You're done when you see:**
+**You are done when you see:**
```text
Block number: 148203117
@@ -56,11 +56,11 @@ Balance (SEI): 12.5
Nonce: 7
```
-The exact numbers are illustrative — your block number and balance will differ. `getBlockNumber()` and `getTransactionCount()` return a `number`, while `getBalance()` returns a `bigint` in wei (format it with `ethers.formatEther()`).
+The exact numbers are illustrative. Your block number and balance will differ. `getBlockNumber()` and `getTransactionCount()` return a `number`, while `getBalance()` returns a `bigint` in wei. To format the balance, use `ethers.formatEther()`.
## Try it live
-Run these read-only calls against Sei Mainnet right now — no install, no private key. They're plain JSON-RPC, the same reads the script above performs.
+Run these read-only calls against Sei Mainnet. You do not need to install anything or use a private key. They are plain JSON-RPC calls, the same reads that the script above performs.
@@ -69,21 +69,21 @@ Run these read-only calls against Sei Mainnet right now — no install, no priva
params={["0x0000000000000000000000000000000000000000", "latest"]}
network="mainnet"
title="eth_getBalance"
- description="Balance in wei of the example address at the latest block — swap in any address."
+ description="Balance in wei of the example address at the latest block. You can replace the example address with any address."
/>
## Edit and run
-Edit and re-run the full ethers code from this page live in the browser — a real ethers v6 `JsonRpcProvider` reading **Sei Testnet**, so its block number and balances won't match the mainnet reads above:
+Edit and re-run the full ethers code from this page live in the browser. The sandbox uses a real ethers v6 `JsonRpcProvider` that reads **Sei Testnet**. Its block number and balances therefore do not match the Sei Mainnet reads above:
-## Browser Provider
+## Browser provider
In a browser context, connect to the user's injected wallet:
@@ -93,17 +93,17 @@ const signer = await provider.getSigner();
const address = await signer.getAddress();
```
-## Wallet from Private Key
+## Wallet from private key
-For scripts and backend services:
+Use this pattern in scripts and backend services:
```ts
const wallet = new ethers.Wallet('0xYourPrivateKey', provider);
```
-## Sending a Transaction
+## Sending a transaction
-Next step — this requires a funded account; get testnet SEI from the [faucet](/learn/faucet).
+This next step requires a funded account. Get testnet SEI from the [faucet](/learn/faucet).
```ts
const tx = await wallet.sendTransaction({
@@ -115,7 +115,7 @@ const receipt = await tx.wait();
// receipt is final immediately — Sei has instant finality
```
-## Reading a Contract
+## Reading a contract
```ts
const abi = ['function balanceOf(address owner) view returns (uint256)'];
@@ -124,9 +124,9 @@ const contract = new ethers.Contract('0xTokenAddress', abi, provider);
const balance = await contract.balanceOf('0xYourAddress');
```
-## Writing to a Contract
+## Writing to a contract
-Pass a signer (wallet or browser signer) to the contract constructor for write operations:
+For write operations, pass a signer (a wallet or a browser signer) to the contract constructor:
```ts
const contract = new ethers.Contract('0xTokenAddress', abi, wallet);
@@ -135,7 +135,7 @@ const tx = await contract.transfer('0xRecipient', 1_000_000n);
const receipt = await tx.wait();
```
-## Estimating Gas
+## Estimating gas
```ts
const gas = await provider.estimateGas({
@@ -145,7 +145,7 @@ const gas = await provider.estimateGas({
});
```
-## Listening for Events
+## Listening for events
```ts
contract.on('Transfer', (from, to, value) => {
@@ -156,10 +156,10 @@ contract.on('Transfer', (from, to, value) => {
contract.off('Transfer');
```
-## Next Steps
+## Next steps
-- [Python quickstart (web3.py)](/evm/python-quickstart) — the same first steps in Python
-- [ERC-20 interaction](/evm/evm-parity/examples/erc20) — full token read/write examples
-- [ERC-721 interaction](/evm/evm-parity/examples/erc721) — NFT ownership, transfers, and approvals
-- [Pointer contracts](/evm/evm-parity/examples/pointer-contracts) — interact with CosmWasm tokens via ERC interfaces
-- [WebSocket connections](/evm/evm-parity/websocket) — real-time block and event subscriptions
+- [Python quickstart (web3.py)](/evm/python-quickstart): the same first steps in Python
+- [ERC-20 interaction](/evm/evm-parity/examples/erc20): full token read and write examples
+- [ERC-721 interaction](/evm/evm-parity/examples/erc721): NFT ownership, transfers, and approvals
+- [Pointer contracts](/evm/evm-parity/examples/pointer-contracts): interact with CosmWasm tokens through ERC interfaces
+- [WebSocket connections](/evm/evm-parity/websocket): real-time block and event subscriptions
diff --git a/evm/evm-parity/examples/multicall.mdx b/evm/evm-parity/examples/multicall.mdx
index 452a6e2..f57c6b3 100644
--- a/evm/evm-parity/examples/multicall.mdx
+++ b/evm/evm-parity/examples/multicall.mdx
@@ -7,20 +7,20 @@ import { RunSnippet } from '/snippets/run-snippet.jsx';
# Multicall
-Multicall3 lets you batch multiple read calls into a single RPC round-trip, dramatically reducing latency for dashboards, portfolio pages, and any view that needs data from multiple contracts at once.
+Multicall3 lets you batch multiple read calls into a single RPC round trip. This greatly reduces latency for dashboards, portfolio pages, and any view that needs data from multiple contracts at once.
-Multicall3 is deployed at `0xcA11bde05977b3631167028862bE2a173976CA11` on Sei Mainnet and Sei Testnet — the same address as Ethereum.
+Multicall3 is deployed at `0xcA11bde05977b3631167028862bE2a173976CA11` on Sei Mainnet and Sei Testnet. This is the same address as on Ethereum.
## Try it live
-Multicall3 is a normal contract — you can hit it with a single `eth_call` and no SDK. These run its two zero-argument helpers on Sei Mainnet; the hex results decode to decimal below each response.
+Multicall3 is a normal contract, so you can call it with a single `eth_call` and no SDK. These snippets run its two zero-argument helpers on Sei Mainnet. Below each response, the widget decodes the hex result to decimal.
-## Batching ERC-20 Reads with viem
+## Batching ERC-20 reads with viem
viem's `multicall` action wraps Multicall3 automatically:
@@ -77,9 +77,9 @@ tokens.forEach((address, i) => {
});
```
-## Allowing Individual Call Failures
+## Allowing individual call failures
-By default, a single failed call causes the entire batch to revert. Use `allowFailure: true` (the default in viem) to get partial results instead:
+By default, a single failed call causes the entire batch to revert. To get partial results instead, use `allowFailure: true` (the default in viem):
```ts
const results = await client.multicall({
@@ -101,7 +101,7 @@ results.forEach((result) => {
## Batching with ethers
-ethers doesn't have a built-in multicall action, but you can call the Multicall3 contract directly:
+ethers does not have a built-in multicall action, but you can call the Multicall3 contract directly:
```ts
import { ethers } from 'ethers';
@@ -138,9 +138,9 @@ results.forEach(({ success, returnData }: { success: boolean; returnData: string
});
```
-## Wagmi
+## wagmi
-In React apps, `useReadContracts` handles batching automatically:
+In React dApps, `useReadContracts` handles batching automatically:
```tsx
import { useReadContracts } from 'wagmi';
diff --git a/evm/evm-parity/examples/pointer-contracts.mdx b/evm/evm-parity/examples/pointer-contracts.mdx
index ccc9973..6fe57d5 100644
--- a/evm/evm-parity/examples/pointer-contracts.mdx
+++ b/evm/evm-parity/examples/pointer-contracts.mdx
@@ -3,12 +3,12 @@ title: 'Pointer Contracts'
description: 'Looking up and interacting with pointer contracts that bridge CosmWasm and EVM tokens on Sei'
---
-# Pointer Contracts
+# Pointer contracts
-Sei runs two token execution environments side by side — EVM and CosmWasm. Pointer contracts are automatically deployed EVM contracts that proxy a CosmWasm token, and vice versa.
+Sei runs two token execution environments side by side: EVM and CosmWasm. Pointer contracts are automatically deployed EVM contracts that proxy a CosmWasm token, and vice versa.
-This guide covers pointers for already-deployed CosmWasm contracts only. It does not document native-denom pointer workflows. IBC is disabled in both directions, and tokenfactory is not a supported development path. See [IBC is disabled](/learn/sip-03-migration#ibc-is-disabled) and [Tokenfactory is not supported](/cosmos-sdk#tokenfactory-is-not-supported).
+This guide covers pointers only for CosmWasm contracts that are already deployed. It does not document native-denom pointer workflows. IBC is disabled in both directions. Tokenfactory is not a supported development path. See [IBC is disabled](/learn/sip-03-migration#ibc-is-disabled) and [Tokenfactory is not supported](/cosmos-sdk#tokenfactory-is-not-supported).
| Token | Pointer type | EVM interface |
@@ -17,13 +17,13 @@ This guide covers pointers for already-deployed CosmWasm contracts only. It does
| CW721 (CosmWasm NFT) | ERC-721 pointer | Standard ERC-721 |
| CW1155 (CosmWasm multi-token) | ERC-1155 pointer | Standard ERC-1155 |
-Once you have the pointer address, you interact with it using the standard ERC-20, ERC-721, or ERC-1155 interface.
+After you have the pointer address, you interact with it through the standard ERC-20, ERC-721, or ERC-1155 interface.
For background on how pointer contracts work, see the [Pointers overview](/learn/pointers).
-## Looking Up a Pointer Address
+## Looking up a pointer address
-The pointerview precompile resolves pointer addresses for existing CosmWasm contracts. Its ABI and address are exported from `@sei-js/precompiles`.
+The pointerview precompile resolves pointer addresses for existing CosmWasm contracts. `@sei-js/precompiles` exports its ABI and address.
@@ -89,11 +89,11 @@ const erc1155Pointer = await pointerview.getCW1155Pointer('sei1...cw1155Contract
-The return value includes the pointer address and an `exists` boolean. Check `exists` before interacting with the pointer — not all CosmWasm tokens have a deployed pointer.
+The return value includes the pointer address and an `exists` boolean. Check `exists` before you interact with the pointer. Not all CosmWasm tokens have a deployed pointer.
-## Interacting with a CW20 Pointer as ERC-20
+## Interacting with a CW20 pointer as ERC-20
-Once you have the pointer address, use it as a standard ERC-20 contract.
+After you have the pointer address, use it as a standard ERC-20 contract.
@@ -125,7 +125,7 @@ const balance = await token.balanceOf('0xYourAddress');
-## Interacting with a CW721 Pointer as ERC-721
+## Interacting with a CW721 pointer as ERC-721
@@ -157,4 +157,4 @@ const owner = await nft.ownerOf(1n);
-For full ERC-20 and ERC-721 examples including transfers, approvals, and events, see the [ERC-20](/evm/evm-parity/examples/erc20) and [ERC-721](/evm/evm-parity/examples/erc721) pages.
+For full ERC-20 and ERC-721 examples, including transfers, approvals, and events, see the [ERC-20](/evm/evm-parity/examples/erc20) and [ERC-721](/evm/evm-parity/examples/erc721) pages.
diff --git a/evm/evm-parity/examples/sei-precompiles.mdx b/evm/evm-parity/examples/sei-precompiles.mdx
index 37d4090..631f8cc 100644
--- a/evm/evm-parity/examples/sei-precompiles.mdx
+++ b/evm/evm-parity/examples/sei-precompiles.mdx
@@ -5,20 +5,20 @@ description: 'Interact with native Sei chain features — staking, governance, n
import { RunSnippet } from '/snippets/run-snippet.jsx';
-Sei exposes native chain functionality through precompiled contracts at deterministic EVM addresses. You can call them from any EVM library (viem, ethers, wagmi) using the ABIs exported from `@sei-js/precompiles` — no special SDK required.
+Sei exposes native chain functionality through precompiled contracts at deterministic EVM addresses. You can call them from any EVM library (viem, ethers, or wagmi) with the ABIs that `@sei-js/precompiles` exports. You do not need a special SDK.
Available precompiles include:
-- **Bank** — query the native SEI bank balance
-- **Staking** — delegate, undelegate, query delegations
-- **Distribution** — claim staking rewards
-- **Governance** — vote on active proposals
-- **JSON** — parse JSON payloads within contracts
-- **P256** — verify P-256 elliptic curve signatures
+- **Bank**: query the native SEI bank balance
+- **Staking**: delegate, undelegate, and query delegations
+- **Distribution**: claim staking rewards
+- **Governance**: vote on active proposals
+- **JSON**: parse JSON payloads within contracts
+- **P256**: verify P-256 elliptic curve signatures
## Try it live
-Precompiles are callable like any contract — even with a plain `eth_call` from the browser. This hits the **Bank** precompile at `0x0000000000000000000000000000000000001001` on Sei Mainnet, calling `name("usei")`. The response is ABI-encoded; it contains the bytes `53 45 49` — ASCII for `SEI`.
+You can call precompiles like any other contract, even with a plain `eth_call` from the browser. This snippet calls `name("usei")` on the Bank precompile at `0x0000000000000000000000000000000000001001` on Sei Mainnet. The response is ABI-encoded. It contains the bytes `53 45 49`, which are ASCII for `SEI`.
For installation instructions, code examples (viem and ethers), common patterns, and a full working Node.js script, see the precompiles reference:
-
- Usage examples for all precompiles with viem and ethers — Bank, Staking, Distribution, Governance, JSON, and P256.
+
+ Usage examples for all precompiles with viem and ethers: Bank, Staking, Distribution, Governance, JSON, and P256.
-For the full ABI reference and every available function on each precompile:
+For the full ABI reference and every available function on each precompile, see these pages:
-
-
-
-
-
+
+
+
+
+
diff --git a/evm/evm-parity/examples/transaction-lifecycle.mdx b/evm/evm-parity/examples/transaction-lifecycle.mdx
index dff4151..f99ee0f 100644
--- a/evm/evm-parity/examples/transaction-lifecycle.mdx
+++ b/evm/evm-parity/examples/transaction-lifecycle.mdx
@@ -5,19 +5,19 @@ description: 'Send transactions, wait for receipts, and decode event logs on Sei
import { RunSnippet } from '/snippets/run-snippet.jsx';
-# Transaction Lifecycle
+# Transaction lifecycle
-This page covers the full round-trip of a transaction: building and sending it, waiting for the receipt, and reading the event logs it emitted.
+This page covers the full round trip of a transaction: building and sending it, waiting for the receipt, and reading its event logs.
## Try it live
-Before you send anything, read the live chain state your transaction will interact with — straight from your browser against Sei Mainnet, no install or key required.
+Before you send anything, read the live chain state that your transaction will interact with. These calls run from your browser against Sei Mainnet. You do not need to install anything or use a key.
-
+
-## Sending a Transaction
+## Sending a transaction
@@ -49,7 +49,7 @@ const tx = await wallet.sendTransaction({
-## Waiting for the Receipt
+## Waiting for the receipt
@@ -77,11 +77,11 @@ console.log('Gas used:', receipt.gasUsed);
-Sei has instant finality — the receipt is final as soon as it arrives. One confirmation is sufficient. See [Finality](/evm/evm-parity/finality).
+Sei has instant finality, so the receipt is final as soon as it arrives. One confirmation is sufficient. See [Finality](/evm/evm-parity/finality).
-## Decoding Event Logs from a Receipt
+## Decoding event logs from a receipt
-After a contract interaction, decode the events the transaction emitted:
+After a contract interaction, decode the events that the transaction emitted:
@@ -144,9 +144,9 @@ for (const log of receipt.logs) {
-## Checking for Revert
+## Checking for revert
-A receipt with `status: 'reverted'` (viem) or `status: 0` (ethers) means the transaction was included but the execution failed. The gas was still consumed.
+A receipt with `status: 'reverted'` (viem) or `status: 0` (ethers) means that the transaction was included but the execution failed. The transaction still consumed gas.
```ts viem
const receipt = await client.waitForTransactionReceipt({ hash });
@@ -158,7 +158,7 @@ if (receipt.status === 'reverted') {
}
```
-## Fetching a Past Transaction
+## Fetching a past transaction
```ts viem
const tx = await client.getTransaction({ hash: '0xTxHash' });
@@ -173,9 +173,9 @@ const tx = await provider.getTransaction('0xTxHash');
const receipt = await provider.getTransactionReceipt('0xTxHash');
```
-## Getting Logs for a Specific Transaction
+## Getting logs for a specific transaction
-To fetch only the events emitted by a specific transaction (rather than decoding from the receipt):
+To fetch only the events that a specific transaction emitted, instead of decoding them from the receipt, use this pattern:
```ts viem
const logs = await client.getContractEvents({
diff --git a/evm/evm-parity/examples/viem-quickstart.mdx b/evm/evm-parity/examples/viem-quickstart.mdx
index 2698475..7085f18 100644
--- a/evm/evm-parity/examples/viem-quickstart.mdx
+++ b/evm/evm-parity/examples/viem-quickstart.mdx
@@ -6,9 +6,9 @@ description: 'Using viem with Sei in a Node.js script, CLI tool, or backend serv
import { RunSnippet } from '/snippets/run-snippet.jsx';
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
-# viem Quickstart
+# viem quickstart
-This example shows how to use viem with Sei outside of a React context — in a Node.js script, CLI tool, or backend service. For React apps, see [wagmi](https://wagmi.sh) and the [frontend guide](/evm/building-a-frontend).
+This example shows how to use viem with Sei outside a React context: in a Node.js script, a CLI tool, or a backend service. For React dApps, see [wagmi](https://wagmi.sh) and the [frontend guide](/evm/building-a-frontend).
## Install
@@ -16,13 +16,13 @@ This example shows how to use viem with Sei outside of a React context — in a
npm install viem
```
-These snippets are TypeScript. Run any of them with no separate build step using [`tsx`](https://www.npmjs.com/package/tsx) (Node 18+):
+These snippets are TypeScript. To run any of them without a separate build step, use [`tsx`](https://www.npmjs.com/package/tsx) (Node 18+):
```bash
npx tsx script.ts
```
-## Public Client
+## Public client
A public client handles all read-only operations.
@@ -45,9 +45,9 @@ const client = createPublicClient({
});
```
-## Reading Chain Data
+## Reading chain data
-This is the first milestone — it needs no private key.
+This is the first milestone. It does not need a private key.
```ts
import { formatEther } from 'viem';
@@ -65,7 +65,7 @@ const nonce = await client.getTransactionCount({ address }); // number
console.log('Nonce:', nonce);
```
-**You're done when you see:**
+**You are done when you see:**
```text
Block number: 148203117n
@@ -73,13 +73,13 @@ Balance (SEI): 12.5
Nonce: 7
```
-The exact numbers are illustrative — your block number and balance will differ. Note the trailing `n`: `getBlockNumber()` and `getBalance()` return `bigint`, while `getTransactionCount()` returns a `number`.
+The exact numbers are illustrative. Your block number and balance will differ. Note the trailing `n`: `getBlockNumber()` and `getBalance()` return a `bigint`, while `getTransactionCount()` returns a `number`.
## Try it live
-Run these read-only calls against Sei Mainnet right now — no install, no private key. They're the same reads the script above performs, issued straight from your browser.
+Run these read-only calls against Sei Mainnet. You do not need to install anything or use a private key. They are the same reads that the script above performs, sent directly from your browser.
-
+
@@ -88,21 +88,21 @@ Run these read-only calls against Sei Mainnet right now — no install, no priva
params={["0x0000000000000000000000000000000000000000", "latest"]}
network="mainnet"
title="eth_getBalance"
- description="Balance in wei of the example address at the latest block — swap in any address."
+ description="Balance in wei of the example address at the latest block. You can replace the example address with any address."
/>
## Edit and run
-The buttons above issue raw JSON-RPC. To run the full viem code from this page — imports, a public client, several reads — edit and re-run it live in the sandbox below. No install, no wallet, no key. Note the sandbox reads **Sei Testnet**, so its block number and balances won't match the mainnet reads above:
+The buttons above send raw JSON-RPC requests. The sandbox below runs the full viem code from this page: imports, a public client, and several reads. You can edit and re-run it live. You do not need to install anything, connect a wallet, or use a key. The sandbox reads **Sei Testnet**, so its block number and balances do not match the Sei Mainnet reads above:
-## Wallet Client
+## Wallet client
A wallet client handles signing and broadcasting transactions.
@@ -120,11 +120,11 @@ const walletClient = createWalletClient({
});
```
-For browser use, replace `http()` with `custom(window.ethereum)` and call `walletClient.getAddresses()` to get the connected account.
+For browser use, replace `http()` with `custom(window.ethereum)`. Then call `walletClient.getAddresses()` to get the connected account.
-## Sending a Transaction
+## Sending a transaction
-Next step — this requires a funded account; get testnet SEI from the [faucet](/learn/faucet).
+This next step requires a funded account. Get testnet SEI from the [faucet](/learn/faucet).
```ts
import { parseEther } from 'viem';
@@ -138,7 +138,7 @@ const receipt = await client.waitForTransactionReceipt({ hash });
// receipt is final immediately — Sei has instant finality
```
-## Reading a Contract
+## Reading a contract
```ts
import { parseAbi } from 'viem';
@@ -153,7 +153,7 @@ const balance = await client.readContract({
});
```
-## Writing to a Contract
+## Writing to a contract
```ts
const hash = await walletClient.writeContract({
@@ -166,7 +166,7 @@ const hash = await walletClient.writeContract({
const receipt = await client.waitForTransactionReceipt({ hash });
```
-## Simulating Before Writing
+## Simulating before writing
```ts
const { result } = await client.simulateContract({
@@ -181,9 +181,9 @@ const { result } = await client.simulateContract({
const hash = await walletClient.writeContract(result);
```
-## Estimating Gas
+## Estimating gas
-Always use `estimateGas` rather than hard-coding values. SSTORE costs on Sei are governance-adjustable.
+Always use `estimateGas` instead of hard-coded values. Governance can adjust SSTORE costs on Sei.
```ts
const gas = await client.estimateGas({
@@ -193,10 +193,10 @@ const gas = await client.estimateGas({
});
```
-## Next Steps
+## Next steps
-- [Python quickstart (web3.py)](/evm/python-quickstart) — the same first steps in Python
-- [ERC-20 interaction](/evm/evm-parity/examples/erc20) — full token read/write examples
-- [ERC-721 interaction](/evm/evm-parity/examples/erc721) — NFT ownership, transfers, and approvals
-- [Pointer contracts](/evm/evm-parity/examples/pointer-contracts) — interact with CosmWasm tokens via ERC interfaces
-- [WebSocket connections](/evm/evm-parity/websocket) — real-time block and event subscriptions
+- [Python quickstart (web3.py)](/evm/python-quickstart): the same first steps in Python
+- [ERC-20 interaction](/evm/evm-parity/examples/erc20): full token read and write examples
+- [ERC-721 interaction](/evm/evm-parity/examples/erc721): NFT ownership, transfers, and approvals
+- [Pointer contracts](/evm/evm-parity/examples/pointer-contracts): interact with CosmWasm tokens through ERC interfaces
+- [WebSocket connections](/evm/evm-parity/websocket): real-time block and event subscriptions
diff --git a/evm/evm-parity/examples/wagmi-react.mdx b/evm/evm-parity/examples/wagmi-react.mdx
index 1489047..44df2c5 100644
--- a/evm/evm-parity/examples/wagmi-react.mdx
+++ b/evm/evm-parity/examples/wagmi-react.mdx
@@ -5,21 +5,21 @@ description: 'Connect wallets, read chain state, and write transactions in a Rea
import { RunSnippet } from '/snippets/run-snippet.jsx';
-# Wagmi + React
+# wagmi + React
-[Wagmi](https://wagmi.sh) is the standard React library for EVM wallet connections and contract interactions. This page covers the essential patterns for a Sei frontend: configuration, wallet connect/disconnect, reading balances, and writing to contracts.
+[wagmi](https://wagmi.sh) is the standard React library for EVM wallet connections and contract interactions. This page covers the essential patterns for a Sei frontend: configuration, connecting and disconnecting a wallet, reading balances, and writing to contracts.
For Node.js scripts and backend services, see the [viem Quickstart](/evm/evm-parity/examples/viem-quickstart) instead.
## Try it live
-The hooks below — `useBlockNumber`, `useBalance` — are thin wrappers over JSON-RPC reads. Here are those same reads issued directly against Sei Mainnet, no wallet connection required, so you can see the data your components will render.
+The hooks below (`useBlockNumber` and `useBalance`) are thin wrappers over JSON-RPC reads. These snippets send the same reads directly to Sei Mainnet, without a wallet connection. They show the data that your components will render.
## Install
@@ -38,7 +38,7 @@ npm install wagmi viem @sei-js/precompiles@^3 @tanstack/react-query
## Configuration
-Configure Wagmi with the Sei chain and your preferred wallet connectors:
+Configure wagmi with Sei Mainnet, Sei Testnet, and your preferred wallet connectors:
```ts
// wagmi.config.ts
@@ -59,9 +59,9 @@ export const config = createConfig({
});
```
-## Provider Setup
+## Provider setup
-Wrap your app with `WagmiProvider` and `QueryClientProvider`:
+Wrap your dApp with `WagmiProvider` and `QueryClientProvider`:
```tsx
// App.tsx
@@ -82,7 +82,7 @@ export function App() {
}
```
-## Connecting a Wallet
+## Connecting a wallet
```tsx
import { useConnect, useDisconnect, useAccount } from 'wagmi';
@@ -113,7 +113,7 @@ export function WalletButton() {
}
```
-## Reading the Native SEI Balance
+## Reading the native SEI balance
```tsx
import { useBalance, useAccount } from 'wagmi';
@@ -131,7 +131,7 @@ export function SeiBalance() {
}
```
-## Reading a Contract
+## Reading a contract
```tsx
import { useReadContract } from 'wagmi';
@@ -162,9 +162,9 @@ export function TokenBalance({ tokenAddress, owner }: { tokenAddress: `0x${strin
}
```
-## Writing to a Contract
+## Writing to a contract
-Use `useWriteContract` for transactions that mutate state, and `useWaitForTransactionReceipt` to track confirmation:
+Use `useWriteContract` for transactions that change state. Use `useWaitForTransactionReceipt` to track confirmation:
```tsx
import { useWriteContract, useWaitForTransactionReceipt } from 'wagmi';
@@ -198,9 +198,9 @@ export function TransferButton({ tokenAddress }: { tokenAddress: `0x${string}` }
}
```
-Sei has instant finality — `useWaitForTransactionReceipt` resolves as soon as the transaction is included in a block. A single confirmation is final. See [Finality](/evm/evm-parity/finality).
+Sei has instant finality, so `useWaitForTransactionReceipt` resolves as soon as the transaction is included in a block. A single confirmation is final. See [Finality](/evm/evm-parity/finality).
-## Watching the Connected Chain
+## Watching the connected chain
```tsx
import { useChainId, useSwitchChain } from 'wagmi';
diff --git a/evm/evm-parity/finality.mdx b/evm/evm-parity/finality.mdx
index f4a4cc9..5d60539 100644
--- a/evm/evm-parity/finality.mdx
+++ b/evm/evm-parity/finality.mdx
@@ -3,21 +3,21 @@ title: 'Finality and Block Tags'
description: 'How Sei instant finality affects block tag behavior and pending state'
---
-# Finality and Block Tags
+# Finality and block tags
-Sei uses Twin Turbo Consensus, which provides instant finality. Every committed block is final immediately — there is no period where a block could be reorganized away.
+Sei uses Twin Turbo Consensus, which gives instant finality. Every committed block is final immediately. There is no period in which a reorganization could remove it.
-This changes how block tags behave compared to Ethereum.
+Because of this, block tags behave differently on Sei than on Ethereum.
-## Block Tags
+## Block tags
On Ethereum, `latest`, `safe`, and `finalized` refer to different points in the chain:
-- `latest` — the most recent block, possibly not yet safe
-- `safe` — a block unlikely to be reorganized
-- `finalized` — a block that is permanently committed
+- `latest`: the most recent block, possibly not yet safe
+- `safe`: a block that is unlikely to be reorganized
+- `finalized`: a block that is permanently committed
-On Sei, all three tags resolve to the same block. There is no reorg risk at any point after a block is committed, so the distinction does not exist.
+On Sei, all three tags resolve to the same block. After a block is committed, there is no reorg risk at any point, so the distinction does not exist.
@@ -46,7 +46,7 @@ const finalized = await provider.getBlock('finalized');
-## Waiting for Confirmation
+## Waiting for confirmation
Because finality is instant, you do not need to wait for multiple confirmations. `waitForTransactionReceipt` resolves as soon as the transaction is included in a block.
@@ -64,17 +64,17 @@ const receipt = await tx.wait(1); // 1 confirmation is final on Sei
-## Pending State
+## Pending state
Sei does not expose Ethereum-style pending state. Do not rely on:
- Reading pending transactions from the mempool
- `eth_getBlockByNumber` with `'pending'`
-- Pending nonce differing from the confirmed nonce
+- A pending nonce that differs from the confirmed nonce
-If your application polls pending transactions or depends on pending state visibility, replace that pattern with confirmed-block polling or WebSocket subscriptions on committed blocks.
+If your application polls pending transactions or depends on pending state visibility, replace that pattern. Use confirmed-block polling or WebSocket subscriptions on committed blocks instead.
-## Practical Impact
+## Practical impact
| Pattern | On Ethereum | On Sei |
| --- | --- | --- |
diff --git a/evm/evm-parity/gas-and-fees.mdx b/evm/evm-parity/gas-and-fees.mdx
index 5827302..8eb79ed 100644
--- a/evm/evm-parity/gas-and-fees.mdx
+++ b/evm/evm-parity/gas-and-fees.mdx
@@ -3,15 +3,15 @@ title: 'Gas and Fees'
description: 'Sei gas price floor, EIP-1559 fee model differences, and SSTORE cost'
---
-# Gas and Fees
+# 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.
+Sei supports both legacy and EIP-1559 transactions. However, the fee model differs from Ethereum in three ways that affect how you estimate and set gas.
-## Legacy Gas Price Floor
+## 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.
+Legacy transactions (type 0) on Sei must meet a minimum gas price set by on-chain governance. Governance proposals can change this floor, so do not hard-code a specific value.
-Use `eth_gasPrice` to read the current minimum:
+To read the current minimum, use `eth_gasPrice`:
@@ -33,11 +33,11 @@ const gasPrice = feeData.gasPrice;
-## EIP-1559 Fee Model
+## 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.
+Sei supports EIP-1559 transactions (type 2), but it does not burn the base fee. All fees go to validators. On Ethereum, part of the fee is burned.
-This does not affect how you construct or send transactions — `maxFeePerGas` and `maxPriorityFeePerGas` work as expected. It is relevant only if your application models token supply or displays fee-burn information to users.
+This does not affect how you construct or send transactions. `maxFeePerGas` and `maxPriorityFeePerGas` work as expected. It matters only if your application models token supply or shows fee-burn information to users.
@@ -54,16 +54,16 @@ const feeData = await provider.getFeeData();
-### Effective Gas Price on Receipts
+### Effective gas price on receipts
-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.
+For dynamic-fee (type 2) transactions, the `effectiveGasPrice` field of the transaction receipt reports the **actual price charged**, not the fee cap. That price is `min(baseFee + maxPriorityFeePerGas, maxFeePerGas)`. This matches standard EIP-1559 semantics. Clients such as ethers and Hardhat therefore see the same `effectiveGasPrice` behavior that they expect from Ethereum.
-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.
+In practice, when your priority tip plus the base fee stays below `maxFeePerGas`, the receipt reports `baseFee + maxPriorityFeePerGas`, not `maxFeePerGas`. To compute what a transaction paid, use the receipt's `effectiveGasPrice`, not `maxFeePerGas`.
-## SSTORE Cost
+## 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.
+On Sei, governance can adjust the gas cost of `SSTORE` (a write to contract storage). The current cost is **72,000 gas** on both Sei Mainnet and Sei Testnet. For details, see [Differences with Ethereum](/evm/differences-with-ethereum#sstore-gas-cost). Treat this number as the current value, not a constant. Do not hard-code storage write estimates in your application.
Always use `eth_estimateGas` for any transaction that writes to storage:
@@ -90,7 +90,7 @@ const gas = await provider.estimateGas({
-A Foundry `forge test --gas-report --fork-url ` report forks chain *state* but runs revm's standard EVM gas schedule, so it shows `SSTORE` at the Ethereum cost (~22,100) rather than Sei's ~72,000. Use it for relative profiling of your own logic; estimate the absolute storage-write cost with a live `eth_estimateGas` against a Sei RPC.
+Estimate the absolute storage-write cost with a live `eth_estimateGas` call against a Sei RPC. A Foundry `forge test --gas-report --fork-url ` report forks the chain *state*, but it runs the standard EVM gas schedule of revm. It therefore shows `SSTORE` at the Ethereum cost (approximately 22,100) instead of the Sei cost (approximately 72,000). Use the report for relative profiling of your own logic.
## Summary
@@ -99,4 +99,4 @@ const gas = await provider.estimateGas({
| Legacy gas floor | Protocol minimum | Governance-set, can change |
| Base fee | Burned | Paid to validators |
| SSTORE cost | Fixed by EIP | Governance-adjustable |
-| `estimateGas` | Always correct to use | Required — do not hard-code storage costs |
+| `estimateGas` | Always correct to use | Required. Do not hard-code storage costs. |
diff --git a/evm/evm-parity/signing.mdx b/evm/evm-parity/signing.mdx
index 33658e5..d882f25 100644
--- a/evm/evm-parity/signing.mdx
+++ b/evm/evm-parity/signing.mdx
@@ -5,20 +5,20 @@ description: 'Wallet signing method support and EIP-712 typed data on Sei'
# Signing
-Signing on Sei works through standard EVM libraries and wallet standards. The methods available depend on which wallet the user has connected.
+Signing on Sei works through standard EVM libraries and wallet standards. The available methods depend on which wallet the user has connected.
-## Wallet Signing Support
+## Wallet signing support
| Method | Standard | Sei Global Wallet | MetaMask | WalletConnect wallets |
| --- | --- | --- | --- | --- |
| `personal_sign` | EIP-191 | Supported | Supported | Wallet-dependent |
| `eth_signTypedData_v4` | EIP-712 | Supported | Supported | Wallet-dependent |
| `eth_sign` | Legacy | Not recommended | Supported | Wallet-dependent |
-| Transaction signing | — | Supported | Supported | Supported |
+| Transaction signing | N/A | Supported | Supported | Supported |
-Do not assume all wallets support all methods. Always handle rejection gracefully.
+Do not assume that every wallet supports every method. Always handle a rejection gracefully.
-## Personal Sign
+## Personal sign
@@ -50,7 +50,7 @@ const signature = await signer.signMessage('Hello Sei');
-## EIP-712 Typed Data
+## EIP-712 typed data
@@ -113,7 +113,7 @@ const signature = await signer.signTypedData(domain, types, value);
-## Verifying Signatures
+## Verifying signatures
```ts viem
import { verifyMessage, verifyTypedData } from 'viem';
@@ -136,9 +136,9 @@ const validTyped = await verifyTypedData({
});
```
-## EIP-1271 Contract Signatures
+## EIP-1271 contract signatures
-Smart contract wallets on Sei can validate signatures via EIP-1271 (`isValidSignature`). Use viem's `verifyMessage` with a contract address — it automatically uses EIP-1271 when the address is a contract.
+Smart contract wallets on Sei can validate signatures with EIP-1271 (`isValidSignature`). Use viem's `verifyMessage` with a contract address. When the address is a contract, `verifyMessage` uses EIP-1271 automatically.
```ts viem
const valid = await verifyMessage({
diff --git a/evm/evm-parity/state-proofs.mdx b/evm/evm-parity/state-proofs.mdx
index f20680a..5f9cf07 100644
--- a/evm/evm-parity/state-proofs.mdx
+++ b/evm/evm-parity/state-proofs.mdx
@@ -3,46 +3,46 @@ title: 'State Proofs'
description: 'How eth_getProof differs on Sei due to IAVL tree storage'
---
-# State Proofs
+# 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.
+Sei supports `eth_getProof`, but it returns a different proof format from Ethereum. If your application verifies proofs on-chain or off-chain, account for this difference.
-## The Difference
+## 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.
+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.
### Store backends
-`eth_getProof` resolves the underlying account store by unwrapping known KVStore wrappers until it reaches a proof-capable queryable store. This means proofs are served across a broader range of node configurations, not just a classic IAVL store. Supported roots include:
+`eth_getProof` resolves the underlying account store. It unwraps known KVStore wrappers until it reaches a proof-capable queryable store. As a result, proofs work across a broader range of node configurations, not only with a classic IAVL store. Supported roots include:
- Classic IAVL stores
- store/v2 memiavl commitment stores
- Any other proof-capable (queryable) store reached through cache, `tracekv`, Giga cache, or prefix store wrappers
-If none of these can be reached, the call returns a `cannot find a proof-capable queryable KV store` error. In all cases the returned proof data is IAVL-format, not Ethereum MPT.
+If the call cannot reach any of these stores, it returns a `cannot find a proof-capable queryable KV store` error. In all cases, the returned proof data is in IAVL format, not Ethereum MPT format.
-## What This Affects
+## What this affects
-Most applications do not call `eth_getProof` directly. It is primarily used by:
+Most applications do not call `eth_getProof` directly. Its main users are:
-- Light clients verifying state without trusting an RPC node
-- Cross-chain bridges proving inclusion of state on Sei
-- Applications verifying contract storage values trustlessly
+- Light clients that verify state without trusting an RPC node
+- Cross-chain bridges that prove the inclusion of state on Sei
+- Applications that verify contract storage values trustlessly
-If you are doing standard contract reads, event queries, or transaction lookups, this difference does not affect you.
+If you do standard contract reads, event queries, or transaction lookups, this difference does not affect you.
## Calling eth_getProof
### Storage key requirements
-Before calling `eth_getProof`, note two requirements Sei enforces on the `storageKeys` argument:
+Before you call `eth_getProof`, note these two requirements that 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.
+- **Keys must be hex-encoded.** Each storage key must be a valid hex-encoded value (for example, `0x0000000000000000000000000000000000000000000000000000000000000001`). Sei decodes each key and left-pads it to 32 bytes. Sei rejects a malformed, non-hex key with an `invalid storage key` error. Raw byte strings do not work, although earlier versions accepted them.
+- **At most 1024 keys per request.** A single proof request may include a maximum of 1024 storage keys. A request for more keys returns a `too many storage keys` error. Split larger sets across multiple requests.
-The call works through standard libraries:
+The call works with standard libraries:
@@ -77,8 +77,8 @@ const proof = await provider.send('eth_getProof', [
-## Verifying Proofs
+## 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.
+To verify Sei state proofs, use an IAVL-compatible verifier. Standard Ethereum MPT verifier libraries reject Sei proofs. Examples are the libraries used in Solidity or in Ethereum bridge contracts.
-Refer to the [Sei RPC reference](/evm/reference) for the exact proof schema returned.
+For the exact proof schema that the method returns, see the [Sei RPC reference](/evm/reference).
diff --git a/evm/evm-parity/transaction-types.mdx b/evm/evm-parity/transaction-types.mdx
index ffb035f..6ba48ff 100644
--- a/evm/evm-parity/transaction-types.mdx
+++ b/evm/evm-parity/transaction-types.mdx
@@ -3,52 +3,52 @@ title: 'Transaction Types'
description: 'Which Ethereum transaction types are supported on Sei'
---
-# Transaction Types
+# Transaction types
Sei supports most Ethereum transaction types. The one notable exception is blob transactions.
-## Supported Types
+## Supported types
| Type | EIP | Name | Sei support |
| --- | --- | --- | --- |
-| 0 | — | Legacy | Supported — governance-set minimum gas price applies |
+| 0 | N/A | Legacy | Supported. A governance-set minimum gas price applies. |
| 1 | EIP-2930 | Access list | Supported |
-| 2 | EIP-1559 | Fee market | Supported — base fee is not burned |
+| 2 | EIP-1559 | Fee market | Supported. Sei does not burn the base fee. |
| 4 | EIP-7702 | Set code | Supported |
-### Set Code (EIP-7702) Auth List Requirement
+### Set code (EIP-7702) auth list requirement
-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`.
+Type 4 (EIP-7702) SetCode transactions must include a non-empty authorization list. If the auth list is empty or nil, validation rejects the transaction 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.
+Each authorization entry must also carry a valid (non-nil) chain ID. If you construct SetCode transactions directly, make sure that at least one authorization is present before you submit the transaction.
-### Access List and Auth List Entry Validation
+### Access list and auth list entry validation
-EVM transactions undergo stricter semantic validation during `ValidateBasic`, enforced since v6.5.0. Malformed transactions that older node versions accepted are rejected.
+Since v6.5.0, `ValidateBasic` applies stricter semantic validation to EVM transactions. It rejects malformed transactions that older node versions accepted.
-**Access list entries (type 1 and type 2):** Each access list tuple is validated for well-formed hex encoding. Every address must be a canonical hex address of the correct length, and every storage key must be a canonical hex hash of the correct length. Entries with wrong-length or non-hex values are rejected.
+**Access list entries (type 1 and type 2):** Validation checks each access list tuple for well-formed hex encoding. Every address must be a canonical hex address of the correct length. Every storage key must be a canonical hex hash of the correct length. Validation rejects entries with wrong-length or non-hex values.
-**Auth list entries (type 4):** In addition to the non-empty auth list and non-nil chain ID requirements above, each authorization entry is validated for a canonical hex address and well-formed signature values.
+**Auth list entries (type 4):** Validation checks each authorization entry for a canonical hex address and well-formed signature values. This check is in addition to the non-empty auth list and non-nil chain ID requirements above.
-**Signature values:** The transaction-level `v`, `r`, and `s` values must each fit in 32 bytes; auth list entries (type 4) cap `v` at 1 byte and `r`/`s` at 32 bytes. In both cases, values must not be zero-padded (no leading zero bytes in multi-byte values); zero-padded signature encodings are rejected.
+**Signature values:** The transaction-level `v`, `r`, and `s` values must each fit in 32 bytes. In auth list entries (type 4), `v` is limited to 1 byte, and `r` and `s` are limited to 32 bytes. In both cases, values must not be zero-padded: a multi-byte value must not have leading zero bytes. Validation rejects zero-padded signature encodings.
-This section is the canonical reference for field-level EVM transaction validation on Sei. Envelope-level restrictions (Cosmos wrapper fields, canonical protobuf encoding, whole-block rejection on decode failure) are covered in [Differences with Ethereum](/evm/differences-with-ethereum#evm-transaction-envelope-restrictions).
+This section is the canonical reference for field-level EVM transaction validation on Sei. [Differences with Ethereum](/evm/differences-with-ethereum#evm-transaction-envelope-restrictions) covers the envelope-level restrictions: Cosmos wrapper fields, canonical protobuf encoding, and whole-block rejection on decode failure.
-## Not Supported
+## Not supported
| Type | EIP | Name | Notes |
| --- | --- | --- | --- |
-| 3 | EIP-4844 | Blob | Not supported — Sei runs Pectra without blob transactions |
+| 3 | EIP-4844 | Blob | Not supported. Sei runs Pectra without blob transactions. |
-## Blob Transactions
+## 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.
+Sei runs the Pectra hardfork without blob transaction support. If you try to send a type 3 transaction, Sei rejects it 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.
+If you port code from Ethereum that uses blob transactions (for example, for rollup data availability), that code path does not apply to Sei.
-## Sending Transactions
+## 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.
+Standard library defaults work correctly. viem, wagmi, and ethers all default to type 2 (EIP-1559) transactions on chains that support EIP-1559, and Sei does.
diff --git a/evm/evm-parity/websocket.mdx b/evm/evm-parity/websocket.mdx
index cd7aedf..f8f84ea 100644
--- a/evm/evm-parity/websocket.mdx
+++ b/evm/evm-parity/websocket.mdx
@@ -3,16 +3,16 @@ title: 'WebSocket Connections'
description: 'Connecting to Sei via WebSocket for real-time block and event subscriptions'
---
-# WebSocket Connections
+# WebSocket connections
-Sei supports `eth_subscribe` over WebSocket. You can subscribe to new blocks, event logs, and pending transactions using standard library WebSocket transports.
+Sei supports `eth_subscribe` over WebSocket. With the WebSocket transports in standard libraries, you can subscribe to new blocks, event logs, and pending transactions.
## Endpoints
| Network | WebSocket endpoint |
| --- | --- |
-| Mainnet | `wss://evm-ws.sei-apis.com` |
-| Testnet | `wss://evm-ws-testnet.sei-apis.com` |
+| Sei Mainnet | `wss://evm-ws.sei-apis.com` |
+| Sei Testnet | `wss://evm-ws-testnet.sei-apis.com` |
## Connecting
@@ -36,7 +36,7 @@ const provider = new ethers.WebSocketProvider('wss://evm-ws.sei-apis.com');
-## Watching New Blocks
+## Watching new blocks
@@ -62,7 +62,7 @@ provider.off('block');
-## Watching Contract Events
+## Watching contract events
@@ -94,7 +94,7 @@ contract.off('Transfer');
-## Watching ERC-20 Transfers Across All Contracts
+## Watching ERC-20 transfers across all contracts
```ts viem
import { parseAbiItem } from 'viem';
@@ -111,22 +111,22 @@ const unwatch = client.watchEvent({
## Notes
-- 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.
+- Sei has instant finality, so every block emitted over WebSocket is already final. You do not need to wait for more confirmations before you act 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
+## `newHeads` under Autobahn consensus
-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:
+When a node runs under Autobahn consensus, `eth_subscribe("newHeads")` notifications come from an in-process notifier, not from the legacy consensus event bus. The notifier publishes committed-block headers directly. Subscribers still observe headers only for fully committed blocks. However, 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.
+- **`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 return in these fields.
+- **`stateRoot`** comes from the finalized block's `AppHash` (the post-execution application hash), not from a pre-execution header field.
+- **`hash`** is the Autobahn block-header hash. It is the same value that `eth_getBlockByNumber` and the receipt APIs report as `blockHash`. This keeps `newHeads` consistent with the rest of the EVM RPC surface.
+- **`gasUsed`** is an approximation (summed from per-transaction results) that keeps 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`.
+- Subscribers that chain-validate the head stream by linking `parentHash` values cannot rely on `newHeads` under Autobahn. They need a different mechanism.
+- If you need the exact `gasUsed` or the omitted hash fields, fetch the block explicitly with `eth_getBlockByNumber`.
diff --git a/evm/evm-verify-contracts.mdx b/evm/evm-verify-contracts.mdx
index e797bc3..a4f12b2 100644
--- a/evm/evm-verify-contracts.mdx
+++ b/evm/evm-verify-contracts.mdx
@@ -7,23 +7,23 @@ keywords: ['contract verification', 'sourcify', 'hardhat', 'foundry', 'smart con
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
import { AddSeiButton } from '/snippets/add-sei-button.jsx';
-Verify your deployed contract using flattened source code, JSON input, Sourcify and more. Verifying your deployed contract ensures transparency and trust by making the source code publicly available and verifiable.
+Verify your deployed contract with flattened source code, JSON input, Sourcify, or other methods. Verification makes your contract's source code public and verifiable. This creates transparency and trust.
-## Benefits of Verification
+## Benefits of verification
-- **Transparency**: Publicly available source code.
-- **Trust**: Community can verify the contract's functionality.
-- **Security**: Greater confidence in the contract's integrity.
+- Transparency: the source code is publicly available.
+- Trust: the community can verify the contract's functionality.
+- Security: verification gives greater confidence in the contract's integrity.
## Sourcify
-[Sourcify](https://sourcify.dev/) provides decentralized, open-source contract verification. Sei has full Sourcify support on both **mainnet** (chain ID 1329) and **testnet** (chain ID 1328).
+[Sourcify](https://sourcify.dev/) is a decentralized, open-source service for contract verification. Sei has full Sourcify support on both Sei Mainnet (chain ID 1329) and Sei Testnet (chain ID 1328).
-Sourcify performs byte-by-byte verification by recompiling your source code with the exact same compiler settings and comparing the output against the on-chain bytecode. No API key is required.
+Sourcify verifies contracts byte by byte. It recompiles your source code with the exact same compiler settings and compares the output with the on-chain bytecode. You do not need an API key.
### Verify with Foundry
-After deploying your contract with Foundry, verify it on Sourcify:
+After you deploy your contract with Foundry, verify it on Sourcify:
```bash
forge verify-contract \
@@ -33,7 +33,7 @@ forge verify-contract \
```
-**Testnet example:**
+**Sei Testnet example:**
```bash
forge verify-contract \
@@ -43,7 +43,7 @@ forge verify-contract \
src/Counter.sol:Counter
```
-**Mainnet example:**
+**Sei Mainnet example:**
```bash
forge verify-contract \
@@ -53,7 +53,7 @@ forge verify-contract \
src/Counter.sol:Counter
```
-To check verification status:
+To check the verification status, run:
```bash
forge verify-check \
@@ -62,7 +62,7 @@ forge verify-check \
```
-You can also deploy and verify in a single step using `forge create`:
+You can also deploy and verify in a single step with `forge create`:
```bash
forge create src/Counter.sol:Counter \
@@ -73,11 +73,11 @@ forge create src/Counter.sol:Counter \
--chain-id 1328
```
-If you need to pass constructor arguments, append them after the contract path. For example: `forge create src/Token.sol:Token --constructor-args "MyToken" "MTK" 18`
+To pass constructor arguments, add them after the contract path. For example: `forge create src/Token.sol:Token --constructor-args "MyToken" "MTK" 18`
### Verify with Hardhat
-The [`hardhat-verify`](https://hardhat.org/docs/learn-more/smart-contract-verification) plugin supports Sourcify out of the box with no additional configuration or API key.
+The [`hardhat-verify`](https://hardhat.org/docs/learn-more/smart-contract-verification) plugin supports Sourcify by default. You do not need extra configuration or an API key.
#### 1. Install dependencies
@@ -122,7 +122,7 @@ export default defineConfig({
});
```
-Sourcify verification is enabled by default in `hardhat-verify`. No `verify` config block is needed for Sourcify.
+`hardhat-verify` enables Sourcify verification by default. You do not need a `verify` config block for Sourcify.
#### 3. Deploy
@@ -136,13 +136,13 @@ npx hardhat ignition deploy ignition/modules/Counter.ts --network sei_testnet
npx hardhat verify sourcify --network sei_testnet
```
-If your contract has constructor arguments:
+If your contract has constructor arguments, add them to the command:
```bash
npx hardhat verify sourcify --network sei_testnet "arg1" "arg2"
```
-Running `npx hardhat verify` without a subtask will attempt verification on all enabled providers (Etherscan, Blockscout, and Sourcify) simultaneously.
+If you run `npx hardhat verify` without a subtask, it tries to verify on all enabled providers (Etherscan, Blockscout, and Sourcify) at the same time.
### Verify via Sourcify UI
@@ -155,11 +155,11 @@ You can also verify contracts directly through the [Sourcify web interface](http
5. Click **Verify**
-## Remix Contract Verification Plugin
+## Remix Contract Verification plugin
-Remix IDE offers an automated contract verification solution through its Contract Verification plugin, which integrates with both Sourcify and Etherscan verification services.
+Remix IDE verifies contracts automatically through its Contract Verification plugin. The plugin integrates with both the Sourcify and Etherscan verification services.
-Don't have a contract deployed yet? Spin up Remix with a sample `Counter.sol`, deploy it to Sei Testnet, then follow the steps below to verify it.
+If you do not have a deployed contract yet, open Remix with a sample `Counter.sol` and deploy it to Sei Testnet. Then follow the steps below to verify it.
@@ -170,42 +170,42 @@ Don't have a contract deployed yet? Spin up Remix with a sample `Counter.sol`, d
description="Remix IDE with a minimal Counter contract preloaded. Deploy it to Sei Testnet, then verify it with the Contract Verification plugin below."
/>
-### Setup and Configuration
+### Setup and configuration
-1. **Activate the Plugin**: In Remix IDE, navigate to the Plugin Manager and activate the **Contract Verification** plugin.
+1. **Activate the plugin**: In Remix IDE, go to the **Plugin Manager** and activate the **Contract Verification** plugin.
-2. **Configure Network Settings**:
+2. **Configure network settings**:
- Search for and select **Sei** as your blockchain
- Choose your deployment environment:
- **Testnet** (1328) for development
- **Mainnet** (1329) for production
-3. **Enable Verification Services**: Activate both verification methods:
- - ✅ **Sourcify**
- - ✅ **Etherscan**
+3. **Enable verification services**: Activate both verification methods:
+ - **Sourcify**
+ - **Etherscan**
-4. **Etherscan Configuration**: Configure the following settings:
- - **API Key**: Obtain from [seiscan.io](https://seiscan.io)
+4. **Configure Etherscan**: Set these values:
+ - **API Key**: Get a key from [seiscan.io](https://seiscan.io)
- **URL**: `https://seiscan.io`
-### Deploy and Verify
+### Deploy and verify
-Once configured, deploy your contract through Remix as usual. The Contract Verification plugin will automatically verify your contract upon successful deployment, submitting to both Sourcify and Seiscan simultaneously.
+After you configure the plugin, deploy your contract through Remix as usual. When the deployment succeeds, the Contract Verification plugin verifies your contract automatically. It submits the contract to both Sourcify and Seiscan at the same time.
-Verification status will be displayed in the plugin interface, and your verified contract will be publicly viewable on Seiscan explorer.
+The plugin interface shows the verification status. Your verified contract is then publicly visible on the Seiscan explorer.
## Verify via 0xngmi Etherscan Verification (third‑party)
-You can batch‑verify a contract that is already verified on another chain using the community tool [Etherscan Verification by 0xngmi](https://etherscan-verification.0xngmi.com/). This copies the verified source from a "source chain" and submits it to [Seiscan](https://seiscan.io), as long as the bytecode and compiler settings match.
+If a contract is already verified on another chain, you can batch-verify it with the community tool [Etherscan Verification by 0xngmi](https://etherscan-verification.0xngmi.com/). The tool copies the verified source from a "source chain" and submits it to [Seiscan](https://seiscan.io). This works only if the bytecode and compiler settings match.
-Prerequisite: The contract is already verified on at least one supported chain (same compiler version, optimization runs, constructor args, and library addresses as on Sei).
+Prerequisite: The contract is already verified on at least one supported chain. That verified deployment must use the same compiler version, optimization runs, constructor arguments, and library addresses as the deployment on Sei.
Steps:
1. Open [Etherscan Verification by 0xngmi](https://etherscan-verification.0xngmi.com/).
-2. In "Source Contract", paste the address of the contract that is already verified and select its chain.
-3. In "Target Contracts", add your Sei deployment address and select "Sei" as the target chain.
-4. Click "Verify Contracts" and wait for the result.
-5. Confirm the result on [Seiscan](https://seiscan.io) by visiting the contract page and checking the Contract tab.
+2. In **Source Contract**, paste the address of the contract that is already verified and select its chain.
+3. In **Target Contracts**, add the address of your Sei deployment and select **Sei** as the target chain.
+4. Click **Verify Contracts** and wait for the result.
+5. Confirm the result on [Seiscan](https://seiscan.io). Open the contract page and check the **Contract** tab.
-If verification fails with a bytecode mismatch, re‑check compiler version, optimization runs, constructor arguments, and linked library addresses; they must be identical to the deployment on Sei.
+If verification fails with a bytecode mismatch, check the compiler version, optimization runs, constructor arguments, and linked library addresses again. They must be identical to the deployment on Sei.
diff --git a/evm/evm-wizard.mdx b/evm/evm-wizard.mdx
index 8f76c16..fe7073e 100644
--- a/evm/evm-wizard.mdx
+++ b/evm/evm-wizard.mdx
@@ -8,7 +8,7 @@ keywords: ['OpenZeppelin wizard', 'smart contract generator', 'ERC standards', '
import { SandboxEmbed } from '/snippets/sandbox-embed.jsx';
import { AddSeiButton } from '/snippets/add-sei-button.jsx';
-The OpenZeppelin Contract Wizard is a powerful interactive tool that simplifies the creation of secure, standard-compliant smart contracts for Sei EVM. It provides a user-friendly interface for generating production-ready contract code based on OpenZeppelin's battle-tested libraries. Explore and create your custom smart contracts using the embedded wizard below.
+The OpenZeppelin Contract Wizard is an interactive tool that helps you create secure, standard-compliant smart contracts for Sei EVM. Its interface generates production-ready contract code based on OpenZeppelin's battle-tested libraries. Use the embedded wizard below to explore and create your custom smart contracts.
-## Benefits of Using the Wizard
+## Benefits of using the wizard
-- **Security First**: All generated contracts use audited, industry-standard implementations from OpenZeppelin
-- **Time-Saving**: Eliminate boilerplate code and common setup configurations
-- **Customizable**: Tailor contracts to your specific requirements through an intuitive UI
-- **Educational**: Learn best practices by examining professionally structured contract code
-- **Up-to-Date**: Always generates code compatible with the latest Solidity versions and standards
+- All generated contracts use audited, industry-standard implementations from OpenZeppelin.
+- The wizard saves time because it removes boilerplate code and common setup configurations.
+- You can tailor contracts to your specific requirements through the UI.
+- You can learn best practices by examining professionally structured contract code.
+- The wizard always generates code that is compatible with the latest Solidity versions and standards.
-## Available Contract Types
+## Available contract types
-| Contract Type | Description | Common Use Cases |
+| Contract type | Description | Common use cases |
| --- | --- | --- |
| ERC20 | Standard fungible token | Cryptocurrencies, utility tokens, governance tokens |
| ERC721 | Non-fungible token (NFT) | Digital collectibles, art, real estate, certifications |
@@ -35,43 +35,43 @@ The OpenZeppelin Contract Wizard is a powerful interactive tool that simplifies
| Governor | On-chain governance | DAO voting systems, protocol management |
| Stablecoin | Price-stable cryptocurrency | Trading pairs, remittances, reducing volatility, payment systems |
| Real-World-Asset | Tokenized physical assets | Real estate, commodities, securities, debt instruments, invoices |
-| Account | Programmable Wallet (ERC-4337) | Account abstraction, Multi signature wallets, EOA Delegation |
+| Account | Programmable wallet (ERC-4337) | Account abstraction, multi-signature wallets, EOA delegation |
| Custom | Specialized contracts | Access control, payment systems, timelock functions |
-## Step-by-Step Guide
+## Step-by-step guide
-1. **Access the Wizard**: Use the embedded widget from OpenZeppelin above or visit [wizard.openzeppelin.com](https://wizard.openzeppelin.com/)
-2. **Select Contract Type**: Choose the standard that matches your project needs (ERC20, ERC721, etc.)
-3. **Configure Basic Settings**:
- - Set token name and symbol
- - Choose Solidity version
- - Select access control mechanism (Ownable, Roles, etc.)
-4. **Add Security Features**:
+1. **Access the wizard**: Use the embedded OpenZeppelin widget above, or go to [wizard.openzeppelin.com](https://wizard.openzeppelin.com/).
+2. **Select the contract type**: Choose the standard that matches your project needs, such as ERC20 or ERC721.
+3. **Configure basic settings**:
+ - Set the token name and symbol
+ - Choose the Solidity version
+ - Select the access control mechanism, such as Ownable or Roles
+4. **Add security features**:
- Pausable functionality
- Permit extensions
- Flash minting capabilities
- Voting mechanisms
-5. **Customize Token Behavior**:
+5. **Customize token behavior**:
- Premint options
- Burning capabilities
- Token transfer rules
- Supply management
-6. **Review Generated Code**: The code updates in real-time as you make selections
-7. **Copy and Implement**: Use the "Copy to clipboard" button to export your contract code
-8. **Deploy**: The generated code is ready for compilation and deployment
+6. **Review the generated code**: The code updates in real time as you make selections.
+7. **Copy and implement**: Use the **Copy to clipboard** button to export your contract code.
+8. **Deploy**: The generated code is ready to compile and deploy.
-## Tips for Effective Use
+## Tips for effective use
-- **Start Simple**: Begin with minimal features and add complexity incrementally
-- **Understand Each Option**: Hover over the question icons (?) for detailed explanations
-- **Review Dependencies**: Note which OpenZeppelin libraries your contract imports
-- **Consider Gas Costs**: More features generally mean higher deployment and operation costs
-- **Customize Post-Generation**: The wizard provides a starting point—most projects will require additional customization
+- **Start simple**: Begin with minimal features and add complexity incrementally.
+- **Understand each option**: Hover over the question icons (?) for detailed explanations.
+- **Review dependencies**: Note which OpenZeppelin libraries your contract imports.
+- **Consider gas costs**: More features generally mean higher deployment and operation costs.
+- **Customize after generation**: The wizard gives you a starting point. Most projects need more customization.
## Try it: deploy from the browser
-Once the wizard generates your contract, you can compile and deploy it to Sei Testnet without any local setup. The Remix sandbox below is preloaded with a sample OpenZeppelin ERC-20 — replace it with your generated code, compile under **Solidity Compiler**, then **Deploy & Run** with **Environment** set to **Injected Provider — MetaMask**.
+After the wizard generates your contract, you can compile and deploy it to Sei Testnet without any local setup. The Remix sandbox below has a sample OpenZeppelin ERC-20 preloaded. Replace it with your generated code and compile it under **Solidity Compiler**. Then deploy it under **Deploy & Run**, with **Environment** set to **Injected Provider - MetaMask**.
@@ -82,8 +82,8 @@ Once the wizard generates your contract, you can compile and deploy it to Sei Te
description="Remix IDE preloaded with a sample OpenZeppelin ERC-20. Paste in your wizard output, compile, and deploy to Sei Testnet."
/>
-## Learn More
+## Learn more
-- [OpenZeppelin Contracts Documentation](https://docs.openzeppelin.com/contracts/)
-- [OpenZeppelin GitHub Repository](https://github.com/OpenZeppelin/openzeppelin-contracts)
-- [OpenZeppelin Community Forum](https://forum.openzeppelin.com/)
+- [OpenZeppelin Contracts documentation](https://docs.openzeppelin.com/contracts/)
+- [OpenZeppelin GitHub repository](https://github.com/OpenZeppelin/openzeppelin-contracts)
+- [OpenZeppelin community forum](https://forum.openzeppelin.com/)
diff --git a/evm/in-app-swaps.mdx b/evm/in-app-swaps.mdx
index 1498e25..2225328 100644
--- a/evm/in-app-swaps.mdx
+++ b/evm/in-app-swaps.mdx
@@ -6,51 +6,51 @@ keywords: ['swap widget', 'in-app swaps', 'token exchange', 'dex integration', '
---
import { ThemeAwareIframe } from '/snippets/theme-aware-iframe.jsx';
-Integrating in-app swap functionality into your Sei application enables users to exchange tokens directly within your platform, enhancing user experience and engagement.
+In-app swaps let users exchange tokens directly in your Sei dApp.
## Overview
-Swap widgets are embeddable UI components that abstract the complexity of interacting with decentralized exchanges (DEXs) and liquidity aggregators. They provide:
+Swap widgets are embeddable UI components that hide the complexity of interacting with decentralized exchanges (DEXs) and liquidity aggregators. They have these benefits:
-- **Seamless UX**: Users can swap tokens without leaving your app
-- **Reduced Friction**: No need to redirect users to external DEX interfaces
-- **Revenue Opportunities**: Many providers offer fee-sharing mechanisms
-- **Cross-Chain Support**: Some widgets enable bridging assets from other chains
+- Users can swap tokens without leaving your dApp.
+- You do not need to redirect users to external DEX interfaces.
+- Many providers offer fee-sharing mechanisms, which can give you revenue.
+- Some widgets let users bridge assets from other chains.
-## Symphony Swap Widget
+## Symphony swap widget
-[Symphony](https://symph.ag) is a native DEX aggregator on Sei, offering the simplest integration via iframe embedding.
+[Symphony](https://symph.ag) is a native DEX aggregator on Sei. It offers the simplest integration: an embedded iframe.
-### Quick Start
+### Quick start
```html
```
-### Live Demo
+### Live demo
-### Size Requirements
+### Size requirements
-- **Minimum Width**: `377px`
-- **Minimum Height**: `650px` (recommended to prevent wallet modal scrolling)
-- **Optimal Height**: `680-685px`
+- **Minimum width**: `377px`
+- **Minimum height**: `650px` (recommended to prevent scrolling in the wallet modal)
+- **Optimal height**: `680-685px`
-### URL Parameters
+### URL parameters
-Customize the widget by appending query parameters:
+To customize the widget, append query parameters to the URL:
-#### Token Selection
+#### Token selection
| Parameter | Description | Example |
| ---------- | ----------------------------- | ----------------------------------------------------- |
| `tokenIn` | Input token contract address | `tokenIn=0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392` |
| `tokenOut` | Output token contract address | `tokenOut=0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7` |
-Tokens can be changed by the user after the widget loads.
+Users can change the tokens after the widget loads.
#### Appearance
@@ -59,7 +59,7 @@ Customize the widget by appending query parameters:
| `bgColor` | Background color | Hex (`%23FFFFFF`), Named (`white`), RGB (`rgb(255,255,255)`), RGBA (`rgba(255,255,255,0.9)`) |
| `theme` | Color theme of the widget | `light` or `dark` (defaults to `dark` if not specified) |
-For hex colors, use `%23` instead of `#` in the URL (e.g., `%23FFFFFF` for white).
+For hex colors, use `%23` instead of `#` in the URL. For example, use `%23FFFFFF` for white.
#### Features
@@ -67,7 +67,7 @@ Customize the widget by appending query parameters:
| --------------- | ---------------------------- | --------------------------- |
| `notifications` | Show/hide notification cards | `true` (default) or `false` |
-### Complete Example
+### Complete example
@@ -123,7 +123,7 @@ return (
-### Popular Sei Token Addresses (Mainnet)
+### Popular Sei token addresses (Mainnet)
| Token | Address |
| ------------- | ------------------------------------------------------------------------------------------------------------------------ |
@@ -133,18 +133,18 @@ return (
---
-## Best Practices
+## Best practices
-### Security Considerations
+### Security considerations
-**Security Checklist**
+**Security checklist**
-- ✅ Validate that iframe sources match official domains
-- ✅ Implement Content Security Policy (CSP) headers
+- Check that iframe sources match the official domains.
+- Add Content Security Policy (CSP) headers.
-### Performance Optimization
+### Performance optimization
```tsx
// Lazy load swap widgets to improve initial page load
@@ -156,7 +156,7 @@ const SwapWidget = dynamic(() => import('./SwapWidget'), {
});
````
-### Responsive Design
+### Responsive design
```css
/* Ensure swap widgets are responsive */
@@ -181,7 +181,7 @@ const SwapWidget = dynamic(() => import('./SwapWidget'), {
}
```
-### Error Handling
+### Error handling
```tsx
import { useState } from 'react';
@@ -206,6 +206,6 @@ function SwapWidgetWithFallback() {
---
-## Additional Resources
+## Additional resources
- [Symphony Swap Widget Documentation](https://docs.symph.ag/widget/symphony-swap-widget)
diff --git a/evm/index.mdx b/evm/index.mdx
index ad8ba64..d3783af 100644
--- a/evm/index.mdx
+++ b/evm/index.mdx
@@ -5,82 +5,82 @@ description: "Build on the fastest EVM with 400ms finality, 100 MGas/s throughpu
keywords: ["sei evm", "ethereum virtual machine", "web3 development", "blockchain development", "fast evm"]
---
-## Why Choose Sei EVM?
+## Why choose Sei EVM?
| Feature | Sei EVM | Ethereum | Other Layer 1s |
| -------------------------- | ------------- | ---------------- | --------------- |
-| Blocktime | 400 ms | ~12 s | 1 - 3 seconds |
-| Transaction Throughput | 100 MGas/s | ~5 MGas/s | < 50 MGas/s |
-| Parallelized Execution | Yes | No | Limited/No |
-| EVM Tooling Compatibility | 100% | 100% | Varies |
-| EVM Version | Pectra (w/o blobs) | Fusaka | Varies |
+| Block time | 400 ms | ~12 s | 1-3 s |
+| Transaction throughput | 100 MGas/s | ~5 MGas/s | < 50 MGas/s |
+| Parallelized execution | Yes | No | Limited/No |
+| EVM tooling compatibility | 100% | 100% | Varies |
+| EVM version | Pectra (without blobs) | Fusaka | Varies |
- View detailed Ethereum comparison
+ See the detailed comparison of Sei EVM and Ethereum.
-## Quick Start
+## Quick start
-
+
- [Install Sei Global Wallet](/evm/sei-global-wallet)
- - [Sei EVM Network Information](/evm/networks)
+ - [Sei EVM network information](/evm/networks)
-
- - [Visit Sei Faucet](/learn/faucet)
- - [View Token Information](/evm/tokens)
+
+ - [Visit the Sei faucet](/learn/faucet)
+ - [View token information](/evm/tokens)
-
- - [EVM General Guide](/evm/evm-general)
- - [Project Templates](/evm/templates)
+
+ - [EVM general guide](/evm/evm-general)
+ - [Project templates](/evm/templates)
-## Ready-to-Deploy Examples
+## Ready-to-deploy examples
-
- Generate ERC-20, ERC-721, and more contracts in minutes. Configure, copy, deploy.
+
+ Generate ERC-20, ERC-721, and other contracts in minutes. Configure the contract, then copy and deploy the code.
-
+
Connect ethers.js, viem, or wagmi to your Sei EVM smart contracts.
-
- Tools and best practices for Solidity development on Sei.
+
+ Find tools and best practices for Solidity development on Sei.
-## Development Tools
+## Development tools
- Deploy smart contracts on Sei EVM using Hardhat. Simple setup, fast results.
+ Deploy smart contracts on Sei EVM with Hardhat.
- Use Foundry to build and deploy on Sei EVM. Fast testing, simple deployment.
+ Use Foundry to build, test, and deploy contracts on Sei EVM.
-
+
Browse every Sei EVM JSON-RPC method, run live requests, and copy ready-to-use code.
-## Use Cases
+## Use cases
-
- Implement HTTP 402 Payment Required for API monetization and premium content.
+
+ Use HTTP 402 Payment Required to charge for API access and premium content.
- Native USDC integration guide for seamless stablecoin transactions.
+ Integrate native USDC for stablecoin transactions.
-
+
Keep many independent transactions in flight from one funded address with EIP-7702 and ERC-4337 nonce lanes.
-## RPC Endpoints
+## RPC endpoints
-Choose from official Sei Foundation endpoints or community-maintained alternatives. All endpoints support standard EVM JSON-RPC methods. Public endpoints have rate limits — for production apps, use a [dedicated RPC provider](/learn/rpc-providers) or [run your own node](/node).
+Choose an official Sei Foundation endpoint or a community-maintained alternative. All endpoints support the standard EVM JSON-RPC methods. Public endpoints have rate limits. For production dApps, use a [dedicated RPC provider](/learn/rpc-providers) or [run your own node](/node).
@@ -102,6 +102,6 @@ Choose from official Sei Foundation endpoints or community-maintained alternativ
-
- Search every Sei EVM JSON-RPC method with Sei-specific behavior notes, switch between mainnet, testnet, and custom endpoints, run live requests, and generate ready-to-use client code.
+
+ Search every Sei EVM JSON-RPC method, with notes on Sei-specific behavior. Switch between Sei Mainnet, Sei Testnet, and custom endpoints. Run live requests and generate ready-to-use client code.
diff --git a/evm/indexer-providers/dune-sim.mdx b/evm/indexer-providers/dune-sim.mdx
index ac6b772..505a504 100644
--- a/evm/indexer-providers/dune-sim.mdx
+++ b/evm/indexer-providers/dune-sim.mdx
@@ -7,35 +7,33 @@ keywords: ['sim', 'dune', 'blockchain indexing', 'api integration', 'real-time d
## Overview
-Sim by Dune is a real-time, multichain developer platform that provides scalable APIs and indexing infrastructure for building onchain applications. It offers the fastest way to access live blockchain data across 60+ chains, including Sei, with zero DevOps overhead. In this tutorial, you'll learn how to set up Sim, build your first data pipeline, and create powerful onchain applications on Sei.
+Sim by Dune is a real-time, multichain developer platform. It has scalable APIs and indexing infrastructure for building onchain applications. It gives you fast access to live blockchain data on 60+ chains, including Sei, with no DevOps overhead. This tutorial shows how to set up Sim, build your first data pipeline, and create onchain applications on Sei.
-To understand more and deep dive into how it works under the hood, please refer to the [Sim by Dune Documentation](https://docs.sim.dune.com/)
+For details on how Sim works, see the [Sim by Dune documentation](https://docs.sim.dune.com/).
## What this guide teaches you:
-This tutorial guides you through:
-
-- **Setup**: Get your Sim API key, install dependencies, and connect to Sei
-- **Core APIs**: Learn to use all 6 Sim APIs with practical examples
-- **End-to-End Examples**: You'll run practical code to:
+- How to get your Sim API key, install the dependencies, and connect to Sei
+- How to use all 6 Sim APIs, with practical examples
+- How to run end-to-end code examples that:
- Fetch Sei token balances with USD values
- Monitor wallet transactions and activity
- Get token metadata and holder information
- Track NFT collections and metadata
-- **Production Ready**: Error handling, rate limiting, and monitoring
+- How to make your code production ready with error handling, rate limiting, and monitoring
-## Some Use Cases:
+## Some use cases:
-- **DeFi Analytics Platforms**: Real-time tracking of liquidity, volumes, and yields across Sei protocols
-- **Portfolio Trackers**: Multi-chain portfolio management with Sei integration
-- **Trading Bots**: Automated trading based on real-time onchain signals
-- **Risk Management**: Monitor positions and liquidation risks across protocols
-- **Governance Tools**: Track voting power and proposal activity
-- **MEV Analysis**: Detect and analyze MEV opportunities on Sei
+- **DeFi analytics platforms**: Real-time tracking of liquidity, volumes, and yields across Sei protocols
+- **Portfolio trackers**: Multichain portfolio management with Sei integration
+- **Trading bots**: Automated trading based on real-time onchain signals
+- **Risk management**: Monitor positions and liquidation risks across protocols
+- **Governance tools**: Track voting power and proposal activity
+- **MEV analysis**: Detect and analyze MEV opportunities on Sei
## Supported APIs
-Sim by Dune provides access to comprehensive EVM blockchain data through these core APIs:
+Sim by Dune gives access to EVM blockchain data through these core APIs:
### Balances API
@@ -44,44 +42,44 @@ Sim by Dune provides access to comprehensive EVM blockchain data through these c
### Transactions API
-- **Features:** Quick and accurate lookup of EVM transactions associated with any address
+- **Features:** Quick and accurate lookup of the EVM transactions for any address
- **Use cases:** Transaction monitoring, compliance tools, activity tracking
### Token Info API
-- **Features:** Metadata including symbol, name, decimals, supply information, logo URLs, and realtime prices
+- **Features:** Metadata, including symbol, name, decimals, supply information, logo URLs, and real-time prices
- **Use cases:** Token discovery, price tracking, market analysis
### Token Holders API
-- **Features:** Holders of an ERC20 token, sorted by balance
+- **Features:** Holders of an ERC-20 token, sorted by balance
- **Use cases:** Governance analysis, token distribution studies, whale tracking
### Activity API
-- **Features:** Derived activities including swaps, transfers, and approvals within transactions for any address
+- **Features:** Derived activities, such as swaps, transfers, and approvals, in the transactions of any address
- **Use cases:** DeFi analytics, trading analysis, user behavior tracking
### Collectibles API
-- **Features:** All NFT (ERC721 and ERC1155) balances, including IDs and metadata
+- **Features:** All NFT balances (ERC-721 and ERC-1155), including IDs and metadata
- **Use cases:** NFT marketplaces, collection analytics, digital asset management
-## Quick Start
+## Quick start
-### 1. Getting Your API Key
+### 1. Getting your API key
-To use Sim APIs, you'll need an API key from the Sim dashboard:
+To use the Sim APIs, you need an API key from the Sim dashboard:
-1. **Visit Sim Dashboard**: Go to [sim.dune.com](https://sim.dune.com)
-2. **Sign Up/Login**: Create an account or login with your existing Dune account
-3. **Navigate to Keys**: In the left sidebar, click on "Keys"
-4. **Create New Key**: Click the "New" button to generate a new API key
-5. **Select API Type**: Choose "Sim API" as the key's purpose
-6. **Copy Your Key**: Save the generated API key securely
+1. Go to [sim.dune.com](https://sim.dune.com).
+2. Create an account, or log in with your existing Dune account.
+3. In the left sidebar, click **Keys**.
+4. To generate a new API key, click **New**.
+5. Choose **Sim API** as the purpose of the key.
+6. Copy the generated API key, and save it securely.
-**Security Notes:**
+**Security notes:**
- Never share your API key in public repositories
@@ -91,7 +89,7 @@ To use Sim APIs, you'll need an API key from the Sim dashboard:
-### 2. Project Setup
+### 2. Project setup
```bash
mkdir sei-sim-tutorial
@@ -100,7 +98,7 @@ npm init -y
npm install axios dotenv
```
-Create `.env` file:
+Create a `.env` file:
```env
SIM_API_KEY=your_sim_api_key_here
@@ -108,7 +106,7 @@ SEI_RPC_URL=https://evm-rpc.sei-apis.com
TEST_WALLET_ADDRESS=0x...your_test_address
```
-### 3. Your First API Call
+### 3. Your first API call
Create `index.js`:
@@ -151,7 +149,7 @@ Run your first query:
node index.js
```
-**Expected Output:**
+**Expected output:**
```
🔍 Fetching Sei balances...
@@ -160,9 +158,9 @@ node index.js
USDC: 500.0 (500.0 USD)
```
-## API Examples
+## API examples
-### Balances API - Get Token Balances
+### Balances API - Get token balances
```javascript
async function getSeiBalances() {
@@ -181,7 +179,7 @@ async function getSeiBalances() {
}
```
-### Transactions API - Monitor Wallet Transactions
+### Transactions API - Monitor wallet transactions
```javascript
async function monitorSeiTransactions(address) {
@@ -213,7 +211,7 @@ async function monitorSeiTransactions(address) {
}
```
-### Token Info API - Get Token Metadata
+### Token Info API - Get token metadata
```javascript
async function getTokenInfo(tokenAddress) {
@@ -241,7 +239,7 @@ async function getTokenInfo(tokenAddress) {
getTokenInfo('0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392');
```
-### Token Holders API - Find Top Holders
+### Token Holders API - Find top holders
```javascript
async function getTokenHolders(tokenAddress, limit = 20) {
@@ -269,7 +267,7 @@ async function getTokenHolders(tokenAddress, limit = 20) {
}
```
-### Activity API - Track Swaps and Transfers
+### Activity API - Track swaps and transfers
```javascript
async function getWalletActivity(walletAddress, limit = 10) {
@@ -304,7 +302,7 @@ async function getWalletActivity(walletAddress, limit = 10) {
}
```
-### Collectibles API - Get NFT Collections
+### Collectibles API - Get NFT collections
```javascript
async function getNFTCollections(walletAddress) {
@@ -352,9 +350,9 @@ async function getNFTCollections(walletAddress) {
}
```
-## Advanced Use Cases
+## Advanced use cases
-### Portfolio Analytics Dashboard
+### Portfolio analytics dashboard
```javascript
require('dotenv').config();
@@ -409,7 +407,7 @@ async function buildAdvancedPortfolio(walletAddress) {
}
```
-### Token Analysis Tool
+### Token analysis tool
```javascript
require('dotenv').config();
@@ -474,9 +472,9 @@ async function analyzeToken(tokenAddress) {
analyzeToken('0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392'); // USDC address
```
-## Error Handling & Best Practices
+## Error handling & best practices
-### Comprehensive Error Handling
+### Comprehensive error handling
```javascript
class SimAPIClient {
@@ -535,7 +533,7 @@ class SimAPIClient {
}
```
-### Rate Limiting
+### Rate limiting
```javascript
class RateLimitedClient {
@@ -564,31 +562,31 @@ class RateLimitedClient {
| Error | Cause | Solution |
| --- | --- | --- |
-| `Invalid API key` | Wrong or expired key | Check API key in dashboard |
+| `Invalid API key` | Wrong or expired key | Check the API key in the dashboard |
| `Rate limit exceeded` | Too many requests | Implement exponential backoff |
-| `Chain not supported` | Using unsupported chain | Check supported chains list |
-| `Invalid address format` | Malformed wallet address | Validate address format |
-| `Request timeout` | Network issues | Increase timeout, add retries |
+| `Chain not supported` | The chain is not supported | Check the list of supported chains |
+| `Invalid address format` | Malformed wallet address | Validate the address format |
+| `Request timeout` | Network issues | Increase the timeout and add retries |
| `Insufficient data` | New address/contract | Wait for indexing to complete |
## Resources
-### Official Documentation
+### Official documentation
-- **Sim Documentation**: [https://docs.sim.dune.com](https://docs.sim.dune.com)
-- **Sim Dashboard**: [https://sim.dune.com](https://sim.dune.com)
-- **Sei Explorer**: [https://seiscan.io](https://seiscan.io)
+- **Sim documentation**: [https://docs.sim.dune.com](https://docs.sim.dune.com)
+- **Sim dashboard**: [https://sim.dune.com](https://sim.dune.com)
+- **Sei explorer**: [https://seiscan.io](https://seiscan.io)
-### Community Resources
+### Community resources
- **Dune Discord**: [https://discord.gg/dune](https://discord.com/invite/ErrzwBz)
- **Sei Discord**: [https://discord.gg/sei](https://discord.gg/sei)
-## Next Steps
+## Next steps
-1. **Scale Your Application**: Implement caching, database storage, and horizontal scaling
-2. **Build a Frontend**: Create React/Vue.js dashboards to visualize your data
-3. **Advanced Analytics**: Implement machine learning for predictive analytics
-4. **Custom Indexers**: Build specialized data pipelines for specific protocols
-5. **API Integration**: Connect with other services like price feeds, news APIs
+1. To scale your application, implement caching, database storage, and horizontal scaling.
+2. Build a frontend, such as a React or Vue.js dashboard, to visualize your data.
+3. Implement machine learning for predictive analytics.
+4. Build custom indexers, which are specialized data pipelines for specific protocols.
+5. Connect your application to other services, such as price feeds and news APIs.
diff --git a/evm/indexer-providers/envio.mdx b/evm/indexer-providers/envio.mdx
index 3bf7079..9ab10c7 100644
--- a/evm/indexer-providers/envio.mdx
+++ b/evm/indexer-providers/envio.mdx
@@ -6,13 +6,13 @@ keywords: ['envio', 'hyperindex', 'hypersync', 'hyperrpc', 'blockchain indexer',
## Envio
-Index Sei smart contract data using Envio, a modular hyper-performant data indexing solution. Envio offers three products you can use individually or together to fit your data needs on Sei.
+Use Envio, a modular data indexing solution, to index Sei smart contract data. Envio has three products. You can use them individually or together, depending on your data needs on Sei.
1. [HyperIndex](https://docs.envio.dev/docs/HyperIndex/overview), a fully customizable blockchain indexing framework that powers GraphQL APIs over Postgres
2. [HyperSync](https://docs.envio.dev/docs/HyperSync/overview), a real-time data retrieval layer up to 2000x faster than traditional RPC
-3. [HyperRPC](https://docs.envio.dev/docs/HyperRPC/overview-hyperrpc), an extremely fast RPC for data-intensive queries
+3. [HyperRPC](https://docs.envio.dev/docs/HyperRPC/overview-hyperrpc), a fast RPC for data-intensive queries
-> **New to Envio?** Jump straight to [How to Index Sei Smart Contract Data in Minutes using Envio](https://docs.envio.dev/blog/index-sei-smart-contracts-envio) for a step-by-step walkthrough that builds a USDC indexer on Sei in under five minutes.
+> If you are new to Envio, start with [How to Index Sei Smart Contract Data in Minutes using Envio](https://docs.envio.dev/blog/index-sei-smart-contracts-envio). This step-by-step walkthrough builds a USDC indexer on Sei in under five minutes.
| Field | Value |
| ---------------------- | -------------------------------------------------------------------- |
@@ -20,27 +20,27 @@ Index Sei smart contract data using Envio, a modular hyper-performant data index
| HyperSync URL Endpoint | `https://sei.hypersync.xyz` or `https://1329.hypersync.xyz` |
| HyperRPC URL Endpoint | `https://sei.rpc.hypersync.xyz` or `https://1329.rpc.hypersync.xyz` |
-> Sei Testnet is also supported, with HyperSync at `https://sei-testnet.hypersync.xyz` and HyperRPC at `https://sei-testnet.rpc.hypersync.xyz`.
+> Envio also supports Sei Testnet. HyperSync is at `https://sei-testnet.hypersync.xyz`, and HyperRPC is at `https://sei-testnet.rpc.hypersync.xyz`.
-## Choosing a Product
+## Choosing a product
### HyperIndex
**Best for:** projects that need a complete indexing solution with schema management, event handling, and a GraphQL API.
-* A full-featured indexing framework that transforms on-chain events into structured, queryable databases with GraphQL APIs
-* Configured with a YAML file, a GraphQL schema, and TypeScript, JavaScript, or ReScript event handlers
-* Supports multichain indexing, real-time indexing, reorg support, and factory (dynamic) contracts
-* Powered by HyperSync for historical backfill
+* An indexing framework that transforms on-chain events into structured, queryable databases with GraphQL APIs
+* Configured with a YAML file, a GraphQL schema, and event handlers in TypeScript, JavaScript, or ReScript
+* Supports multichain indexing, real-time indexing, reorg handling, and factory (dynamic) contracts
+* Uses HyperSync for historical backfill
### HyperSync
-**Best for:** new projects designing their own data access layer, performance-critical workloads, advanced filtering, and full control over data formatting.
+**Best for:** new projects that design their own data access layer, performance-critical workloads, advanced filtering, and full control over data formatting.
-* A purpose-built, high-performance data retrieval layer, built from the ground up in Rust as an alternative to traditional JSON-RPC endpoints
-* The raw blockchain data access layer that powers HyperIndex, delivering up to 2000x faster performance than traditional RPC endpoints
-* Client libraries available for Python, Rust, Node.js, and Go
-* Filter, select, and process exactly the data you need with powerful query options
+* A high-performance data retrieval layer, written from scratch in Rust as an alternative to traditional JSON-RPC endpoints
+* The raw blockchain data access layer that HyperIndex uses. It is up to 2000x faster than traditional RPC endpoints.
+* Client libraries for Python, Rust, Node.js, and Go
+* Query options that let you filter, select, and process exactly the data that you need
Common use cases include custom indexers, data analytics, block explorers, monitoring tools, cross-chain applications, and ETL pipelines.
@@ -48,22 +48,22 @@ Common use cases include custom indexers, data analytics, block explorers, monit
**Best for:** drop-in replacements for existing RPC-based code, projects that need standard JSON-RPC interfaces, and teams without time for a deeper integration.
-* An extremely fast RPC designed specifically for data-intensive blockchain tasks
+* A fast RPC designed for data-intensive blockchain tasks
* A specialized JSON-RPC endpoint optimized for data retrieval workflows
* Drop-in compatible with existing tooling that uses standard RPC methods
-* Up to 5x faster than traditional nodes for data-intensive operations; uses HyperSync to fulfill requests
+* Up to 5x faster than traditional nodes for data-intensive operations. It uses HyperSync to fulfill requests.
Common use cases include historical data queries, log event filtering, block and transaction retrievals, and analytics applications.
-## Getting Started
+## Getting started
-Make sure you have installed the [prerequisites](https://docs.envio.dev/docs/HyperIndex/quickstart#prerequisites), then initialize a new indexer.
+Make sure that you have installed the [prerequisites](https://docs.envio.dev/docs/HyperIndex/quickstart#prerequisites). Then initialize a new indexer:
```bash theme={"dark"}
pnpx envio init
```
-You'll follow interactive prompts to customize your indexer for Sei. A minimal Sei `config.yaml` looks like this.
+Follow the interactive prompts to customize your indexer for Sei. A minimal Sei `config.yaml` looks like this:
```yaml theme={"dark"}
name: IndexerName
@@ -83,11 +83,11 @@ For more detail on configuring chains, schemas, and event handlers, see the [Hyp
## Built with Envio
-* [Indexer Explorer](https://envio.dev/explorer), browse public real-time indexers built on Envio
-* [Case studies](https://docs.envio.dev/blog/tags/case-studies), see real-world deployments and migrations
-* [Showcase](https://docs.envio.dev/showcase), explore live demos built with HyperIndex and HyperSync
+* [Indexer Explorer](https://envio.dev/explorer): browse public real-time indexers built on Envio
+* [Case studies](https://docs.envio.dev/blog/tags/case-studies): see real-world deployments and migrations
+* [Showcase](https://docs.envio.dev/showcase): explore live demos built with HyperIndex and HyperSync
-## More Resources
+## More resources
* [HyperIndex Quickstart](https://docs.envio.dev/docs/HyperIndex/quickstart)
* [Quickstart with AI](https://docs.envio.dev/docs/HyperIndex/quickstart-with-ai)
@@ -96,4 +96,4 @@ For more detail on configuring chains, schemas, and event handlers, see the [Hyp
## Support
-Need help? Connect with the Envio team on [Discord](https://discord.gg/envio) or [Telegram](https://t.me/+kAIGElzPjApiMjI0).
+For help, contact the Envio team on [Discord](https://discord.gg/envio) or [Telegram](https://t.me/+kAIGElzPjApiMjI0).
diff --git a/evm/indexer-providers/goldrush.mdx b/evm/indexer-providers/goldrush.mdx
index b7c9340..bbb9b60 100644
--- a/evm/indexer-providers/goldrush.mdx
+++ b/evm/indexer-providers/goldrush.mdx
@@ -6,15 +6,13 @@ keywords: ['goldrush', 'blockchain indexing', 'api integration', 'data analysis'
---
## Overview
-GoldRush offers the most comprehensive Sei Data API suite for developers, analysts, and enterprises. Whether you're
-building a DeFi dashboard, a wallet, a trading bot, an AI agent or a compliance platform,
-our Sei Data APIs provide fast, accurate, and developer-friendly access to the essential onchain data you need.
+GoldRush has a suite of Sei Data APIs for developers, analysts, and enterprises. The APIs give fast, accurate access to the onchain data that you need. You can use them to build a DeFi dashboard, a wallet, a trading bot, an AI agent, or a compliance platform.
### Supported APIs
| **Product Name** | **Description** | **Key Data Feeds** | **Use Cases** |
| -------------------- | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
-| **Foundational API** | Access structured historical blockchain data across 100+ chains via REST APIs |
Token balances (spot & historical)
Token transfers
Token holders (spot & historical)
Token prices (onchain)
Wallet transactions
Get logs
|
Wallets
Portfolio trackers
Crypto accounting & tax tools
DeFi dashboards
Activity feeds
|
+| **Foundational API** | Access structured historical blockchain data on 100+ chains through REST APIs |
Token balances (spot & historical)
Token transfers
Token holders (spot & historical)
Token prices (onchain)
Wallet transactions
Get logs
|
Wallets
Portfolio trackers
Crypto accounting & tax tools
DeFi dashboards
Activity feeds
|
## Mainnet
@@ -29,21 +27,21 @@ our Sei Data APIs provide fast, accurate, and developer-friendly access to the e
| **Native Gas Token** | SEI |
-## API Usage
+## API usage
-To use this blockchain network in GoldRush API calls, use:
+To use Sei in GoldRush API calls, use this chain name:
-#### Chain Name
+#### Chain name
-- `sei-mainnet` (mainnet)
+- `sei-mainnet` (Sei Mainnet)
-#### Example API Calls (bash)
+#### Example API calls (bash)
```bash
curl -X GET "https://api.covalenthq.com/v1/sei-mainnet/address/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/balances_v2/?key=API_KEY"
```
-### SDK Usage (TypeScript)
+### SDK usage (TypeScript)
```ts
import { GoldRushClient } from '@covalenthq/client-sdk';
@@ -56,55 +54,51 @@ const resp = await client.BalanceService.getTokenBalancesForWalletAddress({
});
```
-## Foundational API Support
+## Foundational API support
-This chain supports **34** GoldRush Foundational APIs:
+Sei supports 34 GoldRush Foundational APIs:
#### Wallet API
-- **[Get token balances for address](https://goldrush.dev/docs/api-reference/foundational-api/balances/get-token-balances-for-address)**
-- **[Get native token balance for address](https://goldrush.dev/docs/api-reference/foundational-api/balances/get-native-token-balance)**
-- **[Get historical portfolio value over time](https://goldrush.dev/docs/api-reference/foundational-api/balances/get-historical-portfolio-value-over-time)**
-- **[Get ERC20 token transfers for address](https://goldrush.dev/docs/api-reference/foundational-api/balances/get-erc20-token-transfers-for-address)**
+- [Get token balances for address](https://goldrush.dev/docs/api-reference/foundational-api/balances/get-token-balances-for-address)
+- [Get native token balance for address](https://goldrush.dev/docs/api-reference/foundational-api/balances/get-native-token-balance)
+- [Get historical portfolio value over time](https://goldrush.dev/docs/api-reference/foundational-api/balances/get-historical-portfolio-value-over-time)
+- [Get ERC20 token transfers for address](https://goldrush.dev/docs/api-reference/foundational-api/balances/get-erc20-token-transfers-for-address)
#### Pricing API
-- **[Get historical token prices](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-historical-token-prices)**
+- [Get historical token prices](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-historical-token-prices)
#### Security API
-- **[Get token approvals for address](https://goldrush.dev/docs/api-reference/foundational-api/security/get-token-approvals-for-address)**
+- [Get token approvals for address](https://goldrush.dev/docs/api-reference/foundational-api/security/get-token-approvals-for-address)
#### Activity Feed API
-- **[Get a transaction](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-a-transaction)**
-- **[Get transaction summary for address](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-transaction-summary-for-address)**
-- **[Get earliest transactions for address (v3) ](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-earliest-transactions-for-address-v3)**
-- **[Get recent transactions for address (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-recent-transactions-for-address-v3)**
-- **[Get paginated transactions for address (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-paginated-transactions-for-address-v3)**
-- **[Get bulk time bucket transactions for address (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-time-bucket-transactions-for-address-v3)**
-- **[Get all transactions in a block (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-all-transactions-in-a-block)**
-- **[Get all transactions in a block by page (v3) ](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-all-transactions-in-a-block-by-page)**
+- [Get a transaction](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-a-transaction)
+- [Get transaction summary for address](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-transaction-summary-for-address)
+- [Get earliest transactions for address (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-earliest-transactions-for-address-v3)
+- [Get recent transactions for address (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-recent-transactions-for-address-v3)
+- [Get paginated transactions for address (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-paginated-transactions-for-address-v3)
+- [Get bulk time bucket transactions for address (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-time-bucket-transactions-for-address-v3)
+- [Get all transactions in a block (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-all-transactions-in-a-block)
+- [Get all transactions in a block by page (v3)](https://goldrush.dev/docs/api-reference/foundational-api/transactions/get-all-transactions-in-a-block-by-page)
#### Block Explorer API
-- **[Get a block](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-a-block)**
-- **[Get all chain statuses](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-all-chain-statuses)**
-- **[Get all chains](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-all-chains)**
-- **[Get block heights](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-block-heights)**
-- **[Get gas prices](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-gas-prices)**
-- **[Get log events by contract address](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-log-events-by-contract-address)**
-- **[Get log events by topic hash(es)](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-log-events-by-topic-hash)**
-- **[Get logs](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-logs)**
-
-## Additional Resources
-
-- [Goldrush Docs](https://goldrush.dev/docs/?utm_source=sei&utm_medium=partner-docs) -
- comprehensive knowledge base for all things GoldRush including a quickstart
-- [Sei Network Details](https://goldrush.dev/chains/sei/?utm_source=sei&utm_medium=partner-docs) -
- setup details and supported APIs for Sei
-- [Guides](https://goldrush.dev/guides/?utm_source=sei&utm_medium=partner-docs) -
- learn how to build for various use cases and expand your onchain knowledge
-- [API Reference](https://goldrush.dev/docs/api-reference/)
-- [API Key](https://goldrush.dev/platform/auth/register/?utm_source=sei&utm_medium=partner-docs) -
- sign up for free
+- [Get a block](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-a-block)
+- [Get all chain statuses](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-all-chain-statuses)
+- [Get all chains](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-all-chains)
+- [Get block heights](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-block-heights)
+- [Get gas prices](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-gas-prices)
+- [Get log events by contract address](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-log-events-by-contract-address)
+- [Get log events by topic hash(es)](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-log-events-by-topic-hash)
+- [Get logs](https://goldrush.dev/docs/api-reference/foundational-api/utility/get-logs)
+
+## Additional resources
+
+- [GoldRush docs](https://goldrush.dev/docs/?utm_source=sei&utm_medium=partner-docs): the GoldRush knowledge base, including a quickstart
+- [Sei network details](https://goldrush.dev/chains/sei/?utm_source=sei&utm_medium=partner-docs): setup details and supported APIs for Sei
+- [Guides](https://goldrush.dev/guides/?utm_source=sei&utm_medium=partner-docs): learn how to build for different use cases
+- [API reference](https://goldrush.dev/docs/api-reference/)
+- [API key](https://goldrush.dev/platform/auth/register/?utm_source=sei&utm_medium=partner-docs): sign up for free
diff --git a/evm/indexer-providers/goldsky.mdx b/evm/indexer-providers/goldsky.mdx
index b58186a..ef403f1 100644
--- a/evm/indexer-providers/goldsky.mdx
+++ b/evm/indexer-providers/goldsky.mdx
@@ -6,43 +6,43 @@ keywords: ['goldsky', 'blockchain indexer', 'subgraphs', 'data pipelines', 'real
## Goldsky
-Wondering how to best leverage Goldsky's products? This guide explains the differences between them and how you can use them individually or together to meet your needs.
+This guide explains the differences between Goldsky's products. It also shows how you can use them individually or together.
-Goldsky offers two flagship products, Subgraphs and Mirror, designed to help developers interact with Sei blockchain data more efficiently. While both tools serve similar goals - retrieving, processing, and querying blockchain data - they differ significantly in how they handle data management, scalability, and customization.
+Goldsky has two main products, Subgraphs and Mirror. Both help developers work with on-chain data from Sei more efficiently. The two tools have similar goals: to retrieve, process, and query blockchain data. They differ significantly in how they handle data management, scalability, and customization.
-Let's dive into the difference in this guide and learn more about which solution is right for you. If you're ready to get started, please visit [this page](https://docs.goldsky.com/chains/sei/?utm_source=sei&utm_medium=docs) for a quickstart guide on how to index Sei with Goldsky.
+If you are ready to start, see the [Goldsky quickstart guide for indexing Sei](https://docs.goldsky.com/chains/sei/?utm_source=sei&utm_medium=docs).
-## How to Choose Between Subgraphs and Mirror
+## How to choose between Subgraphs and Mirror
-### Subgraphs: Structured, Query-Based Data Retrieval
+### Subgraphs: Structured, query-based data retrieval
**Overview:**
-- On-chain data is restricted to EVM-compatible chains, so it's only supported for Sei EVM.
-- The data model is optimized specifically for on-chain data. The entities and data types you define in subgraphs are tailored to represent blockchain data efficiently.
-- You can create relationships and aggregations between on-chain entities (e.g. track the balance of a user for specific tokens)
-- You can enrich entity data with other on-chain sources using **`eth_call`**. However, integrating off-chain data is not supported.
+- Subgraphs support on-chain data from EVM-compatible chains only. On Sei, they support only Sei EVM.
+- The data model is optimized for on-chain data. The entities and data types that you define in subgraphs are designed to represent blockchain data efficiently.
+- You can create relationships and aggregations between on-chain entities. For example, you can track the balance of a user for specific tokens.
+- You can enrich entity data with other on-chain sources through `eth_call`. However, you cannot integrate off-chain data.
**Examples:**
-- Retrieving all transactions related to a specific wallet address.
+- Getting all transactions for a specific wallet address.
- Querying detailed event logs from a smart contract, such as token transfers or contract interactions.
-- Building dashboards or analytics tools that require periodic data retrieval.
+- Building dashboards or analytics tools that query data periodically.
-**Key Advantages:**
+**Key advantages:**
-- **Customizable Data Models**: Define specific data structures to match your needs.
-- **Fast Query Response Times**: Queries return results quickly from pre-indexed data.
-- **Developer Flexibility**: Use GraphQL to create custom queries that fit your application's needs.
+- You can define custom data models that match your needs.
+- Queries return results quickly because the data is pre-indexed.
+- GraphQL gives you the flexibility to create custom queries for your application.

-### Mirror: Real-Time Data Streaming Pipelines
+### Mirror: Real-time data streaming pipelines
-**Overview**:
+**Overview:**
-- The data model is flexible and open to any type of data. You can combine blockchain data with your own data seamlessly, offering more complex and customizable use cases.
-- Using Transforms, you can also perform some pre-processing using SQL dialect as well as doing external processing on your HTTP endpoint before writing to your database.
+- The data model is flexible and accepts any type of data. You can combine blockchain data with your own data for more complex and customizable use cases.
+- With Transforms, you can also process data before it is written to your database. You can pre-process it with a SQL dialect, and you can do external processing on your HTTP endpoint.
**Examples:**
@@ -50,43 +50,43 @@ Let's dive into the difference in this guide and learn more about which solution
- Capturing real-time price updates or liquidity changes in DeFi protocols.
- Feeding live data into machine learning models for predictive analytics.
-**Key Advantages:**
+**Key advantages:**
-- **Real-Time Data Flow**: Data is pushed directly to your database as new events occur on-chain.
-- **Scalable Integration**: Supports ingestion of data from multiple blockchain networks into a centralized database.
-- **Minimal Latency**: Ideal for use cases where immediate data availability is crucial.
+- Mirror pushes data directly to your database as new events occur on-chain.
+- Mirror scales to ingest data from multiple blockchain networks into a centralized database.
+- Latency is minimal, so Mirror is ideal for use cases that need data to be available immediately.

-### Mirror Data Sources Available
+### Mirror data sources available
**Sei EVM:**

-### Decision Guide: Subgraphs vs. Mirror
+### Decision guide: Subgraphs vs. Mirror
**Subgraphs**
-- If you need to query specific Sei EVM data points or historical records, Subgraphs are the way to go.
-- Best suited for applications that deal exclusively with on-chain data and don't need integration with off-chain sources.
-- Ideal for predefined data models, such as dApps that need to query specific smart contract events or execute standard blockchain queries.
-- Great for low to moderate traffic scenarios with relatively straightforward data structures and querying needs.
+- If you need to query specific Sei EVM data points or historical records, use Subgraphs.
+- Subgraphs are best for applications that use only on-chain data and do not need off-chain sources.
+- They are ideal for predefined data models, such as dApps that need to query specific smart contract events or run standard blockchain queries.
+- They are a good fit for low-to-moderate traffic with relatively simple data structures and query needs.
**Mirror**
-- A better fit for applications that require both on-chain and off-chain data, offering the flexibility to combine data sources for advanced analytics or decision-making.
-- Ideal for multi-chain applications, as it simplifies the process of managing data across different blockchains without the need for reindexing. This is specially true if your application needs non-EVM data like Sei Cosmos.
-- Perfect for high-traffic applications, where low latency and real-time data access are critical to the performance and user experience.
+- Mirror is a better fit for applications that need both on-chain and off-chain data. You can combine data sources for advanced analytics or decision-making.
+- It is ideal for multichain applications, because it makes data easier to manage across different blockchains without reindexing. This is especially true if your application needs non-EVM data, such as Sei Cosmos data.
+- It suits high-traffic applications, where low latency and real-time data access are critical to performance and user experience.
-**Example Use Case Comparison:**
+**Example use case comparison:**
-- **A DeFi Analytics Dashboard**: Use Subgraphs to retrieve historical liquidity data and user interactions.
-- **A Real-Time Trading Bot**: Use Mirror to stream price changes directly into your database for instant action.
+- **A DeFi analytics dashboard**: Use Subgraphs to get historical liquidity data and user interactions.
+- **A real-time trading bot**: Use Mirror to stream price changes directly into your database, so that the bot can act instantly.
-By understanding the strengths of each tool, you can select the right solution to match your project's data requirements. Goldsky is designed to offer flexibility, whether you need structured, queryable data or real-time data streams. Dive deeper into Subgraphs vs Mirror [here](https://docs.goldsky.com/subgraph-vs-mirror/?utm_source=sei&utm_medium=docs).
+Select the tool that matches the data requirements of your project. Goldsky supports both structured, queryable data and real-time data streams. For more detail, read the [Goldsky comparison of Subgraphs and Mirror](https://docs.goldsky.com/subgraph-vs-mirror/?utm_source=sei&utm_medium=docs).
-## Getting Started
+## Getting started
1. Sign up for an account at [https://app.goldsky.com/signup](https://app.goldsky.com/signup).
2. Install the Goldsky CLI:
@@ -96,26 +96,26 @@ By understanding the strengths of each tool, you can select the right solution t
```
3. Go to your [Project Settings](https://app.goldsky.com/dashboard/settings) page and create an API key.
-4. Back in your Goldsky CLI, log into your Project by running the command **`goldsky login`** and paste your API key.
-5. Now that you are logged in, run **`goldsky`** to get started.
+4. In the Goldsky CLI, run `goldsky login` to log in to your project, and then paste your API key.
+5. After you log in, run `goldsky` to get started.

-## Deploy a Subgraph
+## Deploy a subgraph
-There are three primary ways to deploy a Subgraph on Goldsky:
+You can deploy a subgraph on Goldsky in three main ways:
1. From source code
-2. Migrating from The Graph or any other subgraph host
-3. Via instant, no-code subgraphs
+2. By migrating from The Graph or any other subgraph host
+3. With instant, no-code subgraphs
-Navigate to [this page](https://docs.goldsky.com/subgraphs/deploying-subgraphs/?utm_source=sei&utm_medium=docs) to learn more about each way of deploying a Subgraph.
+To learn more about each way to deploy a subgraph, see [Deploying subgraphs](https://docs.goldsky.com/subgraphs/deploying-subgraphs/?utm_source=sei&utm_medium=docs) in the Goldsky docs.
-## Deploy a Pipeline
+## Deploy a pipeline
-You have two options to create a Goldsky Mirror pipeline:
+You can create a Goldsky Mirror pipeline in two ways:
-1. **Flow**: With a guided web experience in the dashboard
-2. **CLI**: interactively or by providing a pipeline configuration
+1. **Flow**: Use the guided web experience in the dashboard.
+2. **CLI**: Use the CLI interactively, or give it a pipeline configuration.
-Navigate to [this page](https://docs.goldsky.com/mirror/create-a-pipeline/?utm_source=sei&utm_medium=docs) to learn more about deploying Mirror pipelines.
+To learn more about how to deploy Mirror pipelines, see [Create a pipeline](https://docs.goldsky.com/mirror/create-a-pipeline/?utm_source=sei&utm_medium=docs) in the Goldsky docs.
diff --git a/evm/indexer-providers/moralis.mdx b/evm/indexer-providers/moralis.mdx
index 3959f6d..7a62511 100644
--- a/evm/indexer-providers/moralis.mdx
+++ b/evm/indexer-providers/moralis.mdx
@@ -3,55 +3,55 @@ title: 'Moralis'
description: 'Complete guide to integrating Moralis with Sei blockchain for Web3 development'
keywords: ['moralis', 'web3 api', 'blockchain indexer', 'NFT API', 'wallet API', 'token API', 'sei']
---
-Moralis is an enterprise-grade Web3 API provider that connects any tech stack to blockchain networks, offering multichain blockchain data for wallets, tokens, NFTs, DeFi protocols, and more through one fast, reliable API.
+Moralis is a Web3 API provider that connects any tech stack to blockchain networks. Through one fast, reliable API, it gives you multichain data for wallets, tokens, NFTs, DeFi protocols, and more.
-Moralis provides a comprehensive Backend-as-a-Service (BaaS) platform specifically designed for developers. By abstracting away the complexity of blockchain integration and offering a suite of APIs, SDKs, and scalable infrastructure, Moralis allows developers to focus on building the core functionality of their applications.
+Moralis also has a Backend-as-a-Service (BaaS) platform for developers. It hides the complexity of blockchain integration and gives you a suite of APIs, SDKs, and scalable infrastructure. You can then focus on building the core functionality of your application.
-## What You'll Learn
+## What you'll learn
-By the end of this tutorial, you'll understand:
+This tutorial shows you how to:
-- How to set up and configure Moralis for Sei blockchain integration
-- Working with different Moralis APIs (Wallet, NFT, Token, and Blockchain APIs)
-- Fetching wallet transactions and balances
-- Retrieving NFT holder information and metadata
-- Getting transaction details and token information
+- Set up and configure Moralis for Sei
+- Work with different Moralis APIs (Wallet, NFT, Token, and Blockchain APIs)
+- Fetch wallet transactions and balances
+- Get NFT holder information and metadata
+- Get transaction details and token information
## Prerequisites
-Before starting with this guide, ensure you have:
+Before you start, make sure that you have:
-1. **Moralis Account**: Create a free account at [moralis.io](https://moralis.io)
+1. **Moralis account**: Create a free account at [moralis.io](https://moralis.io)
2. **Node.js**: Version 14 or higher installed
-3. **Package Manager**: npm, yarn, or pnpm
+3. **Package manager**: npm, yarn, or pnpm
4. **TypeScript**: Basic knowledge (optional but recommended)
-### Sei Network Configuration
+### Sei network configuration
-Following is the configuration details of Sei for Moralis integration:
+These are the Sei configuration details for a Moralis integration:
-**Mainnet:**
+**Sei Mainnet:**
- Chain ID: 1329 (0x531)
- RPC URL: https://evm-rpc.sei-apis.com
-**Testnet:**
+**Sei Testnet:**
- Chain ID: 1328 (0x530)
- RPC URL: https://evm-rpc-testnet.sei-apis.com
-## Moralis APIs Overview
+## Moralis APIs overview
-Moralis offers several powerful APIs that work seamlessly across multiple blockchains:
+Moralis has several APIs that work across multiple blockchains:
-- **NFT API**: Access comprehensive NFT data including metadata, ownership details, and transaction history
-- **Wallet API**: Retrieve real-time wallet data including balances, transaction history, and token holdings
+- **NFT API**: Access NFT data, including metadata, ownership details, and transaction history
+- **Wallet API**: Get real-time wallet data, including balances, transaction history, and token holdings
- **Token API**: Get token information, prices, and transfer data
-- **Blockchain API**: Fetch raw blockchain data - blocks, transactions, and logs
-- **Price API**: Retrieve real-time and historical crypto token prices
-- **DeFi API**: Query DeFi protocol data including pools, positions, and yields
+- **Blockchain API**: Fetch raw blockchain data: blocks, transactions, and logs
+- **Price API**: Get real-time and historical crypto token prices
+- **DeFi API**: Query DeFi protocol data, including pools, positions, and yields
-## Setting Up Your Project
+## Setting up your project
### Install Moralis SDK
@@ -73,13 +73,13 @@ npm install @moralisweb3/common-evm-utils
npm install typescript ts-node @types/node --save-dev
```
-### Get Your API Key
+### Get your API key
1. Sign up at [moralis.io](https://moralis.io)
-2. Navigate to "Project Settings"
+2. Go to **Project Settings**
3. Copy your API key from the dashboard
-### Basic Configuration
+### Basic configuration
Create a `.env` file in your project root:
@@ -108,7 +108,7 @@ const initMoralis = async () => {
initMoralis();
```
-## Wallet Transactions API
+## Wallet transactions API
```typescript
// Get wallet transactions for Sei Mainnet
@@ -132,7 +132,7 @@ const walletAddress = '0x742d35Cc6636C0532925a3b8D62c5bceCdB8eBc8';
getWalletTransactions(walletAddress);
```
-## NFT Holders API
+## NFT holders API
```typescript
// Get NFTs owned by wallet address
@@ -168,7 +168,7 @@ const getNFTOwners = async (contractAddress: string) => {
};
```
-## Transaction Details API
+## Transaction details API
```typescript
// Get detailed transaction information
@@ -256,9 +256,9 @@ const getTokenMetadata = async (tokenAddress: string) => {
};
```
-## Complete Integration Example
+## Complete integration example
-Here's a comprehensive example that brings everything together:
+This example combines several of the previous calls into one service:
```typescript
import Moralis from 'moralis';
@@ -353,4 +353,4 @@ const response = await Moralis.EvmApi.transaction.getWalletTransactions({
});
```
- For a complete API reference and additional guides visit the [Moralis Documentation](https://docs.moralis.com/)
+ For a complete API reference and more guides, see the [Moralis documentation](https://docs.moralis.com/).
diff --git a/evm/indexer-providers/the-graph.mdx b/evm/indexer-providers/the-graph.mdx
index e85a795..75b4fe5 100644
--- a/evm/indexer-providers/the-graph.mdx
+++ b/evm/indexer-providers/the-graph.mdx
@@ -3,84 +3,81 @@ title: "The Graph"
description: "Build and deploy subgraphs on The Graph to efficiently index and query data from Sei smart contracts, with step-by-step instructions from initialization to production deployment."
keywords: ["the graph", "subgraphs", "blockchain indexing", "graphql", "dapp data"]
---
-Getting historical data on a smart contract can be frustrating when you're
-building a dapp. [The Graph](https://thegraph.com/) provides an easy way to
-query smart contract data through APIs known as subgraphs. The Graph's
-infrastructure relies on a decentralized network of indexers, enabling your dapp
-to become truly decentralized.
+When you build a dApp, it can be difficult to get historical data for a smart
+contract. [The Graph](https://thegraph.com/) gives you an easy way to query
+smart contract data through APIs called subgraphs. The Graph's infrastructure
+relies on a decentralized network of indexers. This lets your dApp be fully
+decentralized.
-## Quick Start
+## Quick start
-These subgraphs only take a few minutes to set up. To get started, follow these
+A subgraph takes only a few minutes to set up. To get started, follow these
three steps:
1. Initialize your subgraph project
-2. Deploy & Publish
-3. Query from your dapp
+2. Deploy and publish
+3. Query from your dApp
-Pricing: **All developers receive 100K free queries per month on the
-decentralized network**. After these free queries, you only pay based on usage
-at $4 for every 100K queries.
-
-Here's a step by step walk through:
+Pricing: All developers get 100K free queries per month on the decentralized
+network. After these free queries, you pay only for usage, at $4 for every 100K
+queries.
## 1. Initialize your subgraph project
### Create a subgraph on Subgraph Studio
Go to the [Subgraph Studio](https://thegraph.com/studio/) and connect your
-wallet. Once your wallet is connected, you can begin by clicking "Create a
-Subgraph". When entering the subgraph name, it is recommended to use Title Case:
-"Subgraph Name Chain Name."
+wallet. Then click **Create a Subgraph**. When you enter the subgraph name, use
+Title Case: "Subgraph Name Chain Name."

*Create a Subgraph*
-You will then land on your subgraph's page. All the CLI commands you need will
-be visible on the right side of the page:
+Your subgraph's page then opens. The right side of the page shows all the CLI
+commands that you need:

*CLI Commands*
### Install the Graph CLI
-On your local machine run the following:
+On your local machine, run this command:
```bash
npm install -g @graphprotocol/graph-cli
```
-### Initialize your Subgraph
+### Initialize your subgraph
-You can copy this directly from your subgraph page to include your specific
-subgraph slug:
+You can copy this command from your subgraph page. The copied command includes
+your subgraph slug:
```bash
graph init --studio
```
-You'll be prompted to provide some info on your subgraph like this:
+The CLI then prompts you for some information about your subgraph:

*CLI*
-Have your contract verified on the block explorer and the CLI will
-automatically obtain the ABI and set up your subgraph. The default settings will
-generate an entity for each event.
+Make sure that your contract is verified on the block explorer. The CLI then
+gets the ABI automatically and sets up your subgraph. The default settings generate an entity
+for each event.
-## 2. Deploy & Publish
+## 2. Deploy & publish
### Deploy to Subgraph Studio
-First run these commands:
+First, run these commands:
```bash
$ graph codegen
$ graph build
```
-Then run these to authenticate and deploy your subgraph. You can copy these
-commands directly from your subgraph's page in Studio to include your specific
+Then run these commands to authenticate and deploy your subgraph. You can copy
+them from your subgraph's page in Studio. The copied commands include your
deploy key and subgraph slug:
```bash
@@ -88,51 +85,47 @@ $ graph auth --studio
$ graph deploy --studio
```
-You will be asked for a version label. You can enter something like v0.0.1, but
-you're free to choose the format.
+The CLI asks for a version label. You can enter something like v0.0.1, but you
+can choose any format.
### Test your subgraph
-You can test your subgraph by making a sample query in the playground section.
-The Details tab will show you an API endpoint. You can use that endpoint to test
-from your dapp.
+You can test your subgraph with a sample query in the playground section. The
+**Details** tab shows an API endpoint. You can use that endpoint to test from
+your dApp.

-*Run your graphql query in Studio*
+*Run your GraphQL query in Studio*
-### Publish Your Subgraph to The Graph's Decentralized Network
+### Publish your subgraph to The Graph's decentralized network
-Once your subgraph is ready to be put into production, you can publish it to the
-decentralized network. On your subgraph's page in Subgraph Studio, click on the
-Publish button:
+When your subgraph is ready for production, you can publish it to the
+decentralized network. On your subgraph's page in Subgraph Studio, click
+**Publish**:

*Click Publish*
-Before you can query your subgraph, Indexers need to begin serving queries on
-it. In order to streamline this process, you can curate your own subgraph using
-GRT.
+Before you can query your subgraph, Indexers need to start serving queries on
+it. To speed up this process, you can curate your own subgraph with GRT.
-When publishing, you'll see the option to curate your subgraph. Signaling GRT
-on your own subgraph helps ensure that it is indexed and available for querying
-as soon as possible. See The Graph's
-[curating documentation](https://thegraph.com/docs/en/resources/roles/curating/)
-for current guidance on how much GRT to signal.
+When you publish, you see the option to curate your subgraph. Signaling GRT on
+your own subgraph helps make sure that it is indexed and available for queries
+as soon as possible. For current guidance on how much GRT to signal, see The
+Graph's [curating documentation](https://thegraph.com/docs/en/resources/roles/curating/).

-*Publish Screen*
-
-**Note:** The Graph's smart contracts are all on Arbitrum One, even though > your subgraph is indexing data from Ethereum, BSC or any other > [supported chain](https://thegraph.com/docs/en/developing/supported-networks/).
+*Publish screen*
-## 3. Query your Subgraph
+The Graph's smart contracts are all on Arbitrum One, even if your subgraph indexes data from Ethereum, BSC, or any other [supported chain](https://thegraph.com/docs/en/developing/supported-networks/).
-Congratulations! You can now query your subgraph on the decentralized network!
+## 3. Query your subgraph
-For any subgraph on the decentralized network, you can start querying it by
-passing a GraphQL query into the subgraph's query URL which can be found at the
-top of its Explorer page.
+To query any subgraph on the decentralized network, pass a GraphQL query to the
+subgraph's query URL. You can find the query URL at the top of the subgraph's
+Explorer page.
-Here's an example from the
+This example is from the
[CryptoPunks Ethereum subgraph](https://thegraph.com/explorer/subgraphs/HdVdERFUe8h61vm2fDyycHgxjsde5PbB832NHgJfZNqK)
by Messari:
@@ -142,20 +135,19 @@ by Messari:
The query URL for this subgraph is:
`https://gateway-arbitrum.network.thegraph.com/api/`**[api-key]**`/subgraphs/id/HdVdERFUe8h61vm2fDyycHgxjsde5PbB832NHgJfZNqK`
-Now, you need to fill in your own API Key to start sending GraphQL
-queries to this endpoint.
+To send GraphQL queries to this endpoint, fill in your own API key.
-### Getting your own API Key
+### Getting your own API key

*API keys*
-In Subgraph Studio, you'll see the "API Keys" menu at the top of the page. Here
-you can create API Keys.
+In Subgraph Studio, the **API Keys** menu is at the top of the page. You can
+create API keys there.
## Appendix
-### Sample Query
+### Sample query
This query shows the most expensive CryptoPunks sold.
@@ -168,7 +160,7 @@ This query shows the most expensive CryptoPunks sold.
}
```
-Passing this into the query URL returns this result:
+If you pass this query to the query URL, it returns this result:
```json
{
@@ -186,7 +178,7 @@ Passing this into the query URL returns this result:
```
- Trivia: Looking at the top sales on [CryptoPunks website](https://cryptopunks.app/cryptopunks/topsales) it looks like the top sale is Punk #5822, not #9998. Why? Because they censor the flash-loan sale that happened.
+ Trivia: The top sales list on the [CryptoPunks website](https://cryptopunks.app/cryptopunks/topsales) shows Punk #5822 as the top sale, not #9998. The reason is that the website censors the flash-loan sale.
### Sample code
@@ -225,8 +217,8 @@ axios(graphQLRequest)
### Additional resources:
-- To explore all the ways you can optimize & customize your subgraph for a
- better performance, read more about
- [creating a subgraph here](https://thegraph.com/docs/en/developing/creating-a-subgraph/).
-- For more information about querying data from your subgraph, read more
- [here](https://thegraph.com/docs/en/querying/querying-the-graph/).
+- To learn the ways that you can optimize and customize your subgraph for better
+ performance, read about
+ [creating a subgraph](https://thegraph.com/docs/en/developing/creating-a-subgraph/).
+- For more information about how to query data from your subgraph, see the
+ [querying documentation](https://thegraph.com/docs/en/querying/querying-the-graph/).
diff --git a/evm/installing-seid-cli.mdx b/evm/installing-seid-cli.mdx
index 6b0b6e4..f30f135 100644
--- a/evm/installing-seid-cli.mdx
+++ b/evm/installing-seid-cli.mdx
@@ -8,15 +8,15 @@ import { VersionTable } from '/snippets/version-table.jsx';
## What is seid CLI?
-The `seid` CLI is the command-line tool for interacting with the Sei blockchain. It allows you to manage wallets, send transactions, query network data, and perform validator operations.
+The `seid` CLI is the command-line tool to interact with Sei. It lets you manage wallets, send transactions, query network data, and perform validator operations.
## Prerequisites
-- [Go 1.25.6 or later](https://go.dev/doc/install) is required only when building from source. Check the `go.mod` at the release tag you check out below (e.g. [`v6.6.1`](https://github.com/sei-protocol/sei-chain/blob/v6.6.1/go.mod)) for its exact requirement. Prebuilt binaries have no prerequisites.
+- [Go 1.25.6 or later](https://go.dev/doc/install) is required only when you build from source. For the exact requirement, read the `go.mod` file at the release tag that you check out below, for example [`v6.6.1`](https://github.com/sei-protocol/sei-chain/blob/v6.6.1/go.mod). Prebuilt binaries have no prerequisites.
## Installation
-To install `seid`, locate the version you wish to use on the [sei-chain releases page](https://github.com/sei-protocol/sei-chain/releases). A list of the currently used versions on mainnet and testnet are displayed right below.
+To install `seid`, find the version that you want on the [sei-chain releases page](https://github.com/sei-protocol/sei-chain/releases). The table below lists the versions currently in use on Sei Mainnet and Sei Testnet.
@@ -39,15 +39,15 @@ To install `seid`, locate the version you wish to use on the [sei-chain releases
```
- Prebuilt binaries are attached from `v6.6.1` onward — for earlier versions, build
- from source. They are `linux/amd64` only and omit hardware Ledger support. On
- other architectures, or if you sign with a Ledger device, build from source.
+ Prebuilt binaries are attached from `v6.6.1` onward. For earlier versions, build
+ from source. The binaries are `linux/amd64` only and omit hardware Ledger support.
+ On other architectures, or if you sign with a Ledger device, build from source.
- Previously installed with `make install`? An older copy in `$(go env GOPATH)/bin`
- can shadow `/usr/local/bin/seid` depending on your `PATH` order — `which -a seid`
- lists every copy.
+ If you previously installed `seid` with `make install`, an older copy in
+ `$(go env GOPATH)/bin` can shadow `/usr/local/bin/seid`, depending on your `PATH`
+ order. `which -a seid` lists every copy.
@@ -61,29 +61,29 @@ To install `seid`, locate the version you wish to use on the [sei-chain releases
-You can verify that `seid` was installed correctly by running:
+To verify that `seid` is installed correctly, run this command:
```bash
seid version
```
-## Troubleshooting Installation
+## Troubleshooting installation
-If you built from source and encounter an error like `command not found: seid`, you may need to set your GOPATH environment variable.
+If you built from source and get an error such as `command not found: seid`, you may need to set your GOPATH environment variable.
-- Use `go env GOPATH` to find your GOPATH
-- Add the following lines to your `~/.bashrc` or `~/.zshrc`:
+- To find your GOPATH, run `go env GOPATH`.
+- Add these lines to your `~/.bashrc` or `~/.zshrc` file:
```bash
export GOPATH=[your GOPATH from step 1]
export PATH=$PATH:$GOPATH/bin
```
-For more information see [here](https://pkg.go.dev/cmd/go#hdr-GOPATH_environment_variable).
+For more information, see [GOPATH environment variable](https://pkg.go.dev/cmd/go#hdr-GOPATH_environment_variable) in the Go documentation.
-## Command Overview
+## Command overview
-Seid supports all the commands you need to interact with the chain. To see a list of available commands and explanations of what they do, run seid:
+`seid` supports all the commands that you need to interact with the chain. To list the available commands with a short description of each, run `seid`:
```bash
seid
@@ -128,11 +128,11 @@ Flags:
Use "seid [command] --help" for more information about a command.
```
-The `compact`, `latest_version`, and `prune` maintenance commands were removed in v6.6.0. To read the latest memIAVL version (the former `latest_version`), use `seidb memiavl-latest-version`. Historical-data retention is managed through `min-retain-blocks` in the base `app.toml` and `ss-keep-recent` under `[state-store]`.
+The `compact`, `latest_version`, and `prune` maintenance commands were removed in v6.6.0. To read the latest memIAVL version (the former `latest_version`), use `seidb memiavl-latest-version`. `min-retain-blocks` in the base `app.toml` and `ss-keep-recent` under `[state-store]` control historical-data retention.
-## Adding a Wallet
+## Adding a wallet
-You can create a new wallet using the seid keys command:
+To create a new wallet, use the `seid keys` command:
```bash
seid keys add $NAME
@@ -155,11 +155,11 @@ It is the only way to recover your account if you ever forget your password.
```
-Please replace `$NAME` with the name you would like to use for this key. This will generate a seed phrase and store the account in the CLI for use.
+Replace `$NAME` with the name that you want for this key. The command generates a seed phrase and stores the account in the CLI.
-**Important**: Write this mnemonic down and store it in a safe place. Never share your seed phrase with anyone.
+Write down this seed phrase and store it in a safe place. Never share your seed phrase with anyone.
-Alternatively, if you would like to import an existing seed phrase, you can add the `--recover` flag:
+To import an existing seed phrase instead, add the `--recover` flag:
```bash
seid keys add $NAME --recover
@@ -167,7 +167,7 @@ seid keys add $NAME --recover
Output:
-This will prompt you to enter your seed phrase, allowing you to import an existing wallet into the CLI.
+The command prompts you to enter your seed phrase. It then imports the existing wallet into the CLI.
```bash
> Enter your bip39 mnemonic
@@ -181,18 +181,18 @@ This will prompt you to enter your seed phrase, allowing you to import an existi
mnemonic: ""
```
-## EVM Wallet Compatibility
+## EVM wallet compatibility
-### Understanding Coin Types
+### Understanding coin types
Sei supports two coin types:
- Coin type 118 (default): Standard Cosmos address format
- Coin type 60: Ethereum-compatible address format for EVM wallets
-### Creating an EVM-Compatible Wallet
+### Creating an EVM-compatible wallet
-To create a new wallet that's compatible with EVM wallets like MetaMask:
+To create a new wallet that is compatible with EVM wallets such as MetaMask, run this command:
```bash
seid keys add $NAME --coin-type=60
@@ -215,11 +215,11 @@ It is the only way to recover your account if you ever forget your password.
```
-`evm_address` is shown as empty here because it's only displayed after the key first broadcasts a transaction or is associated on-chain. The `0x` address is deterministically derived from the secp256k1 public key.
+`evm_address` is empty here because the CLI shows it only after the key first broadcasts a transaction or is associated on-chain. The `0x` address is derived deterministically from the secp256k1 public key.
-### Importing an Existing EVM Wallet
+### Importing an existing EVM wallet
-To import an existing wallet from MetaMask or other EVM wallets:
+To import an existing wallet from MetaMask or another EVM wallet, run this command:
```bash
seid keys add $NAME --coin-type=60 --recover
@@ -239,13 +239,13 @@ Output:
mnemonic: ""
```
-You'll be prompted to enter your existing 12 or 24-word mnemonic phrase.
+The command prompts you to enter your existing 12-word or 24-word seed phrase.
-Use coin type 60 when you want to use the same address across EVM-compatible chains or import from MetaMask. Use the default coin type 118 for standard Cosmos operations.
+To use the same address across EVM-compatible chains or to import from MetaMask, use coin type 60. For standard Cosmos operations, use the default coin type 118.
-## Managing Wallets
+## Managing wallets
-To see your local wallets, you can run:
+To list all the wallets that you added to your local keyring, run this command:
```bash
seid keys list
@@ -263,7 +263,7 @@ Output:
...
```
-to see a list of all wallets added, or
+To see details about a specific wallet, run this command:
```bash
seid keys show $NAME
@@ -280,11 +280,9 @@ Output:
mnemonic: ""
```
-to see details about a specific wallet.
+## Deleting wallets
-## Deleting Wallets
-
-To delete a wallet/key, you can use the following command:
+To delete a wallet or key, run this command:
```bash
seid keys delete $NAME
@@ -297,11 +295,11 @@ Key reference will be deleted. Continue? [y/N]: y
Key deleted forever (uh oh!)
```
-This will remove the specified wallet from your local keyring. Be cautious, as this action cannot be undone.
+This command removes the specified wallet from your local keyring. Be careful, because you cannot undo this action.
## Uninstalling seid
-If you need to remove `seid` from your system, delete the binary from wherever it was installed:
+To remove `seid` from your system, delete the binary from the location where you installed it:
```bash
# Prebuilt binary install
diff --git a/evm/ledger-ethers.mdx b/evm/ledger-ethers.mdx
index 1439231..f587f2d 100644
--- a/evm/ledger-ethers.mdx
+++ b/evm/ledger-ethers.mdx
@@ -3,32 +3,32 @@ title: 'Ledger Setup (EVM)'
description: 'Set up your Ledger hardware wallet for signing EVM transactions on Sei, including device configuration, Ethers.js integration, and a simple transfer example.'
keywords: ['ledger wallet', 'ethers.js', 'hardware wallet', 'blockchain security', 'sei transactions', 'evm']
---
-This guide covers connecting a Ledger hardware wallet to Sei EVM for signing transactions with Ethers.js.
+This guide shows how to connect a Ledger hardware wallet to Sei EVM and sign transactions with ethers.js.
-`@sei-js/ledger` is no longer in the sei-js monorepo. npm still serves deprecated `1.1.6`; do not install it. It previously handled Cosmos-side Amino signing, and there is no replacement package for that flow. Cosmos SDK signing is deprecated. See [SIP-3](/learn/sip-03-migration) and the [Cosmos SDK deprecation notice](/cosmos-sdk). This page covers EVM transactions only.
+`@sei-js/ledger` is no longer in the sei-js monorepo. Do not install the deprecated version `1.1.6`, which npm still serves. The package previously handled Cosmos-side Amino signing, and there is no replacement package for that flow. Cosmos SDK signing is deprecated. See [SIP-3](/learn/sip-03-migration) and the [Cosmos SDK deprecation notice](/cosmos-sdk). This page covers EVM transactions only.
## Prerequisites
-1. **Ledger App Installation**
+1. **Install the Ledger app**
- On your Ledger device, open the Manager in Ledger Live and install **either** the **Sei** app **or** the **Ethereum** app. The Ethereum app supports any EVM chain (like Sei), but the native Sei app may provide optimal compatibility.
+ Open the **Manager** in Ledger Live. Install either the **Sei** app or the **Ethereum** app on your Ledger device. The Ethereum app supports any EVM chain, including Sei, but the native Sei app may give the best compatibility.
-2. **Enable Blind Signing**
+2. **Enable blind signing**
- In the Ledger device's Ethereum or Sei app settings, **enable "Blind signing"**. This permits the device to sign arbitrary EVM transactions and contract calls (e.g. precompiles), which would otherwise be rejected.
+ In the settings of the Ethereum or Sei app on the Ledger device, enable **Blind signing**. This setting lets the device sign arbitrary EVM transactions and contract calls (for example, precompile calls). Without it, the device rejects them.
-3. **USB Permissions (Linux only)**
+3. **Set up USB permissions (Linux only)**
- You'll need a **udev rule** so your process can talk to the Ledger over USB/HID. Clone the official rules from [LedgerHQ/udev-rules](https://github.com/LedgerHQ/udev-rules), copy `49-ledger.rules` into `/etc/udev/rules.d/`, then run `sudo udevadm control --reload-rules` and replug your Ledger.
+ Your process needs a udev rule to communicate with the Ledger over USB HID. Clone the official rules from [LedgerHQ/udev-rules](https://github.com/LedgerHQ/udev-rules). Copy `49-ledger.rules` into `/etc/udev/rules.d/`. Run `sudo udevadm control --reload-rules`. Then disconnect your Ledger and connect it again.
-4. **Install Dependencies**
+4. **Install dependencies**
```bash
npm install ethers @ethers-ext/signer-ledger @ledgerhq/hw-transport-node-hid
```
-## Connecting Your Ledger
+## Connecting your Ledger
```tsx
import { LedgerSigner } from '@ethers-ext/signer-ledger';
@@ -43,11 +43,11 @@ const addr = await signer.getAddress();
console.log('Using Ledger address:', addr);
```
-Every transaction sent through this signer will require physical confirmation on the Ledger device.
+Every transaction that you send through this signer requires physical confirmation on the Ledger device.
-## Sending a Transfer
+## Sending a transfer
-A simple example sending SEI from your Ledger to another address:
+This example sends SEI from your Ledger to another address:
```tsx
import { LedgerSigner } from '@ethers-ext/signer-ledger';
@@ -67,10 +67,10 @@ const receipt = await tx.wait();
console.log('Confirmed in block:', receipt.blockNumber);
```
-This signer works with any contract interaction — you can pass it to `ethers.Contract` constructors to sign [precompile](/evm/precompiles) calls, ERC-20 transfers, or any other EVM transaction.
+This signer works with any contract interaction. You can pass it to `ethers.Contract` constructors to sign [precompile](/evm/precompiles) calls, ERC-20 transfers, or any other EVM transaction.
## Troubleshooting
-- **Timeouts:** If the Ledger times out, increase the HID timeouts or ensure the device stays awake during signing.
-- **"Blind signing required" errors:** Double-check that blind signing is enabled in the app settings on the device itself.
-- **Connection failures:** Make sure no other application (e.g. Ledger Live) is holding the USB connection to your device.
+- **Timeouts:** If the Ledger times out, increase the HID timeouts or make sure that the device stays awake during signing.
+- **"Blind signing required" errors:** Check that blind signing is enabled in the app settings on the device itself.
+- **Connection failures:** Make sure that no other application, such as Ledger Live, holds the USB connection to your device.
diff --git a/evm/migrate-from-other-evms.mdx b/evm/migrate-from-other-evms.mdx
index 2e11d79..ef1bf26 100644
--- a/evm/migrate-from-other-evms.mdx
+++ b/evm/migrate-from-other-evms.mdx
@@ -4,65 +4,65 @@ sidebarTitle: 'Migrate from Other EVMs'
description: 'Step-by-step checklist for teams that already run on another EVM chain and want to redeploy on Sei, including environment prep, contract migration, liquidity planning, and chain-specific guidance for Ethereum, Arbitrum, Base, Polygon, and Avalanche.'
keywords: ['EVM migration', 'cross-chain deployment', 'ethereum to sei', 'arbitrum to sei', 'base to sei', 'polygon to sei', 'avalanche to sei', 'smart contract deployment']
---
-Sei offers full EVM bytecode compatibility plus instant finality and sub-second blocks. This guide distills what product teams need to do when they already run on Polygon, Base, Ethereum, Arbitrum, Avalanche or another EVM chain and want to bring your dApp stack to Sei.
+Sei has full EVM bytecode compatibility, instant finality, and sub-second blocks. This guide is for product teams that already run on Polygon, Base, Ethereum, Arbitrum, Avalanche, or another EVM chain. It shows what you need to do to bring your dApp stack to Sei.
-**Why Migrate to Sei?**
+**Why migrate to Sei?**
-- **400ms block times** – 30× faster than Ethereum, 2-5× faster than most L2s
-- **~100 MGas/s throughput** – 20× higher than Ethereum mainnet
-- **Instant finality (~400 ms)** – No waiting for confirmations or safe/finalized states
-- **Parallelized execution** – Higher throughput without code changes
-- **Full EVM compatibility** – Deploy your existing Solidity contracts unchanged
+- Block times are 400 ms, which is 30× faster than Ethereum and 2 to 5× faster than most L2s.
+- Throughput is approximately 100 MGas/s, which is 20× higher than Ethereum mainnet.
+- Finality is instant (approximately 400 ms). You do not wait for confirmations or for safe or finalized states.
+- Parallelized execution gives higher throughput without code changes.
+- Full EVM compatibility lets you deploy your existing Solidity contracts unchanged.
## Chain comparison overview
-Before diving into migration steps, understand how Sei compares to your source chain:
+Before you start the migration steps, see how Sei compares with your source chain:
| Feature | Sei | Ethereum | Arbitrum | Base | Polygon PoS | Avalanche C-Chain |
| --- | --- | --- | --- | --- | --- | --- |
| Chain ID | 1329 | 1 | 42161 | 8453 | 137 | 43114 |
-| Block Time | 400 ms | ~12 s | ~250 ms | ~2 s | ~2 s | ~2 s |
+| Block time | 400 ms | ~12 s | ~250 ms | ~2 s | ~2 s | ~2 s |
| Finality | Instant (~400 ms) | ~15 min (finalized) | ~7 days (L1 settlement) | ~7 days (L1 settlement) | ~5 s (Heimdall v2) | ~1 s |
-| Gas Limit | 12.5 M | 60M | 32M | 375M | 45M | Dynamic |
-| Per-Tx Gas Cap | 12.5 M | ~16.7 M | 32 M | ~25 M | 45 M | Dynamic |
-| Native Token | SEI | ETH | ETH | ETH | POL (MATIC) | AVAX |
-| Parallel Execution | Yes | No | No | No | No | No |
-| Base Fee Burn | No (100% to validators) | Yes (EIP-1559) | Yes | Yes | Yes | Yes |
-| EVM Version | Pectra (w/o blobs) | Fusaka | Fusaka | Pectra | Pectra | Cancun |
+| Gas limit | 12.5 M | 60M | 32M | 375M | 45M | Dynamic |
+| Per-tx gas cap | 12.5 M | ~16.7 M | 32 M | ~25 M | 45 M | Dynamic |
+| Native token | SEI | ETH | ETH | ETH | POL (MATIC) | AVAX |
+| Parallel execution | Yes | No | No | No | No | No |
+| Base fee burn | No (100% to validators) | Yes (EIP-1559) | Yes | Yes | Yes | Yes |
+| EVM version | Pectra (without blobs) | Fusaka | Fusaka | Pectra | Pectra | Cancun |
## Chain-specific migration guides
-Select your source chain to see specific migration considerations:
+Select your source chain to see the migration considerations for that chain:
### Migrating from Ethereum Mainnet
-**Key Differences:**
+**Key differences:**
-| Aspect | Ethereum | Sei | Migration Impact |
+| Aspect | Ethereum | Sei | Migration impact |
| --- | --- | --- | --- |
| Block time | ~12 seconds | 400 ms | Reduce `deadline` buffers in DEX swaps by 30× |
| Finality | ~15 min for finalized | Instant (~400 ms) | Remove confirmation polling logic |
| Gas limit | ~16.7M per TX (EIP-7825) | 12.5 M per block/TX | Split large batch deployments |
-| Fee model | EIP-1559 with burn | EIP-1559 different params | Update fee estimation UIs |
+| Fee model | EIP-1559 with burn | EIP-1559 with different parameters | Update fee estimation UIs |
| Pending state | Yes | No | Remove pending transaction logic |
-**What to Update:**
+**What to update:**
-1. **Time-based logic:** If your contracts use block timestamps for deadlines, reduce timeouts proportionally. A 30-minute deadline on Ethereum (~150 blocks) should be ~45 seconds on Sei (~112 blocks).
+1. **Time-based logic:** If your contracts use block timestamps for deadlines, reduce the timeouts proportionally. A 30-minute deadline on Ethereum is approximately 150 blocks. On Sei, the deadline should be approximately 45 seconds (approximately 112 blocks).
-2. **Confirmation requirements:** Remove any logic that waits for multiple confirmations or checks "safe" vs "finalized" states—Sei has instant finality.
+2. **Confirmation requirements:** Remove any logic that waits for multiple confirmations or checks "safe" versus "finalized" states. Sei has instant finality.
-3. **Gas estimation:** Sei's parallelized execution can slightly vary gas estimates. Add a modest buffer (10-15%) to your `gasLimit` calculations.
+3. **Gas estimation:** Sei's parallelized execution can make gas estimates vary slightly. Add a modest buffer (10 to 15%) to your `gasLimit` calculations.
-4. **Fee UI:** Simplify your frontend—you can use a single `gasPrice` input instead of `maxFeePerGas` / `maxPriorityFeePerGas`.
+4. **Fee UI:** Simplify your frontend. You can use a single `gasPrice` input instead of `maxFeePerGas` and `maxPriorityFeePerGas`.
```ts
// Before (Ethereum EIP-1559)
@@ -77,18 +77,18 @@ const tx = await contract.method({
});
```
-Sei enforces a 50 gwei minimum gas price; transactions below this are rejected by the mempool. Query the live value with `eth_gasPrice` (returns base fee + suggested tip).
+Sei enforces a minimum gas price of 50 gwei. The mempool rejects transactions below this price. Query the live value with `eth_gasPrice`, which returns the base fee plus a suggested tip.
-5. **PREVRANDAO/DIFFICULTY:** If you use these for any randomness, integrate a VRF oracle instead—Sei's values are derived from block time, not true randomness.
+5. **PREVRANDAO and DIFFICULTY:** If you use these opcodes for any randomness, integrate a VRF oracle instead. On Sei, their values are derived from block time, not from true randomness.
### Migrating from Arbitrum
-**Key Differences:**
+**Key differences:**
-| Aspect | Arbitrum | Sei | Migration Impact |
+| Aspect | Arbitrum | Sei | Migration impact |
| --- | --- | --- | --- |
| Architecture | Optimistic Rollup (L2) | L1 | No L1 data availability concerns |
| Finality | ~7 days for L1 settlement | Instant (~400 ms) | Simplify withdrawal flows |
@@ -97,13 +97,13 @@ const tx = await contract.method({
| L1 gas | Pays L1 data costs | No L1 dependency | Simpler fee structure |
-**What to Update:**
+**What to update:**
-1. **Remove L1 interactions:** Any logic that posts data to or reads from Ethereum L1 should be removed or replaced with Sei-native alternatives.
+1. **Remove L1 interactions:** Find any logic that posts data to Ethereum L1 or reads data from it. Remove that logic, or replace it with a Sei-native alternative.
-2. **Sequencer assumptions:** Remove any sequencer uptime checks or fallback logic—Sei uses decentralized consensus.
+2. **Sequencer assumptions:** Remove any sequencer uptime checks or fallback logic. Sei uses decentralized consensus.
-3. **Withdrawal delays:** If your protocol has 7-day withdrawal windows for "L1 finality," you can remove these—Sei settles instantly.
+3. **Withdrawal delays:** If your protocol has 7-day withdrawal windows for "L1 finality," you can remove them. Sei settles instantly.
4. **ArbOS precompiles:** Replace any Arbitrum-specific precompiles:
@@ -123,9 +123,9 @@ uint256 blockNum = block.number; // Standard EVM
### Migrating from Base
-**Key Differences:**
+**Key differences:**
-| Aspect | Base | Sei | Migration Impact |
+| Aspect | Base | Sei | Migration impact |
| --- | --- | --- | --- |
| Architecture | OP Stack Rollup (L2) | L1 | No L1 data availability concerns |
| Finality | ~7 days for L1 settlement | Instant (~400 ms) | Simplify withdrawal flows |
@@ -134,11 +134,11 @@ uint256 blockNum = block.number; // Standard EVM
| EIP-4844 blobs | Supported | Not supported | Remove blob transaction logic |
-**What to Update:**
+**What to update:**
-1. **Remove blob transactions:** Sei doesn't support EIP-4844 blob transactions. If you're using them for data availability, store data differently or use Sei's native mechanisms.
+1. **Remove blob transactions:** Sei does not support EIP-4844 blob transactions. If you use them for data availability, store the data differently or use Sei's native mechanisms.
-2. **OP Stack precompiles:** Remove any Optimism/Base-specific precompile calls:
+2. **OP Stack precompiles:** Remove any precompile calls that are specific to Optimism or Base:
```solidity
// Base-specific (remove)
@@ -148,11 +148,11 @@ uint256 blockNum = block.number; // Standard EVM
uint256 blockNum = block.number;
```
-3. **Fault proof assumptions:** Remove any logic that accounts for the 7-day challenge period—Sei has instant finality.
+3. **Fault proof assumptions:** Remove any logic that accounts for the 7-day challenge period. Sei has instant finality.
4. **Sequencer fee logic:** Base has a separate L1 data fee component. On Sei, fees are simpler: `Gas Used × Gas Price`.
-5. **Coinbase Wallet integrations:** Update wallet connection logic to use Sei network parameters:
+5. **Coinbase Wallet integrations:** Update your wallet connection logic to use the Sei network parameters:
```ts
// Update network config
@@ -170,9 +170,9 @@ const seiMainnet = {
### Migrating from Polygon PoS
-**Key Differences:**
+**Key differences:**
-| Aspect | Polygon PoS | Sei | Migration Impact |
+| Aspect | Polygon PoS | Sei | Migration impact |
| --- | --- | --- | --- |
| Native token | POL (MATIC) | SEI | Update all token references |
| Block time | ~2 seconds | 400 ms | 5× faster blocks |
@@ -181,9 +181,9 @@ const seiMainnet = {
| Reorgs | Possible (rare) | Never | Remove reorg handling |
-**What to Update:**
+**What to update:**
-1. **Token references:** Replace all MATIC/POL references with SEI:
+1. **Token references:** Replace all MATIC and POL references with SEI:
```solidity
// Before (Polygon)
@@ -193,13 +193,13 @@ const seiMainnet = {
// Check ecosystem contracts for canonical WSEI address
```
-2. **Checkpoint logic:** Remove any logic that waits for Polygon checkpoints to Ethereum—Sei has instant finality.
+2. **Checkpoint logic:** Remove any logic that waits for Polygon checkpoints to Ethereum. Sei has instant finality.
-3. **Heimdall/Bor assumptions:** Remove any Polygon-specific validator or sidechain logic.
+3. **Heimdall and Bor assumptions:** Remove any Polygon-specific validator or sidechain logic.
-4. **Reorg handling:** You can safely remove block reorganization handling code—Sei's consensus prevents reorgs.
+4. **Reorg handling:** You can safely remove the code that handles block reorganizations. Sei's consensus prevents reorgs.
-5. **Gas price oracles:** Polygon's gas prices can spike significantly. Sei's fees are more stable due to higher throughput:
+5. **Gas price oracles:** Polygon's gas prices can spike significantly. Sei's fees are more stable because of higher throughput:
```ts
// Polygon - needed aggressive gas price management
@@ -210,25 +210,25 @@ const boostedPrice = gasPrice.mul(120).div(100); // 20% buffer
const gasPrice = await provider.getGasPrice(); // Usually sufficient as-is
```
-6. **Bridge integrations:** Replace Polygon Bridge with [LayerZero](/evm/bridging/layerzero) or other Sei-supported bridges.
+6. **Bridge integrations:** Replace the Polygon Bridge with [LayerZero](/evm/bridging/layerzero) or other Sei-supported bridges.
### Migrating from Avalanche C-Chain
-**Key Differences:**
+**Key differences:**
-| Aspect | Avalanche C-Chain | Sei | Migration Impact |
+| Aspect | Avalanche C-Chain | Sei | Migration impact |
| --- | --- | --- | --- |
| Native token | AVAX | SEI | Update all token references |
| Block time | ~2 seconds | 400 ms | 5× faster blocks |
| Finality | ~1 second | Instant (~400 ms) | Similar, slightly faster |
| Subnets | Supported | N/A | Remove subnet logic |
-| Gas limit | Dynamic (post-Octane) | 12.5 M | Large tx headroom varies; benchmark deployments |
+| Gas limit | Dynamic (post-Octane) | 12.5 M | Large tx headroom varies, so benchmark deployments |
-**What to Update:**
+**What to update:**
1. **Token references:** Replace AVAX with SEI:
@@ -240,7 +240,7 @@ const gasPrice = await provider.getGasPrice(); // Usually sufficient as-is
// Use native SEI or check ecosystem contracts for WSEI
```
-2. **Subnet interactions:** If your dApp uses Avalanche Subnets, you'll need to redesign that architecture for Sei's single-chain model or use cross-chain messaging.
+2. **Subnet interactions:** If your dApp uses Avalanche Subnets, redesign that architecture for Sei's single-chain model, or use cross-chain messaging.
3. **Avalanche-specific precompiles:** Remove C-Chain precompile calls:
@@ -251,14 +251,14 @@ const gasPrice = await provider.getGasPrice(); // Usually sufficient as-is
// Use standard EVM patterns on Sei
```
-4. **Gas limit adjustments:** Avalanche now uses a dynamic gas model after Octane, while Sei has a fixed `12.5M` block/tx cap. If you have large transactions, benchmark them on Sei and split them when needed:
+4. **Gas limit adjustments:** Avalanche now uses a dynamic gas model after Octane. Sei has a fixed `12.5M` cap per block and per transaction. If you have large transactions, benchmark them on Sei and split them when needed:
```ts
// If deploying large contracts, batch by gas
const MAX_GAS_PER_BATCH = 11_500_000; // Leave buffer under 12.5M
```
-5. **TWAP calculations:** Both chains have fast blocks, but adjust your observation windows if migrating oracle logic:
+5. **TWAP calculations:** Both chains have fast blocks. If you migrate oracle logic, adjust your observation windows:
```solidity
// Avalanche: 1 hour = ~1800 blocks
@@ -271,11 +271,11 @@ uint32 constant TWAP_PERIOD = 9000; // Adjust for Sei's block time
## Step 1: Evaluate compatibility
-Revisit the [Divergence from Ethereum](/evm/differences-with-ethereum) doc and confirm every assumption your contracts/frontends make still holds.
+Review the [Divergence from Ethereum](/evm/differences-with-ethereum) page. Confirm that every assumption your contracts and frontends make still holds.
-| Dimension | Sei EVM | Practical Effect |
+| Dimension | Sei EVM | Practical effect |
| --- | --- | --- |
-| Block time | 400 ms | Faster TX inclusion → smaller `deadline` buffers and quicker price oracles |
+| Block time | 400 ms | Faster TX inclusion means smaller `deadline` buffers and quicker price oracles |
| Finality | Instant (~400 ms) | No separate "safe/latest" commitment levels to poll |
| Gas limit | 12.5M gas + 21 MB byte limit | Batch contract deployments by 12.5M gas blocks |
| Base fee | Dynamic but never burned | Validators receive 100% of fees |
@@ -285,20 +285,20 @@ Revisit the [Divergence from Ethereum](/evm/differences-with-ethereum) doc and c
-**Features Requiring Attention:**
+**Features that need attention:**
-- **Pending state:** Sei doesn't have pending state — transactions are either included or not
-- **Blob opcodes:** EIP-4844 blob transactions are not supported
-- **PREVRANDAO entropy:** Returns block-time-derived value, not true randomness — use VRF oracles here
-- **SELFDESTRUCT:** Deprecated; refactor to "soft close" patterns
+- **Pending state:** Sei does not have a pending state. A transaction is either included or not.
+- **Blob opcodes:** Sei does not support EIP-4844 blob transactions.
+- **PREVRANDAO entropy:** Use VRF oracles for randomness. PREVRANDAO returns a value derived from block time, not true randomness.
+- **SELFDESTRUCT:** Refactor to "soft close" patterns. This opcode is deprecated.
## Step 2: Prepare your development environment
-### Add Sei Network configuration
+### Add Sei network configuration
-**Hardhat Configuration:**
+**Hardhat configuration:**
```ts title="hardhat.config.ts"
import { defineConfig, configVariable } from 'hardhat/config';
@@ -323,9 +323,9 @@ export default defineConfig({
});
```
-Store your deployer key in Hardhat's encrypted keystore with `npx hardhat keystore set SEI_PRIVATE_KEY`. Contract verification via Sourcify is enabled by default in Hardhat 3's `hardhat-verify` (bundled with the toolbox).
+Store your deployer key in Hardhat's encrypted keystore with `npx hardhat keystore set SEI_PRIVATE_KEY`. In Hardhat 3, `hardhat-verify` (bundled with the toolbox) enables contract verification through Sourcify by default.
-**Foundry Configuration:**
+**Foundry configuration:**
```toml title="foundry.toml"
[profile.default]
@@ -341,11 +341,11 @@ sei_testnet = "https://evm-rpc-testnet.sei-apis.com"
# Run: forge verify-contract --verifier sourcify --chain-id
```
-See the [Hardhat tutorial](/evm/evm-hardhat) and [Foundry guide](/evm/evm-foundry) for complete setup instructions.
+For complete setup instructions, see the [Hardhat tutorial](/evm/evm-hardhat) and the [Foundry guide](/evm/evm-foundry).
### Wallet configuration
-Pre-configure MetaMask or other wallets with Sei chain params:
+Preconfigure MetaMask or other wallets with the Sei chain parameters:
```ts
const seiMainnet = {
@@ -364,7 +364,7 @@ await window.ethereum.request({
## Step 3: Bootstrap common infrastructure
-Sei already exposes canonical helper contracts—reference them instead of redeploying:
+Sei already exposes canonical helper contracts. Reference them instead of redeploying them:
| Component | Address | Notes |
| --- | --- | --- |
@@ -374,7 +374,7 @@ Sei already exposes canonical helper contracts—reference them instead of redep
| SingletonFactory | `0xce0042B868300000d44A59004Da54A005ffdcf9f` | EIP-2470 singleton factory |
-For third-party contracts (LayerZero, Safe, etc.), consult the full [Ecosystem Contracts page](/evm/ecosystem-contracts).
+For LayerZero, Safe, and other third-party contracts, see the full [Ecosystem Contracts page](/evm/ecosystem-contracts).
## Step 4: Port contracts and configuration
@@ -396,8 +396,8 @@ function getDeadline(uint256 secondsFromNow) internal view returns (uint256) {
### Adjust gas and size assumptions
-- Keep `gasLimit` buffers modest but ensure calldata stays under 21 MB
-- Sei's 12.5M gas limit per block means large deployments may need batching
+- Keep `gasLimit` buffers modest, but make sure that calldata stays under 21 MB.
+- Sei's gas limit is 12.5M per block, so large deployments may need batching.
### Refactor deprecated patterns
@@ -445,9 +445,9 @@ const seiContract = {
### Oracle integration
-Sei supports multiple oracle solutions:
+Sei supports these oracles:
-| Provider | Use Case | Documentation |
+| Provider | Use case | Documentation |
| --- | --- | --- |
| Pyth Network | High-frequency price feeds | [Pyth Network](https://docs.pyth.network/) |
| Chainlink | Industry-standard data feeds | [Chainlink on Sei](/evm/oracles/chainlink) |
@@ -455,34 +455,34 @@ Sei supports multiple oracle solutions:
| API3 | First-party oracle data | [API3 on Sei](/evm/oracles/api3) |
-**TWAP Adjustments:** Because Sei blocks arrive ~30× faster than Ethereum, shorten your TWAP observation windows to maintain comparable time-weighted calculations.
+**TWAP adjustments:** Sei blocks arrive approximately 30× faster than Ethereum blocks. Shorten your TWAP observation windows to keep your time-weighted calculations comparable.
## Step 7: Launch checklist
### Sei Testnet deployment
-- [ ] Deploy all contracts to testnet (chain ID: `1328`)
-- [ ] Run full integration test suite
-- [ ] Verify contracts via [Sourcify](/evm/evm-verify-contracts)
+- [ ] Deploy all contracts to Sei Testnet (chain ID: `1328`)
+- [ ] Run the full integration test suite
+- [ ] Verify the contracts with [Sourcify](/evm/evm-verify-contracts)
- [ ] Test wallet connections and transaction flows
-- [ ] Validate oracle integrations
-- [ ] Test cross-chain messaging if applicable
+- [ ] Validate your oracle integrations
+- [ ] If applicable, test cross-chain messaging
### Sei Mainnet deployment
-- [ ] Deploy contracts to mainnet (chain ID: `1329`)
-- [ ] Re-run smoke tests
+- [ ] Deploy the contracts to Sei Mainnet (chain ID: `1329`)
+- [ ] Run the smoke tests again
- [ ] Verify all contracts on Sourcify
-- [ ] Update frontend configurations
-- [ ] Prepare user migration documentation
+- [ ] Update the frontend configurations
+- [ ] Prepare migration documentation for your users
-**Fee Redistribution Warning:** Fees on Sei are not burned. If your protocol redistributes "burn rebates" to users, redesign that logic so it does not expect a base-fee burn component.
+**Fee redistribution:** If your protocol redistributes "burn rebates" to users, redesign that logic so it does not expect a base-fee burn component. Sei does not burn fees.
## Step 8: Operational readiness
### Contract verification
-Automate verification through CI using [Sourcify](/evm/evm-verify-contracts):
+Automate verification in CI with [Sourcify](/evm/evm-verify-contracts):
```bash
# Foundry verification
@@ -497,11 +497,11 @@ forge verify-contract --watch \
- **Primary RPC:** `https://evm-rpc.sei-apis.com`
- **Testnet RPC:** `https://evm-rpc-testnet.sei-apis.com`
-- For mission-critical paths, consider self-hosted nodes or [premium RPC providers](/learn/rpc-providers)
+- For mission-critical paths, consider self-hosted nodes or [premium RPC providers](/learn/rpc-providers).
### Monitoring gas parameters
-Periodically query fee data to keep dashboards aligned:
+Query fee data periodically to keep your dashboards up to date:
```ts
// Monitor current gas prices
@@ -511,30 +511,30 @@ const gasPrice = await provider.getGasPrice();
## Example: Uniswap V3-style deployment
-Here's how to mirror a Uniswap V3 experience on Sei:
+Use these steps to reproduce a Uniswap V3 experience on Sei:
-1. **Routers & Factories:** Deploy your own or fork the existing DragonSwap stack:
+1. **Routers and factories:** Deploy your own, or fork the existing DragonSwap stack:
- Router: `0xdD489C75be1039ec7d843A6aC2Fd658350B067Cf`
- V3 Factory: `0x75FC67473A91335B5b8F8821277262a13B38c9b3`
- Position Manager: `0x8B3c541c30f9b29560f56B9E44b59718916B69EF`
2. **Permit and Multicall:** Point your frontend SDK to the shared `Permit2` and `Multicall3` addresses above.
-3. **Liquidity Migration Script:** Build a helper that:
- - Withdraws LP on source chain
- - Bridges underlying tokens to Sei
+3. **Liquidity migration script:** Build a helper that:
+ - Withdraws LP on the source chain
+ - Bridges the underlying tokens to Sei
- Mints new Sei LP positions
- - Include gas estimations tuned for Sei's 12.5M block cap
+ - Includes gas estimates tuned for Sei's 12.5M block cap
-4. **Price Oracles:** Reuse TWAP/Chainlink logic but shorten observation windows for Sei's faster blocks.
+4. **Price oracles:** Reuse your TWAP or Chainlink logic, but shorten the observation windows for Sei's faster blocks.
-5. **Verification:** Submit to [Sourcify](/evm/evm-verify-contracts) and the [Ecosystem Contracts registry](/evm/ecosystem-contracts).
+5. **Verification:** Submit your contracts to [Sourcify](/evm/evm-verify-contracts) and the [Ecosystem Contracts registry](/evm/ecosystem-contracts).
## Helpful references
-- [Divergence from Ethereum](/evm/differences-with-ethereum) – Opcode, gas, and state nuances
-- [EVM Networks](/evm/networks) – RPCs, explorers, and MetaMask payloads
-- [Precompiles](/evm/precompiles/example-usage) – Interoperability patterns
-- [Ecosystem Contracts](/evm/ecosystem-contracts) – Canonical addresses
-- [LayerZero Integration](/evm/bridging/layerzero) – Cross-chain messaging
-- [Contract Verification](/evm/evm-verify-contracts) – Contract verification guide
+- [Divergence from Ethereum](/evm/differences-with-ethereum): opcode, gas, and state differences
+- [EVM Networks](/evm/networks): RPCs, explorers, and MetaMask payloads
+- [Precompiles](/evm/precompiles/example-usage): interoperability patterns
+- [Ecosystem Contracts](/evm/ecosystem-contracts): canonical addresses
+- [LayerZero Integration](/evm/bridging/layerzero): cross-chain messaging
+- [Contract Verification](/evm/evm-verify-contracts): contract verification guide
diff --git a/evm/migrate-from-solana.mdx b/evm/migrate-from-solana.mdx
index 65c0d15..f1211d5 100644
--- a/evm/migrate-from-solana.mdx
+++ b/evm/migrate-from-solana.mdx
@@ -4,42 +4,42 @@ sidebarTitle: 'Migrate from Solana'
description: 'A comprehensive guide for Solana developers transitioning to Sei EVM, covering architectural differences, concept mapping, code translation patterns, and step-by-step migration strategies.'
keywords: ['solana migration', 'rust to solidity', 'anchor to hardhat', 'EVM migration', 'parallel execution', 'sei']
---
-Sei offers a unique value proposition for Solana developers: the parallelized execution model you're familiar with, combined with full EVM compatibility and the extensive Ethereum tooling ecosystem. This guide helps Rust/Anchor developers translate their mental models and codebases to Solidity on Sei.
+Sei combines parallelized execution, which you know from Solana, with full EVM compatibility and the extensive Ethereum tooling ecosystem. This guide helps Rust and Anchor developers translate their mental models and codebases to Solidity on Sei.
-**Why Solana Developers Choose Sei**
+**Why Solana developers choose Sei**
-- **Familiar parallelization** – Sei uses optimistic parallel execution similar to Solana's Sealevel
-- **400ms block times** – Comparable to Solana's speed, with instant finality
-- **~100 MGas/s throughput** – High performance without sacrificing EVM compatibility
-- **EVM ecosystem access** – Leverage Ethereum's mature tooling, audited contracts, and developer resources
-- **No dependency declarations** – Unlike Solana, Sei handles parallelization automatically
+- Sei uses optimistic parallel execution, similar to Solana's Sealevel.
+- Block times of 400 ms are comparable to Solana's speed, and finality is instant.
+- Throughput is approximately 100 MGas/s, with full EVM compatibility.
+- You can use Ethereum's mature tooling, audited contracts, and developer resources.
+- You do not declare dependencies. Unlike Solana, Sei handles parallelization automatically.
-## Understanding the Paradigm Shift
+## Understanding the paradigm shift
-Before diving into code, it's essential to understand the fundamental architectural differences between Solana and EVM-based chains like Sei.
+Before you write code, understand the architectural differences between Solana and EVM-based chains such as Sei.
-### Execution Model Comparison
+### Execution model comparison
| Aspect | Solana | Sei EVM |
| --- | --- | --- |
| Language | Rust (with Anchor framework) | Solidity |
-| Account Model | Programs + Accounts (separated code and data) | Contracts (code and storage unified) |
-| State Storage | Flat account data with owner programs | Contract storage slots (key-value) |
+| Account model | Programs + Accounts (separated code and data) | Contracts (code and storage unified) |
+| State storage | Flat account data with owner programs | Contract storage slots (key-value) |
| Parallelization | Explicit (declare accounts upfront) | Optimistic (automatic conflict detection) |
-| Block Time | ~400ms | 400ms |
+| Block time | ~400ms | 400ms |
| Finality | ~2.5-4.5 seconds (32 confirmations) | Instant (single block) |
-| Fee Model | Compute units + priority fees + rent | Gas × Gas Price (no rent) |
-| Cross-Contract Calls | CPI (Cross-Program Invocation) | Internal/External function calls |
-| Deterministic Addresses | PDAs (Program Derived Addresses) | CREATE2 / ImmutableCreate2Factory |
-| Token Standard | SPL Token | ERC-20 / ERC-721 / ERC-1155 |
-| Dev Tooling | Anchor, Solana CLI, solana-web3.js | Hardhat, Foundry, ethers.js, viem |
+| Fee model | Compute units + priority fees + rent | Gas × Gas Price (no rent) |
+| Cross-contract calls | CPI (Cross-Program Invocation) | Internal/External function calls |
+| Deterministic addresses | PDAs (Program Derived Addresses) | CREATE2 / ImmutableCreate2Factory |
+| Token standard | SPL Token | ERC-20 / ERC-721 / ERC-1155 |
+| Dev tooling | Anchor, Solana CLI, solana-web3.js | Hardhat, Foundry, ethers.js, viem |
-## Core Concept Mapping
+## Core concept mapping
-### Programs → Smart Contracts
+### Programs → smart contracts
On Solana, you write **programs** that are stateless executables. Data lives in separate **accounts** that programs can read and modify. On Sei EVM, **smart contracts** combine code and state in a single entity.
@@ -110,13 +110,13 @@ contract Counter {
**Key differences:**
-- No account space allocation needed—storage grows dynamically
-- No explicit `Signer` validation—`msg.sender` is always authenticated
-- No system program imports—native operations are built into the EVM
+- You do not allocate account space. Storage grows dynamically.
+- You do not validate a `Signer` explicitly. `msg.sender` is always authenticated.
+- You do not import a system program. Native operations are built into the EVM.
-### PDAs → CREATE2 Deterministic Addresses
+### PDAs → CREATE2 deterministic addresses
-Solana's **Program Derived Addresses (PDAs)** let you create deterministic addresses from seeds. On EVM, you achieve similar functionality with `CREATE2`.
+Solana's **Program Derived Addresses (PDAs)** let you create deterministic addresses from seeds. On the EVM, you get similar functionality with `CREATE2`.
@@ -165,9 +165,9 @@ mapping(address => Vault) public vaults;
-### CPI → Contract Calls
+### CPI → contract calls
-Solana's **Cross-Program Invocation (CPI)** becomes simple function calls in Solidity:
+Solana's **Cross-Program Invocation (CPI)** becomes a simple function call in Solidity:
@@ -247,21 +247,21 @@ contract MyToken is ERC20 {
**Key ERC-20 differences from SPL:**
-- No Associated Token Accounts (ATAs)—balances are stored directly in the contract
-- Approvals use `approve()` / `transferFrom()` pattern
-- No mint/freeze authorities in basic implementation (add via `Ownable`)
+- ERC-20 has no Associated Token Accounts (ATAs). Balances are stored directly in the contract.
+- Approvals use the `approve()` and `transferFrom()` pattern.
+- The basic implementation has no mint or freeze authorities. To add them, use `Ownable`.
-## Fee Model Translation
+## Fee model translation
-Understanding the fee differences is crucial for accurate cost estimation:
+To estimate costs accurately, learn how the fee models differ:
-| Solana Concept | Sei EVM Equivalent | Notes |
-| ------------------ | ------------------ | ------------------------------------- |
-| Compute Units (CU) | Gas | Both measure computational work |
-| Priority Fee | Gas Price | Higher price = faster inclusion |
-| Rent | None | Sei has no rent; storage is permanent |
-| Rent Exemption | N/A | No minimum balance requirements |
-| Base Fee | Dynamic Base Fee | Sei doesn't burn base fee |
+| Solana concept | Sei EVM equivalent | Notes |
+| ------------------ | ------------------ | -------------------------------------- |
+| Compute units (CU) | Gas | Both measure computational work |
+| Priority fee | Gas price | Higher price = faster inclusion |
+| Rent | None | Sei has no rent. Storage is permanent. |
+| Rent exemption | N/A | No minimum balance requirements |
+| Base fee | Dynamic base fee | Sei does not burn the base fee |
```ts
// Solana fee estimation
@@ -276,19 +276,19 @@ const fee = gasLimit * gasPrice; // No rent to consider
```
-**No Rent on Sei!**
+**No rent on Sei**
-Unlike Solana where accounts can be garbage collected if rent isn't paid, Sei EVM storage is permanent. This simplifies your application logic—no need to track rent-exempt minimums or worry about account closure.
+On Solana, accounts can be garbage collected if rent is not paid. On Sei EVM, storage is permanent. This simplifies your application logic: you do not need to track rent-exempt minimums or worry about account closure.
-## Parallelization: Automatic vs Explicit
+## Parallelization: automatic vs explicit
-One of the biggest advantages of Sei for Solana developers is that parallelization is **automatic**.
+On Sei, parallelization is **automatic**.
-### Solana: Explicit Account Declaration
+### Solana: explicit account declaration
-On Solana, you must declare all accounts a transaction will touch upfront:
+On Solana, you must declare upfront every account that a transaction will touch:
```rust
// Solana: Must declare all accounts for parallelization
@@ -308,9 +308,9 @@ pub struct Swap<'info> {
}
```
-### Sei: Optimistic Parallelization
+### Sei: optimistic parallelization
-On Sei, you write normal Solidity—the runtime handles parallelization:
+On Sei, you write normal Solidity, and the runtime handles parallelization:
```solidity
// Sei EVM: Just write normal code
@@ -331,15 +331,15 @@ function swap(
```
-**Optimizing for Parallelization**
+**Optimizing for parallelization**
-While Sei handles parallelization automatically, you can still optimize your contracts for better parallel performance. Avoid global counters updated on every transaction—use user-partitioned storage instead. See [Optimizing for Parallelization](/evm/best-practices/optimizing-for-parallelization) for detailed patterns.
+Avoid global counters that every transaction updates. Use user-partitioned storage instead. Sei handles parallelization automatically, but you can still optimize your contracts for better parallel performance. For detailed patterns, see [Optimizing for Parallelization](/evm/best-practices/optimizing-for-parallelization).
-## Step 1: Set Up Your Development Environment
+## Step 1: Set up your development environment
-### Install Required Tools
+### Install required tools
```bash
# Install Node.js (if not already installed)
@@ -382,7 +382,7 @@ export default defineConfig({
});
```
-Store your deployer key in Hardhat's encrypted keystore (no plaintext `.env` file needed):
+Store your deployer key in Hardhat's encrypted keystore instead of a plaintext `.env` file:
```bash
npx hardhat keystore set SEI_PRIVATE_KEY
@@ -409,9 +409,9 @@ sei_testnet = "https://evm-rpc-testnet.sei-apis.com"
-### Wallet Setup
+### Wallet setup
-Configure MetaMask or any EVM wallet with Sei:
+Configure MetaMask or any EVM wallet for Sei:
```ts
const seiMainnet = {
@@ -423,11 +423,11 @@ const seiMainnet = {
};
```
-## Step 2: Translate Your Solana Program
+## Step 2: Translate your Solana program
-### Common Pattern Translations
+### Common pattern translations
-#### Initializing State
+#### Initializing state
@@ -467,7 +467,7 @@ contract MyContract {
-#### Access Control
+#### Access control
@@ -524,7 +524,7 @@ contract MyContract {
-#### Error Handling
+#### Error handling
@@ -562,7 +562,7 @@ if (balance < required) revert InsufficientBalance(balance, required);
-#### Events/Logs
+#### Events/logs
@@ -604,9 +604,9 @@ emit Transfer(from, to, amount);
-## Step 3: Frontend Migration
+## Step 3: Frontend migration
-### SDK Comparison
+### SDK comparison
| Solana | Sei EVM | Notes |
| ------------------------ | ------------------------ | ------------------------------ |
@@ -615,7 +615,7 @@ emit Transfer(from, to, amount);
| `@solana/wallet-adapter` | `wagmi` / `RainbowKit` | Wallet connection |
| Phantom, Solflare | MetaMask, Rabby, Backpack | Popular wallets |
-### Code Translation
+### Code translation
@@ -664,9 +664,9 @@ await tx.wait();
-## Step 4: Testing Your Migrated Code
+## Step 4: Testing your migrated code
-### Test Framework Comparison
+### Test framework comparison
@@ -722,9 +722,9 @@ describe('Counter', function () {
-## Step 5: Deploy and Verify
+## Step 5: Deploy and verify
-### Deploy to Testnet
+### Deploy to testnet
```bash
# Hardhat
@@ -736,7 +736,7 @@ forge create --rpc-url https://evm-rpc-testnet.sei-apis.com \
src/Counter.sol:Counter
```
-### Verify Contract
+### Verify contract
```bash
# Hardhat
@@ -750,9 +750,9 @@ forge verify-contract \
src/Counter.sol:Counter
```
-## Common Migration Pitfalls
+## Common migration pitfalls
-### 1. Expecting Rent
+### 1. Expecting rent
```solidity
// ❌ Wrong: No need to check rent exemption
@@ -762,7 +762,7 @@ require(address(this).balance >= rentExempt, "Not rent exempt");
// Storage persists without rent payments
```
-### 2. Manual Account Validation
+### 2. Manual account validation
```solidity
// ❌ Wrong: Over-engineering account checks (Solana habit)
@@ -772,7 +772,7 @@ require(accountOwner == expectedOwner, "Invalid account owner");
// msg.sender is already authenticated
```
-### 3. Expecting Explicit Parallelization
+### 3. Expecting explicit parallelization
```solidity
// ❌ Wrong: Trying to declare "accounts" for parallelization
@@ -782,7 +782,7 @@ function swap(address[] memory accounts) external { ... }
function swap(address tokenIn, address tokenOut, uint256 amount) external { ... }
```
-### 4. Using Lamports Mental Model
+### 4. Using lamports mental model
```solidity
// ❌ Wrong: Solana-style lamports
@@ -793,37 +793,37 @@ uint256 amount = 1 ether; // 1 SEI = 1e18 wei
uint256 amount = 1e18; // Same thing
```
-## Ecosystem Infrastructure
+## Ecosystem infrastructure
### Available on Sei
-| Component | Solana Equivalent | Sei Address/Info |
+| Component | Solana equivalent | Sei address/info |
| --------------- | ------------------------- | ------------------------------------------------------------------------------------------------ |
| Multicall3 | N/A | `0xcA11bde05977b3631167028862bE2a173976CA11` |
| Permit2 | N/A | `0xB952578f3520EE8Ea45b7914994dcf4702cEe578` |
| CREATE2 Factory | N/A | `0x0000000000FFe8B47B3e2130213B802212439497` |
-| Oracle | Pyth Network, Switchboard | [Pyth](/evm/oracles/pyth-network), [Redstone](/evm/oracles/redstone), [Chainlink](/evm/oracles/chainlink) |
-| Bridge | Wormhole | [LayerZero](/evm/bridging/layerzero), Wormhole, many more.. |
+| Oracle | Pyth Network, Switchboard | [Pyth](/evm/oracles/pyth-network), [RedStone](/evm/oracles/redstone), [Chainlink](/evm/oracles/chainlink) |
+| Bridge | Wormhole | [LayerZero](/evm/bridging/layerzero), Wormhole, and many others |
-## Helpful Resources
+## Helpful resources
### Learning Solidity
-- [EVM with Foundry](/evm/evm-foundry) – Foundry setup guide and starter tutorial
-- [EVM with Hardhat](/evm/evm-hardhat) – Hardhat setup guide and starter tutorial
-- [Solidity Resources](/evm/solidity-resources) – Curated solidity learning resources
-- [CryptoZombies](https://cryptozombies.io) – Interactive Solidity tutorial
-- [Solidity by Example](https://solidity-by-example.org) – Pattern reference
+- [EVM with Foundry](/evm/evm-foundry): Foundry setup guide and starter tutorial
+- [EVM with Hardhat](/evm/evm-hardhat): Hardhat setup guide and starter tutorial
+- [Solidity Resources](/evm/solidity-resources): curated Solidity learning resources
+- [CryptoZombies](https://cryptozombies.io): interactive Solidity tutorial
+- [Solidity by Example](https://solidity-by-example.org): pattern reference
-### Sei-Specific
+### Sei-specific
-- [Divergence from Ethereum](/evm/differences-with-ethereum) – Technical differences
-- [Optimizing for Parallelization](/evm/best-practices/optimizing-for-parallelization) – Performance patterns
-- [Ecosystem Contracts](/evm/ecosystem-contracts) – Canonical addresses
+- [Divergence from Ethereum](/evm/differences-with-ethereum): technical differences
+- [Optimizing for Parallelization](/evm/best-practices/optimizing-for-parallelization): performance patterns
+- [Ecosystem Contracts](/evm/ecosystem-contracts): canonical addresses
-**Need Help?**
+**Need help?**
-Join the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) on Telegram for developer support. The community is active and helpful for migration questions.
+For developer support, join the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) on Telegram. The community is active and helps with migration questions.
diff --git a/evm/networks.mdx b/evm/networks.mdx
index 1d4472a..d3e24f0 100644
--- a/evm/networks.mdx
+++ b/evm/networks.mdx
@@ -9,7 +9,7 @@ import { NetworkTabs } from '/snippets/network-tabs.jsx';
-The panel above is interactive. For plain-text endpoints you can copy directly — plus additional provider options — see:
+The panel above is interactive. For plain-text endpoints that you can copy directly, and for more provider options, see:
-- [Chains & endpoints](/learn/dev-chains) — RPC URLs and chain IDs in plain text
-- [RPC providers](/learn/rpc-providers) — additional public and commercial RPC endpoints
+- [Chains & endpoints](/learn/dev-chains): RPC URLs and chain IDs in plain text
+- [RPC providers](/learn/rpc-providers): more public and commercial RPC endpoints
diff --git a/evm/nonce-lanes.mdx b/evm/nonce-lanes.mdx
index 86d38f2..f87f232 100644
--- a/evm/nonce-lanes.mdx
+++ b/evm/nonce-lanes.mdx
@@ -9,16 +9,22 @@ import { SequentialNonceQueue, NonceLanes, NonceLaneDelegation, NonceLanePipelin
One funded account on Sei EVM has one sequential nonce. That suits a wallet, where each action follows the last. It does not suit a stream of independent work: one transaction that never lands blocks every transaction signed after it. The usual fix is a fleet of hot wallets, which multiplies balances, approvals, and keys.
-[sei-nonce-lanes](https://github.com/sei-protocol/sei-nonce-lanes) is a reference implementation that removes the queue instead. One funded externally owned account (EOA) keeps its address, balance, and approvals while holding many mutually independent operations in flight at the same time.
+[sei-nonce-lanes](https://github.com/sei-protocol/sei-nonce-lanes) is a reference implementation that removes the queue instead. With it, one funded externally owned account (EOA) holds many mutually independent operations in flight at the same time. The account keeps its address, balance, and approvals.
-The pattern applies whenever one funded address needs to do many things that do not depend on each other: market making and order flow, liquidation and keeper bots, oracle updates, payout and claim batching, or game and backend transactions.
+The pattern applies whenever one funded address needs to do many things that do not depend on each other, for example:
+
+- Market making and order flow
+- Liquidation and keeper bots
+- Oracle updates
+- Payout and claim batching
+- Game and backend transactions
- The repository is a runnable engineering demonstration, not a production service. It uses a mock venue, plaintext development keys in `.env`, an in-process queue, and console output. Read [Before you adapt this](#before-you-adapt-this) before pointing it at real funds.
+ The repository is a runnable engineering demonstration, not a production service. It uses a mock venue, plaintext development keys in `.env`, an in-process queue, and console output. Read [Before you adapt this](#before-you-adapt-this) before you point it at real funds.
- This page is about submission concurrency. If you want a hosted bundler, a paymaster, and gas sponsorship for consumer wallets, start with [Pimlico](/evm/wallet-integrations/pimlico) or [Thirdweb EIP-7702](/evm/wallet-integrations/thirdweb-7702) instead. Nonce lanes solve the opposite problem: throughput from one address you control, with no third party in the submission path.
+ This page is about submission concurrency. For a hosted bundler, a paymaster, and gas sponsorship for consumer wallets, start with [Pimlico](/evm/wallet-integrations/pimlico) or [thirdweb EIP-7702](/evm/wallet-integrations/thirdweb-7702) instead. Nonce lanes solve the opposite problem: throughput from one address you control, with no third party in the submission path.
## Why one account is one queue
@@ -34,20 +40,20 @@ The second case is the submission bottleneck. It covers transactions that are dr
-Two properties of Sei make this sharper than on Ethereum:
+Two properties of Sei make this problem worse than on Ethereum:
-- **Strict nonce admission.** Under Giga, the Autobahn producer mempool admits EVM transactions in per-sender nonce order and rejects a gap with a `bad nonce` error instead of holding it for later. See [Giga mode behavior](/node/technical-reference#giga-mode-behavior-and-per-block-limits). What you observe through an RPC endpoint can differ, because the node in front of the producer may hold a gapped transaction and release it later, or accept it and then drop it. The repository's `npm run baseline` command probes the RPC path you configure; in one session it returned [two different verdicts](#optional-see-the-baseline-you-are-escaping) for two Sei Testnet endpoints.
-- **No dependable pending view.** Sei does not expose Ethereum-style pending state, and [Finality and block tags](/evm/evm-parity/finality#pending-state) tells you not to rely on a pending nonce differing from the confirmed nonce. `txpool_content` is also [truncated and collapses the pending/queued distinction](/evm/reference). Even where a node answers a pending-nonce query, the value cannot be used to rebuild an in-flight queue.
+- **Strict nonce admission.** Under Giga, the Autobahn producer mempool admits EVM transactions in per-sender nonce order. It rejects a gap with a `bad nonce` error instead of holding it for later (see [Giga mode behavior](/node/technical-reference#giga-mode-behavior-and-per-block-limits)). What you observe through an RPC endpoint can differ. The node in front of the producer may hold a gapped transaction and release it later, or accept it and then drop it. The repository's `npm run baseline` command probes the RPC path you configure. In one session, it returned [two different verdicts](#optional-see-the-baseline-you-are-escaping) for two Sei Testnet endpoints.
+- **No dependable pending view.** Sei does not expose Ethereum-style pending state. [Finality and block tags](/evm/evm-parity/finality#pending-state) tells you not to rely on a pending nonce that differs from the confirmed nonce. `txpool_content` is also [truncated and does not separate pending from queued transactions](/evm/reference). Even where a node answers a pending-nonce query, you cannot use the value to rebuild an in-flight queue.
- Do not design around a pending nonce on Sei. `eth_getTransactionCount(address, "pending")` is [documented](/evm/reference) as returning `EvmNextPendingNonce` from the mempool, so it is not an alias for `"latest"`. The finality guidance still marks the pending view as unreliable, and the value varies by node and by whether the node runs Giga. The design below does not depend on the answer: its hot path reads no nonces.
+ Do not design around a pending nonce on Sei. `eth_getTransactionCount(address, "pending")` is [documented](/evm/reference) as returning `EvmNextPendingNonce` from the mempool. It is therefore not an alias for `"latest"`. The finality guidance still marks the pending view as unreliable. The value also varies by node and by whether the node runs Giga. The design below does not depend on the answer: its hot path reads no nonces.
-Splitting work across hot wallets raises throughput, but every wallet is another balance to rebalance, another set of approvals to maintain, and another key that can move funds.
+Splitting work across hot wallets raises throughput. However, every wallet is another balance to rebalance, another set of approvals to maintain, and another key that can move funds.
## How it works
-The design combines four mechanisms. Each solves one part of the problem; none is sufficient alone.
+The design combines four mechanisms. Each solves one part of the problem, and none is sufficient alone.
| Mechanism | What it contributes |
| --- | --- |
@@ -58,13 +64,13 @@ The design combines four mechanisms. Each solves one part of the problem; none i
### ERC-4337 nonce lanes
-The canonical EntryPoint v0.8 singleton is already deployed at `0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108` on both Sei Mainnet (chain ID `1329`) and Sei Testnet (chain ID `1328`), so nothing here asks you to deploy one. It stores a UserOperation nonce as a 192-bit key plus a 64-bit sequence:
+The canonical EntryPoint v0.8 singleton is already deployed at `0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108` on both Sei Mainnet (chain ID `1329`) and Sei Testnet (chain ID `1328`). Nothing in this guide asks you to deploy one. The EntryPoint stores a UserOperation nonce as a 192-bit key plus a 64-bit sequence:
```text
nonce = (uint192 key << 64) | uint64 sequence
```
-The EntryPoint keeps one `sequence` counter for each `key`. The specification calls this a two-dimensional nonce; the repository calls a key a **lane**.
+The EntryPoint keeps one `sequence` counter for each `key`. The specification calls this a two-dimensional nonce. The repository calls a key a **lane**.
@@ -75,7 +81,7 @@ Four rules follow from that layout:
- An operation that executes and reverts still consumes its lane sequence.
- An operation that never reaches a successful `handleOps` transaction consumes nothing.
-`LaneAccount` rejects lane `0`. Most SDKs pick key `0` when you do not pass one, and work that lands entirely on key `0` is a single queue again. Rejecting it converts a silent fallback into an explicit validation failure. `ADMIN_LANE` (the maximum `uint192`) is reserved for integrations that need one explicitly ordered lane for administrative calls.
+`LaneAccount` rejects lane `0`. Most SDKs pick key `0` when you do not pass one. Work that lands entirely on key `0` is a single queue again. Rejecting it converts a silent fallback into an explicit validation failure. `ADMIN_LANE` (the maximum `uint192`) is reserved for integrations that need one explicitly ordered lane for administrative calls.
### EIP-7702 keeps the funded address
@@ -85,7 +91,7 @@ An EIP-7702 authorization writes a delegation designator into the EOA's code slo
0xef0100 ||
```
-The address does not change. Its native balance, token balances, protocol state, and approvals stay attached to the same account. When the EntryPoint calls the account, the EVM runs `LaneAccount`'s code in the EOA's context, so `LaneAccount.execute` reaches the target with the funded EOA as `msg.sender`.
+The address does not change. Its native balance, token balances, protocol state, and approvals stay attached to the same account. When the EntryPoint calls the account, the EVM runs `LaneAccount`'s code in the EOA's context. As a result, `LaneAccount.execute` reaches the target with the funded EOA as `msg.sender`.
@@ -103,12 +109,14 @@ contract LaneAccount is Simple7702Account {
}
```
-Installing the delegation takes one type-4 transaction. Sei requires a non-empty authorization list on type-4 transactions; see [Transaction types](/evm/evm-parity/transaction-types#set-code-eip-7702-auth-list-requirement).
+Installing the delegation takes one type-4 transaction. Sei requires a non-empty authorization list on type-4 transactions. See [Transaction types](/evm/evm-parity/transaction-types#set-code-eip-7702-auth-list-requirement).
+
+The nonce cost depends on who sends that transaction. The EVM applies the authorization list after it increments the sender's nonce for the transaction itself. When the authority is also the sender, the authorization must therefore be signed over `nonce + 1`. Applying it then increments the account's nonce a second time.
-The nonce cost depends on who sends that transaction. The EVM applies the authorization list after incrementing the sender's nonce for the transaction itself, so when the authority is also the sender, the authorization must be signed over `nonce + 1` and applying it increments the account a second time. A self-sponsored delegation advances the account's nonce by two; `npm run delegate` takes this path. A delegation sponsored by a different sender advances the funded account by one, the increment the authorization itself performs. In both cases, once the designator is in place, the submission path signs UserOperations only and the funded account's EVM nonce stops moving.
+A self-sponsored delegation advances the account's nonce by two. `npm run delegate` takes this path. A delegation sponsored by a different sender advances the funded account's nonce by one: the increment that the authorization itself performs. In both cases, after the designator is in place, the submission path signs only UserOperations. The funded account's EVM nonce then stops moving.
- EIP-7702 alone does not create independent nonces; it preserves the account. ERC-4337 supplies the nonce model. The design needs both.
+ EIP-7702 alone does not create independent nonces. It preserves the account, and ERC-4337 supplies the nonce model. The design needs both.
### Gas-only relayers carry what is left of the queue
@@ -119,28 +127,32 @@ UserOperations are not transactions. Something still has to wrap them in `EntryP
The sequential constraint moves rather than disappears. Each relayer has one sequential EVM nonce and keeps one outer transaction in flight at a time. The custody boundary is what changes: relayers hold native SEI for gas and nothing else. A compromised relayer key can lose its own gas balance or rebroadcast operations the funded account already signed. It cannot create a new operation, because every UserOperation carries an EIP-712 signature from the funded account over the EntryPoint's `PackedUserOperation` digest.
-The bundling queue matters for a different reason. It is an in-process queue, not a mempool: nothing is gossiped, nothing arrives from another party, and it is gone when the process exits. It therefore never enters the canonical ERC-4337 alt-mempool, and the [ERC-7562](https://eips.ethereum.org/EIPS/eip-7562) validation rules that govern that mempool, including `SAME_SENDER_MEMPOOL_COUNT = 4` for an unstaked sender, do not apply to it. A cap of four pending operations per sender is sized for wallets, not for a submission pipeline. Those rules exist so competing bundlers can safely pack operations from unrelated senders into one bundle. Here every operation comes from one account you control, so that threat does not arise. The EntryPoint still enforces everything that protects funds: the signature, per-lane nonce uniqueness, and prefund solvency.
+The bundling queue matters for a different reason. It is an in-process queue, not a mempool. Nothing is gossiped, nothing arrives from another party, and the queue is gone when the process exits. It therefore never enters the canonical ERC-4337 alt-mempool. The [ERC-7562](https://eips.ethereum.org/EIPS/eip-7562) validation rules that govern that mempool, including `SAME_SENDER_MEMPOOL_COUNT = 4` for an unstaked sender, do not apply to it. A cap of four pending operations per sender is sized for wallets, not for a submission pipeline.
+
+Those rules exist so that competing bundlers can safely pack operations from unrelated senders into one bundle. Here, every operation comes from one account that you control, so this threat does not arise. The EntryPoint still enforces everything that protects funds: the signature, per-lane nonce uniqueness, and prefund solvency.
### One bundle, start to finish
-Each relayer runs one asynchronous worker. The worker takes a bundle of up to `MAX_OPS_PER_BUNDLE` operations (never two from the same lane), and then works through a fixed sequence.
+Each relayer runs one asynchronous worker. The worker takes a bundle of up to `MAX_OPS_PER_BUNDLE` operations (never two from the same lane). It then works through a fixed sequence.
-Two rules provide most of the safety:
+Most of the safety comes from two rules:
+
+- **Write-ahead ordering.** The signed outer transaction is written to the journal before it is broadcast. Each journal snapshot is fsynced before it is renamed into place, and the directory is fsynced after the rename. A written record therefore survives a kernel panic or host loss, not only a process crash. On restart, the exact raw bytes are rebroadcast first, so a crash between signing and sending cannot lose or duplicate work. The journal is still one file on one disk, not a replicated database.
+- **Same-nonce replacement.** If no receipt arrives within `BUNDLE_RECEIPT_TIMEOUT_MS`, the worker checks earlier attempts for a receipt. It then bumps fees by `REPLACEMENT_FEE_BUMP_PERCENT` and signs a replacement at the same relayer nonce. It never sends nonce `n + 1` while a transaction at `n` might still land, which is the gap this design exists to avoid.
-- **Write-ahead ordering.** The signed outer transaction is written to the journal before it is broadcast. Each journal snapshot is fsynced before it is renamed into place, and the directory is fsynced after it, so a written record survives a kernel panic or host loss, not only a process crash. On restart, the exact raw bytes are rebroadcast first, so a crash between signing and sending cannot lose or duplicate work. The journal is still one file on one disk, not a replicated database.
-- **Same-nonce replacement.** If no receipt arrives within `BUNDLE_RECEIPT_TIMEOUT_MS`, the worker checks earlier attempts for a receipt, bumps fees by `REPLACEMENT_FEE_BUMP_PERCENT`, and signs a replacement at the same relayer nonce. It never sends nonce `n + 1` while a transaction at `n` might still land, which is the gap this design exists to avoid.
+The receipt wait polls every `RECEIPT_POLLING_INTERVAL_MS`, 250 ms by default. Sei produces blocks in well under a second. With viem's 4-second default, most of the timeout passes idle between polls. A bundle that has already landed can also be reported as timed out. This triggers an unnecessary fee-bumped replacement.
-The receipt wait polls every `RECEIPT_POLLING_INTERVAL_MS`, 250 ms by default. Sei produces blocks in well under a second. With viem's 4-second default, most of the timeout passes idle between polls, and a bundle that has already landed can be reported as timed out, which triggers an unnecessary fee-bumped replacement.
+Two more guards cover the simulation and the journal. The `eth_estimateGas` call passes the relayer's address string as `account`, not the viem `Account` object. Given a local account object, viem prepares a full transaction request before it estimates. That adds a chain ID read, a fee lookup, and an `eth_getTransactionCount(address, "pending")` call. Passing the address skips all three, including the pending-nonce read that this hot path is built to avoid.
-Two further guards cover the simulation and the journal. The `eth_estimateGas` call passes the relayer's address string as `account`, not the viem `Account` object. Given a local account object, viem prepares a full transaction request before estimating, which adds a chain ID read, a fee lookup, and an `eth_getTransactionCount(address, "pending")` call; passing the address skips all three, including the pending-nonce read this hot path is built to avoid. A file lock keeps a second process off the same account. The lock identifies its holder by inode rather than by the existence of a file, and the process re-checks that it still holds the lock immediately before it signs and before every journal write, so a process that lost a lock race stops instead of signing.
+A file lock keeps a second process off the same account. The lock identifies its holder by inode rather than by the existence of a file. The process re-checks that it still holds the lock immediately before it signs and before every journal write. A process that lost a lock race therefore stops instead of signing.
-Before any new work is created, a restarted process reconciles every incomplete journal entry against the EntryPoint. If the chain sequence is ahead of the journal, the operation was consumed. If they match, the lane is reserved and the operation is recovered or requeued. If the chain is behind the journal, the state is inconsistent and the process stops rather than guessing.
+Before it creates any new work, a restarted process reconciles every incomplete journal entry against the EntryPoint. If the chain sequence is ahead of the journal, the operation was consumed. If they match, the lane is reserved and the operation is recovered or requeued. If the chain is behind the journal, the state is inconsistent, and the process stops rather than guessing.
### What fails alone and what fails together
-The EntryPoint treats an account execution failure as a per-operation result: it emits a failed `UserOperationEvent`, charges gas, advances that lane, and continues with the next operation. A validation failure (bad signature, stale sequence, insufficient prefund) is different: it reverts the whole `handleOps` transaction and nothing in it is consumed.
+The EntryPoint treats an account execution failure as a per-operation result. It emits a failed `UserOperationEvent`, charges gas, advances that lane, and continues with the next operation. A validation failure (bad signature, stale sequence, insufficient prefund) is different. It reverts the whole `handleOps` transaction, and nothing in it is consumed.
@@ -151,18 +163,18 @@ The EntryPoint treats an account execution failure as a per-operation result: it
| Operation validation fails | Not consumed | Entire `handleOps` reverts | Fix the cause and resubmit |
| Signed operation never reached a mined bundle | Not consumed | Independent lanes stay valid | The journal requeues it |
| Outer transaction times out or is evicted | Unknown until reconciled | Bundle stays intact | Rebroadcast and fee-bump at the same relayer nonce |
-| Outer transaction mines and reverts | Not consumed | Nothing in that bundle executes | Relayer nonce is consumed; operations can be requeued |
+| Outer transaction mines and reverts | Not consumed | Nothing in that bundle executes | Relayer nonce is consumed, and operations can be requeued |
| Process exits after journaling | Determined at restart | No new work starts first | Reconcile receipts, lane sequences, and the relayer nonce |
-Every bundle is simulated with `eth_estimateGas` before broadcast, so validation failures are normally caught before any gas is spent. `MAX_OPS_PER_BUNDLE` sets the size of the shared validation domain; keep it small when isolation matters more than amortized cost.
+Every bundle is simulated with `eth_estimateGas` before broadcast, so validation failures are normally caught before any gas is spent. `MAX_OPS_PER_BUNDLE` sets the size of the shared validation domain. When isolation matters more than amortized cost, keep it small.
## Why this is hard to replicate
-Faster hardware and better RPC routing help every submission strategy. The difference here is structural: one funded address holds many independent operations in flight while keeping the custody surface of a single wallet.
+Faster hardware and better RPC routing help every submission strategy. The difference here is structural: one funded address holds many independent operations in flight while it keeps the custody surface of a single wallet.
The relevant comparison is a fleet of hot wallets, which is what most teams run. A fleet can match the width. It cannot do so from one balance, one approval set, and one key.
-The baseline is not one transaction at a time. A single address can sign and broadcast nonces `n`, `n+1`, `n+2`, and onward and have all of them unresolved, and [the producer mempool admits them](/node/technical-reference#giga-mode-behavior-and-per-block-limits) as long as they arrive in order. The constraint is ordering: the outstanding transactions form one queue, and one that never lands strands every later nonce behind it.
+The baseline is not one transaction at a time. A single address can sign and broadcast nonces `n`, `n+1`, `n+2`, and onward, and all of them can be unresolved at the same time. [The producer mempool admits them](/node/technical-reference#giga-mode-behavior-and-per-block-limits) as long as they arrive in order. The constraint is ordering. The outstanding transactions form one queue, and one transaction that never lands strands every later nonce behind it.
| | One hot wallet | Fleet of N hot wallets | Public ERC-4337 bundler | Nonce lanes |
| --- | --- | --- | --- | --- |
@@ -170,23 +182,25 @@ The baseline is not one transaction at a time. A single address can sign and bro
| Outer transactions broadcast at once | Many | Many per wallet | Set by the bundler's policy | `RELAYER_COUNT` |
| Are those submissions independent? | No: one ordered queue | Only across wallets, ordered within each | Yes | Yes: one sequence per lane |
| Balances and approvals to maintain | One address | N addresses, approved N times | One address | One address |
-| Keys that can move funds | 1 | N | 1 | 1; relayers hold gas only |
+| Keys that can move funds | 1 | N | 1 | 1 (relayers hold gas only) |
| Recovering the in-flight set after a crash | Re-derive it from the chain | Re-derive it per wallet | Handled by the bundler | Durable journal and deterministic reconciliation |
| Failure blast radius | Everything behind the gap | Everything behind the gap, per wallet | One operation | One lane for execution, one bundle for validation |
- Read the first two rows together. `LANE_POOL_SIZE` caps how many operations can be signed and unresolved at once; `RELAYER_COUNT` caps how many outer transactions are broadcast at once. Lanes provide a large pool of independent intents rather than a large number of simultaneous transactions. The approximate per-block submission width is `RELAYER_COUNT × MAX_OPS_PER_BUNDLE`.
+ Read the first two rows together. `LANE_POOL_SIZE` caps how many operations can be signed and unresolved at once. `RELAYER_COUNT` caps how many outer transactions are broadcast at once. Lanes give a large pool of independent intents, not a large number of simultaneous transactions. The approximate per-block submission width is `RELAYER_COUNT × MAX_OPS_PER_BUNDLE`.
-Measured on Sei Testnet against the same venue call, one address with sequential nonces landed 1 operation per second sending serially and 7 per second pipelining one request at a time, and reached 51 per second only by sending all 1,024 transactions in one JSON-RPC batch. A fleet of 8 hot wallets also landed 51 per second. Nonce lanes landed 60 to 64 per second from one address whose EVM nonce never moved, against a block-gas ceiling of about 73 for that call shape. The method, the run shapes, and the caveats are in [Benchmarks](#benchmarks).
+On Sei Testnet, with the same venue call in every run, one address with sequential nonces landed 1 operation per second when it sent serially. When it pipelined one request at a time, it landed 7 per second. It reached 51 per second only when it sent all 1,024 transactions in one JSON-RPC batch.
+
+A fleet of 8 hot wallets also landed 51 per second. Nonce lanes landed 60 to 64 per second from one address whose EVM nonce never moved. For that call shape, the block-gas ceiling was about 73 per second. The method, the run shapes, and the caveats are in [Benchmarks](#benchmarks).
Six properties of the design produce those rows:
1. Capital, approvals, and protocol state stay on one address. Width comes from lanes, not from splitting funds. A new lane costs nothing to open and is valid at sequence `0` immediately.
2. The only key that can create a valid operation is the funded account's. Relayer keys can be rotated, replaced, or lost at a cost bounded by their gas balances.
-3. After the one-time delegation, the funded account's EVM nonce does not move while submitting. Nothing an RPC drops or a producer rejects can strand the account.
-4. The in-process bundling queue removes the ERC-7562 `SAME_SENDER_MEMPOOL_COUNT` limit and the dependency on a third-party bundler's inclusion policy, while every EntryPoint check that protects funds still runs.
-5. Signed operations and signed outer transactions are journaled and fsynced before broadcast, replacement reuses the relayer nonce, and restart reconciliation is deterministic: it refuses to create new work when the recorded state is ambiguous.
+3. After the one-time delegation, the funded account's EVM nonce does not move during submission. Nothing an RPC drops or a producer rejects can strand the account.
+4. The in-process bundling queue removes the ERC-7562 `SAME_SENDER_MEMPOOL_COUNT` limit and the dependency on a third-party bundler's inclusion policy. Every EntryPoint check that protects funds still runs.
+5. Signed operations and signed outer transactions are journaled and fsynced before broadcast. Replacement reuses the relayer nonce. Restart reconciliation is deterministic: it refuses to create new work when the recorded state is ambiguous.
6. The signing path performs no nonce reads, so an unreliable pending view costs nothing. Fast blocks and instant finality keep each relayer's receipt wait short, which is what makes `RELAYER_COUNT × MAX_OPS_PER_BUNDLE` a usable per-block width.
@@ -194,7 +208,7 @@ Six properties of the design produce those rows:
- Block time and gas limits differ between today's [Twin Turbo Consensus](/learn/twin-turbo-consensus) and [Sei Giga](/learn/sei-giga). Size a relayer pool against the network you submit to, and measure rather than assume.
+ Block time and gas limits differ between today's [Twin Turbo Consensus](/learn/twin-turbo-consensus) and [Sei Giga](/learn/sei-giga). Size a relayer pool for the network that you submit to. Base the size on measurements, not assumptions.
## Tutorial: run the reference implementation
@@ -210,7 +224,7 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
- Clone with submodules so the pinned `account-abstraction`, OpenZeppelin, and `forge-std` dependencies are checked out:
+ Clone the repository with submodules so that the pinned `account-abstraction`, OpenZeppelin, and `forge-std` dependencies are checked out:
```bash
git clone --recurse-submodules https://github.com/sei-protocol/sei-nonce-lanes.git
@@ -231,19 +245,27 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
forge test -vv
```
- The Foundry suite runs against the real EntryPoint v0.8 bytecode from the pinned dependency, placed at the canonical address inside the test VM. It verifies that different lanes can land in any order, that an execution revert affects only its own lane, that an operation that is never submitted blocks nothing, that a gap on one shared lane reproduces sequential blocking, that one validation failure reverts the whole bundle, that lane `0` is rejected, and that a 50-lane bundle fits in one outer transaction.
+ The Foundry suite runs against the real EntryPoint v0.8 bytecode from the pinned dependency, placed at the canonical address inside the test VM. It verifies these properties:
+
+ - Different lanes can land in any order.
+ - An execution revert affects only its own lane.
+ - An operation that is never submitted blocks nothing.
+ - A gap on one shared lane reproduces sequential blocking.
+ - One validation failure reverts the whole bundle.
+ - Lane `0` is rejected.
+ - A 50-lane bundle fits in one outer transaction.
Start with a local Prague fork. It carries Sei Testnet's state, including the deployed EntryPoint, but spends only local funds.
- Never use Anvil, Hardhat, tutorial, or shared test mnemonics on Sei Testnet or Sei Mainnet. Their addresses and keys are public, so anyone can move funds sent to them. An address derived from a published mnemonic may also carry an existing EIP-7702 delegation, and a fork inherits that code. The fork below therefore needs a fresh mnemonic too. It also runs as chain `1328`, so an authorization signed against it is replayable on Sei Testnet itself whenever the account's nonce lines up. Regenerate every key and mnemonic before you point a fork's `.env` at a public network.
+ Never use Anvil, Hardhat, tutorial, or shared test mnemonics on Sei Testnet or Sei Mainnet. Their addresses and keys are public, so anyone can move funds sent to them. An address derived from a published mnemonic may also carry an existing EIP-7702 delegation, and a fork inherits that code. The fork below therefore needs a fresh mnemonic too. It also runs as chain `1328`, so an authorization signed against it is replayable on Sei Testnet itself whenever the account's nonce matches. Regenerate every key and mnemonic before you point a fork's `.env` at a public network.
- EIP-7702 requires a Prague-capable node. Generate a mnemonic for the fork to use, and do not fall back to Anvil's default one:
+ EIP-7702 requires a Prague-capable node. Do not fall back to Anvil's default mnemonic. Generate one for the fork to use:
```bash
cast wallet new-mnemonic
@@ -259,9 +281,9 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
--mnemonic "word word word ..."
```
- Anvil funds the first ten accounts of whatever mnemonic you hand it. Using a fresh phrase avoids Anvil's published addresses. Do not use the default mnemonic here: a fork keeps any account code already attached to those public addresses, and every mutating command refuses a relayer that has code.
+ Anvil funds the first ten accounts of whatever mnemonic you give it. A fresh phrase avoids Anvil's published addresses. Do not use the default mnemonic here. A fork keeps any account code that is already attached to those public addresses, and every mutating command refuses a relayer that has code.
- The repository compiles its contracts for Cancun because they use no Prague-only opcodes, but the local node must run Prague to accept the type-4 delegation transaction.
+ The repository compiles its contracts for Cancun because they use no Prague-only opcodes. However, the local node must run Prague to accept the type-4 delegation transaction.
Create the configuration and point it at the fork:
@@ -277,9 +299,9 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
RELAYER_START_INDEX=1
```
- Set `TRADER_PRIVATE_KEY` to account `0`'s private key from the Anvil startup output, and `RELAYER_MNEMONIC` to the phrase you just generated. Starting relayers at index `1` keeps the funded account and relayer identities distinct; the application rejects overlapping identities.
+ Set `TRADER_PRIVATE_KEY` to account `0`'s private key from the Anvil startup output. Set `RELAYER_MNEMONIC` to the phrase that you generated. Starting relayers at index `1` keeps the funded account and relayer identities distinct. The application rejects overlapping identities.
- Anvil prints that key in the clear and it lands in `.env`, so treat the phrase as throwaway and keep this `.env` pointed at `127.0.0.1`.
+ Anvil prints that key in the clear, and you store it in `.env`. Treat the phrase as throwaway, and keep this `.env` pointed at `127.0.0.1`.
Deploy the demo contracts from the repository root. Anvil unlocks its own accounts, so pass account `0`'s address from its startup output as the sender:
@@ -299,7 +321,7 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
cast wallet new-mnemonic # relayer mnemonic
```
- Fund the address from the [Sei faucet](/learn/faucet), then configure:
+ Fund the address from the [Sei faucet](/learn/faucet). Then create the configuration:
```bash
cp .env.example .env
@@ -324,7 +346,7 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
--interactives 1
```
- `--interactives 1` prompts for the key and does not echo it, so it never reaches your shell history, the process table, or an environment variable.
+ `--interactives 1` prompts for the key and does not echo it. The key therefore never reaches your shell history, the process table, or an environment variable.
@@ -336,7 +358,7 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
```
- Mutating commands refuse to write to a remote Sei Mainnet RPC unless `ALLOW_MAINNET=1` is set explicitly. They also refuse remote writes when `TRADER_PRIVATE_KEY` is Anvil account `0` or `RELAYER_MNEMONIC` is the default Anvil mnemonic. The fresh mnemonic above does not trigger that credential guard. Keep its `.env` pointed at `127.0.0.1`; if you point it at Sei Testnet, chain ID `1328` is still valid and the application cannot know the change was accidental. These guards do not cover the separate Forge deployment command, and they do not make the demo production-ready.
+ Mutating commands refuse to write to a remote Sei Mainnet RPC unless you set `ALLOW_MAINNET=1` explicitly. They also refuse remote writes when `TRADER_PRIVATE_KEY` is Anvil account `0` or `RELAYER_MNEMONIC` is the default Anvil mnemonic. The fresh mnemonic above does not trigger that credential guard. Keep its `.env` pointed at `127.0.0.1`. If you point it at Sei Testnet, chain ID `1328` is still valid, and the application cannot know that the change was accidental. These guards do not cover the separate Forge deployment command, and they do not make the demo production-ready.
@@ -350,7 +372,7 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
It prints the chain ID and whether there is code at the EntryPoint address `0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108`. It also reports the account's current delegation, balances, its EntryPoint deposit, each relayer's confirmed nonce and gas balance, the lane sequences, and the venue state.
- Against current Sei Testnet or Sei Mainnet state, the EntryPoint line reads `present` because the singleton is deployed on both. On a local fork or against a misconfigured endpoint, the check catches missing fork state or the wrong network. The relayer lines are worth a second look: any `HAS CODE/DELEGATION` marker means the mutating commands will refuse that relayer.
+ Against current Sei Testnet or Sei Mainnet state, the EntryPoint line reads `present` because the singleton is deployed on both. On a local fork or against a misconfigured endpoint, the check catches missing fork state or the wrong network. Check the relayer lines carefully. Any `HAS CODE/DELEGATION` marker means that the mutating commands refuse that relayer.
@@ -358,9 +380,11 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
npm run delegate
```
- This sends one type-4 transaction with an authorization for `LANE_ACCOUNT_IMPL`, signed and paid for by the account itself, so the account's EVM nonce advances by two: once for the transaction, once for the authorization. The command reads the account's confirmed nonce once and pins both the transaction nonce and the authorization nonce (`nonce + 1`) to that read, instead of letting the client fill them from a pending-nonce lookup. That matters because a wrong authorization nonce is not rejected: the EVM skips the authorization, the transaction still succeeds, and nothing is installed. The command therefore re-reads the designator after the receipt and fails if the delegation did not take effect.
+ This sends one type-4 transaction with an authorization for `LANE_ACCOUNT_IMPL`, and the account itself signs and pays for it. The account's EVM nonce therefore advances by two: once for the transaction, and once for the authorization.
+
+ The command reads the account's confirmed nonce once. It pins both the transaction nonce and the authorization nonce (`nonce + 1`) to that read. It does not let the client fill them from a pending-nonce lookup. This matters because the EVM does not reject a wrong authorization nonce. It skips the authorization, the transaction still succeeds, and nothing is installed. The command therefore re-reads the designator after the receipt and fails if the delegation did not take effect.
- The command is idempotent: if the account already delegates to the configured implementation, it does nothing. If the account delegates to something else, it tells you before replacing it.
+ The command is idempotent: if the account already delegates to the configured implementation, it does nothing. If the account delegates to something else, the command tells you before it replaces that delegation.
@@ -369,7 +393,7 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
npm run status
```
- `fund` uses ordinary transactions to top each relayer up to `RELAYER_FUNDING` SEI and to bring the account's `EntryPoint.depositTo` balance up to `ENTRYPOINT_DEPOSIT` SEI. The deposit is what the EntryPoint draws prefund from when it validates each operation. On a public network you can instead send SEI to relayer `0` and run `npm run dispense`, which waits for the balance and splits it across the pool. Use one bootstrapping path or the other, not both.
+ `fund` uses ordinary transactions to top each relayer up to `RELAYER_FUNDING` SEI and to bring the account's `EntryPoint.depositTo` balance up to `ENTRYPOINT_DEPOSIT` SEI. When the EntryPoint validates each operation, it draws prefund from this deposit. On a public network, you can instead send SEI to relayer `0` and run `npm run dispense`. That command waits for the balance and splits it across the pool. Use one bootstrapping path or the other, not both.
@@ -377,13 +401,13 @@ The walkthrough below deploys the demo contracts, delegates a throwaway account,
npm run submit
```
- One `submit` process performs the complete run and exits. It runs the preflight, estimates the delegated call's gas, reads each lane's sequence once, signs 24 operations concurrently with no nonce RPCs, journals them, bundles them, drains the bundles through the relayer pool, and prints a report. By default, order `2` receives a limit price below the mark, so its operation reverts during execution while the neighboring lanes continue.
+ One `submit` process performs the complete run and exits. It runs the preflight, estimates the delegated call's gas, and reads each lane's sequence once. It then signs 24 operations concurrently with no nonce RPCs, journals them, and bundles them. Finally, it drains the bundles through the relayer pool and prints a report. By default, order `2` receives a limit price below the mark, so its operation reverts during execution while the neighboring lanes continue.
### Read the report
-The output below is illustrative; your addresses, blocks, and timings will differ.
+The output below is illustrative. Your addresses, blocks, and timings will differ.
```text
=== preflight ===
@@ -438,19 +462,19 @@ trader EVM nonce 9 -> 9 UNCHANGED
total wall time 4210ms
```
-What to look for:
+Look for these items:
- **`trader nonce` before and `trader EVM nonce` after** must be identical. The tool calls the funded account the trader. Its key never entered a queue.
-- **`call gas`** is the measured delegated-call estimate plus 25 percent. A `CALL_GAS_LIMIT floor` appears in that line only when you set one; leave it unset unless you have a reason, because the EntryPoint reserves the declared limit before running each operation.
+- **`call gas`** is the measured delegated-call estimate plus 25 percent. A `CALL_GAS_LIMIT floor` appears in that line only when you set one. Leave it unset unless you have a reason, because the EntryPoint reserves the declared limit before it runs each operation.
- **`exec`** combines the bundle receipt with the venue's `isFilled` read. `reverted` means the outer transaction landed, so the operation consumed its lane sequence, but the call failed inside the venue. `not mined` would mean the outer transaction never landed and nothing was consumed.
-- **`land#`** is the venue's global landing counter. It shows the order in which operations actually executed, which has nothing to do with lane number. Lane acquisition is last-in, first-out, so a fresh 32-lane pool starts at lane `32`; lane numbers carry no priority.
+- **`land#`** is the venue's global landing counter. It shows the order in which operations executed, which has nothing to do with lane number. Lane acquisition is last-in, first-out, so a fresh 32-lane pool starts at lane `32`. Lane numbers carry no priority.
- **`hash check`** confirms that the locally computed EIP-712 digest matches `EntryPoint.getUserOpHash` for the first operation, so client-side hashing matches consensus.
-If a bundle is reported as `PENDING` or `FAILED`, the command exits non-zero and leaves the journal intact. Run `npm run submit` again once the RPC can answer receipt and nonce queries; the process recovers or replaces at the same relayer nonce before it creates new work. Do not delete the journal and do not send the relayer's next nonce by hand.
+If a bundle is reported as `PENDING` or `FAILED`, the command exits non-zero and leaves the journal intact. When the RPC can answer receipt and nonce queries, run `npm run submit` again. Before it creates new work, the process recovers or replaces the bundle at the same relayer nonce. Do not delete the journal. Do not send the relayer's next nonce by hand.
### Optional: real swaps on Sei Testnet
-The repository includes a real-target path that routes tiny native SEI and native USDC swaps through the documented DragonSwap V1 deployment on Sei Testnet. It is hard-blocked on every other chain. Get testnet USDC from the [Circle faucet](https://faucet.circle.com/), then:
+The repository includes a real-target path that routes tiny native SEI and native USDC swaps through the documented DragonSwap V1 deployment on Sei Testnet. It is hard-blocked on every other chain. Get testnet USDC from the [Circle faucet](https://faucet.circle.com/). Then run these commands:
```bash
# from the app directory, where the walkthrough left off
@@ -458,7 +482,7 @@ npm run swap:setup
npm run swap:submit
```
-`swap:setup` uses ordinary transactions to approve a limited amount of USDC and to create and seed the WSEI/USDC pair if the factory has no live pair. `swap:submit` alternates SEI to USDC and USDC to SEI swaps through independent lanes and reports outcomes from EntryPoint events rather than one RPC read per swap. The same knobs apply:
+`swap:setup` uses ordinary transactions to approve a limited amount of USDC. If the factory has no live pair, it also creates and seeds the WSEI/USDC pair. `swap:submit` alternates SEI to USDC and USDC to SEI swaps through independent lanes. It reports outcomes from EntryPoint events rather than one RPC read per swap. The same knobs apply:
```bash
ORDERS=3000 \
@@ -468,7 +492,7 @@ REVERT_ORDER_INDEX=2 \
npm run swap:submit
```
-The account must hold enough of both assets for every input-side swap to execute regardless of landing order. Set `REVERT_ORDER_INDEX=-1` when you want to measure maximum throughput.
+The account must hold enough of both assets for every input-side swap to execute, regardless of landing order. To measure maximum throughput, set `REVERT_ORDER_INDEX=-1`.
### Optional: see the baseline you are escaping
@@ -477,46 +501,52 @@ The account must hold enough of both assets for every input-side swap to execute
npm run baseline
```
-Using a gas-only relayer key so nothing of value is at risk, `baseline` measures the constraint directly. It sends nonce `n + 1` while deliberately skipping `n`, waits to see whether that transaction can be included above a gap, fills the gap with nonce `n`, then checks whether the skipped-ahead transaction lands once the gap is closed. The verdict is one of four outcomes:
+`baseline` measures the constraint directly. It uses a gas-only relayer key, so nothing of value is at risk. The probe deliberately sends nonce `n + 1` without nonce `n`, and waits to see whether that transaction can be included above a gap. Next, it fills the gap with nonce `n` and checks whether the skipped-ahead transaction lands after the gap is closed. The verdict is one of four outcomes:
| Verdict | What the RPC path did | What happened to the out-of-order transaction |
| --- | --- | --- |
| `REJECTED at admission` | Refused the gapped nonce, typically with `bad nonce` | Refused synchronously, so the sender learns at once and no gap forms on this path |
-| `ADMITTED then dropped` | Returned a hash, then discarded the transaction | Lost without an error; it did not land even after the gap was filled |
+| `ADMITTED then dropped` | Returned a hash, then discarded the transaction | Lost without an error, and did not land even after the gap was filled |
| `QUEUED, then included once the gap filled` | Held it and released it in nonce order | Waited, then landed after nonce `n` arrived |
-| `ACCEPTED and included above a gap` | Included it out of order | Landed before nonce `n`; this path does not enforce nonce order |
+| `ACCEPTED and included above a gap` | Included it out of order | Landed before nonce `n`, which means this path does not enforce nonce order |
-The probe measures gap handling only. How many consecutive nonces one sender can have outstanding is a separate question, answered in [Why this is hard to replicate](#why-this-is-hard-to-replicate): many, as long as they arrive in order.
+The probe measures gap handling only. How many consecutive nonces one sender can have outstanding is a separate question. [Why this is hard to replicate](#why-this-is-hard-to-replicate) answers it: many, as long as they arrive in order.
-The probe samples both the `latest` and `pending` nonce tags before, during, and after, and prints any rejection message verbatim, because the exact message is the finding. If the two tags already disagree before the probe starts, it warns you: either the account has work in flight or the node reports a mempool-derived pending nonce, and in both cases the gap it is about to create may not be a gap at all, so the verdict cannot be attributed to nonce ordering. Compare the result with a `submit` run, where 24 operations from one account are mutually independent and one failure strands nothing.
+The probe samples both the `latest` and `pending` nonce tags before, during, and after the run. It prints any rejection message verbatim, because the exact message is the finding. If the two tags already disagree before the probe starts, it warns you. The disagreement means that either the account has work in flight, or the node reports a mempool-derived pending nonce. In both cases, the gap that the probe is about to create may not be a gap at all. You therefore cannot attribute the verdict to nonce ordering.
-The verdict depends on the path. In one session, two Sei Testnet RPC endpoints answered differently: a dedicated provider queued the gapped transaction and released it once the gap filled, while the public endpoint returned a hash and then dropped it, so it never landed even after the gap was filled. Neither rejected it at admission. Probe the path you will actually use.
+Compare the result with a `submit` run. There, 24 operations from one account are mutually independent, and one failure strands nothing.
+
+The verdict depends on the path. In one session, two Sei Testnet RPC endpoints answered differently. A dedicated provider queued the gapped transaction and released it after the gap filled. The public endpoint returned a hash and then dropped the transaction, so it never landed, even after the gap was filled. Neither endpoint rejected it at admission. Probe the path that you will use.
## Tuning
-Three knobs shape a run. They interact, so change one at a time and measure.
+Three knobs shape a run. They interact, so change one at a time and measure the result.
- One lane holds at most one in-flight operation, so `LANE_POOL_SIZE` is the hard ceiling on unresolved UserOperations in a process. Larger pools permit more concurrently unresolved intents, add startup `getNonce` reads (batched with bounded concurrency so a public RPC does not rate-limit you), and increase the recovery state you must understand after a failure. `ORDERS` must not exceed `LANE_POOL_SIZE`; the application rejects that configuration instead of silently submitting fewer operations.
+ One lane holds at most one in-flight operation, so `LANE_POOL_SIZE` is the hard ceiling on unresolved UserOperations in a process. Larger pools permit more concurrently unresolved intents. They also add startup `getNonce` reads and increase the recovery state that you must understand after a failure. The startup reads are batched with bounded concurrency so that a public RPC does not rate-limit you. `ORDERS` must not exceed `LANE_POOL_SIZE`. The application rejects that configuration instead of silently submitting fewer operations.
- `MAX_OPS_PER_BUNDLE` trades amortized outer-transaction overhead for the size of the shared validation failure domain. A width of `1` gives maximum isolation and the highest overhead. Execution reverts stay per-operation at any width. The relayer caps signed transaction gas below the block gas limit it read at startup and rejects a bundle whose estimate cannot fit.
+ `MAX_OPS_PER_BUNDLE` trades amortized outer-transaction overhead for the size of the shared validation failure domain. A width of `1` gives maximum isolation and the highest overhead. Execution reverts stay per-operation at any width. The relayer caps signed transaction gas below the block gas limit that it read at startup. It rejects a bundle whose estimate cannot fit.
+
+ A bundle does not need the sum of its operations' declared call gas. Before each operation, the EntryPoint checks that enough gas remains to honor that operation's `callGasLimit`. Whatever an operation leaves unspent passes to the next one. The outer transaction therefore needs the gas that the bundle consumes, plus about one operation's declared limit in reserve.
+
+ Over-declaring still has a cost. EntryPoint v0.8 charges 10 percent of unused call gas beyond a 40,000-gas threshold. Each operation also reserves prefund from the deposit against its declared limits, not its measured cost. An inflated limit therefore ties up deposit that is refunded only afterwards.
- A bundle does not need the sum of its operations' declared call gas. The EntryPoint checks before each operation that enough gas remains to honor that operation's `callGasLimit`, and whatever an operation leaves unspent passes to the next one, so the outer transaction needs the gas the bundle actually consumes plus about one operation's declared limit in reserve. Over-declaring still has a cost: v0.8 charges 10 percent of unused call gas beyond a 40,000-gas threshold, and each operation reserves prefund from the deposit against its declared limits rather than its measured cost, so an inflated limit ties up deposit that is only refunded afterwards.
+ That is why `CALL_GAS_LIMIT` is unset by default. Both submit paths measure the real call gas for the chain and call shape, and add 25 percent. The variable is only a floor, and it has an effect only when you set it above that measurement. Because the EntryPoint reserves each operation's declared call gas before it runs the operation, a floor above the measurement costs block gas. It therefore costs operations per block, but it does not change the gas that the operations use.
- That is why `CALL_GAS_LIMIT` is unset by default. Both submit paths measure the real call gas for the chain and call shape and add 25 percent; the variable is only a floor, and it has an effect only when you set it above that measurement. Because the EntryPoint reserves each operation's declared call gas before running it, a floor above the measurement costs block gas, and therefore operations per block, without changing the gas actually used.
+ As a reference point, the real-swap path sustained 77 operations per bundle on Sei Testnet with `CALL_GAS_LIMIT=500000`. That value was the default in an earlier revision of the repository. A bundle of 78 no longer fit the 12,500,000 block gas limit in effect during that run. It failed safely during simulation. Width 76 produced the best observed submission rate for that call shape: 47.7 landed swaps per second. These are measurements for one call shape, one configuration, and one network state, not protocol limits.
- As a reference point, on Sei Testnet with `CALL_GAS_LIMIT=500000`, the default in an earlier revision of the repository, the real-swap path sustained 77 operations per bundle; 78 no longer fit the 12,500,000 block gas limit in effect during that run and failed safely during simulation. Width 76 produced the best observed submission rate for that call shape, 47.7 landed swaps per second. These are measurements for one call shape, one configuration, and one network state, not protocol limits.
+ The mock venue is a heavier call. In the [benchmark session](#benchmarks), with `CALL_GAS_LIMIT` unset, each `place` operation used about 331,000 gas of outer transaction gas. The widest bundle that fit was therefore 36 operations, and a bundle of 37 failed safely in simulation. Widths 8, 16, and 36 packed 4, 2, and 1 bundles into a 12,500,000-gas block. Width 9, which should fit 4, landed 3.
- The mock venue is a heavier call. In the [benchmark session](#benchmarks), with `CALL_GAS_LIMIT` unset, each `place` operation used about 331,000 gas of outer transaction gas, so 36 operations was the widest bundle that fit and 37 failed safely in simulation. Widths 8, 16, and 36 packed 4, 2, and 1 bundles into a 12,500,000-gas block; width 9, which should fit 4, landed 3. Wide bundles also queue behind each other, because only one 11,700,000-gas bundle fits a block. With more than about 8 relayers at width 32 or 36, receipt waits exceed the default `BUNDLE_RECEIPT_TIMEOUT_MS`; raise the timeout for those shapes instead of paying for fee-bumped replacements of bundles that land anyway.
+ Wide bundles also queue behind each other, because only one 11,700,000-gas bundle fits a block. With more than about 8 relayers at width 32 or 36, receipt waits exceed the default `BUNDLE_RECEIPT_TIMEOUT_MS`. For those shapes, raise the timeout instead of paying for fee-bumped replacements of bundles that land anyway.
- Each relayer has one sequential outer transaction stream. Under favorable admission and inclusion conditions, the immediate submission width is roughly `RELAYER_COUNT × MAX_OPS_PER_BUNDLE` per block. That is a planning heuristic, not a throughput guarantee: RPC latency, block limits, state contention, gas, and producer policy still apply. Public RPC endpoints have [rate limits](/evm/networks); use a [dedicated provider](/learn/rpc-providers) or your own node for anything beyond a demo.
+ Each relayer has one sequential outer transaction stream. Under favorable admission and inclusion conditions, the immediate submission width is roughly `RELAYER_COUNT × MAX_OPS_PER_BUNDLE` per block. That is a planning heuristic, not a throughput guarantee. RPC latency, block limits, state contention, gas, and producer policy still apply. Public RPC endpoints have [rate limits](/evm/networks). For anything beyond a demo, use a [dedicated provider](/learn/rpc-providers) or your own node.
- One relayer's bundle cycle is five sequential RPC round trips (gas estimate, fee estimate, block number, broadcast, receipt poll) plus inclusion, about 1.5 seconds on a 120 ms endpoint. Below roughly 120 operations in flight the pool is the bottleneck and throughput scales with `RELAYER_COUNT`; above that, block gas is.
+ One relayer's bundle cycle is five sequential RPC round trips (gas estimate, fee estimate, block number, broadcast, receipt poll) plus inclusion. On a 120 ms endpoint, that takes about 1.5 seconds. Below roughly 120 operations in flight, the pool is the bottleneck, and throughput scales with `RELAYER_COUNT`. Above that, block gas is the bottleneck.
- In the [benchmark session](#benchmarks), the bundle-width sweep with 4 relayers produced client-side rates of 2.7, 8.9, 15.3, 24.3, 45.4, and 50.5 operations per second at widths 1, 4, 8, 16, 32, and 36. Its chain-side rates were 3.2, 9.8, 17.1, 28.4, 51.2, and 56.9. At width 4, the relayer-count sweep produced client-side rates of 2.2, 8.9, 15.4, 27.9, and 47.2 operations per second with 1, 4, 8, 16, and 32 relayers. Its chain-side rates were 2.7, 9.8, 17.1, 32.0, and 51.2.
+ In the [benchmark session](#benchmarks), the bundle-width sweep used 4 relayers and widths of 1, 4, 8, 16, 32, and 36. Its client-side rates were 2.7, 8.9, 15.3, 24.3, 45.4, and 50.5 operations per second. Its chain-side rates were 3.2, 9.8, 17.1, 28.4, 51.2, and 56.9. At width 4, the relayer-count sweep used 1, 4, 8, 16, and 32 relayers. Its client-side rates were 2.2, 8.9, 15.4, 27.9, and 47.2 operations per second. Its chain-side rates were 2.7, 9.8, 17.1, 32.0, and 51.2.
@@ -524,28 +554,28 @@ Three knobs shape a run. They interact, so change one at a time and measure.
### Configuration reference
-The application always loads `.env` from the repository root. The variables you are most likely to change:
+The application always loads `.env` from the repository root. These are the variables that you are most likely to change:
| Variable | Default | Meaning |
| --- | --- | --- |
| `SEI_CHAIN_ID` | `1328` | `1328` (Sei Testnet) or `1329` (Sei Mainnet) |
-| `SEI_RPC_URL` | viem chain default | HTTP endpoint; its reported chain ID must match before any write |
+| `SEI_RPC_URL` | viem chain default | HTTP endpoint. Its reported chain ID must match before any write |
| `ALLOW_MAINNET` | `0` | Must be `1` for writes to a remote Sei Mainnet RPC |
| `TRADER_PRIVATE_KEY` | required | The funded account that signs every UserOperation |
| `RELAYER_MNEMONIC` | required | Fresh BIP-39 mnemonic used only for gas-paying relayers |
| `RELAYER_COUNT` | `4` | Relayer workers, `1..256` |
-| `RELAYER_START_INDEX` | `0` | First derivation index; offset it if the mnemonic also holds the funded account |
+| `RELAYER_START_INDEX` | `0` | First derivation index. Offset it if the mnemonic also holds the funded account |
| `RELAYER_FUNDING` | `0.5` | Target SEI balance per relayer for `fund` |
| `ENTRYPOINT_DEPOSIT` | `1` | Target deposit in the EntryPoint for `fund` |
-| `LANE_ACCOUNT_IMPL` | unset | Deployed `LaneAccount`; required by `delegate` and `submit` |
-| `VENUE` | unset | Deployed demo target; required by `submit` |
-| `ORDERS` | `24` | Operations per run; must not exceed `LANE_POOL_SIZE` |
+| `LANE_ACCOUNT_IMPL` | unset | Deployed `LaneAccount`, required by `delegate` and `submit` |
+| `VENUE` | unset | Deployed demo target, required by `submit` |
+| `ORDERS` | `24` | Operations per run (must not exceed `LANE_POOL_SIZE`) |
| `LANE_POOL_SIZE` | `32` | `1..4096` lanes and the in-flight ceiling |
| `MAX_OPS_PER_BUNDLE` | `4` | `1..LANE_POOL_SIZE` operations sharing one validation domain |
-| `REVERT_ORDER_INDEX` | `2` | Order that receives an unfillable limit price; `-1` disables |
-| `CALL_GAS_LIMIT` | unset | Optional floor for each operation's declared call gas; when unset, the live estimate plus 25 percent is used |
+| `REVERT_ORDER_INDEX` | `2` | Order that receives an unfillable limit price (`-1` disables it) |
+| `CALL_GAS_LIMIT` | unset | Optional floor for each operation's declared call gas. When it is unset, the application uses the live estimate plus 25 percent |
| `BUNDLE_RECEIPT_TIMEOUT_MS` | `12000` | Receipt wait before same-nonce replacement |
-| `RECEIPT_POLLING_INTERVAL_MS` | `250` | Receipt poll interval, `10..60000`; viem's own default is `4000` |
+| `RECEIPT_POLLING_INTERVAL_MS` | `250` | Receipt poll interval, `10..60000` (viem's own default is `4000`) |
| `BUNDLE_MAX_ATTEMPTS` | `3` | Same-nonce attempts per process invocation |
| `REPLACEMENT_FEE_BUMP_PERCENT` | `25` | Fee increase per replacement, `10..1000` |
| `OPERATION_JOURNAL_PATH` | `app/.state/pending-ops.json` | Durable signed-operation journal |
@@ -554,7 +584,7 @@ The [repository README](https://github.com/sei-protocol/sei-nonce-lanes#configur
## Benchmarks
-`app/bench/` measures the lane path against the baseline it replaces: one EOA sending ordinary transactions with sequential nonces. Every mode calls the same `MockPerpVenue.place` on the configured `VENUE`, so the numbers differ only in how the calls were submitted. The commands read the root `.env`, and the shell environment overrides it:
+`app/bench/` measures the lane path against the baseline it replaces: one EOA that sends ordinary transactions with sequential nonces. Every mode calls the same `MockPerpVenue.place` on the configured `VENUE`, so the numbers differ only in how the calls were submitted. The commands read the root `.env`, and the shell environment overrides it:
```bash
cd app
@@ -579,13 +609,15 @@ REPORT_FROM_BLOCK= REPORT_TO_BLOCK= npm run bench:repor
npm run bench:latency
```
-The `bench:baseline` modes are the ways one address can drive a sequential queue. `serial` sends one transaction and waits for its receipt before the next. `pipelined` signs everything up front and broadcasts in nonce order without waiting. `pipelined-gap` does the same but never broadcasts the transaction at `BENCH_GAP_INDEX`, then repairs the gap. `batch` sends everything in one JSON-RPC batch request. `fleet` derives `BENCH_FLEET_SIZE` wallets from `RELAYER_MNEMONIC`, funds them from the account, and runs `pipelined` on each at once.
+The `bench:baseline` modes are the ways one address can drive a sequential queue. `serial` sends one transaction and waits for its receipt before the next. `pipelined` signs everything up front and broadcasts in nonce order without waiting. `pipelined-gap` does the same but never broadcasts the transaction at `BENCH_GAP_INDEX`. It then repairs the gap. `batch` sends everything in one JSON-RPC batch request. `fleet` derives `BENCH_FLEET_SIZE` wallets from `RELAYER_MNEMONIC`, funds them from the account, and runs `pipelined` on each at once.
-`bench:lanes` shares the account-wide run lock with `submit` and `swap:submit` but keeps its own journal under `app/.state/bench/`, so a benchmark never replays the tutorial's pending operations. If a `submit` run was interrupted, recover it with `npm run submit` first. The remaining `BENCH_*` and `REPORT_*` knobs are documented in the [repository README](https://github.com/sei-protocol/sei-nonce-lanes#benchmarks).
+`bench:lanes` shares the account-wide run lock with `submit` and `swap:submit`. However, it keeps its own journal under `app/.state/bench/`, so a benchmark never replays the tutorial's pending operations. If a `submit` run was interrupted, recover it with `npm run submit` first. The [repository README](https://github.com/sei-protocol/sei-nonce-lanes#benchmarks) documents the remaining `BENCH_*` and `REPORT_*` knobs.
### Measured against the alternatives
-Every row below comes from one measurement session on Sei Testnet. Conditions during the session: block gas limit 12,500,000; base fee 50 gwei plus a 1 gwei tip; about 2.0 blocks per second under load; 120 ms warm request latency to the configured endpoint. Each direct `place` transaction used 328,425 gas and each lane operation about 331,000 gas of outer transaction gas, so the block admits 36 to 38 operations however they are submitted: roughly 73 landed operations per second for this call shape. Chain-side rates divide landed operations by the block-timestamp span, which Sei stamps in whole seconds. Client-side rates divide by wall time from first broadcast to last receipt.
+Every row below comes from one measurement session on Sei Testnet. During the session, the block gas limit was 12,500,000, and the base fee was 50 gwei plus a 1 gwei tip. The network produced about 2.0 blocks per second under load, and warm request latency to the configured endpoint was 120 ms.
+
+Each direct `place` transaction used 328,425 gas, and each lane operation used about 331,000 gas of outer transaction gas. The block therefore admits 36 to 38 operations, regardless of how they are submitted. For this call shape, that is roughly 73 landed operations per second. Chain-side rates divide landed operations by the block-timestamp span, which Sei stamps in whole seconds. Client-side rates divide by wall time from first broadcast to last receipt.
@@ -603,20 +635,20 @@ Every row below comes from one measurement session on Sei Testnet. Conditions du
-What the numbers show:
+The numbers show four things:
-- Block gas, not the nonce model, set the ceiling. Lanes came closest to it, with 28 of 31 blocks at least 90 percent full in the 16 × 36 run, from one address whose EVM nonce never moved. A single ordered queue matched the fleet only when every transaction left in one JSON-RPC batch; one request at a time, it is bounded by the round trip, about 7 per second.
-- Small relayer pools are client-bound. Throughput scales with `RELAYER_COUNT` until roughly 120 operations are in flight, then block gas takes over. The relayer and width series are in [Tuning](#tuning).
-- A gap costs the whole queue. One lost transaction in the sequential queue (`pipelined-gap`, nonce 50 of 100) left the 49 transactions behind it accepted but unmined until the client resent it 15 seconds later. In the lane runs, the deliberately reverting order consumed only its own lane while the rest of its bundle landed.
+- Block gas, not the nonce model, set the ceiling. Lanes came closest to that ceiling, and they did so from one address whose EVM nonce never moved. In the 16 × 36 run, 28 of 31 blocks were at least 90 percent full. A single ordered queue matched the fleet only when every transaction left in one JSON-RPC batch. With one request at a time, the round trip bounds it to about 7 per second.
+- Small relayer pools are client-bound. Throughput scales with `RELAYER_COUNT` until roughly 120 operations are in flight. After that, block gas is the limit. The relayer and width series are in [Tuning](#tuning).
+- A gap costs the whole queue. One transaction was lost in the sequential queue (`pipelined-gap`, nonce 50 of 100). The 49 transactions behind it stayed accepted but unmined until the client resent the lost transaction 15 seconds later. In the lane runs, the deliberately reverting order consumed only its own lane while the rest of its bundle landed.
- RPC paths differ. `npm run baseline` gave [two different verdicts](#optional-see-the-baseline-you-are-escaping) for two Sei Testnet endpoints in the same session.
- These are measurements of one call shape, one network state, and one client machine, not protocol limits. Cost was about 0.02 SEI per landed operation at the effective 52 gwei. Rerun the benchmarks against the network and endpoint you will actually use; block time and gas limits differ between [Twin Turbo Consensus](/learn/twin-turbo-consensus) and [Sei Giga](/learn/sei-giga). The raw records under `app/.state/bench/` include a journal for `bench:lanes`, which you should treat like `pending-ops.json`.
+ These are measurements of one call shape, one network state, and one client machine, not protocol limits. The cost was about 0.02 SEI per landed operation at the effective 52 gwei. Rerun the benchmarks against the network and endpoint that you will use. Block time and gas limits differ between [Twin Turbo Consensus](/learn/twin-turbo-consensus) and [Sei Giga](/learn/sei-giga). The raw records under `app/.state/bench/` include a journal for `bench:lanes`. Treat it like `pending-ops.json`.
## Adapting it to your contract
-The demo's `MockPerpVenue` is a stand-in that reverts on slippage so a failure is observable. Swapping it for a real target means encoding a different call. `LaneAccount.execute(target, value, data)` forwards any call, and the target sees the funded EOA as `msg.sender`:
+The demo's `MockPerpVenue` is a stand-in that reverts on slippage so that you can observe a failure. To replace it with a real target, encode a different call. `LaneAccount.execute(target, value, data)` forwards any call, and the target sees the funded EOA as `msg.sender`:
```ts
import { encodeFunctionData } from 'viem';
@@ -658,34 +690,34 @@ bundlingQueue.add({
});
```
-The real-swap path in `app/src/swap-submit.ts` is a complete example of this against a live router, including forwarding native SEI as `value`.
+The real-swap path in `app/src/swap-submit.ts` is a complete example of this against a live router. It also forwards native SEI as `value`.
Check these before you trust a new target:
- **`msg.sender` and `tx.origin`.** At the target, `msg.sender` is the funded EOA and `tx.origin` is the gas-paying relayer. Contracts that require `tx.origin == msg.sender` are incompatible. Audit each router, approval path, callback, reentrancy assumption, and authorization rule.
-- **Gas on Sei.** Storage writes cost materially more than on Ethereum. The application estimates the delegated call live and declares that estimate plus 25 percent, raised to `CALL_GAS_LIMIT` only when you set that floor higher. Do not copy Ethereum-sized static limits in either direction: too low runs out of gas, and too high reserves block gas your operations never use. See [Gas and fees](/evm/evm-parity/gas-and-fees).
-- **Storage contention.** Lanes remove submission ordering, not execution conflicts. Analyze which storage slots your calls touch; see [Optimizing for parallelization](/evm/best-practices/optimizing-for-parallelization).
-- **Lane policy.** One lane per in-flight intent is the simplest correct policy. If some calls must stay ordered relative to each other, put them on one lane (or on `ADMIN_LANE`) rather than falling back to lane `0`.
+- **Gas on Sei.** Storage writes cost materially more than on Ethereum. The application estimates the delegated call live and declares that estimate plus 25 percent. It raises the value to `CALL_GAS_LIMIT` only when you set that floor higher. Do not copy Ethereum-sized static limits in either direction. A limit that is too low runs out of gas, and a limit that is too high reserves block gas that your operations never use. See [Gas and fees](/evm/evm-parity/gas-and-fees).
+- **Storage contention.** Lanes remove submission ordering, not execution conflicts. Analyze which storage slots your calls touch. See [Optimizing for parallelization](/evm/best-practices/optimizing-for-parallelization).
+- **Lane policy.** One lane per in-flight intent is the simplest correct policy. If some calls must stay ordered relative to each other, put them on one lane (or on `ADMIN_LANE`). Do not fall back to lane `0`.
### Before you adapt this
The repository is explicit about what it leaves out. Before this design touches real funds, add at least:
-- audited account and integration contracts;
-- hardware-backed or remote signing;
-- a real risk engine with an idempotent intent model;
-- durable, replicated queue and reconciliation storage;
-- metrics, tracing, alerting, and structured logs;
-- controlled deployment and delegation procedures;
-- RPC redundancy and chain-specific fee policy;
-- graceful shutdown and operator runbooks; and
-- load, fault-injection, and live-chain recovery testing.
+- Audited account and integration contracts
+- Hardware-backed or remote signing
+- A real risk engine with an idempotent intent model
+- Durable, replicated queue and reconciliation storage
+- Metrics, tracing, alerting, and structured logs
+- Controlled deployment and delegation procedures
+- RPC redundancy and chain-specific fee policy
+- Graceful shutdown and operator runbooks
+- Load, fault-injection, and live-chain recovery testing
- EIP-7702 changes the code that executes at your address. Before delegating, verify the implementation source and deployed address, verify the target chain, inspect any existing delegation, and use a throwaway account for this demo. `submit` refuses to run if the current designator does not exactly match `LANE_ACCOUNT_IMPL`.
+ Before you delegate, verify the implementation source, the deployed address, and the target chain. Inspect any existing delegation. Use a throwaway account for this demo. EIP-7702 changes the code that executes at your address. `submit` refuses to run if the current designator does not exactly match `LANE_ACCOUNT_IMPL`.
-Treat `.env`, `app/.state/`, signed raw transactions, and RPC URLs containing credentials as sensitive. The journal does not contain private keys, but it contains signed UserOperations and replayable raw transactions until their nonces are consumed. Clone the repository for a teammate and create fresh keys; do not copy a working directory.
+Treat `.env`, `app/.state/`, signed raw transactions, and RPC URLs that contain credentials as sensitive. The journal does not contain private keys, but it contains signed UserOperations and replayable raw transactions until their nonces are consumed. For a teammate, clone the repository and create fresh keys. Do not copy a working directory.
## Troubleshooting
@@ -694,11 +726,11 @@ Treat `.env`, `app/.state/`, signed raw transactions, and RPC URLs containing cr
Check both `SEI_CHAIN_ID` and `SEI_RPC_URL`. For a local fork, pass `--chain-id 1328` to Anvil. The configured chain ID is part of the EIP-712 signature domain and cannot be guessed safely.
- The canonical v0.8 singleton is deployed at `0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108` on both Sei Mainnet and Sei Testnet. A `MISSING` line against current state usually means the configured RPC is not serving Sei. Check `SEI_RPC_URL`, and check that a local Anvil was started with `--fork-url` against a Sei endpoint rather than as a bare chain. `submit` fails closed on the same condition with `No EntryPoint at … on this chain`, before it signs anything.
+ The canonical v0.8 singleton is deployed at `0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108` on both Sei Mainnet and Sei Testnet. A `MISSING` line against current state usually means the configured RPC is not serving Sei. Check `SEI_RPC_URL`. For a local Anvil, check that it was started with `--fork-url` against a Sei endpoint, not as a bare chain. `submit` fails closed on the same condition with `No EntryPoint at … on this chain`, before it signs anything.
- Do not deploy your own EntryPoint to work around it. A second EntryPoint lives at a different address, so it has a different EIP-712 domain and shares no lane sequences or deposits with the one every other integration on Sei uses.
+ Do not deploy your own EntryPoint to work around it. A second EntryPoint is at a different address, so it has a different EIP-712 domain. It also shares no lane sequences or deposits with the EntryPoint that every other integration on Sei uses.
- Confirm the deployment against the same endpoint. Export `SEI_RPC_URL` from your `.env`, then run:
+ Confirm the deployment against the same endpoint. Export `SEI_RPC_URL` from your `.env`, and then run:
```bash
cast call 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108 \
@@ -706,32 +738,36 @@ Treat `.env`, `app/.state/`, signed raw transactions, and RPC URLs containing cr
--rpc-url "$SEI_RPC_URL"
```
- It answers `ERC4337`, version `1`, its own address, and the chain ID you queried. Comparing bytecode against another chain's deployment is the wrong test: v0.8 caches that domain separator in an immutable, so the runtime code at the canonical address differs by that one word, and by the chain ID word, on every chain it is deployed to.
+ It returns `ERC4337`, version `1`, its own address, and the chain ID that you queried. Comparing bytecode with another chain's deployment is the wrong test. EntryPoint v0.8 caches that domain separator in an immutable. The runtime code at the canonical address therefore differs by that one word on every chain where it is deployed. It also differs by the chain ID word.
- Run `npm run status` and compare `delegated to` with `LANE_ACCOUNT_IMPL`. Do not blindly replace an unexpected designator. Confirm the account, chain, and implementation first, then run `npm run delegate` deliberately.
+ Run `npm run status`, and compare `delegated to` with `LANE_ACCOUNT_IMPL`. Do not blindly replace an unexpected designator. First confirm the account, chain, and implementation. Then run `npm run delegate` deliberately.
Run `npm run fund`, or send SEI to relayer `0` and run `npm run dispense`.
- Relayers must be plain EOAs, and every mutating command checks that before it signs. The usual cause is a public mnemonic whose addresses already have code or a delegation on Sei. A fork inherits that account code. Generate a fresh mnemonic with `cast wallet new-mnemonic`, point `RELAYER_MNEMONIC` at it, and fund the new relayers rather than trying to undelegate the old ones.
+ Relayers must be plain EOAs, and every mutating command checks that before it signs. The usual cause is a public mnemonic whose addresses already have code or a delegation on Sei. A fork inherits that account code. Generate a fresh mnemonic with `cast wallet new-mnemonic`, and point `RELAYER_MNEMONIC` at it. Fund the new relayers instead of trying to undelegate the old ones.
- Common validation causes: `AA24` is an invalid signature or the wrong EIP-712 chain or domain; `AA25` is a stale or incorrect lane sequence; an insufficient EntryPoint prefund; or delegation to the wrong account implementation. Run `npm run status` and resolve the cause before widening bundles or retrying.
+ `AA24` means an invalid signature, or the wrong EIP-712 chain or domain. `AA25` means a stale or incorrect lane sequence. Other common validation causes are an insufficient EntryPoint prefund and delegation to the wrong account implementation. Run `npm run status`. Resolve the cause before you widen bundles or retry.
- `AA95` is the EntryPoint's report that the outer transaction had less gas left than an operation's declared limits require. In general it points to an outer gas limit or estimation headroom that is too low, not to network capacity. While widening bundles, the usual cause is the block gas limit: simulation cannot find an outer gas amount under that limit that satisfies the check, and the relayer never signs above the limit it read at startup. Nothing in a bundle that fails simulation is broadcast or consumed. Rerun with a smaller `MAX_OPS_PER_BUNDLE`; the durable queue is repacked at the smaller width.
+ `AA95` is the EntryPoint's report that the outer transaction had less gas left than an operation's declared limits require. In general, it points to an outer gas limit or estimation headroom that is too low, not to network capacity. When you widen bundles, the usual cause is the block gas limit. Simulation cannot find an outer gas amount under that limit that satisfies the check. The relayer never signs above the limit that it read at startup.
+
+ Nothing in a bundle that fails simulation is broadcast or consumed. Rerun with a smaller `MAX_OPS_PER_BUNDLE`. The durable queue is repacked at the smaller width.
Only one lane-based process may use an account at a time, even when `submit` and `swap:submit` use different journals. Stop the other process. A lock whose recorded PID is no longer alive is removed automatically on the next run.
- `could not acquire the lock … within 2000ms` is different. The lock file exists but its contents could not be parsed, so the process cannot tell whether a live holder owns it, and it refuses to remove a lock it cannot attribute. A torn or truncated file left by a dead process and a live holder caught mid-publish produce the same message, and the message repeating across runs does not distinguish between them. Removing a lock that a live process holds lets two processes sign for the same account, which produces duplicate operations on the same lane sequences and conflicting relayer nonces.
+ `could not acquire the lock … within 2000ms` is different. The lock file exists, but the process could not parse its contents, so it cannot tell whether a live holder owns the lock. It refuses to remove a lock that it cannot attribute. A torn or truncated file left by a dead process produces the same message as a live holder caught mid-publish. A message that repeats across runs does not distinguish between them either.
+
+ If you remove a lock that a live process holds, two processes can sign for the same account. That produces duplicate operations on the same lane sequences and conflicting relayer nonces.
- Before deleting a lock file by hand, confirm that no `submit`, `swap:submit`, or `bench:lanes` process is running against this account. Read the `pid` from the file if it is legible, and check the process table on every host that shares the state directory. Both locks live under `app/.state/`: the account-wide run lock (`sender--.lock`, or `SENDER_RUN_LOCK_PATH`) and one `.lock` file next to each journal. Delete the file only after that check.
+ Before you delete a lock file manually, confirm that no `submit`, `swap:submit`, or `bench:lanes` process is running against this account. If the file is legible, read the `pid` from it. Check the process table on every host that shares the state directory. Both locks are under `app/.state/`: the account-wide run lock (`sender--.lock`, or `SENDER_RUN_LOCK_PATH`) and one `.lock` file next to each journal. Delete the file only after that check.
- Do not delete the journal and do not send the relayer's next nonce manually. Run `npm run submit` again once the RPC can answer receipt and nonce queries. If the application reports partial lane consumption or a state it cannot reconcile, stop and inspect the EntryPoint events, every attempted transaction hash, the relayer's confirmed nonce, and each lane sequence.
+ Do not delete the journal. Do not send the relayer's next nonce manually. When the RPC can answer receipt and nonce queries, run `npm run submit` again. If the application reports partial lane consumption or a state that it cannot reconcile, stop. Then inspect the EntryPoint events, every attempted transaction hash, the relayer's confirmed nonce, and each lane sequence.
@@ -748,7 +784,7 @@ Treat `.env`, `app/.state/`, signed raw transactions, and RPC URLs containing cr
UserOperations, the EntryPoint, and two-dimensional nonces.
- The alt-mempool rules the in-process bundling queue sidesteps.
+ The alt-mempool rules that do not apply to the in-process bundling queue.
Why one confirmation is final and the pending view is unreliable.
@@ -759,7 +795,7 @@ Treat `.env`, `app/.state/`, signed raw transactions, and RPC URLs containing cr
A hosted ERC-4337 bundler and paymaster, if you want sponsorship instead of throughput.
-
+
EIP-7702 delegation for consumer wallet flows.
diff --git a/evm/oracles/api3.mdx b/evm/oracles/api3.mdx
index 72de170..a52540e 100644
--- a/evm/oracles/api3.mdx
+++ b/evm/oracles/api3.mdx
@@ -3,30 +3,30 @@ title: 'API3'
description: 'Complete guide to integrating API3 with Sei'
keywords: ['API3', 'oracle', 'price feeds', 'data feeds', 'decentralized oracle', 'sei']
---
-API3 is a decentralized oracle network that provides real-time data feeds to smart contracts. Unlike traditional oracles that rely on third-party intermediaries, API3 connects APIs directly to the blockchain through first-party oracles operated by the API providers themselves. This approach reduces trust assumptions and potential points of failure.
+API3 is a decentralized oracle network that supplies real-time data feeds to smart contracts. Traditional oracles rely on third-party intermediaries. API3 instead connects APIs directly to the blockchain through first-party oracles that the API providers operate themselves. This approach reduces trust assumptions and potential points of failure.
-## What You'll Be Doing in This Guide
+## What you'll be doing in this guide
-In this tutorial, you'll learn how to:
+This tutorial shows you how to:
-1. Integrate API3's data feeds into your smart contract on the SEI network
-2. Retrieve real-time SEI token price data using API3's proxy contract
+1. Integrate API3's data feeds into your smart contract on Sei
+2. Get real-time price data for the SEI token from API3's proxy contract
3. Understand the structure of API3's reader proxy interface
-4. Deploy and test your integration on SEI
+4. Deploy and test your integration on Sei
-By the end of this guide, you'll have a working smart contract that can fetch SEI price data from API3's decentralized oracle network.
+By the end of this guide, you will have a working smart contract that can fetch SEI price data from API3's decentralized oracle network.
## Prerequisites
-Before starting this tutorial, ensure you have:
+Before you start this tutorial, make sure that you have:
-### Technical Requirements
+### Technical requirements
-- **Solidity Knowledge**: Basic understanding of Solidity smart contract development
-- **Development Environment**: Remix IDE, Hardhat, or similar Solidity development setup
-- **SEI Network Access**: RPC endpoint and mainnet access for SEI
+- **Solidity knowledge**: A basic understanding of smart contract development in Solidity
+- **Development environment**: Remix IDE, Hardhat, or a similar Solidity development setup
+- **Sei network access**: An RPC endpoint and access to Sei Mainnet
-### Required Dependencies
+### Required dependencies
- OpenZeppelin Contracts library (`@openzeppelin/contracts`)
- API3 Contracts library (`@api3/contracts`)
@@ -44,16 +44,16 @@ yarn add @openzeppelin/contracts @api3/contracts
pnpm add @openzeppelin/contracts @api3/contracts
```
-### SEI Network Configuration
+### Sei network configuration
-Make sure your development environment is configured for SEI:
+Make sure that your development environment is configured for Sei:
- **Mainnet RPC**: `https://evm-rpc.sei-apis.com`
-- **Chain ID**: 1329 (mainnet)
+- **Chain ID**: 1329 (Sei Mainnet)
-## Contract Code
+## Contract code
-Here's the complete smart contract code for integrating with API3 to read SEI price data:
+This complete smart contract reads SEI price data from API3:
```solidity
// SPDX-License-Identifier: MIT
@@ -106,40 +106,40 @@ contract DataFeedReaderExample is Ownable {
}
```
-### Contract Breakdown
+### Contract breakdown
-**Key Components:**
+**Main components:**
-1. **Proxy Address**: The contract stores the API3 proxy address that provides SEI price data
-2. **Data Validation**: The contract validates that price values are positive and timestamps are recent
-3. **IApi3ReaderProxy Interface**: This interface provides the `read()` function to fetch price data
+1. **Proxy address**: The contract stores the address of the API3 proxy that supplies SEI price data
+2. **Data validation**: The contract validates that price values are positive and that timestamps are recent
+3. **IApi3ReaderProxy interface**: This interface has the `read()` function, which fetches price data
-**The `readDataFeed()` Function:**
+**The `readDataFeed()` function:**
- Returns `int224 value`: The SEI price (likely in USD with 18 decimal places)
- Returns `uint256 timestamp`: When the price was last updated
-- Validates data freshness (within 1 day)
-- Ensures price is positive
+- Checks that the data is fresh (within 1 day)
+- Checks that the price is positive
-## Proxy Address
+## Proxy address
-For this tutorial, we'll be using the following API3 proxy address on SEI:
+This tutorial uses the API3 proxy at this address on Sei:
[`0x09c6e594DE2EB633902f00B87A43b27F80a31a60`](https://seiscan.io/address/0x09c6e594DE2EB633902f00B87A43b27F80a31a60)
-This proxy provides real-time [SEI/USD](https://market.api3.org/sei/sei-usd/integrate) price data from API3's decentralized oracle network.
+This proxy supplies real-time [SEI/USD](https://market.api3.org/sei/sei-usd/integrate) price data from API3's decentralized oracle network.
-## How to Test
+## How to test
-### 1. Deploy the Contract
+### 1. Deploy the contract
**Using Remix IDE:**
1. Open [Remix IDE](https://remix.ethereum.org/)
-2. Create a new file called `DataFeedReaderExample.sol`
-3. Paste the contract code above
-4. Compile the contract using Solidity compiler ^0.8.0
-5. Deploy with constructor parameter: `0x09c6e594DE2EB633902f00B87A43b27F80a31a60`
+2. Create a new file named `DataFeedReaderExample.sol`
+3. Paste the contract code from above
+4. Compile the contract with the Solidity compiler (version ^0.8.0)
+5. Deploy with this constructor parameter: `0x09c6e594DE2EB633902f00B87A43b27F80a31a60`
**Using Hardhat:**
@@ -150,9 +150,9 @@ const reader = await DataFeedReader.deploy(proxy);
await reader.deployed();
```
-### 2. Read Price Data
+### 2. Read price data
-After deployment, call the `readDataFeed()` function to retrieve the current SEI price:
+After you deploy the contract, call the `readDataFeed()` function to get the current SEI price:
```javascript
// Using ethers.js
@@ -161,14 +161,14 @@ console.log('SEI Price:', ethers.utils.formatUnits(result.value, 18));
console.log('Last Updated:', new Date(result.timestamp * 1000));
```
-**Expected Output Format:**
+**Expected output format:**
-- `value`: SEI price in USD (with 18 decimals, e.g., `300000000000000000` = $0.3)
+- `value`: The SEI price in USD (with 18 decimals, for example `300000000000000000` = $0.3)
- `timestamp`: Unix timestamp of the last price update
-### 3. Integration Examples
+### 3. Integration examples
-**Basic Price Display:**
+**Basic price display:**
```solidity
function getSEIPrice() external view returns (int224 value) {
diff --git a/evm/oracles/chainlink.mdx b/evm/oracles/chainlink.mdx
index 8f4f0f0..a639a2b 100644
--- a/evm/oracles/chainlink.mdx
+++ b/evm/oracles/chainlink.mdx
@@ -7,54 +7,54 @@ keywords: ['chainlink', 'oracle', 'data streams', 'price feeds', 'real-time data
## What is Chainlink?
-Chainlink is the world's most widely adopted decentralized oracle network, enabling smart contracts to securely access off-chain data, APIs, and traditional payment systems. Chainlink Data Streams is a pull-based oracle solution that delivers high-frequency, low-latency market data directly to smart contracts.
+Chainlink is the world's most widely adopted decentralized oracle network. It lets smart contracts securely access off-chain data, APIs, and traditional payment systems. Chainlink Data Streams is a pull-based oracle that delivers high-frequency, low-latency market data directly to smart contracts.
-## What This Guide Teaches You
+## What this guide teaches you
-This tutorial will walk you through integrating Chainlink Data Streams on Sei Network to:
+This tutorial shows you how to integrate Chainlink Data Streams on Sei to:
-1. **Fetch real-time price data** using the Chainlink Data Streams SDK
-2. **Deploy a smart contract** that can verify and decode price reports on-chain
-3. **Combine off-chain and on-chain components** to create a complete oracle solution
-4. **Verify SEI/USDT price feeds** as a practical example
+1. Fetch real-time price data with the Chainlink Data Streams SDK
+2. Deploy a smart contract that can verify and decode price reports on-chain
+3. Combine off-chain and on-chain components to create a complete oracle solution
+4. Verify SEI/USDT price feeds as a practical example
-By the end of this guide, you'll have a working implementation that fetches price data off-chain and verifies it on-chain using Chainlink's data streams SDK.
+By the end of this guide, you will have a working implementation that uses the Chainlink Data Streams SDK. It fetches price data off-chain and verifies it on-chain.
## Prerequisites
-Before starting this tutorial, ensure you have:
+Before you start this tutorial, make sure that you have:
-### Technical Requirements
+### Technical requirements
-- **Node.js** (v18 or higher) and npm installed
-- **Basic knowledge** of TypeScript/JavaScript
-- **Solidity development experience** (basic to intermediate)
-- **Familiarity with smart contract deployment** tools like Remix or Hardhat
+- Node.js (v18 or higher) and npm installed
+- Basic knowledge of TypeScript or JavaScript
+- Solidity development experience (basic to intermediate)
+- Familiarity with tools to deploy smart contracts, such as Remix or Hardhat
-### Sei Network Setup
+### Sei network setup
-**Testnet** :
+**Sei Testnet:**
- **Sei Testnet RPC**: `https://evm-rpc-testnet.sei-apis.com`
- **Chain ID**: 1328
-**Mainnet** :
+**Sei Mainnet:**
-- **SEI mainnet RPC**: `https://evm-rpc.sei-apis.com`
+- **Sei Mainnet RPC**: `https://evm-rpc.sei-apis.com`
- **Chain ID**: 1329
-### Chainlink Data Streams Access
+### Chainlink Data Streams access
-You need to contact Chainlink for getting access to API credentials of Data Streams.
+Contact Chainlink to get access to the API credentials for Data Streams.
-- **API credentials**: Contact Chainlink to get access to Data Streams on Sei Mainnet/testnet
+- **API credentials**: Contact Chainlink to get access to Data Streams on Sei Mainnet or Sei Testnet
- **API Key** and **User Secret** for testnet access
-- **Feed IDs**: We'll use [SEI/USDT](https://docs.chain.link/data-streams/crypto-streams?page=1&testnetPage=1&testnetSearch=SEI#testnet-crypto-streams) feed ID `0x0003dba2d8553dfd7afe35c2bfe217ef5106d7805e5272c04a08940ddb868117`
-- **VerifierProxy contract address**: `0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB` — the same address is used on [Sei Mainnet](https://seiscan.io/address/0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB) and [Sei Testnet](https://testnet.seiscan.io/address/0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB). See Chainlink's [Stream Addresses](https://docs.chain.link/data-streams/crypto-streams) page for the current list.
+- **Feed IDs**: This guide uses the [SEI/USDT](https://docs.chain.link/data-streams/crypto-streams?page=1&testnetPage=1&testnetSearch=SEI#testnet-crypto-streams) feed ID `0x0003dba2d8553dfd7afe35c2bfe217ef5106d7805e5272c04a08940ddb868117`
+- **VerifierProxy contract address**: `0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB`. [Sei Mainnet](https://seiscan.io/address/0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB) and [Sei Testnet](https://testnet.seiscan.io/address/0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB) use the same address. For the current list, see Chainlink's [Stream Addresses](https://docs.chain.link/data-streams/crypto-streams) page.
-## Step-by-Step Tutorial
+## Step-by-step tutorial
-### Step 1: Project Setup
+### Step 1: Project setup
Create a new directory and initialize your project:
@@ -78,9 +78,9 @@ API_KEY=your_chainlink_api_key_here
USER_SECRET=your_chainlink_user_secret_here
```
-### Step 2: Fetching Price Data with TypeScript
+### Step 2: Fetching price data with TypeScript
-Create a file called `singleStream.ts` with the following code:
+Create a file named `singleStream.ts` with this code:
```typescript
import { createClient, decodeReport, LogLevel, getReportVersion, formatReport } from '@chainlink/data-streams-sdk';
@@ -142,14 +142,14 @@ main();
This script:
-- **Creates a Data Streams client** with your API credentials
-- **Fetches the latest report** for a given feed ID
-- **Decodes the raw report** into readable price data
-- **Displays both raw and formatted data** for debugging
+- Creates a Data Streams client with your API credentials
+- Fetches the latest report for a given feed ID
+- Decodes the raw report into readable price data
+- Displays both the raw and the formatted data for debugging
-### Step 3: Smart Contract Deployment
+### Step 3: Smart contract deployment
-Create and deploy the verification contract on Sei Network. Copy this Solidity code into Remix IDE:
+Create and deploy the verification contract on Sei. Copy this Solidity code into Remix IDE:
```solidity
// SPDX-License-Identifier: MIT
@@ -286,10 +286,10 @@ contract ClientReportsVerifier {
**Deployment steps in Remix:**
1. Switch to Sei Testnet in MetaMask
-2. Deploy with Sei Testnet VerifierProxy address: `0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB`
+2. Deploy the contract with the VerifierProxy address for Sei Testnet: `0x60fAa7faC949aF392DFc858F5d97E3EEfa07E9EB`
3. Save the contract address for testing
-### Step 4: Complete Integration Script
+### Step 4: Complete integration script
Create `verifyOnChain.ts` to combine off-chain fetching with on-chain verification:
@@ -343,11 +343,11 @@ async function main() {
main().catch(console.error);
```
-## How to Run and Test
+## How to run and test
-### 1. Test Off-chain Data Fetching
+### 1. Test off-chain data fetching
-Run the single stream script to verify off-chain fetching and decoding:
+Run the single-stream script to test off-chain fetching and decoding:
```bash
npx tsx singleStream.ts 0x0003dba2d8553dfd7afe35c2bfe217ef5106d7805e5272c04a08940ddb868117
@@ -378,15 +378,15 @@ Bid Price: 179941088372418000
Ask Price: 180063641553635300
```
-### 2. Test Smart Contract Deployment
+### 2. Test smart contract deployment
-1. Copy the raw report blob from Step 1 output (the long hex string starting with `0x00090d9e...`)
-2. Call `verifyReport()` and paste the entire blob as the `unverifiedReport` parameter
-3. Call `getLastPrice()` - you should see the decoded price (e.g., `180009506586149300`)
+1. Copy the raw report blob from the Step 1 output (the long hex string that starts with `0x00090d9e...`)
+2. Call `verifyReport()` with the entire blob as the `unverifiedReport` parameter
+3. Call `getLastPrice()`. You should see the decoded price (for example, `180009506586149300`)
-### 3. Test Complete Integration
+### 3. Test complete integration
-**Step 3a: Setup Integration Script**
+**Step 3a: Set up the integration script**
Add your private key to `.env`:
@@ -396,17 +396,15 @@ USER_SECRET=your_chainlink_user_secret_here
PRIVATE_KEY=your_sei_testnet_private_key_here
```
-Update `verifyOnChain.ts` with your deployed contract address:
+In `verifyOnChain.ts`, replace `YOUR_DEPLOYED_CONTRACT_ADDRESS` with the address of your deployed contract.
-Replace `YOUR_DEPLOYED_CONTRACT_ADDRESS` in the script with your actual contract address.
-
-**Step 3b: Run Integration Test**
+**Step 3b: Run the integration test**
```bash
npx tsx verifyOnChain.ts
```
-**Expected Output:**
+**Expected output:**
```bash
npx tsx verifyOnChain.ts
@@ -420,4 +418,4 @@ Price verified on-chain: 0.180009506586149300 SEI/USDT
## Resources
-- [Chainlink Data Streams Documentation](https://docs.chain.link/data-streams/)
+- [Chainlink Data Streams documentation](https://docs.chain.link/data-streams/)
diff --git a/evm/oracles/pyth-network.mdx b/evm/oracles/pyth-network.mdx
index 62b25d3..acf5017 100644
--- a/evm/oracles/pyth-network.mdx
+++ b/evm/oracles/pyth-network.mdx
@@ -3,31 +3,31 @@ title: 'Pyth Network'
description: 'Complete guide to integrating Pyth Network with Sei'
keywords: ['pyth network', 'oracle', 'price feeds', 'pull oracle', 'real-time data', 'sei']
---
-Pyth Network is a first-party oracle solution that provides high-fidelity, low-latency financial market data on-chain. Unlike traditional push-based oracles, Pyth uses a unique "pull" model where applications retrieve signed price updates on-demand, significantly reducing gas costs while maintaining data freshness. With over 400+ price feeds across cryptocurrencies, equities, FX, and commodities, Pyth aggregates data directly from 120+ institutional data publishers including major exchanges and trading firms.
+Pyth Network is a first-party oracle that delivers high-fidelity, low-latency financial market data on-chain. Unlike traditional push-based oracles, Pyth uses a "pull" model: applications get signed price updates on demand. This significantly reduces gas costs and still keeps the data fresh. Pyth has more than 400 price feeds across cryptocurrencies, equities, FX, and commodities. It aggregates data directly from more than 120 institutional data publishers, including major exchanges and trading firms.
-## What You'll Be Doing in This Guide
+## What you'll be doing in this guide
-In this tutorial, you'll learn how to:
+This tutorial shows you how to:
1. Integrate Pyth Network's pull-based oracle system into your Sei EVM application
-2. Fetch real-time SEI token price data using Pyth's JavaScript SDK
+2. Fetch real-time price data for the SEI token with Pyth's JavaScript SDK
3. Create a smart contract that consumes Pyth price feeds with proper price update mechanisms
4. Understand Pyth's on-demand architecture and implement efficient price fetching strategies
-By the end of this guide, you'll have a working demo that can fetch and utilize Sei price data from Pyth Network's oracle system with proper on-chain verification.
+By the end of this guide, you will have a working demo. It can fetch and use SEI price data from Pyth Network's oracle system, with proper on-chain verification.
## Prerequisites
-Before starting this tutorial, ensure you have:
+Before you start this tutorial, make sure that you have:
-### Technical Requirements
+### Technical requirements
-- **Solidity Knowledge**: Basic understanding of Solidity smart contract development
-- **JavaScript/Node.js**: For off-chain price data fetching using Pyth EVM SDK
-- **Development Environment**: Remix IDE, Hardhat, Foundry, or similar Solidity development setup
-- **Sei Network Access**: RPC endpoint and familiarity with Sei's EVM environment
+- **Solidity knowledge**: A basic understanding of smart contract development in Solidity
+- **JavaScript and Node.js**: To fetch price data off-chain with the Pyth EVM SDK
+- **Development environment**: Remix IDE, Hardhat, Foundry, or a similar Solidity development setup
+- **Sei network access**: An RPC endpoint and familiarity with the Sei EVM environment
-### Required Dependencies
+### Required dependencies
- Pyth EVM JavaScript SDK (`@pythnetwork/pyth-evm-js`)
- Pyth Solidity SDK (`@pythnetwork/pyth-sdk-solidity`)
@@ -45,28 +45,28 @@ yarn add @pythnetwork/pyth-evm-js @pythnetwork/pyth-sdk-solidity
pnpm add @pythnetwork/pyth-evm-js @pythnetwork/pyth-sdk-solidity
```
-### Sei Network Configuration
+### Sei network configuration
-Make sure your development environment is configured for Sei:
+Make sure that your development environment is configured for Sei:
- **Mainnet RPC**: `https://evm-rpc.sei-apis.com`
-- **Chain ID**: 1329 (mainnet)
+- **Chain ID**: 1329 (Sei Mainnet)
- **Testnet RPC**: `https://evm-rpc-testnet.sei-apis.com`
-- **Testnet Chain ID**: 1328 (testnet)
+- **Testnet chain ID**: 1328 (Sei Testnet)
-## Pyth Architecture Overview
+## Pyth architecture overview
Pyth's pull-based oracle model consists of:
1. **Publishers**: 120+ institutional data providers that sign and submit price data to Pythnet
-2. **Pythnet**: Dedicated blockchain that aggregates publisher data using a stake-weighted algorithm
-3. **Hermes**: Off-chain price service that provides signed price update messages
-4. **Target Chains**: EVM networks (like Sei) where applications consume price data on-demand
-5. **Price Update Mechanism**: Users submit price update data alongside their transactions
+2. **Pythnet**: A dedicated blockchain that aggregates publisher data with a stake-weighted algorithm
+3. **Hermes**: An off-chain price service that supplies signed price update messages
+4. **Target chains**: EVM networks (such as Sei) where applications consume price data on demand
+5. **Price update mechanism**: Users submit price update data alongside their transactions
-## Steps to Integrate Pyth Price Feeds
+## Steps to integrate Pyth price feeds
-### Step 1: Smart Contract Integration
+### Step 1: Smart contract integration
Create a smart contract that integrates with Pyth's on-chain price feeds:
@@ -139,15 +139,15 @@ contract SeiPythPriceDemo {
}
```
-You can fetch Price Feeds at [docs](https://docs.pyth.network/price-feeds/core/price-feeds/price-feed-ids?search=sei&pageSize=50).
+You can find price feeds in the [Pyth docs](https://docs.pyth.network/price-feeds/core/price-feeds/price-feed-ids?search=sei&pageSize=50).
-Deploy the contract using [Remix](https://remix.ethereum.org/) with the constructor arguments set to the Pyth contract address on Sei:
+Deploy the contract with [Remix](https://remix.ethereum.org/). Set the constructor arguments to the Pyth contract address on Sei:
-- **Sei Mainnet/Testnet Pyth Contract**: [0x2880aB155794e7179c9eE2e38200202908C17B43](https://docs.pyth.network/price-feeds/core/contract-addresses/evm)
+- **Pyth contract on Sei Mainnet and Sei Testnet**: [0x2880aB155794e7179c9eE2e38200202908C17B43](https://docs.pyth.network/price-feeds/core/contract-addresses/evm)
-### Step 2: JavaScript Integration for Price Updates
+### Step 2: JavaScript integration for price updates
-Create a module to fetch price updates directly from Pyth's Hermes API and interact with your deployed contract:
+Create a module that fetches price updates directly from Pyth's Hermes API and interacts with your deployed contract:
```javascript
const ethers = require('ethers');
@@ -308,9 +308,9 @@ if (require.main === module) {
}
```
-### Step 3: Complete Integration Example
+### Step 3: Complete integration example
-Here's a simple usage example that puts it all together:
+This simple example combines all the parts:
```javascript
// demo.js - Simple demonstration script
@@ -330,9 +330,9 @@ demonstrateSeiPriceIntegration()
});
```
-### Expected Output
+### Expected output
-When you run the integration, you should see output similar to:
+When you run the integration, you should see output similar to this:
```
🚀 Starting SEI-Pyth integration demo...
@@ -395,31 +395,31 @@ Querying updated price with 120 second time limit...
- Final SEI Price: $0.132869
```
-### Data Structure Details
+### Data structure details
-Pyth price data includes several important fields:
+Pyth price data includes these fields:
- **price**: The asset price (scaled by `expo`)
-- **conf**: Confidence interval (±range around the price)
-- **expo**: The exponent for scaling the price (e.g., -6 means divide by 1,000,000)
-- **publishTime**: Unix timestamp when the price was last updated
+- **conf**: The confidence interval (the ± range around the price)
+- **expo**: The exponent that scales the price (for example, -6 means divide by 1,000,000)
+- **publishTime**: The Unix timestamp of the last price update
-### Fee Structure
+### Fee structure
-- **Update Fee**: Small fee paid in native token (SEI) to submit price update data
-- **Variable Cost**: Fee depends on the number of price feeds being updated
-- **Gas Efficiency**: Pull model is more gas-efficient than traditional push oracles
+- **Update fee**: A small fee, paid in the native token (SEI), to submit price update data
+- **Variable cost**: The fee depends on how many price feeds you update
+- **Gas efficiency**: The pull model is more gas efficient than traditional push oracles
-## Best Practices
+## Best practices
-1. **Price Freshness**: Always check price age before using in critical applications
-2. **Confidence Intervals**: Consider the confidence interval for risk management
-3. **Fee Management**: Monitor update fees and optimize update frequency
-4. **Error Handling**: Implement robust error handling for price update failures
+1. **Price freshness**: Always check the age of a price before you use it in critical applications
+2. **Confidence intervals**: Consider the confidence interval for risk management
+3. **Fee management**: Monitor update fees and optimize the update frequency
+4. **Error handling**: Implement error handling for failed price updates
## Resources
-- [Pyth Network Documentation](https://docs.pyth.network/)
-- [Pyth Price Feed IDs](https://docs.pyth.network/price-feeds/core/price-feeds/price-feed-ids?search=sei&pageSize=50)
-- [Pyth EVM SDK GitHub](https://github.com/pyth-network/pyth-crosschain)
-- [Hermes Price Service API](https://api-reference.pyth.network/price-feeds/evm)
+- [Pyth Network documentation](https://docs.pyth.network/)
+- [Pyth price feed IDs](https://docs.pyth.network/price-feeds/core/price-feeds/price-feed-ids?search=sei&pageSize=50)
+- [Pyth EVM SDK on GitHub](https://github.com/pyth-network/pyth-crosschain)
+- [Hermes price service API](https://api-reference.pyth.network/price-feeds/evm)
diff --git a/evm/oracles/redstone.mdx b/evm/oracles/redstone.mdx
index 0121a75..e44889a 100644
--- a/evm/oracles/redstone.mdx
+++ b/evm/oracles/redstone.mdx
@@ -4,31 +4,31 @@ sidebarTitle: 'Redstone'
description: 'Complete guide to integrating RedStone oracles with Sei'
keywords: ['redstone', 'oracle', 'data on-demand', 'price feeds', 'modular oracle', 'sei']
---
-RedStone is a modular oracle network that provides real-time data feeds to smart contracts through a unique approach called "data-on-demand". Instead of constantly pushing data to the blockchain, RedStone delivers signed data packages directly to smart contracts at the time of transaction execution. This architecture significantly reduces gas costs while maintaining high data freshness and reliability.
+RedStone is a modular oracle network. It supplies real-time data feeds to smart contracts through an approach called "data-on-demand". RedStone does not push data to the blockchain constantly. Instead, it delivers signed data packages directly to smart contracts when the transaction executes. This architecture significantly reduces gas costs. Data freshness and reliability stay high.
-## What You'll Be Doing in This Guide
+## What you'll be doing in this guide
-In this tutorial, you'll learn how to:
+This tutorial shows you how to:
-1. Integrate RedStone's data feeds into your application on the SEI network
-2. Retrieve real-time SEI token price data using RedStone's SDK and data packages
-3. Understand RedStone's unique "data-on-demand" architecture
-4. Implement fetching and data verification
+1. Integrate RedStone's data feeds into your application on Sei
+2. Get real-time price data for the SEI token with RedStone's SDK and data packages
+3. Understand RedStone's "data-on-demand" architecture
+4. Implement data fetching and verification
-By the end of this guide, you'll have a working demo that can fetch SEI price data from RedStone's oracle network using their data package system.
+By the end of this guide, you will have a working demo. It can fetch SEI price data from RedStone's oracle network with the RedStone data package system.
## Prerequisites
-Before starting this tutorial, ensure you have:
+Before you start this tutorial, make sure that you have:
-### Technical Requirements
+### Technical requirements
-- **Solidity Knowledge**: Basic understanding of Solidity smart contract development
-- **JavaScript/Node.js**: For off-chain data fetching using RedStone SDK
-- **Development Environment**: Remix IDE, Hardhat, or similar Solidity development setup
-- **SEI Network Access**: RPC endpoint and mainnet access for SEI
+- **Solidity knowledge**: A basic understanding of smart contract development in Solidity
+- **JavaScript and Node.js**: To fetch data off-chain with the RedStone SDK
+- **Development environment**: Remix IDE, Hardhat, or a similar Solidity development setup
+- **Sei network access**: An RPC endpoint and access to Sei Mainnet
-### Required Dependencies
+### Required dependencies
- RedStone SDK (`@redstone-finance/sdk`)
- RedStone EVM Connector (`@redstone-finance/evm-connector`)
@@ -46,25 +46,25 @@ yarn add @redstone-finance/sdk @redstone-finance/evm-connector
pnpm add @redstone-finance/sdk @redstone-finance/evm-connector
```
-### SEI Network Configuration
+### Sei network configuration
-Make sure your development environment is configured for SEI:
+Make sure that your development environment is configured for Sei:
- **Mainnet RPC**: `https://evm-rpc.sei-apis.com`
-- **Chain ID**: 1329 (mainnet)
+- **Chain ID**: 1329 (Sei Mainnet)
-## RedStone Architecture Overview
+## RedStone architecture overview
-RedStone uses a unique "data-on-demand" model:
+RedStone uses a "data-on-demand" model:
-1. **Data Providers**: Collect data from multiple sources and sign data packages
-2. **Data Packages**: Signed data structures containing price information and metadata
-3. **Gateway Network**: Distributes data packages to consumers
-4. **Smart Contracts**: Verify signatures and extract data on-chain
+1. **Data providers**: Collect data from multiple sources and sign data packages
+2. **Data packages**: Signed data structures that contain price information and metadata
+3. **Gateway network**: Distributes data packages to consumers
+4. **Smart contracts**: Verify signatures and extract data on-chain
-## Steps to Fetch SEI Price Data
+## Steps to fetch SEI price data
-Let's implement the JavaScript code to fetch SEI price data using RedStone's SDK:
+This JavaScript code fetches SEI price data with RedStone's SDK:
```javascript
import { requestDataPackages, getSignersForDataServiceId } from '@redstone-finance/sdk';
@@ -129,16 +129,16 @@ fetchSEIPrice()
});
```
-### Data Package Structure
+### Data package structure
A RedStone data package contains:
-- **dataPoints**: Array of price data points
+- **dataPoints**: An array of price data points
- **timestampMilliseconds**: When the data was signed
-- **signature**: Cryptographic signature from the data provider
-- **dataPackageId**: Identifier for the specific data feed (e.g., "SEI")
+- **signature**: The cryptographic signature from the data provider
+- **dataPackageId**: The identifier of the specific data feed (for example, "SEI")
## Resources
-- [RedStone Documentation](https://docs.redstone.finance/)
-- [RedStone GitHub Repository](https://github.com/redstone-finance)
+- [RedStone documentation](https://docs.redstone.finance/)
+- [RedStone GitHub repository](https://github.com/redstone-finance)
diff --git a/evm/precompiles/cosmwasm-precompiles/addr.mdx b/evm/precompiles/cosmwasm-precompiles/addr.mdx
index c547dd9..13ba17b 100644
--- a/evm/precompiles/cosmwasm-precompiles/addr.mdx
+++ b/evm/precompiles/cosmwasm-precompiles/addr.mdx
@@ -6,40 +6,40 @@ keywords: ['addr precompile', 'address association', 'ethers.js', 'cross-chain',
---
**Address:** `0x0000000000000000000000000000000000001004`
-The Sei Address precompile allows EVM applications to interact directly with Sei's address association system through standard smart contract calls. This enables querying and creating mappings between EVM addresses and their corresponding Cosmos addresses, enabling seamless cross-chain address management without needing separate Cosmos SDK integration.
+The Sei Address precompile lets EVM applications interact directly with Sei's address association system through standard smart contract calls. You can use it to query and create mappings between EVM addresses and their corresponding Cosmos addresses. You get cross-chain address management without a separate Cosmos SDK integration.
- **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.
+ **What is a precompile?** A precompile is a special smart contract that the Sei protocol itself deploys at a fixed address. It exposes custom native chain logic to EVM-based applications. To the EVM, it behaves like a regular contract, but it executes privileged, low-level logic efficiently.
-## How Does the Address Precompile Work?
+## How does the Address precompile work?
-The Address precompile at address `0x0000000000000000000000000000000000001004` exposes functions like `associate()`, `associatePubKey()`, `getSeiAddr()`, and `getEvmAddr()`.
+The Address precompile at address `0x0000000000000000000000000000000000001004` exposes functions such as `associate()`, `associatePubKey()`, `getSeiAddr()`, and `getEvmAddr()`.
-- **Direct Integration:** EVM contracts and dApps can call address association functions like any other smart contract method.
-- **Native Execution:** Operations are executed at the Cosmos SDK level for maximum efficiency and security.
-- **Seamless Bridge:** No need for separate wallet integrations or complex cross-chain interactions.
+- EVM contracts and dApps can call address association functions directly, like any other smart contract method.
+- Operations run natively at the Cosmos SDK level for efficiency and security.
+- You do not need separate wallet integrations or complex cross-chain interactions.
-## Use Cases
+## Use cases
-- **Cross-Chain Identity:** Link EVM and Cosmos addresses for unified user experiences across both execution environments.
-- **Address Resolution:** Build applications that can seamlessly work with both EVM and Cosmos address formats.
-- **Wallet Integration:** Enable users to associate their addresses once and use both EVM and native Sei functionality.
-- **DeFi Applications:** Create protocols that can interact with users regardless of their preferred address format.
+- **Cross-chain identity:** Link EVM and Cosmos addresses for a unified user experience across both execution environments.
+- **Address resolution:** Build applications that can work with both EVM and Cosmos address formats.
+- **Wallet integration:** Let users associate their addresses once and then use both EVM and native Sei functionality.
+- **DeFi applications:** Create protocols that can interact with users regardless of their preferred address format.
-## What You'll Learn in This Guide
+## What you'll learn in this guide
-By the end of this guide, you'll be able to:
+After you finish this guide, you can:
-- **Integrate Address Operations** - Call association and lookup functions directly from your EVM contracts and dApps
-- **Handle Signature Verification** - Master the signature format requirements for secure address association
-- **Manage Address Mappings** - Query and validate address relationships between EVM and Cosmos formats
-- **Build Cross-Chain Tools** - Implement unified address management for applications spanning both execution environments
-- **Navigate Association Requirements** - Understand when and how address association occurs automatically vs. manually
+- Call association and lookup functions directly from your EVM contracts and dApps.
+- Handle signature verification and the signature format requirements for secure address association.
+- Query and validate address mappings between EVM and Cosmos formats.
+- Build cross-chain tools with unified address management for applications that span both execution environments.
+- Understand when and how address association happens automatically or manually.
## Functions
-The Address precompile exposes the following functions:
+The Address precompile exposes these functions:
-### Transaction Functions
+### Transaction functions
```solidity
/// Associates an account given it's signature of any custom message.
@@ -65,7 +65,7 @@ function associatePubKey(
) external returns (string memory seiAddr, address evmAddr);
```
-### Query Functions
+### Query functions
```solidity
/// Queries the corresponding Sei Address for some EVM address.
@@ -83,23 +83,23 @@ function getEvmAddr(
) external view returns (address response);
```
-## Using the Precompile
+## Using the precompile
### Setup
#### Prerequisites
-Before getting started, ensure you have:
+Before you start, make sure that you have:
-- **Node.js** (v18 or higher)
-- **npm** or **yarn** package manager
-- **EVM-compatible wallet**
-- **SEI tokens** for gas
-- **Hardhat** development environment set up
+- Node.js (v18 or higher)
+- The npm or yarn package manager
+- An EVM-compatible wallet
+- SEI tokens for gas
+- A Hardhat development environment set up
-#### Install Dependencies
+#### Install dependencies
-Install the required packages for interacting with Sei precompiles:
+Install the required packages to interact with Sei precompiles:
```bash
# Initiate a Hardhat 3 project (choose "Hardhat 3" and the Mocha + Ethers.js TypeScript setup)
@@ -112,9 +112,9 @@ npm install ethers
npm install @sei-js/precompiles@^3
```
-#### Setup Hardhat Environment
+#### Setup Hardhat environment
-Create a `hardhat.config.ts` file with the following content:
+Create a `hardhat.config.ts` file with this content:
```typescript
import { defineConfig, configVariable } from 'hardhat/config';
@@ -134,13 +134,13 @@ export default defineConfig({
});
```
-Store your private key in Hardhat's encrypted keystore (no plaintext `.env` file needed):
+Store your private key in Hardhat's encrypted keystore, so that you do not need a plaintext `.env` file:
```bash
npx hardhat keystore set PRIVATE_KEY
```
-#### Import Precompile Components
+#### Import precompile components
@@ -179,9 +179,9 @@ function getEvmAddr(string memory addr) external view returns (address response)
- **Precompile Address:** The address precompile is deployed at `0x0000000000000000000000000000000000001004`
+ **Precompile address:** The Address precompile is deployed at `0x0000000000000000000000000000000000001004`.
-### Contract Initialization
+### Contract initialization
@@ -208,9 +208,9 @@ contract CrossChainAddressManager {
-#### When Does Association Happen?
+#### When does association happen?
-Address association between EVM and Cosmos addresses occurs automatically in most cases:
+In most cases, the association between EVM and Cosmos addresses happens automatically:
| Method | Trigger | Requirements |
| --- | --- | --- |
@@ -219,36 +219,36 @@ Address association between EVM and Cosmos addresses occurs automatically in mos
| **Manual (PubKey)** | associatePubKey() function | Compressed public key |
-### How Association Works
+### How association works
-**Automatic Association:**
+**Automatic association:**
-- Occurs when a wallet first signs and broadcasts any transaction on Sei
-- No additional steps required for most users
-- Association is permanent once created
+- The association happens when a wallet first signs and broadcasts any transaction on Sei.
+- Most users do not need to take any other steps.
+- The association is permanent after it is created.
-**Manual Association:**
+**Manual association:**
-- Use `associate()` for signature-based association
-- Use `associatePubKey()` for public key-based association
-- Useful for advanced applications or when automatic association hasn't occurred
+- Use `associate()` for signature-based association.
+- Use `associatePubKey()` for public-key-based association.
+- Manual association is useful for advanced applications, or when automatic association has not happened.
-### Address Format Requirements
+### Address format requirements
-**EVM Addresses:**
+**EVM addresses:**
- Standard Ethereum format: `0x1234...` (20 bytes, 40 hex characters)
-- Case-insensitive but typically lowercase
+- Case-insensitive, but typically lowercase
-**Sei Addresses:**
+**Sei addresses:**
-- Cosmos format with `sei1...` prefix for regular addresses
-- Validator addresses use `seivaloper1...` prefix
+- Cosmos format, with the `sei1...` prefix for regular addresses
+- Validator addresses use the `seivaloper1...` prefix
- Bech32 encoding format
-## Step-by-Step Guide: Using the Address Precompile
+## Step-by-step guide: Using the Address precompile
-### Associate Address with Signature
+### Associate address with signature
@@ -309,7 +309,7 @@ contract AddressManager {
-### Associate Address with Public Key
+### Associate address with public key
@@ -352,7 +352,7 @@ contract AddressManager {
-### Query Sei Address from EVM Address
+### Query Sei address from EVM address
@@ -398,7 +398,7 @@ contract AddressManager {
-### Query EVM Address from Sei Address
+### Query EVM address from Sei address
@@ -444,7 +444,7 @@ contract AddressManager {
-### Complete Integration Example
+### Complete integration example
@@ -511,7 +511,7 @@ async function addrExample() {
-**Contract Example**
+**Contract example**
```solidity
// SPDX-License-Identifier: MIT
@@ -606,7 +606,7 @@ contract CrossChainAddressManager {
}
```
-**Client Integration Example**
+**Client integration example**
Deploy the contract:
@@ -695,24 +695,24 @@ npx hardhat run scripts/interact.js --network sei
-## Security Considerations & Risks
+## Security considerations & risks
-### Association Permanence
+### Association permanence
-- **Permanent Mapping:** Once addresses are associated, the mapping cannot be changed or removed
-- **Single Association:** Each address can only be associated with one counterpart
-- **Verification:** Always verify associations before depending on them in critical operations
+- **Permanent mapping:** After addresses are associated, the mapping cannot be changed or removed.
+- **Single association:** Each address can be associated with only one counterpart.
+- **Verification:** Always verify associations before you depend on them in critical operations.
-### Signature Security
+### Signature security
-- **Custom Messages:** Use unique, timestamped messages to prevent replay attacks
-- **Message Format:** Follow exact Ethereum Signed Message format for compatibility
+- **Custom messages:** Use unique, timestamped messages to prevent replay attacks.
+- **Message format:** Follow the exact Ethereum Signed Message format for compatibility.
## Troubleshooting
-### Common Issues and Solutions
+### Common issues and solutions
-#### Gas-Related Issues
+#### Gas-related issues
```typescript
// Set appropriate gas limits for different operations
@@ -725,43 +725,43 @@ const pubKeyTx = await addr.associatePubKey(pubKeyHex, {
});
```
-### Error Code Reference
+### Error code reference
| Error | Cause | Solution |
| --- | --- | --- |
-| `invalid signature` | Malformed v, r, s components | Verify signature parsing and format |
-| `already associated` | Address already has association | Check existing association instead |
-| `not found` | No association exists | Create association first |
-| `invalid public key` | Malformed public key format | Use compressed format without 0x prefix |
-| `invalid address format` | Wrong address format | Use proper EVM (0x...) or Sei (sei1...) format |
+| `invalid signature` | Malformed v, r, s components | Verify the signature parsing and format |
+| `already associated` | The address already has an association | Check the existing association instead |
+| `not found` | No association exists | Create an association first |
+| `invalid public key` | Malformed public key format | Use the compressed format without the 0x prefix |
+| `invalid address format` | Wrong address format | Use the correct EVM (0x...) or Sei (sei1...) format |
-## Important Notes
+## Important notes
- Remember: Address associations are permanent and cannot be changed once created!
+ Address associations are permanent and cannot be changed after they are created.
-### Address Formats
+### Address formats
-- **EVM Addresses:** Use standard Ethereum format with `0x` prefix
-- **Sei Addresses:** Use Cosmos format with `sei1` prefix for regular addresses
-- **Case Sensitivity:** EVM addresses are case-insensitive, Sei addresses are case-sensitive
+- **EVM addresses:** Use the standard Ethereum format with the `0x` prefix.
+- **Sei addresses:** Use the Cosmos format with the `sei1` prefix for regular addresses.
+- **Case sensitivity:** EVM addresses are case-insensitive. Sei addresses are case-sensitive.
-### Association Timing
+### Association timing
-- **Automatic:** Most users get associated automatically on their first transaction
-- **Manual:** Use precompile functions for programmatic association or when automatic association hasn't occurred
-- **Verification:** Always verify associations exist before depending on them
+- **Automatic:** For most users, association happens automatically on their first transaction.
+- **Manual:** Use the precompile functions for programmatic association, or when automatic association has not happened.
+- **Verification:** Always verify that associations exist before you depend on them.
-### Signature Requirements
+### Signature requirements
-- **Message Format:** Must include Ethereum Signed Message prefix for `associate()` function
-- **Component Format:** v, r, s must be properly formatted hex strings
-- **Replay Protection:** Use unique messages to prevent signature replay attacks
+- **Message format:** For the `associate()` function, the message must include the Ethereum Signed Message prefix.
+- **Component format:** v, r, and s must be correctly formatted hex strings.
+- **Replay protection:** Use unique messages to prevent signature replay attacks.
-### Gas Considerations
+### Gas considerations
-- **Association operations:** ~200,000 gas limit recommended
-- **Query operations:** Standard view function gas usage
-- **Batch operations:** Scale gas limits based on array size
+- **Association operations:** Use a gas limit of approximately 200,000.
+- **Query operations:** These use the standard gas for a view function.
+- **Batch operations:** Scale gas limits based on the array size.
-View the Address precompile source code and the contract ABI [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/addr).
+View the [Address precompile source code and contract ABI](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/addr).
diff --git a/evm/precompiles/cosmwasm-precompiles/bank.mdx b/evm/precompiles/cosmwasm-precompiles/bank.mdx
index 957113d..931ac12 100644
--- a/evm/precompiles/cosmwasm-precompiles/bank.mdx
+++ b/evm/precompiles/cosmwasm-precompiles/bank.mdx
@@ -8,10 +8,10 @@ keywords: ['bank precompile', 'native sei', 'ethers.js', 'balance query', 'sei d
**Address:** `0x0000000000000000000000000000000000001001`
-This page covers native SEI (`usei`) only. Do not use the Bank precompile as an IBC or tokenfactory integration path. IBC is disabled in both directions, and tokenfactory is not supported for new development. See [IBC is disabled](/learn/sip-03-migration#ibc-is-disabled) and [Tokenfactory is not supported](/cosmos-sdk#tokenfactory-is-not-supported).
+Do not use the Bank precompile as an IBC or tokenfactory integration path. This page covers native SEI (`usei`) only. IBC is disabled in both directions. Tokenfactory is not supported for new development. See [IBC is disabled](/learn/sip-03-migration#ibc-is-disabled) and [Tokenfactory is not supported](/cosmos-sdk#tokenfactory-is-not-supported).
-The Bank precompile exposes the Bank Module balance for native SEI and lets an EVM caller send SEI to a native `sei1...` address.
+The Bank precompile exposes the Bank Module balance for native SEI. It also lets an EVM caller send SEI to a native `sei1...` address.
## Functions
@@ -135,4 +135,4 @@ contract NativeSeiSender {
}
```
-Validate the recipient before sending. A successful transaction cannot be reversed.
+Validate the recipient before you send SEI. A successful transaction cannot be reversed.
diff --git a/evm/precompiles/cosmwasm-precompiles/cosmwasm.mdx b/evm/precompiles/cosmwasm-precompiles/cosmwasm.mdx
index 2affbfa..41ce914 100644
--- a/evm/precompiles/cosmwasm-precompiles/cosmwasm.mdx
+++ b/evm/precompiles/cosmwasm-precompiles/cosmwasm.mdx
@@ -7,43 +7,43 @@ keywords: ['cosmwasm precompile', 'ethers.js', 'wasm execution', 'cross-chain co
**Address:** `0x0000000000000000000000000000000000001002`
- **Deprecation Notice — Prop 115**
+ **Deprecation notice (Prop 115)**
- Per [governance Proposal 115](https://seistream.app/proposals/115), CosmWasm code uploads (`MsgStoreCode`) and contract instantiations (`MsgInstantiateContract`) are disabled chain-wide. The `instantiate()` function on this precompile **will revert** for all callers. Only `execute()`, `execute_batch()`, and `query()` against pre-existing CosmWasm contracts remain functional, and all CosmWasm functionality is deprecated in favor of EVM-only per [SIP-3](https://github.com/sei-protocol/sips/blob/main/sips/sip-3.md).
+ Under [governance Proposal 115](https://seistream.app/proposals/115), CosmWasm code uploads (`MsgStoreCode`) and contract instantiations (`MsgInstantiateContract`) are disabled chain-wide. The `instantiate()` function on this precompile **reverts** for all callers. Only calls to `execute()`, `execute_batch()`, and `query()` against pre-existing CosmWasm contracts still work. All CosmWasm functionality is deprecated in favor of EVM-only under [SIP-3](https://github.com/sei-protocol/sips/blob/main/sips/sip-3.md).
- The examples on this page attach only native SEI. Do not use the `coins` field to build IBC or tokenfactory integrations. IBC is disabled in both directions, and tokenfactory is not a supported development path.
+ The examples on this page attach only native SEI. Do not use the `coins` field to build IBC or tokenfactory integrations. IBC is disabled in both directions. Tokenfactory is not a supported development path.
For new smart contract development, use the EVM directly. See [Deploy a Smart Contract](/evm/evm-general).
-The Sei CosmWasm precompile allows EVM applications to interact directly with **pre-existing** CosmWasm contracts through standard smart contract calls. This enables execution, batch operations, and querying of CosmWasm contracts directly from your dApps without needing separate Cosmos SDK integration.
+The Sei CosmWasm precompile lets EVM applications interact directly with **pre-existing** CosmWasm contracts through standard smart contract calls. You can call CosmWasm contracts directly from your dApps for execution, batch operations, and queries. You do not need a separate Cosmos SDK integration.
- **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.
+ **What is a precompile?** A precompile is a special smart contract that the Sei protocol itself deploys at a fixed address. It exposes custom native chain logic to EVM-based applications. To the EVM, it behaves like a regular contract, but it executes privileged, low-level logic efficiently.
-## How Does the CosmWasm Precompile Work?
+## How does the CosmWasm precompile work?
-The CosmWasm precompile at address `0x0000000000000000000000000000000000001002` exposes functions like `execute()`, `execute_batch()`, and `query()`.
+The CosmWasm precompile at address `0x0000000000000000000000000000000000001002` exposes functions such as `execute()`, `execute_batch()`, and `query()`.
-- **Direct Integration:** EVM contracts and dApps can call CosmWasm functions like any other smart contract method.
-- **Native Execution:** Operations are executed at the Cosmos SDK level for maximum efficiency and security.
-- **Seamless Bridge:** No need for separate wallet integrations or complex cross-chain interactions.
+- EVM contracts and dApps can call CosmWasm functions directly, like any other smart contract method.
+- Operations run natively at the Cosmos SDK level for efficiency and security.
+- You do not need separate wallet integrations or complex cross-chain interactions.
-## What You'll Learn in This Guide
+## What you'll learn in this guide
-By the end of this guide, you'll be able to:
+After you finish this guide, you can:
-- **Execute Contract Functions** - Call CosmWasm contract methods and handle message formatting
-- **Batch Operations** - Execute multiple contract calls efficiently in a single transaction
-- **Query Contract State** - Read CosmWasm contract data without gas costs
-- **Handle Cross-Runtime Data** - Master message encoding/decoding between EVM and CosmWasm formats
+- Call CosmWasm contract functions and handle message formatting.
+- Run batch operations that execute multiple contract calls efficiently in a single transaction.
+- Query contract state to read CosmWasm contract data without gas costs.
+- Handle cross-runtime data by encoding and decoding messages between EVM and CosmWasm formats.
## Functions
-The CosmWasm precompile exposes the following functions:
+The CosmWasm precompile exposes these functions:
-### Transaction Functions
+### Transaction functions
-The `instantiate()` function has been disabled by [Prop 115](https://seistream.app/proposals/115) and will revert. It is omitted from this reference. The ABI in `@sei-js/precompiles` may still expose it for backwards compatibility, but calling it on-chain will fail.
+[Prop 115](https://seistream.app/proposals/115) disabled the `instantiate()` function, so calls to it revert. This reference omits it. The ABI in `@sei-js/precompiles` may still expose it for backward compatibility, but on-chain calls to it fail.
```solidity
/// Executes some message on a CosmWasm contract.
@@ -71,7 +71,7 @@ function execute_batch(
) payable external returns (bytes[] memory responses);
```
-### Query Functions
+### Query functions
```solidity
/// Queries a CosmWasm contract.
@@ -84,22 +84,22 @@ function query(
) external view returns (bytes memory response);
```
-## Using the Precompile
+## Using the precompile
### Setup
#### Prerequisites
-Before getting started, ensure you have:
+Before you start, make sure that you have:
-- **Node.js** (v18 or higher)
-- **npm** or **yarn** package manager
-- **EVM-compatible wallet**
-- **SEI tokens** for gas and contract operations
+- Node.js (v18 or higher)
+- The npm or yarn package manager
+- An EVM-compatible wallet
+- SEI tokens for gas and contract operations
-#### Install Dependencies
+#### Install dependencies
-Install the required packages for interacting with Sei precompiles:
+Install the required packages to interact with Sei precompiles:
```bash
# Install ethers.js for smart contract interactions
@@ -109,7 +109,7 @@ npm install ethers
npm install @sei-js/precompiles@^3
```
-#### Import Precompile Components
+#### Import precompile components
```typescript
// Import CosmWasm precompile address and ABI
@@ -118,9 +118,9 @@ import { WASM_PRECOMPILE_ABI, WASM_PRECOMPILE_ADDRESS } from '@sei-js/precompile
import { ethers } from 'ethers';
```
- **Precompile Address:** The CosmWasm precompile is deployed at `0x0000000000000000000000000000000000001002`
+ **Precompile address:** The CosmWasm precompile is deployed at `0x0000000000000000000000000000000000001002`.
-### Contract Initialization
+### Contract initialization
Set up your provider, signer, and contract instance:
@@ -134,35 +134,33 @@ const signer = await provider.getSigner();
const cosmwasm = new ethers.Contract(WASM_PRECOMPILE_ADDRESS, WASM_PRECOMPILE_ABI, signer);
```
-## Critical: Understanding Message Formats
+## Critical: Understanding message formats
-One of the most important concepts to understand when working with the Sei CosmWasm precompile:
+### CosmWasm message structure
-### CosmWasm Message Structure
+The CosmWasm precompile requires JSON-encoded messages that match each contract's own schema:
-The CosmWasm precompile requires **JSON-encoded messages** that conform to each contract's specific schema:
-
-| Function | Input/Output | Format Type | Example |
+| Function | Input/Output | Format type | Example |
| --- | --- | --- | --- |
| `execute()` | msg parameter (input) | JSON bytes | `ethers.toUtf8Bytes(jsonString)` |
| `query()` | req parameter (input) | JSON bytes | `ethers.toUtf8Bytes(jsonString)` |
| **All functions** | response (output) | JSON bytes | `JSON.parse(ethers.toUtf8String(response))` |
-### How Message Encoding Works
+### How message encoding works
**All CosmWasm functions require JSON-encoded byte arrays:**
-- `execute()` - accepts execution message as JSON bytes
-- `query()` - accepts query message as JSON bytes
+- `execute()`: accepts the execution message as JSON bytes
+- `query()`: accepts the query message as JSON bytes
**Native SEI handling:**
- Use `msg.value` for SEI amounts
- Pass an empty JSON array for `coins` when the call does not require Bank Module funds
-### Best Practice: Message Encoding Helpers
+### Best practice: Message encoding helpers
-When working with CosmWasm messages, use proper JSON encoding:
+When you work with CosmWasm messages, use correct JSON encoding:
```typescript
// Helper functions for message encoding
@@ -197,7 +195,7 @@ const queryMsg = CosmWasmMessageEncoder.encodeQueryMsg({
});
```
-## Message Format Helpers
+## Message format helpers
Use these helper functions to handle CosmWasm message formatting:
@@ -242,9 +240,9 @@ const executeMsg = CosmWasmHelper.createExecuteMsg({
const coins = CosmWasmHelper.emptyCoins();
```
-## Step-by-Step Guide: Using the CosmWasm Precompile
+## Step-by-step guide: Using the CosmWasm precompile
-### Execute a CosmWasm Contract
+### Execute a CosmWasm contract
@@ -302,7 +300,7 @@ contract CosmWasmExecutor {
-### Execute Batch Operations
+### Execute batch operations
@@ -373,7 +371,7 @@ contract BatchExecutor {
-### Query a CosmWasm Contract
+### Query a CosmWasm contract
@@ -440,11 +438,11 @@ contract CosmWasmQuery {
- **Query Limitations:** CosmWasm queries are read-only operations and don't consume gas, but parsing JSON responses in Solidity is complex. Consider handling response parsing off-chain.
+ **Query limitations:** Consider parsing responses off-chain. CosmWasm queries are read-only operations and do not consume gas. However, parsing JSON responses in Solidity is complex.
-## Advanced Usage Examples
+## Advanced usage examples
-### Cross-Runtime DeFi Integration
+### Cross-runtime DeFi integration
```typescript
async function crossRuntimeDeFiOperation(cosmwasmDexContract: string, evmTokenContract: string, amount: string) {
@@ -483,7 +481,7 @@ async function crossRuntimeDeFiOperation(cosmwasmDexContract: string, evmTokenCo
}
```
-### Complete Integration Example
+### Complete integration example
@@ -574,7 +572,7 @@ async function cosmwasmExample() {
-**Contract Example**
+**Contract example**
```solidity
// SPDX-License-Identifier: MIT
@@ -662,9 +660,9 @@ contract CosmWasmBridge {
}
```
- **Note:** This contract acts as a bridge between EVM and existing CosmWasm contracts. Message encoding/decoding should be handled client-side for complex operations.
+ This contract is a bridge between the EVM and existing CosmWasm contracts. For complex operations, handle message encoding and decoding client-side.
-**Client Integration Example**
+**Client integration example**
```javascript
import { network } from 'hardhat';
@@ -721,9 +719,9 @@ main().catch((error) => {
## Troubleshooting
-### Common Issues and Solutions
+### Common issues and solutions
-#### Message Encoding Issues
+#### Message encoding issues
```typescript
// Ensure proper JSON encoding for messages
@@ -741,46 +739,46 @@ const encodedMsg = ethers.toUtf8Bytes(JSON.stringify(msg));
const incorrectMsg = ethers.toUtf8Bytes('invalid json');
```
-### Error Code Reference
+### Error code reference
| Error | Cause | Solution |
| --- | --- | --- |
-| `invalid json` | Malformed JSON message | Validate JSON before encoding |
-| `contract not found` | Invalid contract address | Verify contract address format |
-| `insufficient funds` | Not enough tokens for operation | Check balance and reduce amount |
-| `execution failed` | Contract execution error | Check contract state and parameters |
+| `invalid json` | Malformed JSON message | Validate the JSON before encoding |
+| `contract not found` | Invalid contract address | Verify the contract address format |
+| `insufficient funds` | Not enough tokens for the operation | Check the balance and reduce the amount |
+| `execution failed` | Contract execution error | Check the contract state and parameters |
| `unauthorized` | Insufficient permissions | Check admin/owner permissions |
-| `query parsing failed` | Invalid query message format | Match contract's query schema |
+| `query parsing failed` | Invalid query message format | Match the contract's query schema |
-## Important Notes
+## Important notes
- Remember the key rule: All CosmWasm messages must be properly JSON-encoded as bytes, and contract schemas vary by implementation!
+ All CosmWasm messages must be correctly JSON-encoded as bytes. Contract schemas vary by implementation.
-### Message Format Requirements
+### Message format requirements
-- **JSON Encoding:** All messages must be valid JSON encoded as UTF-8 bytes, invalid JSON will cause transaction failures
-- **Schema Compliance:** Messages must match the contract's expected format
-- **Type Safety:** Use proper data types as expected by the contract
+- **JSON encoding:** All messages must be valid JSON, encoded as UTF-8 bytes. Invalid JSON causes transaction failures.
+- **Schema compliance:** Messages must match the contract's expected format.
+- **Type safety:** Use the data types that the contract expects.
-### Contract Address Format
+### Contract address format
-- Use valid Sei contract addresses with `sei1...` prefix
-- These are Cosmos-format addresses, not EVM addresses
-- **Contract Existence:** Verify contracts exist before calling
+- Use valid Sei contract addresses with the `sei1...` prefix.
+- These are Cosmos-format addresses, not EVM addresses.
+- **Contract existence:** Verify that contracts exist before you call them.
-### Cross-Runtime Considerations
+### Cross-runtime considerations
-- **State Isolation:** CosmWasm and EVM contracts have separate state
-- **Gas Estimation:** CosmWasm operations may require different gas calculations
-- **Error Handling:** Failed CosmWasm operations revert the entire EVM transaction
-- **Native SEI Handling:** Use `msg.value` for SEI and leave the `coins` list empty
-- **Batch Limitations:** Large batches may hit gas limits
+- **State isolation:** CosmWasm and EVM contracts have separate state.
+- **Gas estimation:** CosmWasm operations may require different gas calculations.
+- **Error handling:** Failed CosmWasm operations revert the entire EVM transaction.
+- **Native SEI handling:** Use `msg.value` for SEI and leave the `coins` list empty.
+- **Batch limitations:** Large batches may reach gas limits.
-### Best Practices
+### Best practices
-- Always validate JSON messages before sending
-- Handle response parsing carefully, especially for complex data structures
-- Use batch operations for multiple related calls to save gas
-- Query contracts before executing to verify state when possible
+- Always validate JSON messages before you send them.
+- Parse responses carefully, especially for complex data structures.
+- Use batch operations for multiple related calls to save gas.
+- When possible, query contracts to verify their state before you execute calls on them.
-View the CosmWasm precompile source code and the contract ABI [here](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/wasmd).
+View the [CosmWasm precompile source code and contract ABI](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/wasmd).
diff --git a/evm/precompiles/cosmwasm-precompiles/example-usage.mdx b/evm/precompiles/cosmwasm-precompiles/example-usage.mdx
index d21cff5..2409fae 100644
--- a/evm/precompiles/cosmwasm-precompiles/example-usage.mdx
+++ b/evm/precompiles/cosmwasm-precompiles/example-usage.mdx
@@ -6,17 +6,16 @@ keywords: ["precompile example", "ethers.js", "cosmwasm query", "evm integration
-Per [Proposal 115](https://seistream.app/proposals/115), no new CosmWasm contracts can be deployed on Sei. The examples below apply to **pre-existing CosmWasm contracts** only. `instantiate()` will revert.
+Under [Proposal 115](https://seistream.app/proposals/115), no new CosmWasm contracts can be deployed on Sei. The examples below apply to **pre-existing CosmWasm contracts** only. Calls to `instantiate()` revert.
-The Sei precompiles can be used like any standard smart contract on the EVM. For
-example, using [ethers.js](https://docs.ethers.org/v6/), you can query and
-execute actions on an existing CosmWasm contract as follows:
+You can use the Sei precompiles like any standard smart contract on the EVM. For
+example, this page uses [ethers.js](https://docs.ethers.org/v6/) to query an
+existing CosmWasm contract and execute actions on it.
## Setup
-To install `ethers`, run the following command in your project directory
-terminal:
+To install `ethers`, run this command in a terminal in your project directory:
```bash
npm install ethers @sei-js/precompiles@^3
@@ -32,7 +31,7 @@ import { WASM_PRECOMPILE_ABI, WASM_PRECOMPILE_ADDRESS } from '@sei-js/precompile
## Using the contract
-Next, we'll set up a provider and contract to interact with the blockchain:
+Next, set up a provider and a contract to interact with Sei:
```typescript
import { ethers, toUtf8Bytes, toUtf8String } from 'ethers';
@@ -45,10 +44,11 @@ const signer = await provider.getSigner();
const contract = new ethers.Contract(WASM_PRECOMPILE_ADDRESS, WASM_PRECOMPILE_ABI, signer);
```
-#### Querying & Executing a CosmWasm Contract
+#### Querying & executing a CosmWasm contract
-Once you have the contract, you can query and execute messages to any CosmWasm
-smart contract. In the below example we assume there is a counter contract with a `get_count` function
+When you have the contract instance, you can send query and execute messages to
+any CosmWasm smart contract. The example below assumes a counter contract with a
+`get_count` function.
```typescript
// Replace with your contract
@@ -75,8 +75,8 @@ console.log(executeResponse);
### Executing a payable function
-In this example, we execute the 'donate' method on our contract. This is similar
-to the `increment` method, but also receives funds from the user and stores it
+This example executes the `donate` method on the same contract. It is similar to
+the `increment` method, but it also receives funds from the user and stores them
in the contract.
```typescript
diff --git a/evm/precompiles/distribution.mdx b/evm/precompiles/distribution.mdx
index 143ae93..360ff67 100644
--- a/evm/precompiles/distribution.mdx
+++ b/evm/precompiles/distribution.mdx
@@ -8,17 +8,17 @@ keywords: ['distribution precompile', 'staking rewards', 'validator commissions'
**Address**: `0x0000000000000000000000000000000000001007`
-The distribution precompile provides EVM access to Cosmos SDK's distribution module. Smart contracts can manage staking rewards, validator commissions, and withdrawal addresses. This precompile is essential for DeFi applications that need to handle staking rewards programmatically.
+The distribution precompile gives EVM access to the Cosmos SDK distribution module. Smart contracts can use it to manage staking rewards, validator commissions, and withdrawal addresses. DeFi dApps that need to handle staking rewards programmatically depend on this precompile.
-## Key Features
+## Key features
-- **Reward Management**: Withdraw delegation rewards from validators
-- **Commission Handling**: Validators can withdraw earned commissions
-- **Batch Operations**: Withdraw from multiple validators efficiently
-- **Flexible Withdrawals**: Set custom withdrawal addresses
-- **Comprehensive Queries**: Access detailed reward information through `rewards(address)`
+- Withdraw delegation rewards from validators.
+- Withdraw earned commission (validators only).
+- Withdraw rewards from multiple validators in one batch call.
+- Set a custom withdrawal address.
+- Query detailed reward information with `rewards(address)`.
-## Interface Overview
+## Interface overview
```solidity
interface IDistr {
@@ -41,13 +41,13 @@ interface IDistr {
## Setup
-Install Ethers.js and the Sei EVM bindings that ship the precompile address and ABI:
+Install ethers and the Sei EVM bindings, which include the precompile address and ABI:
```bash
npm install ethers @sei-js/precompiles@^3
```
-Import both constants wherever you build the contract instance:
+Import both constants where you create the contract instance:
```ts
import { DISTRIBUTION_PRECOMPILE_ABI, DISTRIBUTION_PRECOMPILE_ADDRESS } from '@sei-js/precompiles';
@@ -55,7 +55,7 @@ import { DISTRIBUTION_PRECOMPILE_ABI, DISTRIBUTION_PRECOMPILE_ADDRESS } from '@s
## Events
-The distribution precompile emits events for all state-changing operations, allowing off-chain services to track reward distributions and configuration changes.
+The distribution precompile emits events for all state-changing operations. Off-chain services can use these events to track reward distributions and configuration changes.
### WithdrawAddressSet
@@ -67,8 +67,8 @@ event WithdrawAddressSet(address indexed delegator, address withdrawAddr);
**Parameters:**
-- `delegator` (indexed): The EVM address of the delegator changing their settings
-- `withdrawAddr`: The new address where rewards will be sent
+- `delegator` (indexed): The EVM address of the delegator who changes the setting
+- `withdrawAddr`: The new address that receives the rewards
**Example usage:**
@@ -89,9 +89,9 @@ event DelegationRewardsWithdrawn(address indexed delegator, string validator, ui
**Parameters:**
-- `delegator` (indexed): The EVM address of the delegator withdrawing rewards
-- `validator`: The Sei validator address (e.g., "seivaloper1...")
-- `amount`: The amount of rewards withdrawn (in usei, 6 decimal precision)
+- `delegator` (indexed): The EVM address of the delegator who withdraws the rewards
+- `validator`: The Sei validator address (for example, "seivaloper1...")
+- `amount`: The amount of rewards withdrawn (in usei, 6-decimal precision)
**Example usage:**
@@ -113,9 +113,9 @@ event MultipleDelegationRewardsWithdrawn(address indexed delegator, string[] val
**Parameters:**
-- `delegator` (indexed): The EVM address of the delegator withdrawing rewards
-- `validators`: Array of Sei validator addresses
-- `amounts`: Array of reward amounts corresponding to each validator (in usei, 6 decimal precision)
+- `delegator` (indexed): The EVM address of the delegator who withdraws the rewards
+- `validators`: An array of Sei validator addresses
+- `amounts`: An array of reward amounts, one for each validator (in usei, 6-decimal precision)
**Example usage:**
@@ -140,7 +140,7 @@ event ValidatorCommissionWithdrawn(string indexed validator, uint256 amount);
**Parameters:**
- `validator` (indexed): The Sei validator address
-- `amount`: The commission amount withdrawn (in usei, 6 decimal precision)
+- `amount`: The commission amount withdrawn (in usei, 6-decimal precision)
**Example usage:**
@@ -152,13 +152,13 @@ distrContract.on('ValidatorCommissionWithdrawn', (validator, amount) => {
});
```
-**Event Amounts**: All event amounts use 6 decimal precision (usei), matching the actual withdrawn token amounts. This differs from the `rewards()` query which returns 18 decimal precision.
+**Event amounts**: All event amounts use 6-decimal precision (usei). This matches the withdrawn token amounts. In contrast, the `rewards()` query returns 18-decimal precision.
-## Transaction Methods
+## Transaction methods
### setWithdrawAddress
-Sets the withdrawal address for staking rewards. By default, rewards are sent to the delegator's address, but this can be customized.
+Sets the withdrawal address for staking rewards. By default, rewards go to the delegator's address, but you can change it.
```solidity
function setWithdrawAddress(address withdrawAddr) external returns (bool success);
@@ -166,9 +166,9 @@ function setWithdrawAddress(address withdrawAddr) external returns (bool success
**Parameters:**
-- `withdrawAddr`: EVM address where future rewards should be sent
+- `withdrawAddr`: The EVM address that receives future rewards
-**Gas Cost**: ~30,000 gas
+**Gas cost**: ~30,000 gas
**Example:**
@@ -179,9 +179,9 @@ require(success, "Failed to set withdraw address");
```
- **Recipient Validation**: The withdrawal address must be able to receive external funds. Through the precompile, an unassociated EVM address is rejected with the error `cannot use an unassociated address as withdraw address`. Separately, the bank module rejects addresses it blocks from receiving external funds with `ErrInvalidRecipient` — for example, the cast address of an EVM account that has since been associated with a different Sei address. Ensure the withdrawal address is associated and permitted to receive funds before setting it.
+ **Recipient validation**: Before you set the withdrawal address, make sure that it is associated and allowed to receive funds. The withdrawal address must be able to receive external funds. The precompile rejects an unassociated EVM address with the error `cannot use an unassociated address as withdraw address`. Separately, the bank module returns `ErrInvalidRecipient` for an address that it blocks from receiving external funds. For example, it blocks the cast address of an EVM account that was later associated with a different Sei address.
- Additionally, if a previously set withdrawal address later becomes invalid (blocked or no longer able to receive external funds), reward withdrawals automatically fall back to sending rewards to the delegator's own address instead.
+ If a withdrawal address that was set earlier becomes invalid, reward withdrawals automatically fall back to the delegator's own address. An address is invalid when it is blocked or can no longer receive external funds.
### withdrawDelegationRewards
@@ -194,9 +194,9 @@ function withdrawDelegationRewards(string memory validator) external returns (bo
**Parameters:**
-- `validator`: Sei validator address (e.g., "seivaloper1...")
+- `validator`: The Sei validator address (for example, "seivaloper1...")
-**Gas Cost**: ~50,000-80,000 gas (varies by reward amount)
+**Gas cost**: ~50,000-80,000 gas (varies with the reward amount)
**Example:**
@@ -208,7 +208,7 @@ require(success, "Failed to withdraw rewards");
### withdrawMultipleDelegationRewards
-Efficiently withdraws rewards from multiple validators in a single transaction.
+Withdraws rewards from multiple validators in a single transaction.
```solidity
function withdrawMultipleDelegationRewards(string[] memory validators) external returns (bool success);
@@ -216,9 +216,9 @@ function withdrawMultipleDelegationRewards(string[] memory validators) external
**Parameters:**
-- `validators`: Array of Sei validator addresses
+- `validators`: An array of Sei validator addresses
-**Gas Cost**: ~40,000 + (30,000 × number of validators)
+**Gas cost**: ~40,000 + (30,000 × number of validators)
**Example:**
@@ -232,19 +232,19 @@ bool success = DISTR_CONTRACT.withdrawMultipleDelegationRewards(validators);
require(success, "Failed to withdraw multiple rewards");
```
-**Batch Efficiency**: Using `withdrawMultipleDelegationRewards` is significantly more gas-efficient than multiple individual calls, especially when withdrawing from 3+ validators.
+**Batch efficiency**: One `withdrawMultipleDelegationRewards` call is significantly more gas-efficient than multiple individual calls, especially when you withdraw from 3 or more validators.
### withdrawValidatorCommission
-Allows validators to withdraw their earned commission. Only callable by the validator operator address.
+Lets a validator withdraw its earned commission. Only the validator operator address can call this method.
```solidity
function withdrawValidatorCommission() external returns (bool success);
```
-**Parameters:** None - the validator is automatically determined from the caller's associated Sei address.
+**Parameters:** None. The precompile determines the validator automatically from the caller's associated Sei address.
-**Gas Cost**: ~60,000-90,000 gas
+**Gas cost**: ~60,000-90,000 gas
**Example:**
@@ -254,19 +254,19 @@ bool success = DISTR_CONTRACT.withdrawValidatorCommission();
require(success, "Failed to withdraw commission");
```
-**Validator Only**: This method can only be called by the validator's operator address. The precompile automatically identifies the validator based on the caller's associated Sei address. If the caller is not a validator operator, the call will fail.
+**Validator only**: Call this method only from the validator's operator address. The precompile identifies the validator automatically from the caller's associated Sei address. If the caller is not a validator operator, the call fails.
-## Query Methods
+## Query methods
### rewards
-Retrieves comprehensive reward information for a delegator across all validators.
+Returns the reward information for a delegator across all validators.
```solidity
function rewards(address delegatorAddress) external view returns (Rewards rewards);
```
-**Data Structures:**
+**Data structures:**
```solidity
struct Coin {
@@ -287,11 +287,11 @@ struct Rewards {
```
-**Critical: Decimal Precision for Rewards**
+**Critical: decimal precision for rewards**
-The `rewards()` query returns amounts with **18 decimal precision** (`DecCoins` from Cosmos SDK).
+The `rewards()` query returns amounts with **18-decimal precision** (`DecCoins` from the Cosmos SDK).
-This is different from the actual withdrawn reward amounts, which use **6 decimal precision** (`sdk.Coins`).
+In contrast, withdrawn reward amounts use **6-decimal precision** (`sdk.Coins`).
**To convert pending rewards to SEI for display:**
@@ -327,11 +327,11 @@ for (uint i = 0; i < userRewards.rewards.length; i++) {
}
```
-## Understanding Decimal Precision
+## Understanding decimal precision
-The distribution precompile has **different decimal precision for queries vs actual withdrawals** due to how rewards are tracked in the Cosmos SDK:
+Because of how the Cosmos SDK tracks rewards, the distribution precompile uses **different decimal precision for queries and withdrawals**:
-| Function | Type | Decimal Precision | Conversion to SEI |
+| Function | Type | Decimal precision | Conversion to SEI |
| --- | --- | --- | --- |
| **rewards()** | Query (pending rewards) | 18 decimals (DecCoins) | `amount / 1e18` |
| **withdrawDelegationRewards()** | Withdrawn amount (event) | 6 decimals (usei) | `amount / 1e6` |
@@ -339,13 +339,13 @@ The distribution precompile has **different decimal precision for queries vs act
| **withdrawValidatorCommission()** | Withdrawn amount (event) | 6 decimals (usei) | `amount / 1e6` |
-### Why Different Precisions?
+### Why different precisions?
-1. **Pending Rewards (18 decimals)**: The Cosmos SDK tracks pending rewards using `DecCoins` (decimal coins) with 18 decimal precision for higher accuracy during reward accumulation.
+1. **Pending rewards (18 decimals)**: The Cosmos SDK tracks pending rewards as `DecCoins` (decimal coins) with 18-decimal precision. This gives higher accuracy while rewards accumulate.
-2. **Withdrawn Rewards (6 decimals)**: When rewards are actually withdrawn, they are converted to `sdk.Coins` (usei) with 6 decimal precision to match Sei's native token units.
+2. **Withdrawn rewards (6 decimals)**: When rewards are withdrawn, they are converted to `sdk.Coins` (usei) with 6-decimal precision. This matches Sei's native token units.
-### Conversion Helper Functions
+### Conversion helper functions
```typescript
// Convert pending rewards (18 decimals) to SEI
@@ -364,11 +364,11 @@ const pendingSei = pendingRewardsToSei(pendingRewards.total[0].amount);
console.log(`Pending rewards: ${pendingSei} SEI`);
```
-**Note**: When reconciling pending rewards with actual withdrawals, be aware of the 12-decimal difference (10^12 factor) between query results and withdrawal amounts.
+When you reconcile pending rewards with withdrawals, remember the 12-decimal difference (10^12 factor) between query results and withdrawal amounts.
-## Practical Examples
+## Practical examples
-### DeFi Yield Aggregator
+### DeFi yield aggregator
```solidity
contract YieldAggregator {
@@ -400,7 +400,7 @@ contract YieldAggregator {
}
```
-### Validator Commission Manager
+### Validator commission manager
```solidity
contract ValidatorManager {
@@ -423,9 +423,9 @@ contract ValidatorManager {
}
```
-## Error Handling
+## Error handling
-Common error scenarios and how to handle them:
+This example shows common error scenarios and how to handle them:
```solidity
contract SafeDistribution {
@@ -457,16 +457,16 @@ contract SafeDistribution {
}
```
-## Gas Optimization Tips
+## Gas optimization tips
-1. **Batch Operations**: Use `withdrawMultipleDelegationRewards` for multiple validators
-2. **Check Before Withdraw**: Query rewards first to avoid unnecessary transactions
-3. **Set Withdraw Address Once**: Avoid repeated `setWithdrawAddress` calls
-4. **Commission Timing**: Withdraw validator commission when amounts are substantial
+1. To withdraw from multiple validators, use one `withdrawMultipleDelegationRewards` batch call.
+2. Query rewards before you withdraw, to avoid unnecessary transactions.
+3. Set the withdrawal address once. Avoid repeated `setWithdrawAddress` calls.
+4. Withdraw validator commission when the amounts are substantial.
-## Integration Patterns
+## Integration patterns
-### Auto-Compounding Strategy
+### Auto-compounding strategy
```solidity
// Automatically reinvest rewards back into staking
@@ -479,7 +479,7 @@ function autoCompound() external {
}
```
-### Treasury Management
+### Treasury management
```solidity
// Route all rewards to a DAO treasury
diff --git a/evm/precompiles/example-usage.mdx b/evm/precompiles/example-usage.mdx
index bf84897..f182f51 100644
--- a/evm/precompiles/example-usage.mdx
+++ b/evm/precompiles/example-usage.mdx
@@ -5,10 +5,10 @@ description: "Learn how to interact with Sei's precompiles through viem and ethe
keywords: ['precompile usage', 'viem', 'ethers.js', 'sei precompiles', 'evm integration', 'quick start guide']
---
-Sei precompiles are special smart contracts deployed at fixed addresses that expose native Sei functionality to EVM applications. They can be called like any standard smart contract using viem, ethers, or wagmi.
+Sei precompiles are special smart contracts deployed at fixed addresses. They expose native Sei functionality to EVM applications. You can call them like any standard smart contract, with viem, ethers, or wagmi.
-**Available Precompiles:**
+**Available precompiles:**
| Precompile | Address | Description |
| --- | --- | --- |
@@ -24,13 +24,13 @@ Sei precompiles are special smart contracts deployed at fixed addresses that exp
| Solo | `0x000000000000000000000000000000000000100C` | Claim Solo migration payloads |
| P256 | `0x0000000000000000000000000000000000001011` | Verify P-256 elliptic curve signatures |
-This page shows Bank, Staking, Governance, Distribution, JSON, and Solo. The rest are covered on their own pages: [CosmWasm](/evm/precompiles/cosmwasm-precompiles/cosmwasm), [Address](/evm/precompiles/cosmwasm-precompiles/addr), [Pointer contracts](/evm/evm-parity/examples/pointer-contracts) for both pointer precompiles, and [P256](/evm/precompiles/p256-precompile).
+This page shows Bank, Staking, Governance, Distribution, JSON, and Solo. The other precompiles have their own pages: [CosmWasm](/evm/precompiles/cosmwasm-precompiles/cosmwasm), [Address](/evm/precompiles/cosmwasm-precompiles/addr), [Pointer contracts](/evm/evm-parity/examples/pointer-contracts) for both pointer precompiles, and [P256](/evm/precompiles/p256-precompile).
-The IBC and Oracle precompiles are not exported by `@sei-js/precompiles`. IBC is disabled in both directions, and native Oracle queries are retired. Calls to either precompile cannot succeed on live Sei. See [IBC is disabled](/learn/sip-03-migration#ibc-is-disabled) and [Oracle Precompile (Retired)](/evm/precompiles/oracle).
+The `@sei-js/precompiles` package does not export the IBC and Oracle precompiles. IBC is disabled in both directions, and native Oracle queries are retired. Calls to either precompile cannot succeed on live Sei. See [IBC is disabled](/learn/sip-03-migration#ibc-is-disabled) and [Oracle Precompile (Retired)](/evm/precompiles/oracle).
-`@sei-js/precompiles@3` is ESM-only and matches Sei Chain v6.6.1 ABIs. Import raw `*_PRECOMPILE_ABI` constants from the package root, `@sei-js/precompiles/precompiles`, or `@sei-js/precompiles/viem`. Ethers factories are on `@sei-js/precompiles/ethers`. The package does not expose `VIEM_*_PRECOMPILE_ABI` aliases. It re-exports Viem's `sei` and `seiTestnet` definitions and also exports `seiLocal` (chain ID `713714`, `http://localhost:8545`). Viem 2.55.16 or newer is required.
+`@sei-js/precompiles@3` is ESM-only and matches the Sei Chain v6.6.1 ABIs. Import raw `*_PRECOMPILE_ABI` constants from the package root, `@sei-js/precompiles/precompiles`, or `@sei-js/precompiles/viem`. Import the ethers factories from `@sei-js/precompiles/ethers`. The package does not expose `VIEM_*_PRECOMPILE_ABI` aliases. It re-exports the viem `sei` and `seiTestnet` definitions and also exports `seiLocal` (chain ID `713714`, `http://localhost:8545`). The package requires viem 2.55.16 or newer.
```ts
import { getStakingPrecompileEthersV6Contract } from '@sei-js/precompiles/ethers';
@@ -71,9 +71,9 @@ const signer = await provider.getSigner();
-## Bank Precompile
+## Bank precompile
-`eth_getBalance` only returns the EVM-side SEI balance. The Bank precompile lets you query the native SEI (`usei`) bank balance for an address:
+`eth_getBalance` returns only the EVM-side SEI balance. The Bank precompile lets you query the native SEI (`usei`) bank balance for an address:
@@ -99,7 +99,7 @@ const balance = await bank.balance('0xYourAddress', 'usei');
-## Staking Precompile
+## Staking precompile
Delegate, undelegate, and query staking state:
@@ -156,7 +156,7 @@ await undelegateTx.wait();
-## Governance Precompile
+## Governance precompile
Vote on an active governance proposal:
@@ -186,7 +186,7 @@ await tx.wait();
-## Distribution Precompile
+## Distribution precompile
Claim staking rewards from a validator:
@@ -218,9 +218,9 @@ await tx.wait();
-## JSON Precompile
+## JSON precompile
-Parse JSON data within EVM contracts or dApps. This is useful for processing oracle responses, NFT metadata, and structured payloads:
+Parse JSON data in EVM contracts or dApps. This is useful for oracle responses, NFT metadata, and structured payloads:
@@ -268,7 +268,7 @@ console.log(`${symbol}: ${price}`);
-## Solo Precompile
+## Solo precompile
Claim a Solo migration payload. Both functions take the signed payload as `bytes` and return a boolean:
@@ -296,11 +296,11 @@ await tx.wait();
-Use `claimSpecific` with the same argument shape to claim a single payload rather than everything available to the address.
+To claim a single payload instead of everything available to the address, use `claimSpecific` with the same argument shape.
-## Common Patterns
+## Common patterns
-### Error Handling
+### Error handling
Wrap precompile calls in try/catch and check for specific error codes:
@@ -320,7 +320,7 @@ try {
}
```
-### Batch Read Operations
+### Batch read operations
Fetch multiple precompile values in parallel:
@@ -332,9 +332,9 @@ const [delegation1, delegation2, rewards] = await Promise.all([
]);
```
-### Gas Limits
+### Gas limits
-Precompile calls that write state need enough gas. Use `estimateContractGas` rather than hard-coding:
+Precompile calls that write state need enough gas. Use `estimateContractGas` instead of a hard-coded value:
```ts viem
const gas = await client.estimateContractGas({
@@ -347,9 +347,9 @@ const gas = await client.estimateContractGas({
});
```
-## Full Working Example
+## Full working example
-A Node.js script that delegates SEI and then casts a governance vote:
+This Node.js script delegates SEI and then casts a governance vote:
```ts
import { ethers } from 'ethers';
@@ -384,20 +384,20 @@ async function main() {
main().catch(console.error);
```
-Run with:
+Run the script:
```bash
PRIVATE_KEY=your_key npx tsx script.ts
```
-## Next Steps
+## Next steps
-For full ABI reference and all available functions on each precompile:
+For the full ABI reference and all available functions of each precompile, see these pages:
-- [Staking Precompile →](/evm/precompiles/staking)
-- [Governance Precompile →](/evm/precompiles/governance)
-- [Distribution Precompile →](/evm/precompiles/distribution)
-- [JSON Precompile →](/evm/precompiles/json)
-- [P256 Precompile →](/evm/precompiles/p256-precompile)
-- [CosmWasm Precompiles →](/evm/precompiles/cosmwasm-precompiles/example-usage)
+- [Staking precompile →](/evm/precompiles/staking)
+- [Governance precompile →](/evm/precompiles/governance)
+- [Distribution precompile →](/evm/precompiles/distribution)
+- [JSON precompile →](/evm/precompiles/json)
+- [P256 precompile →](/evm/precompiles/p256-precompile)
+- [CosmWasm precompiles →](/evm/precompiles/cosmwasm-precompiles/example-usage)
- [Pointer contracts →](/evm/evm-parity/examples/pointer-contracts)
diff --git a/evm/precompiles/governance.mdx b/evm/precompiles/governance.mdx
index bc34f3f..7ad3426 100644
--- a/evm/precompiles/governance.mdx
+++ b/evm/precompiles/governance.mdx
@@ -6,54 +6,54 @@ keywords: ['governance precompile', 'ethers.js', 'proposal voting', 'blockchain
---
**Address:** `0x0000000000000000000000000000000000001006`
-The Sei governance precompile enables EVM applications to submit proposals, vote, and deposit tokens. The ABI is write-only. Query proposal state through Cosmos REST/RPC or a Sei explorer.
+The Sei governance precompile lets EVM applications submit proposals, vote, and deposit tokens. The ABI is write-only. Query proposal state through Cosmos REST or RPC, or with a Sei explorer.
-**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.
+**What is a precompile?** A precompile is a special smart contract that the Sei protocol itself deploys at a fixed address. It exposes custom native chain logic to EVM-based applications. To the EVM, it behaves like a regular contract, but it executes privileged, low-level logic efficiently.
-## How Does the Governance Precompile Work?
+## How does the governance precompile work?
-The governance precompile at address `0x0000000000000000000000000000000000001006` exposes functions like `vote()`, `voteWeighted()`, `deposit()`, and `submitProposal()`.
+The governance precompile at address `0x0000000000000000000000000000000000001006` exposes functions such as `vote()`, `voteWeighted()`, `deposit()`, and `submitProposal()`.
-- **Direct Integration:** EVM contracts and dApps can interact with governance like any other smart contract method.
-- **Native Execution:** Governance operations are executed at the chain level for maximum efficiency.
-- **Seamless:** No need for separate wallet integrations.
+- EVM contracts and dApps can call governance functions like any other smart contract method.
+- Governance operations run natively at the chain level, which makes them efficient.
+- You do not need a separate wallet integration.
-## Use Cases
+## Use cases
-- **Voting Interfaces:** Create user-friendly governance participation tools.
-- **Automated Governance:** Smart contracts that vote based on predetermined strategies.
-- **Governance Aggregators:** Build platforms that aggregate and simplify governance participation.
+- **Voting interfaces:** Create user-friendly tools for governance participation.
+- **Automated governance:** Build smart contracts that vote based on predetermined strategies.
+- **Governance aggregators:** Build platforms that aggregate and simplify governance participation.
-## Sei Governance Overview
+## Sei governance overview
-Sei governance operates on a structured timeline with specific parameters:
+Sei governance follows a structured timeline with specific parameters:
-### Governance Process
+### Governance process
-1. **Proposal Submission:** Submit proposal with minimum 3,500 SEI deposit
-2. **Deposit Period:** 2 days to accumulate minimum deposit or reach expedited threshold
-3. **Voting Period:** 3 days (1 day for expedited) of active voting once minimum deposit is met
-4. **Tallying:** Results calculated based on quorum and voting thresholds
+1. **Proposal submission:** Submit a proposal with a minimum deposit of 3,500 SEI.
+2. **Deposit period:** The proposal has 2 days to accumulate the minimum deposit or reach the expedited threshold.
+3. **Voting period:** When the proposal meets the minimum deposit, voting is active for 3 days (1 day for expedited proposals).
+4. **Tallying:** The results are calculated from the quorum and voting thresholds.
- To find out all about the governance process on Sei, go to the [governance explainer](/learn/general-governance).
+ To learn more about the governance process on Sei, read the [governance explainer](/learn/general-governance).
-**Critical Mainnet Considerations:**
+**Critical Sei Mainnet considerations:**
-- **High Stakes:** Mainnet governance involves real SEI tokens and binding decisions
-- **Minimum Deposit:** 3500 SEI minimum, 7000 SEI for expedited
-- **Deposit Risk:** Deposits will be burned if your proposal receives >33.4% NoWithVeto votes
-- **Voting Power Required:** Must stake SEI with validators to participate
-- **Time Limits:** Strict 2-day deposit period and 3-day voting period
-- **Real Impact:** Successful proposals can change network parameters
+- **High stakes:** Governance on Sei Mainnet involves real SEI tokens and binding decisions.
+- **Minimum deposit:** 3,500 SEI, or 7,000 SEI for an expedited proposal.
+- **Deposit risk:** If your proposal receives more than 33.4% NoWithVeto votes, its deposits are burned.
+- **Voting power required:** You must stake SEI with validators to participate.
+- **Time limits:** The 2-day deposit period and the 3-day voting period are strict.
+- **Real impact:** Successful proposals can change network parameters.
## Functions
-The governance precompile exposes the following functions:
+The governance precompile exposes these functions:
-### Transaction Functions
+### Transaction functions
```solidity
/// Cast a vote on the specified proposal.
@@ -101,22 +101,22 @@ function submitProposal(
) payable external returns (uint64 proposalID);
```
-## Using the Contract
+## Using the contract
### Setup
#### Prerequisites
-Before getting started, ensure you have:
+Before you start, make sure that you have:
-- **Node.js** (v18 or higher)
-- **npm** or **yarn** package manager
-- **MetaMask** or compatible EVM wallet configured for Sei Mainnet
-- **SEI tokens** for gas and governance deposits (minimum 3,500 SEI for proposals)
+- Node.js (v18 or higher)
+- The npm or yarn package manager
+- MetaMask or another compatible EVM wallet, configured for Sei Mainnet
+- SEI tokens for gas and governance deposits (a minimum of 3,500 SEI to submit a proposal)
-#### Install Dependencies
+#### Install dependencies
-Install the required packages for interacting with Sei precompiles:
+Install the required packages to interact with Sei precompiles:
```bash
# Install ethers.js for smart contract interactions
@@ -129,7 +129,7 @@ npm install @sei-js/precompiles@^3
npm install dotenv
```
-#### Import Precompile Components
+#### Import precompile components
```typescript
// Import Governance precompile address and ABI
@@ -138,19 +138,19 @@ import { GOVERNANCE_PRECOMPILE_ABI, GOVERNANCE_PRECOMPILE_ADDRESS } from '@sei-j
import { ethers } from 'ethers';
```
-**Precompile Address:** The governance precompile is deployed at `0x0000000000000000000000000000000000001006`
+**Precompile address:** The governance precompile is deployed at `0x0000000000000000000000000000000000001006`.
-#### Get SEI Tokens
+#### Get SEI tokens
-Purchase SEI tokens from supported exchanges:
+Buy SEI tokens from supported exchanges:
-- **Centralized Exchanges:** Binance, Coinbase, KuCoin, Gate.io
-- **Decentralized Exchanges:** Astroport, Dragonswap (on Sei)
-- **Bridge Options:** Various cross-chain bridges support SEI
+- **Centralized exchanges:** Binance, Coinbase, KuCoin, Gate.io
+- **Decentralized exchanges:** Astroport, Dragonswap (on Sei)
+- **Bridge options:** Several cross-chain bridges support SEI
-**Minimum Requirements:** You need at least 3,500 SEI to submit a governance proposal, plus additional tokens for gas and potential additional deposits.
+**Minimum requirements:** You need at least 3,500 SEI to submit a governance proposal. You also need more SEI for gas and for any extra deposits.
-### Contract Initialization
+### Contract initialization
Set up your provider, signer, and contract instance:
@@ -168,31 +168,31 @@ const signer = new ethers.Wallet('YOUR_PRIVATE_KEY', provider);
const governance = new ethers.Contract(GOVERNANCE_PRECOMPILE_ADDRESS, GOVERNANCE_PRECOMPILE_ABI, signer);
```
-## Vote Options
+## Vote options
-The governance system uses the following vote options:
+The governance system uses these vote options:
| Option | Value | Description | Impact |
| --- | --- | --- | --- |
-| Yes | 1 | Vote in favor of the proposal | Proposal passes if threshold met |
+| Yes | 1 | Vote in favor of the proposal | Proposal passes if the threshold is met |
| Abstain | 2 | Abstain from voting | Counts toward quorum only |
-| No | 3 | Vote against the proposal | Opposes proposal |
-| NoWithVeto | 4 | Vote against with veto | Opposes Proposal & burns deposit if > 33.4% |
+| No | 3 | Vote against the proposal | Opposes the proposal |
+| NoWithVeto | 4 | Vote against with veto | Opposes the proposal and burns the deposit if > 33.4% |
-### Voting Power
+### Voting power
-Your voting power is determined by:
+Your voting power depends on:
-- **Staked SEI:** Amount of SEI you have staked with validators
+- **Staked SEI:** The amount of SEI that you staked with validators
- **Delegation:** SEI delegated to validators counts toward voting power
-- **Liquid SEI:** Unstaked SEI does not provide voting power
+- **Liquid SEI:** Unstaked SEI does not give voting power
-**Important:** Only staked SEI provides voting power. You must delegate your tokens to validators to participate in governance voting.
+Only staked SEI gives voting power. To vote in governance, you must delegate your tokens to validators.
-## Validation Functions
+## Validation functions
-Before making governance transactions, use these helper functions to validate inputs:
+Before you send governance transactions, use these helper functions to validate the inputs:
```typescript
// Validate vote option
@@ -246,17 +246,17 @@ async function checkVotingPower(userAddress: string): Promise {
}
```
-## Step-by-Step Guide: Using the Governance Precompile
+## Step-by-step guide: Using the governance precompile
-### Submit a Proposal
+### Submit a proposal
-**Important Deposit Requirements:**
+**Deposit requirements:**
-- **Minimum deposit:** 3,500 SEI required for proposal to enter voting period
-- **Expedited processing:** 7,000 SEI if the voting period should only be 1 day long
-- **Deposit period:** 2 days to meet minimum or proposal fails and deposits are burned
-- **Multiple deposits:** Anyone can contribute to reach the minimum threshold
+- **Minimum deposit:** A proposal needs 3,500 SEI to enter the voting period.
+- **Expedited processing:** A proposal needs 7,000 SEI for a voting period of only 1 day.
+- **Deposit period:** The proposal has 2 days to meet the minimum. If it does not, the proposal fails and the deposits are burned.
+- **Multiple deposits:** Anyone can contribute to reach the minimum threshold.
@@ -383,7 +383,7 @@ const depositAmount = ethers.parseUnits('4000', 18); // 4,000 SEI deposit
await submitGovernanceProposal(proposalTitle, proposalDescription, depositAmount, false);
```
-### Vote on a Proposal
+### Vote on a proposal
```typescript
// Simple voting with comprehensive validation
@@ -448,9 +448,9 @@ await voteOnProposal(proposalID, 1);
await voteOnProposal(proposalID, 4);
```
-### Weighted Voting
+### Weighted voting
-**Critical Requirement:** Weighted vote options MUST sum to exactly 1.0 or the transaction will fail. The Sei governance module enforces this strictly - even small rounding errors will cause rejection.
+**Critical requirement:** Make sure that the option weights in a weighted vote sum to exactly 1.0. If they do not, the transaction fails. The Sei governance module enforces this strictly. Even small rounding errors cause a rejection.
```typescript
// Weighted voting with comprehensive validation
@@ -562,7 +562,7 @@ const badVote = [
// await castWeightedVote(proposalID, badVote); // Don't run this!
```
-### Deposit to a Proposal
+### Deposit to a proposal
```typescript
// Add deposit to help proposal reach minimum threshold
@@ -617,9 +617,9 @@ const additionalDeposit = ethers.parseUnits('1000', 18); // 1,000 SEI
await addDepositToProposal(proposalID, additionalDeposit);
```
-## Complete Integration Example
+## Complete integration example
-Create a comprehensive governance interaction script:
+Create a script that interacts with the governance precompile:
```javascript title="governance-mainnet-demo.mjs"
import { ethers } from 'ethers';
@@ -872,7 +872,7 @@ This is a test proposal. Vote according to your preference to test the system.`,
main().catch(console.error);
```
-### Running the Example
+### Running the example
1. **Create a new directory and initialize npm:**
@@ -895,12 +895,12 @@ PRIVATE_KEY=your_private_key_here
```
4. **Create the demo file:**
- Copy the complete integration example above into `governance-mainnet-demo.mjs`
+ Copy the complete integration example above into `governance-mainnet-demo.mjs`.
-5. **Ensure you have sufficient SEI:**
+5. **Make sure that you have enough SEI:**
- - Minimum 3,500 SEI for proposal deposit
- - Additional SEI for gas and optional additional deposits
+ - A minimum of 3,500 SEI for the proposal deposit
+ - More SEI for gas and for optional extra deposits
- Staked SEI for voting power
6. **Run the script:**
@@ -909,7 +909,7 @@ PRIVATE_KEY=your_private_key_here
node governance-mainnet-demo.mjs
```
-### Expected Output
+### Expected output
```
🌐 Connecting to Sei Mainnet...
@@ -960,9 +960,9 @@ node governance-mainnet-demo.mjs
## Troubleshooting
-### Common Issues and Solutions
+### Common issues and solutions
-#### Insufficient Deposit
+#### Insufficient deposit
```typescript
// Check minimum deposit requirement based on proposal type
@@ -981,7 +981,7 @@ function checkDepositRequirement(depositAmount: bigint, isExpedited: boolean = f
}
```
-#### No Voting Power
+#### No voting power
```typescript
// Check if user has staked SEI for voting power
@@ -998,7 +998,7 @@ async function checkVotingEligibility(userAddress: string): Promise {
}
```
-#### Invalid Vote Option
+#### Invalid vote option
```typescript
// Validate vote option with descriptive error
@@ -1020,7 +1020,7 @@ function validateVoteOptionWithDescription(option: number): void {
}
```
-#### Weighted Vote Validation
+#### Weighted vote validation
```typescript
// Comprehensive weighted vote validation with helpful errors
@@ -1082,26 +1082,26 @@ function validateWeightedVoteComprehensive(options: Array<{ option: number; weig
}
```
-### Error Code Reference
+### Error code reference
| Error | Cause | Solution |
| --- | --- | --- |
-| `proposal does not exist` | Invalid proposal ID or proposal expired | Verify proposal ID and ensure voting period is still active |
-| `inactive proposal` | Voting or deposit period has ended | Check proposal status and timeline |
-| `insufficient deposit` | Deposit below 3,500 SEI | Increase deposit to the minimum required amount |
+| `proposal does not exist` | Invalid proposal ID or proposal expired | Verify the proposal ID and make sure that the voting period is still active |
+| `inactive proposal` | Voting or deposit period has ended | Check the proposal status and timeline |
+| `insufficient deposit` | Deposit below 3,500 SEI | Increase the deposit to the minimum required amount |
| `invalid vote option` | Vote option not 1-4 | Use a valid option (1-Yes, 2-Abstain, 3-No, 4-NoWithVeto) |
| `already voted` | Address has already voted on this proposal | Each address can vote only once per proposal |
-| `weights must sum to 1` | Weighted votes don’t sum to 1.0 | **CRITICAL —** adjust weights so they total exactly 1.0 |
+| `weights must sum to 1` | Weighted votes do not sum to 1.0 | **Critical:** Adjust the weights so that they total exactly 1.0 |
| `insufficient voting power` | No staked SEI | Delegate SEI to validators to gain voting power |
-| `deposit period ended` | Deposits no longer accepted | Deposit period closes 2 days after submission |
+| `deposit period ended` | Deposits no longer accepted | The deposit period closes 2 days after submission |
-**Need Help?** If you encounter issues:
+**Need help?** If you have problems, use these resources:
- **Discord:** [Sei Community Discord](https://discord.gg/sei)
-- **GitHub:** [Sei Protocol Repository](https://github.com/sei-protocol/sei-chain)
-- **Explorer:** [View Proposals on Sei Explorer](https://sei.explorers.guru/proposals)
+- **GitHub:** [Sei Protocol repository](https://github.com/sei-protocol/sei-chain)
+- **Explorer:** [View proposals on Sei Explorer](https://sei.explorers.guru/proposals)
diff --git a/evm/precompiles/json.mdx b/evm/precompiles/json.mdx
index 210d2f1..e336b87 100644
--- a/evm/precompiles/json.mdx
+++ b/evm/precompiles/json.mdx
@@ -6,31 +6,31 @@ keywords: ['json precompile', 'ethers.js', 'json parsing', 'smart contract data'
---
**Address:** `0x0000000000000000000000000000000000001003`
-The Sei JSON precompile allows EVM applications to efficiently parse and query JSON data directly within smart contracts. This enables complex data handling capabilities that are not natively available in Solidity, making it easier to work with structured data from external sources or APIs.
+The Sei JSON precompile lets EVM applications parse and query JSON data efficiently, directly within smart contracts. Solidity does not support this kind of complex data handling natively. The precompile makes it easier to work with structured data from external sources or APIs.
-**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.
+**What is a precompile?** A precompile is a special smart contract that the Sei protocol itself deploys at a fixed address. It exposes custom native chain logic to EVM-based applications. To the EVM, it behaves like a regular contract, but it executes privileged, low-level logic efficiently.
-## How Does the JSON Precompile Work?
+## How does the JSON precompile work?
The JSON precompile at address `0x0000000000000000000000000000000000001003` exposes `extractAsBytes()`, `extractAsBytesList()`, `extractAsBytesFromArray()`, and `extractAsUint256()`.
-- **Direct Integration:** EVM contracts and dApps can parse JSON data like any other smart contract method.
-- **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.
+- EVM contracts and dApps can call the JSON parsing functions directly, like any other smart contract method.
+- JSON parsing runs at the native level, which makes it efficient.
+- You do not need complex workarounds or external libraries to handle JSON.
-## Use Cases
+## Use cases
-- **Oracle Integration:** Parse complex oracle responses containing multiple data points.
-- **DeFi Applications:** Process structured price feeds and market data.
+- **Oracle integration:** Parse complex oracle responses that contain multiple data points.
+- **DeFi applications:** Process structured price feeds and market data.
- **Gaming:** Handle complex game state and player data stored in JSON format.
-- **Cross-Chain Communication:** Parse messages and data from other chains.
-- **NFT Metadata:** Extract and manipulate NFT metadata stored in JSON format.
+- **Cross-chain communication:** Parse messages and data from other chains.
+- **NFT metadata:** Extract and manipulate NFT metadata stored in JSON format.
## Functions
-The JSON precompile exposes the following functions:
+The JSON precompile exposes these functions:
-### Query Functions
+### Query functions
```solidity
/// Extracts data as bytes from the input using the specified key.
@@ -70,22 +70,22 @@ function extractAsUint256(
) external view returns (uint256 response);
```
-## Using the Precompile
+## Using the precompile
### Setup
#### Prerequisites
-Before getting started, ensure you have:
+Before you start, make sure that you have:
-- **Node.js** (v18 or higher)
-- **npm** or **yarn** package manager
-- **MetaMask** or compatible EVM wallet configured for Sei Mainnet
-- **SEI tokens** for gas
+- Node.js (v18 or higher)
+- The npm or yarn package manager
+- MetaMask or another compatible EVM wallet, configured for Sei Mainnet
+- SEI tokens for gas
-#### Install Dependencies
+#### Install dependencies
-Install the required packages for interacting with Sei precompiles:
+Install the required packages to interact with Sei precompiles:
```bash
# Install ethers.js for smart contract interactions
@@ -98,7 +98,7 @@ npm install @sei-js/precompiles@^3
npm install dotenv
```
-#### Import Precompile Components
+#### Import precompile components
```typescript
// Import JSON precompile address and ABI
@@ -107,9 +107,9 @@ import { JSON_PRECOMPILE_ABI, JSON_PRECOMPILE_ADDRESS } from '@sei-js/precompile
import { ethers } from 'ethers';
```
-**Precompile Address:** The JSON precompile is deployed at `0x0000000000000000000000000000000000001003`
+**Precompile address:** The JSON precompile is deployed at `0x0000000000000000000000000000000000001003`.
-### Contract Initialization
+### Contract initialization
Set up your provider, signer, and contract instance:
@@ -127,24 +127,24 @@ const signer = new ethers.Wallet(process.env.PRIVATE_KEY, provider);
const jsonPrecompile = new ethers.Contract(JSON_PRECOMPILE_ADDRESS, JSON_PRECOMPILE_ABI, signer);
```
-## Data Type Handling
+## Data type handling
The JSON precompile has specific limitations for different data types:
-### Supported Data Types
+### Supported data types
| Function | Supports | Limitations |
| --- | --- | --- |
-| extractAsBytes | Strings, Objects, Arrays | Returns raw bytes - needs conversion |
+| extractAsBytes | Strings, objects, arrays | Returns raw bytes that need conversion |
| extractAsUint256 | Integers only | No decimals, booleans, or negative numbers |
-| extractAsBytesList | Arrays of strings/objects | Each element returned as bytes |
+| extractAsBytesList | Arrays of strings/objects | Returns each element as bytes |
-**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.
+**Value length limit:** Make sure that the numeric values you pass stay within 100 characters. `extractAsUint256` rejects value strings longer than 100 characters. If the numeric string extracted for the given key is longer than this, the call fails with `value string too long`.
-### Data Type Conversion Strategies
+### Data type conversion strategies
```typescript
// For decimal numbers - store as integers with known precision
@@ -164,9 +164,9 @@ const userString = ethers.toUtf8String(userBytes);
const userObject = JSON.parse(userString);
```
-## Error Handling Utilities
+## Error handling utilities
-Create comprehensive error handling for all extraction functions:
+Add error handling to all extraction functions:
```typescript
// Safe extraction for bytes data
@@ -206,9 +206,9 @@ async function safeExtractBytesList(jsonPrecompile: ethers.Contract, data: any,
}
```
-## Step-by-Step Guide: Using the JSON Precompile
+## Step-by-step guide: Using the JSON precompile
-### Extract String Data
+### Extract string data
```typescript
// JSON data with string values
@@ -229,7 +229,7 @@ try {
}
```
-### Extract Numeric Data
+### Extract numeric data
```typescript
// JSON data with numbers (integers only)
@@ -247,7 +247,7 @@ const actualRate = Number(rate) / 100; // Convert to 2.75
console.log('Rate:', actualRate);
```
-### Extract Array Data
+### Extract array data
```typescript
// JSON data with array
@@ -266,9 +266,9 @@ const valuesArray = JSON.parse(valuesString);
console.log('Mixed values:', valuesArray); // Output: [42, "test", 100]
```
-### Extract Nested Data
+### Extract nested data
-**Important:** The JSON precompile does not support dot notation for nested objects. Instead, extract the parent object and parse it manually.
+Extract the parent object and parse it manually. The JSON precompile does not support dot notation for nested objects.
```typescript
// For nested data, extract the parent object first
@@ -299,9 +299,9 @@ const walletData = JSON.parse(ethers.toUtf8String(walletBytes));
console.log('Wallet data:', walletData); // Output: { balance: 1000, currency: "SEI" }
```
-## Complete Integration Example
+## Complete integration example
-Create a comprehensive JSON parsing application for mainnet:
+Create a complete JSON parsing application for Sei Mainnet:
```javascript title="json-precompile-mainnet.mjs"
// json-precompile-mainnet.mjs
@@ -502,7 +502,7 @@ async function main() {
main().catch(console.error);
```
-### Running the Mainnet Example
+### Running the mainnet example
1. **Create a new directory and initialize npm:**
@@ -524,14 +524,14 @@ npm install ethers @sei-js/precompiles@^3 dotenv
PRIVATE_KEY=your_private_key_here
```
-**Security Note:** Never commit private keys to version control! The `.env` file should be added to your `.gitignore`.
+Never commit private keys to version control. Add the `.env` file to your `.gitignore`.
4. **Create the demo file:**
- Copy the complete integration example above into `json-precompile-mainnet.mjs`
+ Copy the complete integration example above into `json-precompile-mainnet.mjs`.
-5. **Ensure you have SEI tokens:**
+5. **Make sure that you have SEI tokens:**
- - SEI for gas (small amounts needed for view functions)
+ - SEI for gas (view functions need only small amounts)
6. **Run the script:**
@@ -539,7 +539,7 @@ PRIVATE_KEY=your_private_key_here
node json-precompile-mainnet.mjs
```
-### Expected Output
+### Expected output
```
🌐 Connecting to Sei Mainnet...
@@ -615,9 +615,9 @@ node json-precompile-mainnet.mjs
🎉 === JSON Precompile Demo Completed Successfully! ===
```
-## Advanced Usage Examples
+## Advanced usage examples
-### Oracle Price Feed Integration
+### Oracle price feed integration
```typescript
// Advanced oracle integration with comprehensive error handling
@@ -669,9 +669,9 @@ class SeiPriceOracle {
## Troubleshooting
-### Common Issues and Solutions
+### Common issues and solutions
-#### Key Not Found
+#### Key not found
```typescript
// Comprehensive error handling for missing keys
@@ -693,30 +693,30 @@ async function handleMissingKeys(jsonPrecompile: ethers.Contract, data: any) {
}
```
-### Error Code Reference
+### Error code reference
| Error | Cause | Solution |
| --- | --- | --- |
-| `key not found` | Specified key doesn't exist in JSON | Verify key path and JSON structure |
-| `invalid JSON format` | Malformed JSON input | Use `JSON.stringify()` to ensure valid format |
-| `execution reverted` | Gas limit too low | Increase gas limit based on data complexity |
-| `invalid integer` | Non-numeric value for `extractAsUint256` | Ensure the value is a valid integer |
+| `key not found` | The specified key does not exist in the JSON | Verify the key path and JSON structure |
+| `invalid JSON format` | Malformed JSON input | Use `JSON.stringify()` to make sure the format is valid |
+| `execution reverted` | Gas limit too low | Increase the gas limit based on data complexity |
+| `invalid integer` | Non-numeric value for `extractAsUint256` | Make sure that the value is a valid integer |
| `out of gas` | Insufficient gas for large JSON | Use `calculateGasLimit()` for dynamic estimation |
-## Key Considerations and Tricks
+## Key considerations and tricks
-- **Integers Only:** `extractAsUint256` only handles integers - no decimals, booleans, or negative numbers
-- **Decimal Handling:** Store decimal numbers as integers with known precision (e.g., 275 for 2.75 with 2 decimal places)
-- **Boolean Values:** Use 0/1 integers to represent false/true
-- **Key Paths:** Extract parent objects first, then parse manually - dot notation may not be supported
+- **Integers only:** `extractAsUint256` handles only integers. It does not handle decimals, booleans, or negative numbers.
+- **Decimal handling:** Store decimal numbers as integers with known precision. For example, use 275 for 2.75 with 2 decimal places.
+- **Boolean values:** Use the integer 0 for false and 1 for true.
+- **Key paths:** Extract parent objects first, then parse them manually. Dot notation may not be supported.
- **Arrays:** Object-keyed arrays use `extractAsBytesList()`. JSON arrays by index use `extractAsBytesFromArray()`.
-- **Gas Costs:** Large JSON objects require higher gas limits
-- **Encoding:** Always use UTF-8 encoding with `ethers.toUtf8Bytes()`
-- **Error Handling:** Always implement fallback values for production applications
+- **Gas costs:** Large JSON objects need higher gas limits.
+- **Encoding:** Always use UTF-8 encoding with `ethers.toUtf8Bytes()`.
+- **Error handling:** Always implement fallback values for production applications.
-**Need Help?** If you encounter issues not covered here, check the [Sei Discord](https://discord.gg/sei) or [GitHub repository](https://github.com/sei-protocol/sei-chain) for community support.
+**Need help?** If you have a problem that this page does not cover, look for community support in the [Sei Discord](https://discord.gg/sei) or the [GitHub repository](https://github.com/sei-protocol/sei-chain).
diff --git a/evm/precompiles/oracle.mdx b/evm/precompiles/oracle.mdx
index c56efa9..6177ef0 100644
--- a/evm/precompiles/oracle.mdx
+++ b/evm/precompiles/oracle.mdx
@@ -6,4 +6,4 @@ keywords: ['oracle precompile', 'retired', 'oracle migration', 'chainlink', 'pyt
---
**Address:** `0x0000000000000000000000000000000000001008`
-**Retired as of v6.4.0:** The native Sei Oracle precompile has been retired. On-chain oracle data queries are disabled — calling `getExchangeRates` or `getOracleTwaps` now reverts with the error `oracle precompile is retired; oracle data queries are disabled`. You must migrate to one of the third-party oracle providers, such as [Chainlink](/evm/oracles/chainlink), [Pyth](/evm/oracles/pyth-network), [Redstone](/evm/oracles/redstone), or [API3](/evm/oracles/api3).
+**Retired as of v6.4.0:** Migrate to a third-party oracle provider, such as [Chainlink](/evm/oracles/chainlink), [Pyth](/evm/oracles/pyth-network), [RedStone](/evm/oracles/redstone), or [API3](/evm/oracles/api3). The native Sei Oracle precompile is retired, and on-chain oracle data queries are disabled. A call to `getExchangeRates` or `getOracleTwaps` reverts with the error `oracle precompile is retired; oracle data queries are disabled`.
diff --git a/evm/precompiles/p256-precompile.mdx b/evm/precompiles/p256-precompile.mdx
index 0005063..3b571ef 100644
--- a/evm/precompiles/p256-precompile.mdx
+++ b/evm/precompiles/p256-precompile.mdx
@@ -4,21 +4,21 @@ sidebarTitle: 'P256'
description: 'Use the P256 precompile to verify secp256r1/P-256 signatures directly from EVM smart contracts, enabling efficient passkey-based authentication and signature verification.'
keywords: ['p256 precompile', 'secp256r1', 'signature verification', 'passkey', 'webauthn', 'secure enclave']
---
-**Address**: `0x0000000000000000000000000000000000001011`
+**Address:** `0x0000000000000000000000000000000000001011`
-This is the implementation of [RIP-7212](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md), which provides a precompiled contract for verifying signatures in the `secp256r1` or `P-256` elliptic curve.
+This precompile implements [RIP-7212](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md), which defines a precompiled contract to verify signatures on the `secp256r1` or `P-256` elliptic curve.
## Overview
-The P256 precompile enables efficient signature verification for the `secp256r1` curve, which is widely used in modern security systems including:
+The P256 precompile verifies signatures on the `secp256r1` curve efficiently. Many modern security systems use this curve, including:
- Apple's Secure Enclave
-- WebAuthn/FIDO2
+- WebAuthn and FIDO2
- Android Keychain
- Various hardware security modules (HSMs)
-- PassKeys
+- Passkeys
-This precompile implementation is significantly more gas efficient (up to 60x) compared to Solidity-based implementations.
+This precompile implementation is significantly more gas efficient than Solidity-based implementations (up to 60x).
## Interface
@@ -37,9 +37,9 @@ interface IP256VERIFY {
}
```
-## Implementation Library
+## Implementation library
-Here's a complete implementation of the P256 library that provides a convenient wrapper around the precompile:
+This is a complete implementation of the P256 library, a convenient wrapper around the precompile:
```solidity
// SPDX-License-Identifier: MIT
@@ -79,9 +79,9 @@ library P256 {
}
```
-## Basic Usage
+## Basic usage
-### Using the P256 Library
+### Using the P256 library
```solidity
// SPDX-License-Identifier: MIT
@@ -103,7 +103,7 @@ contract P256Example {
}
```
-### Direct Precompile Usage
+### Direct precompile usage
For more control, you can call the precompile directly:
@@ -142,15 +142,15 @@ contract P256Verifier {
}
```
-## Signature Format
+## Signature format
-The signature verification requires the following components:
+Signature verification requires these components:
- `digest`: 32 bytes of the signed data hash
- `signature`: Contains the r and s components of the signature
- `publicKey`: Contains the x and y coordinates of the public key
-The precompile expects these components to be encoded in a specific format:
+The precompile expects these components encoded in this format:
- First 32 bytes: message hash
- Next 32 bytes: `r` component of the signature
@@ -160,16 +160,16 @@ The precompile expects these components to be encoded in a specific format:
Total length: 160 bytes
-## Gas Costs
+## Gas costs
-The precompile is highly gas efficient compared to Solidity implementations. The exact gas cost per byte of verified data is set to `GasCostPerByte = 300`, which gives us:
+The precompile is much more gas efficient than Solidity implementations. The exact gas cost per byte of verified data is set to `GasCostPerByte = 300`. The results are:
-- **Total Cost**: 300 × 160 = **48,000 gas** per verification
+- **Total cost**: 300 × 160 = **48,000 gas** per verification
- **Efficiency**: Up to 60x more efficient than pure Solidity implementations
-## Real-World Use Cases
+## Real-world use cases
-### WebAuthn/PassKeys Authentication
+### WebAuthn/passkeys authentication
```solidity
pragma solidity ^0.8.0;
@@ -215,7 +215,7 @@ contract WebAuthnAuth {
}
```
-### Apple Secure Enclave Integration
+### Apple Secure Enclave integration
```solidity
contract SecureEnclaveAuth {
@@ -254,7 +254,7 @@ contract SecureEnclaveAuth {
}
```
-### Multi-Signature with Hardware Keys
+### Multi-signature with hardware keys
```solidity
contract HardwareMultiSig {
@@ -303,11 +303,11 @@ contract HardwareMultiSig {
}
```
-## Security Considerations
+## Security considerations
-**Important**: Always validate public keys and signature components before verification to prevent invalid curve point attacks.
+Always validate public keys and signature components before verification. This prevents invalid curve point attacks.
-### Public Key Validation
+### Public key validation
```solidity
function isValidPublicKey(bytes32 x, bytes32 y) internal pure returns (bool) {
@@ -320,9 +320,9 @@ function isValidPublicKey(bytes32 x, bytes32 y) internal pure returns (bool) {
}
```
-### Signature Malleability
+### Signature malleability
-P256 signatures can be malleable. If your application requires unique signatures, implement additional checks:
+P256 signatures can be malleable. If your application requires unique signatures, implement more checks:
```solidity
function isLowS(bytes32 s) internal pure returns (bool) {
@@ -332,9 +332,9 @@ function isLowS(bytes32 s) internal pure returns (bool) {
}
```
-## JavaScript Integration
+## JavaScript integration
-### Preparing Input Data
+### Preparing input data
```javascript
// Example: Preparing P256 verification input (ethers v6)
@@ -368,14 +368,14 @@ async function verifyP256Signature(provider, messageHash, signature, publicKey)
}
```
-## Error Handling
+## Error handling
-The P256 precompile returns no data on failure. Because `verify` is declared as returning `bytes`, a high-level Solidity interface call reverts when it tries to decode that empty return data — always use a low-level `staticcall` (as in the examples above) so invalid signatures resolve to `false` instead of reverting. Common failure cases include:
+The P256 precompile returns no data on failure. Because `verify` is declared to return `bytes`, a high-level Solidity interface call reverts when it tries to decode the empty return data. Always use a low-level `staticcall`, as the examples above do. Invalid signatures then resolve to `false` instead of reverting. Common failure cases include:
-1. **Invalid Input Length**: Input must be exactly 160 bytes
-2. **Invalid Public Key**: Point not on the P256 curve
-3. **Invalid Signature**: r or s values out of valid range
-4. **Verification Failure**: Signature doesn't match message and public key
+1. **Invalid input length**: The input must be exactly 160 bytes.
+2. **Invalid public key**: The point is not on the P256 curve.
+3. **Invalid signature**: The r or s values are out of the valid range.
+4. **Verification failure**: The signature does not match the message and public key.
```solidity
function safeVerifyP256(
@@ -409,7 +409,7 @@ function safeVerifyP256(
## Testing
-### Unit Tests
+### Unit tests
```solidity
contract P256Test {
@@ -434,11 +434,11 @@ contract P256Test {
}
```
-## Performance Considerations
+## Performance considerations
-- **Gas Efficiency**: 48,000 gas per verification vs 2M+ gas for Solidity implementations
-- **Batch Operations**: Consider batching multiple verifications in a single transaction
+- **Gas efficiency**: 48,000 gas per verification, compared to 2M gas or more for Solidity implementations
+- **Batch operations**: Consider batching multiple verifications in a single transaction
- **Caching**: Cache public keys on-chain to reduce calldata for repeated verifications
-- **Hardware Integration**: Particularly efficient for applications using hardware-backed keys
+- **Hardware integration**: Particularly efficient for applications that use hardware-backed keys
-View the complete P256 precompile ABI in the [Sei Chain v6.6.1 snapshot](https://github.com/sei-protocol/sei-chain/blob/v6.6.1/precompiles/p256/legacy/v66/abi.json), or browse the [implementation source](https://github.com/sei-protocol/sei-chain/tree/v6.6.1/precompiles/p256).
+View the complete P256 precompile ABI in the [sei-chain v6.6.1 snapshot](https://github.com/sei-protocol/sei-chain/blob/v6.6.1/precompiles/p256/legacy/v66/abi.json), or browse the [implementation source](https://github.com/sei-protocol/sei-chain/tree/v6.6.1/precompiles/p256).
diff --git a/evm/precompiles/staking.mdx b/evm/precompiles/staking.mdx
index 1e6cab6..8d6576e 100644
--- a/evm/precompiles/staking.mdx
+++ b/evm/precompiles/staking.mdx
@@ -8,41 +8,41 @@ keywords: ['staking precompile', 'ethers.js', 'delegation', 'validators', 'staki
**Address:** `0x0000000000000000000000000000000000001005`
-The Sei staking precompile allows EVM applications to interact directly with Sei's native staking module through standard smart contract calls. This enables delegation, undelegation, redelegation, validator management, and staking queries directly from your dApps without needing separate Cosmos SDK integration.
+The Sei staking precompile lets EVM applications interact directly with the Sei native staking module through standard smart contract calls. Your dApps can use it for delegation, undelegation, redelegation, validator management, and staking queries. They do not need a separate Cosmos SDK integration.
- **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.
+ **What is a precompile?** A precompile is a special smart contract that the Sei protocol itself deploys at a fixed address. It exposes custom native chain logic to EVM-based applications. To the EVM, it behaves like a regular contract, but it executes privileged, low-level logic efficiently.
-## How Does the Staking Precompile Work?
+## How does the staking precompile work?
-The staking precompile at address `0x0000000000000000000000000000000000001005` exposes a comprehensive set of staking functions including `delegate()`, `undelegate()`, `redelegate()`, `createValidator()`, `editValidator()`, and various query functions like `validators()`, `delegatorDelegations()`, `pool()`, and `params()`.
+The staking precompile at address `0x0000000000000000000000000000000000001005` exposes transaction functions such as `delegate()`, `undelegate()`, `redelegate()`, `createValidator()`, and `editValidator()`. It also exposes query functions such as `validators()`, `delegatorDelegations()`, `pool()`, and `params()`.
-- **Direct Integration:** EVM contracts and dApps can call staking functions like any other smart contract method.
-- **Native Execution:** Operations are executed at the Cosmos SDK level for maximum efficiency and security.
-- **Seamless Bridge:** No need for separate wallet integrations or complex cross-chain interactions.
-- **Event Emission:** Staking operations emit `Delegate`, `Undelegate`, `Redelegate`, `DelegationRewardsWithdrawn`, `ValidatorCreated`, and `ValidatorEdited`.
+- EVM contracts and dApps can call staking functions like any other smart contract method.
+- Operations run at the Cosmos SDK level, which makes them efficient and secure.
+- You do not need separate wallet integrations or complex cross-chain interactions.
+- Staking operations emit `Delegate`, `Undelegate`, `Redelegate`, `DelegationRewardsWithdrawn`, `ValidatorCreated`, and `ValidatorEdited` events.
-## Use Cases
+## Use cases
-- **DeFi Integration:** Build liquid staking protocols and yield farming strategies.
-- **Delegation Services:** Create user-friendly interfaces for staking operations.
-- **Portfolio Management:** Automate staking strategies and delegation rebalancing.
-- **Validator Management:** Create and manage validators programmatically.
+- **DeFi integration:** Build liquid staking protocols and yield farming strategies.
+- **Delegation services:** Create user-friendly interfaces for staking operations.
+- **Portfolio management:** Automate staking strategies and delegation rebalancing.
+- **Validator management:** Create and manage validators programmatically.
-## What You'll Learn in This Guide
+## What you'll learn in this guide
-By the end of this guide, you'll be able to:
+This guide shows how to:
-- **Integrate Staking Operations** - Call delegation, undelegation, and redelegation functions directly from your EVM contracts and dApps
-- **Handle Decimal Precision** - Master the critical precision patterns for different operations to avoid common formatting errors
-- **Create and Manage Validators** - Create new validators and edit their parameters programmatically
-- **Query Staking State** - Use the comprehensive query functions to fetch validators, delegations, unbonding info, pool statistics, and staking parameters
-- **Listen for Staking Events** - Track staking operations using emitted events for indexing and notifications
-- **Build Portfolio Tools** - Implement automated rebalancing and delegation tracking for staking management applications
-- **Navigate Staking Risks** - Understand unbonding periods, slashing mechanics, and validator selection for safe staking operations
+- Call delegation, undelegation, and redelegation functions directly from your EVM contracts and dApps
+- Use the correct decimal precision for each operation, to avoid common formatting errors
+- Create validators and edit their parameters programmatically
+- Use the query functions to fetch validators, delegations, unbonding information, pool statistics, and staking parameters
+- Listen for staking events, to track staking operations for indexing and notifications
+- Build portfolio tools for staking management applications, with automated rebalancing and delegation tracking
+- Understand unbonding periods, slashing mechanics, and validator selection, so that you can stake safely
## Events
-The staking precompile emits the following events:
+The staking precompile emits these events:
```solidity
/**
@@ -116,9 +116,9 @@ event ValidatorEdited(
);
```
-### Listening for Events
+### Listening for events
-You can listen for these events in your dApp to track staking operations:
+Your dApp can listen for these events to track staking operations:
```typescript
// Listen for delegation events
@@ -153,9 +153,9 @@ staking.on('ValidatorEdited', (editor, validatorAddress, moniker) => {
## Functions
-The staking precompile exposes the following functions:
+The staking precompile exposes these functions:
-### Transaction Functions
+### Transaction functions
```solidity
/// Delegates Sei to the specified validator.
@@ -221,7 +221,7 @@ function editValidator(
) external returns (bool success);
```
-### Query Functions
+### Query functions
```solidity
struct Delegation {
@@ -447,13 +447,13 @@ function params() external view returns (Params memory params);
-**Important Precision Note for `delegation()` Response:**
+**Precision in the `delegation()` response:**
-The response contains two different precision scales:
+The response uses two different precision scales:
-- `balance.amount`: **6 decimals** (usei) - the actual staked token amount
-- `delegation.shares`: **18 decimals** - the validator pool share amount
-- `delegation.decimals`: Always returns **18** (refers to shares precision, NOT balance)
+- `balance.amount`: The staked token amount, in **6 decimals** (usei)
+- `delegation.shares`: The amount of shares in the validator pool, in **18 decimals**
+- `delegation.decimals`: Always returns **18** (the precision of the shares, NOT of the balance)
To convert to SEI for display:
@@ -462,22 +462,22 @@ To convert to SEI for display:
-## Using the Precompile
+## Using the precompile
### Setup
#### Prerequisites
-Before getting started, ensure you have:
+Before you start, make sure that you have:
-- **Node.js** (v18 or higher)
-- **npm** or **yarn** package manager
-- **EVM-compatible wallet**
-- **SEI tokens** for gas and staking operations
+- Node.js (v18 or higher)
+- The npm or yarn package manager
+- An EVM-compatible wallet
+- SEI tokens for gas and staking operations
-#### Install Dependencies
+#### Install dependencies
-Install the required packages for interacting with Sei precompiles:
+Install the required packages to interact with Sei precompiles:
```bash
# Install ethers.js for smart contract interactions
@@ -487,7 +487,7 @@ npm install ethers
npm install @sei-js/precompiles@^3
```
-#### Import Precompile Components
+#### Import precompile components
```typescript
// Import Staking precompile address and ABI
@@ -496,9 +496,9 @@ import { STAKING_PRECOMPILE_ABI, STAKING_PRECOMPILE_ADDRESS } from '@sei-js/prec
import { ethers } from 'ethers';
```
- **Precompile Address:** The staking precompile is deployed at `0x0000000000000000000000000000000000001005`
+ **Precompile address:** The staking precompile is deployed at `0x0000000000000000000000000000000000001005`.
-### Contract Initialization
+### Contract initialization
Set up your provider, signer, and contract instance:
@@ -512,15 +512,15 @@ const signer = await provider.getSigner();
const staking = new ethers.Contract(STAKING_PRECOMPILE_ADDRESS, STAKING_PRECOMPILE_ABI, signer);
```
-## Critical: Understanding Decimal Precision
+## Critical: understanding decimal precision
-One of the most important concepts to understand when working with the Sei staking precompile:
+Decimal precision is one of the most important concepts to understand when you work with the Sei staking precompile.
-### Mixed Decimal Precision System
+### Mixed decimal precision system
-The staking precompile operates with **different decimal precision for different operations** due to bridging EVM and Cosmos standards:
+The staking precompile uses **different decimal precision for different operations**, because it bridges EVM and Cosmos standards:
-| Function | Input/Output | Decimal Precision | Example |
+| Function | Input/Output | Decimal precision | Example |
| --- | --- | --- | --- |
| **delegate()** | msg.value (input) | 18 decimals (wei) | `ethers.parseUnits('1', 18)` |
| **undelegate()** | amount (input) | 6 decimals (uSEI) | `1000000` (represents 1 SEI) |
@@ -533,7 +533,7 @@ The staking precompile operates with **different decimal precision for different
**Granularity for delegate():**
-`msg.value` is truncated to 6 decimals (uSEI). Always send amounts that are a multiple of `1e12` wei (last 12 digits zero) to avoid unintended truncation.
+To avoid unintended truncation, always send amounts that are a multiple of `1e12` wei (the last 12 digits are zero). The precompile truncates `msg.value` to 6 decimals (uSEI).
- OK: `1_000_000_000_000` wei (`0.000001000000` SEI)
- NOT OK: `1_000_000_000_001` wei (`0.000001000000000001` SEI)
@@ -546,31 +546,31 @@ Examples:
-### How This Works in Practice
+### How this works in practice
-**delegate() Function (Uses 18 decimals):**
+**delegate() function (uses 18 decimals):**
-- `delegate()` - accepts `msg.value` in wei (18 decimals)
+- `delegate()`: Accepts `msg.value` in wei (18 decimals)
-**undelegate() and redelegate() Functions (Use 6 decimals):**
+**undelegate() and redelegate() functions (use 6 decimals):**
-- `undelegate()` - expects amount parameter in 6 decimals (uSEI)
-- `redelegate()` - expects amount parameter in 6 decimals (uSEI)
+- `undelegate()`: Expects the amount parameter in 6 decimals (uSEI)
+- `redelegate()`: Expects the amount parameter in 6 decimals (uSEI)
-**Reading/Query Operations (Return 6 decimals):**
+**Read and query operations (return 6 decimals):**
-- `delegation()` - returns `balance.amount` in 6-decimal `uSEI` and `delegation.shares` in 18-decimal precision
-- Rewards are handled by the **Distribution precompile**: `rewards()` query returns 18-decimal `DecCoins`, while withdrawn amounts (events) are 6-decimal `uSEI`
+- `delegation()`: Returns `balance.amount` in 6-decimal `uSEI` and `delegation.shares` in 18-decimal precision
+- The **Distribution precompile** handles rewards. Its `rewards()` query returns 18-decimal `DecCoins`, but withdrawn amounts (events) are 6-decimal `uSEI`.
-### Why This Mixed System Exists
+### Why this mixed system exists
-1. **delegate() EVM Compatibility:** Uses standard 18-decimal wei format for EVM `msg.value` consistency
-2. **Other Operations Cosmos Integration:** `undelegate()` and `redelegate()` use 6-decimal uSEI precision to match native Cosmos operations
-3. **Staking Query Consistency:** Staking precompile query balances use 6-decimal `uSEI` (while `shares` is 18-decimal) for consistent reading
+1. **delegate() EVM compatibility:** Uses the standard 18-decimal wei format, for consistency with EVM `msg.value`
+2. **Cosmos integration for other operations:** `undelegate()` and `redelegate()` use 6-decimal uSEI precision to match native Cosmos operations
+3. **Staking query consistency:** Query balances in the staking precompile use 6-decimal `uSEI` (but `shares` is 18-decimal), for consistent reading
-### Best Practice: Different Conversion for Different Functions
+### Best practice: different conversion for different functions
-When working with user inputs, use the appropriate conversion for each function:
+When you work with user input, use the appropriate conversion for each function:
```typescript
// Best practice for handling user input amounts
@@ -595,13 +595,13 @@ const delegateAmount = prepareAmountForDelegate(userInputAmount); // 18 decimals
const undelegateAmount = prepareAmountForUndelegateRedelegate(userInputAmount); // 6 decimals
```
-### Normalization Guidelines (Clients and Indexers)
+### Normalization guidelines (clients and indexers)
- **Normalize to a single unit** for analytics and reconciliation:
- Display: convert to `SEI` (`wei / 1e18`, `uSEI / 1e6`)
- - Storage/aggregation: prefer `uSEI` (6 decimals)
-- **Reconciling delegate vs. undelegate/redelegate/rewards:** convert delegate `msg.value` from wei to uSEI using integer division by `1e12` (floor), which matches the precompile’s internal truncation.
-- **Enforce granularity at source:** construct `msg.value` as a multiple of `1e12` wei by formatting user input to 6 decimals prior to `parseUnits`.
+ - Storage and aggregation: prefer `uSEI` (6 decimals)
+- **Reconcile delegate amounts with undelegate, redelegate, and rewards amounts:** Convert the delegate `msg.value` from wei to uSEI with integer division by `1e12` (floor). This matches the internal truncation in the precompile.
+- **Enforce granularity at the source:** Construct `msg.value` as a multiple of `1e12` wei. To do this, format user input to 6 decimals before you call `parseUnits`.
```typescript
// Convert delegate msg.value (wei) to uSEI (6 decimals) for reconciliation
@@ -620,7 +620,7 @@ function normalizeWeiForDelegate(valueWei: bigint): bigint {
}
```
-## Decimal Conversion Helpers
+## Decimal conversion helpers
Use these helper functions to avoid precision errors:
@@ -654,9 +654,9 @@ const undelegateAmount = SeiAmountConverter.seiToUsei(0.5); // For undelegate()
const redelegateAmount = SeiAmountConverter.seiToUsei(2); // For redelegate() - 6 decimals
```
-## Step-by-Step Guide: Using the Staking Precompile
+## Step-by-step guide: Using the staking precompile
-### Delegate Tokens
+### Delegate tokens
@@ -694,7 +694,7 @@ function delegateToValidator(string memory validatorAddress) external payable {
-### Undelegate Tokens
+### Undelegate tokens
@@ -733,9 +733,9 @@ function undelegateFromValidator(
- **IMPORTANT:** Undelegated tokens are subject to a **21-day unbonding period** during which they cannot be transferred and do not earn rewards.
+ Undelegated tokens have a **21-day unbonding period**. During this period, you cannot transfer them, and they do not earn rewards.
-### Redelegate Tokens
+### Redelegate tokens
@@ -778,15 +778,15 @@ function redelegateBetweenValidators(
**Redelegation restrictions:**
-- Maximum 7 redelegations per validator pair per 21-day period
+- A maximum of 7 redelegations per validator pair in each 21-day period
-- After redelegating from Validator A to Validator B, you cannot redelegate from Validator B to another validator for 21 days
+- After you redelegate from Validator A to Validator B, you cannot redelegate from Validator B to another validator for 21 days
- Each redelegation has its own 21-day cooldown period
-### Query a Delegation
+### Query a delegation
@@ -833,9 +833,9 @@ function getDelegationInfo(
-### Create a Validator
+### Create a validator
- Creating a validator requires significant SEI for self-delegation and proper validator infrastructure setup. Only proceed if you understand the responsibilities of running a validator node.
+ Proceed only if you understand the responsibilities of running a validator node. To create a validator, you need significant SEI for self-delegation and a correctly configured validator infrastructure.
@@ -892,7 +892,7 @@ function createNewValidator(
-### Edit a Validator
+### Edit a validator
```typescript
// Update validator parameters
@@ -906,9 +906,9 @@ const receipt = await tx.wait();
console.log('Validator updated:', receipt);
```
-**Edit Validator Constraints:** - Commission can only be changed once every 24 hours - `minSelfDelegation` can only be increased, never decreased - Pass empty string `""` for `commissionRate` to keep current rate - Pass `0` for `minSelfDelegation` to keep current value
+**Edit validator constraints:** You can change the commission only once every 24 hours. You can only increase `minSelfDelegation`, never decrease it. To keep the current rate, pass an empty string `""` for `commissionRate`. To keep the current value, pass `0` for `minSelfDelegation`.
-### Query Validators
+### Query validators
```typescript
// Get all bonded validators
@@ -926,7 +926,7 @@ if (allValidators.nextKey.length > 0) {
}
```
-### Query a Specific Validator
+### Query a specific validator
```typescript
const validatorAddress = 'seivaloper1xyz...';
@@ -941,7 +941,7 @@ console.log('Validator details:', {
});
```
-### Query All Delegations for an Address
+### Query all delegations for an address
```typescript
const delegator = await signer.getAddress();
@@ -956,7 +956,7 @@ for (const del of myDelegations.delegations) {
}
```
-### Query Unbonding Delegations
+### Query unbonding delegations
```typescript
const delegator = await signer.getAddress();
@@ -978,7 +978,7 @@ const validatorAddress = 'seivaloper1xyz...';
const specificUnbonding = await staking.unbondingDelegation(delegator, validatorAddress);
```
-### Query Redelegations
+### Query redelegations
```typescript
// Get all redelegations for a specific delegator
@@ -1002,7 +1002,7 @@ for (const redel of redelegations.redelegations) {
}
```
-### Query Staking Pool and Parameters
+### Query staking pool and parameters
```typescript
// Get staking pool totals
@@ -1022,7 +1022,7 @@ console.log('Staking Parameters:', {
});
```
-### Query Historical Validator Info
+### Query historical validator info
```typescript
// Get validator set at a specific block height
@@ -1035,9 +1035,9 @@ for (const val of historicalInfo.validators) {
}
```
-## Advanced Usage Examples
+## Advanced usage examples
-### Portfolio Rebalancing
+### Portfolio rebalancing
```typescript
async function rebalanceStaking(
@@ -1062,7 +1062,7 @@ async function rebalanceStaking(
}
```
-### Complete Integration Example
+### Complete integration example
@@ -1125,7 +1125,7 @@ async function stakingExample() {
-**Contract Example**
+**Contract example**
```solidity
// SPDX-License-Identifier: MIT
@@ -1308,9 +1308,9 @@ contract StakingManager {
}
```
- **Note:** This is a simplified example for demonstration purposes. The above example works such that when someone delegates through the above contract, the delegation will be recorded under the above contract address and not the user. So maintain correct mapping in the contract for tracking user delegations
+ This is a simplified example for demonstration purposes. When someone delegates through this contract, the delegation is recorded under the contract address, not under the user's address. Maintain a correct mapping in the contract to track user delegations.
-**Client Integration Example**
+**Client integration example**
```javascript
import { network } from 'hardhat';
@@ -1372,30 +1372,30 @@ main().catch((error) => {
-## Security Considerations & Risks
+## Security considerations & risks
-### Unbonding Period
+### Unbonding period
-- **21-day lock:** Undelegated tokens cannot be transferred or earn rewards for 21 days
-- **No exceptions:** This cannot be canceled once initiated
-- **Planning:** Consider this when managing liquidity needs
+- **21-day lock:** For 21 days, undelegated tokens cannot be transferred and do not earn rewards.
+- **No exceptions:** After the unbonding starts, you cannot cancel it.
+- **Planning:** Consider the unbonding period when you manage liquidity needs.
-### Validator Selection Criteria
+### Validator selection criteria
-- **Commission Rate:** Lower commission means more rewards for you (typically 1-10%)
-- **Uptime:** Check for validators with high uptime (99%+)
+- **Commission rate:** Commission is typically 1% to 10%. A lower commission means more rewards for you.
+- **Uptime:** Look for validators with high uptime (99% or more).
-### Redelegation Complexity
+### Redelegation complexity
-- **7-transaction limit:** You can only redelegate from the same validator to the same destination validator 7 times in 21 days
-- **Serial blocking:** After redelegating A→B, you cannot redelegate B→C for 21 days
-- **Each redelegation starts its own 21-day timer**
+- **7-transaction limit:** You can redelegate from the same validator to the same destination validator only 7 times in 21 days.
+- **Serial blocking:** After you redelegate from A to B, you cannot redelegate from B to C for 21 days.
+- Each redelegation starts its own 21-day timer.
## Troubleshooting
-### Common Issues and Solutions
+### Common issues and solutions
-#### Gas-Related Issues
+#### Gas-related issues
```typescript
// Set appropriate gas limits for different operations
@@ -1405,57 +1405,57 @@ const delegateTx = await staking.delegate(validatorAddress, {
});
```
-### Error Code Reference
+### Error code reference
| Error | Cause | Solution |
| --- | --- | --- |
-| `insufficient funds` | Not enough SEI for operation | Check balance and reduce amount |
-| `validator does not exist` | Invalid validator address | Verify validator address format |
-| `invalid delegation amount` | Amount formatting issue | Use correct decimal precision |
-| `commission rate too high` | Commission above max rate | Lower commission rate |
-| `commission change too frequent` | Changing commission within 24h | Wait 24 hours between changes |
-| `self delegation too low` | Below minimum self-delegation | Increase self-delegation amount |
-| `too many redelegations` | Exceeded 7 redelegation limit | Wait for earliest redelegation to expire |
+| `insufficient funds` | Not enough SEI for the operation | Check the balance and reduce the amount |
+| `validator does not exist` | Invalid validator address | Verify the validator address format |
+| `invalid delegation amount` | Amount formatting issue | Use the correct decimal precision |
+| `commission rate too high` | Commission above the max rate | Lower the commission rate |
+| `commission change too frequent` | Commission changed within 24 hours | Wait 24 hours between changes |
+| `self delegation too low` | Below the minimum self-delegation | Increase the self-delegation amount |
+| `too many redelegations` | Exceeded the limit of 7 redelegations | Wait for the earliest redelegation to expire |
-## FAQ: Precision and Normalization
+## FAQ: precision and normalization
-- **What are the base units and precision standards defined for SEI across operations?**
- - `delegate()`: accepts `msg.value` in wei (18 decimals), but is internally truncated to 6-decimal `uSEI`. Effective granularity is 1 uSEI = `1e12` wei.
- - `undelegate()` / `redelegate()`: amounts use 6-decimal `uSEI`.
- - Staking queries: balances are 6-decimal `uSEI` (and shares are 18-decimal). Distribution `rewards()` query returns 18-decimal `DecCoins`, but withdrawn amounts are 6-decimal `uSEI`.
+- **What are the base units and precision standards for SEI across operations?**
+ - `delegate()`: Accepts `msg.value` in wei (18 decimals), but the precompile truncates it internally to 6-decimal `uSEI`. The effective granularity is 1 uSEI = `1e12` wei.
+ - `undelegate()` and `redelegate()`: Amounts use 6-decimal `uSEI`.
+ - Staking queries: Balances are 6-decimal `uSEI`, and shares are 18-decimal. The Distribution `rewards()` query returns 18-decimal `DecCoins`, but withdrawn amounts are 6-decimal `uSEI`.
- **Should applications normalize between 18 and 6 decimals?**
- - Yes. For reconciliation, convert delegate `wei` to `uSEI` via integer division by `1e12` (floor). For display, convert to SEI (`wei → /1e18`, `uSEI → /1e6`).
+ - Yes. For reconciliation, convert delegate `wei` to `uSEI` with integer division by `1e12` (floor). For display, convert to SEI (`wei → /1e18`, `uSEI → /1e6`).
- **Is this behavior consistent and intentional?**
- - Yes. This is intentional and not planned to change. Delegation uses EVM-native `msg.value` (18 decimals), while staking operations are executed in the Cosmos staking module, which uses 6-decimal `uSEI`.
-- **Why multiple decimal precisions on one chain?**
- - To bridge EVM conventions (18-decimal `msg.value`) with the Cosmos staking module’s native 6-decimal accounting while keeping queries and non-`delegate()` writes consistent at 6 decimals.
+ - Yes. This behavior is intentional, and there is no plan to change it. Delegation uses EVM-native `msg.value` (18 decimals). Staking operations run in the Cosmos staking module, which uses 6-decimal `uSEI`.
+- **Why does one chain use multiple decimal precisions?**
+ - The precompile bridges EVM conventions (18-decimal `msg.value`) and the native 6-decimal accounting of the Cosmos staking module. At the same time, queries and writes other than `delegate()` stay consistent at 6 decimals.
-## Important Notes
+## Important notes
- Remember the key rule: delegate() uses 18 decimals, undelegate()/redelegate() use 6 decimals, delegation() returns 6 decimals!
+ Remember this rule: delegate() uses 18 decimals, undelegate() and redelegate() use 6 decimals, and delegation() returns 6 decimals.
-### Decimal Precision
+### Decimal precision
- **delegate()** uses 18 decimals (wei) for msg.value
- **undelegate() and redelegate()** use 6 decimals (uSEI) for amount parameters
-- **Query results** return amounts in 6 decimal precision
-- **Best practice:** Use appropriate conversion functions for each operation
-- **Rewards/claims (Distribution precompile):** `rewards()` query returns 18-decimal `DecCoins`; withdrawn amounts (events) are 6-decimal `uSEI`
-- **Granularity:** `delegate()` `msg.value` must be a multiple of `1e12` wei (last 12 digits zero) because the precompile truncates to 6 decimals internally
+- **Query results** return amounts in 6-decimal precision
+- **Best practice:** Use the appropriate conversion function for each operation
+- **Rewards and claims (Distribution precompile):** The `rewards()` query returns 18-decimal `DecCoins`. Withdrawn amounts (events) are 6-decimal `uSEI`.
+- **Granularity:** The `msg.value` of `delegate()` must be a multiple of `1e12` wei (the last 12 digits are zero). The precompile truncates it to 6 decimals internally.
-### Validator Addresses
+### Validator addresses
-- Use valid Sei validator addresses with `seivaloper1...` prefix
-- These are Cosmos-format addresses, not EVM addresses
+- Use valid Sei validator addresses with the `seivaloper1...` prefix.
+- These are Cosmos-format addresses, not EVM addresses.
-### Staking Risks
+### Staking risks
-- **Unbonding:** 21-day waiting period for undelegated tokens
-- **Redelegation limits:** Complex rules around frequency and serial operations
+- **Unbonding:** A 21-day waiting period applies to undelegated tokens.
+- **Redelegation limits:** Complex rules apply to redelegation frequency and serial redelegations.
-### Commission and Rewards
+### Commission and rewards
-- Validators keep a commission percentage
-- Rewards are distributed proportionally to delegation amounts
-- Choose validators wisely based on commission, uptime, and governance participation
+- Validators keep a commission percentage.
+- Rewards are distributed in proportion to delegation amounts.
+- Choose validators based on commission, uptime, and governance participation.
diff --git a/evm/python-quickstart.mdx b/evm/python-quickstart.mdx
index 08c0c8b..437bab1 100644
--- a/evm/python-quickstart.mdx
+++ b/evm/python-quickstart.mdx
@@ -7,11 +7,11 @@ keywords: ['sei evm', 'python', 'web3.py', 'json-rpc', 'quickstart']
import { RunSnippet } from '/snippets/run-snippet.jsx';
-Sei is fully EVM-compatible, so any standard Ethereum client works — including Python's [web3.py](https://web3py.readthedocs.io). This guide connects to Sei from a Python script, reads chain data with no credentials, then signs and broadcasts a transaction.
+Sei is fully EVM-compatible, so any standard Ethereum client works with it, including Python's [web3.py](https://web3py.readthedocs.io). In this guide, you connect to Sei from a Python script and read chain data without credentials. Then you sign and broadcast a transaction.
## Install
-We recommend an isolated virtual environment:
+Use an isolated virtual environment:
```bash
python3 -m venv venv
@@ -19,9 +19,9 @@ source venv/bin/activate # Windows: venv\Scripts\activate
pip install web3
```
-## Reading Chain Data
+## Reading chain data
-This is the first milestone — it needs no private key.
+This is the first milestone. It does not need a private key.
```python
from web3 import Web3
@@ -38,7 +38,7 @@ print("Balance (SEI):", w3.from_wei(w3.eth.get_balance(address), "ether"))
print("Nonce:", w3.eth.get_transaction_count(address))
```
-**You're done when you see:**
+**You are done when you see:**
```text
Connected: True
@@ -48,13 +48,13 @@ Balance (SEI): 12.5
Nonce: 7
```
-Values are illustrative — your block number, and the queried address's balance and nonce, will differ. The EVM chain ID is always `1329` on Sei Mainnet and `1328` on Sei Testnet.
+The exact values are illustrative. Your block number will differ, and so will the balance and nonce of the queried address. The EVM chain ID is always `1329` on Sei Mainnet and `1328` on Sei Testnet.
## Try it live
-`web3.py` issues plain JSON-RPC under the hood — here are the same reads against Sei Mainnet, no Python required.
+`web3.py` sends plain JSON-RPC requests internally. These snippets send the same reads to Sei Mainnet, so you do not need Python to run them.
-
+
@@ -63,12 +63,12 @@ Values are illustrative — your block number, and the queried address's balance
params={['0x0000000000000000000000000000000000000000', 'latest']}
network="mainnet"
title="w3.eth.get_balance(address)"
- description="Wei balance of the example address — swap in your own. w3.from_wei(…, 'ether') converts it to SEI."
+ description="Wei balance of the example address. You can replace the example address with your own. w3.from_wei(…, 'ether') converts the balance to SEI."
/>
-## Sending a Transaction
+## Sending a transaction
-Next step — this requires a funded account. Get testnet SEI from the [faucet](/learn/faucet), then build, **sign locally**, and broadcast with `eth_sendRawTransaction`. Public RPC endpoints don't manage accounts, so you sign the transaction yourself rather than relying on node-managed accounts.
+This next step requires a funded account. Get testnet SEI from the [faucet](/learn/faucet). Then build the transaction, **sign it locally**, and broadcast it with `eth_sendRawTransaction`. Public RPC endpoints do not manage accounts, so you sign the transaction yourself instead of relying on node-managed accounts.
```python
import os
@@ -97,11 +97,11 @@ receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
print("Mined in block:", receipt.blockNumber) # final immediately — Sei has instant finality
```
-Never hard-code or commit a private key. Load it from an environment variable or a secrets manager, and use a dedicated throwaway key funded with only what you need.
+Never hard-code or commit a private key. Load it from an environment variable or a secrets manager. Use a dedicated throwaway key that holds only the funds you need.
-`signed.raw_transaction` is the attribute name in web3.py v7+. On web3.py v6 it is `signed.rawTransaction`.
+In web3.py v7+, the attribute name is `signed.raw_transaction`. In web3.py v6, it is `signed.rawTransaction`.
-## Reading a Contract
+## Reading a contract
```python
abi = [{
@@ -117,9 +117,9 @@ token = w3.eth.contract(address="0xTokenAddress", abi=abi)
print(token.functions.balanceOf(address).call())
```
-## Next Steps
+## Next steps
-- [viem Quickstart](/evm/evm-parity/examples/viem-quickstart) — the TypeScript/Node.js equivalent
-- [ethers v6 Quickstart](/evm/evm-parity/examples/ethers-quickstart) — TypeScript with ethers
-- [Network information](/evm/networks) — RPC endpoints, chain IDs, and explorers
-- [Faucet](/learn/faucet) — get testnet SEI
+- [viem Quickstart](/evm/evm-parity/examples/viem-quickstart): the TypeScript and Node.js equivalent
+- [ethers v6 Quickstart](/evm/evm-parity/examples/ethers-quickstart): TypeScript with ethers
+- [Network information](/evm/networks): RPC endpoints, chain IDs, and explorers
+- [Faucet](/learn/faucet): get testnet SEI
diff --git a/evm/querying-the-evm.mdx b/evm/querying-the-evm.mdx
index 04110e1..9c9d629 100644
--- a/evm/querying-the-evm.mdx
+++ b/evm/querying-the-evm.mdx
@@ -4,29 +4,29 @@ description: 'Read EVM state from the seid CLI: address associations, ERC20 read
keywords: ['seid query', 'evm query', 'erc20 balance', 'payload generation']
---
-The `seid q evm` subcommands let you read EVM state — token data, address associations, and transactions — without sending a transaction or running your own node.
+The `seid q evm` subcommands let you read EVM state (token data, address associations, and transactions). You do not need to send a transaction or run your own node.
## Prerequisites
-If your machine is **not running a Sei node**, append the `--node` flag to every `seid q evm` command, pointing at a Sei Cosmos RPC endpoint (the same kind used by `seid status`):
+If your machine does not run a Sei node, append the `--node` flag to every `seid q evm` command. Point it at a Sei Cosmos RPC endpoint, the same kind that `seid status` uses:
```bash
--node https://
```
-The one exception is `seid q evm tx`, which uses `--evm-rpc` to point at an EVM JSON-RPC endpoint (port 8545 by convention). See [Transaction Lookup](#transaction-lookup) below.
+The one exception is `seid q evm tx`, which uses `--evm-rpc` to point at an EVM JSON-RPC endpoint (port 8545 by convention). See [Transaction lookup](#transaction-lookup) below.
-Refer to the [RPC endpoints](/evm/networks) page for a list of available RPC endpoints.
+For a list of available RPC endpoints, see [RPC endpoints](/evm/networks).
-**Output format.** Most commands print YAML by default. Pass `-o json` for JSON. ERC20 read methods (`name`, `balanceOf`, …) return a bare value with no formatting — the result below is the raw stdout.
+**Output format.** Most commands print YAML by default. To get JSON, pass `-o json`. ERC20 read methods (such as `name` and `balanceOf`) return a bare value with no formatting. The output shown below is the raw stdout.
-## Address Mapping
+## Address mapping
-Sei addresses (`sei1…`) and EVM addresses (`0x…`) are linked via an on-chain association set the first time an account signs an EVM transaction or calls the address-association precompile. Until then, the two address spaces are independent.
+Sei addresses (`sei1…`) and EVM addresses (`0x…`) are linked through an on-chain association. The association is set the first time an account signs an EVM transaction or calls the address-association precompile. Until then, the two address spaces are independent.
-### Get Sei Address from EVM Address
+### Get Sei address from EVM address
```bash
seid q evm sei-addr [evm address]
@@ -45,7 +45,7 @@ associated: true
sei_address: sei13ytysxs88z0fp9cssagg77ekpecrrlrwce9pwl
```
-### Get EVM Address from Sei Address
+### Get EVM address from Sei address
```bash
seid q evm evm-addr [sei address]
@@ -64,9 +64,9 @@ associated: true
evm_address: 0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55
```
-If the account hasn't been associated yet, `associated` is `false` and the other field is empty. This is normal for accounts that have only ever transacted on one side of the chain.
+If the account is not associated yet, `associated` is `false`, and the other field is empty. This is normal for accounts that have transacted on only one side of the chain.
-## ERC20 Contract Queries
+## ERC20 contract queries
Call standard view methods on any ERC20 contract:
@@ -74,7 +74,7 @@ Call standard view methods on any ERC20 contract:
seid q evm erc20 [contract address] [method] [arguments...]
```
-**Example — query Wrapped Sei (`WSEI`):**
+**Example query for Wrapped Sei (`WSEI`):**
```bash
seid q evm erc20 0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7 symbol
@@ -86,13 +86,13 @@ seid q evm erc20 0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7 symbol
WSEI
```
-**Example — balance:**
+**Example balance query:**
```bash
seid q evm erc20 0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7 balanceOf 0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55
```
-**Output (raw integer, in smallest unit):**
+**Output (raw integer, in the smallest unit):**
```
0
@@ -101,23 +101,23 @@ seid q evm erc20 0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7 balanceOf 0xDa52B9E6
**Supported methods:**
-- `name` — token name
-- `symbol` — token symbol
-- `decimals` — token decimals
-- `totalSupply` — total supply
-- `balanceOf [address]` — balance of an address
-- `allowance [owner] [spender]` — current allowance
+- `name`: token name
+- `symbol`: token symbol
+- `decimals`: token decimals
+- `totalSupply`: total supply
+- `balanceOf [address]`: balance of an address
+- `allowance [owner] [spender]`: current allowance
For arbitrary methods or non-standard contracts, use [`payload`](#custom-abi) with the contract ABI.
-## Payload Generation
+## Payload generation
-Generate ABI-encoded call data without sending a transaction. Useful for crafting `seid tx evm call-contract` calls or inspecting expected calldata.
+These commands generate ABI-encoded calldata without sending a transaction. They are useful when you build `seid tx evm call-contract` calls or inspect expected calldata.
- ### ERC20 Payload Generation
+ ### ERC20 payload generation
```bash
seid q evm erc20-payload [method] [arguments...]
@@ -133,7 +133,7 @@ Generate ABI-encoded call data without sending a transaction. Useful for craftin
a9059cbb000000000000000000000000da52b9e673d1f48fcd9916b3f606a136a8ea5e550000000000000000000000000000000000000000000000000de0b6b3a7640000
```
- **Approve spender:**
+ **Approve a spender:**
```bash
seid q evm erc20-payload approve 0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55 2000000000000000000
```
@@ -143,7 +143,7 @@ Generate ABI-encoded call data without sending a transaction. Useful for craftin
095ea7b3000000000000000000000000da52b9e673d1f48fcd9916b3f606a136a8ea5e550000000000000000000000000000000000000000000000001bc16d674ec80000
```
- **Transfer from (pulls tokens from `from` to `to`, using a prior `approve`):**
+ **Transfer from (pulls tokens from `from` to `to`, based on an earlier `approve`):**
```bash
seid q evm erc20-payload transferFrom 0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55 0xdEAD000000000000000042069420694206942069 1500000000000000000
```
@@ -159,13 +159,13 @@ Generate ABI-encoded call data without sending a transaction. Useful for craftin
- `approve [spender] [amount]`
- `transferFrom [from] [to] [amount]`
- Amounts are in the token's smallest unit (e.g., wei for an 18-decimal token; `1000000` for 1 USDC with 6 decimals).
+ Amounts are in the token's smallest unit: for example, wei for an 18-decimal token, or `1000000` for 1 USDC with 6 decimals.
- ### ERC721 Payload Generation
+ ### ERC721 payload generation
```bash
seid q evm erc721-payload [method] [arguments...]
@@ -211,7 +211,7 @@ Generate ABI-encoded call data without sending a transaction. Useful for craftin
- ### ERC1155 Payload Generation
+ ### ERC1155 payload generation
```bash
seid q evm erc1155-payload [method] [arguments...]
@@ -243,15 +243,15 @@ Generate ABI-encoded call data without sending a transaction. Useful for craftin
- `safeBatchTransferFrom [from] [to] [tokenIds] [amounts] [data]`
- `setApprovalForAll [operator] [true|false]`
- For batch operations, pass arrays as quoted bracketed strings: `"[123,456]"`. The trailing `data` field is a hex string (use `0x` for empty).
+ For batch operations, pass arrays as quoted bracketed strings: `"[123,456]"`. The trailing `data` field is a hex string (use `0x` for empty data).
- ### Custom ABI Payload Generation
+ ### Custom ABI payload generation
- Encode a call against any contract by supplying its ABI:
+ To encode a call against any contract, supply its ABI:
```bash
seid q evm payload [abi-filepath] [method] [arguments...]
@@ -263,21 +263,21 @@ Generate ABI-encoded call data without sending a transaction. Useful for craftin
```
- The ABI file must be a JSON array of function definitions, in the same shape Hardhat/Foundry emit (the `abi` field of an artifact, not the whole artifact).
+ The ABI file must be a JSON array of function definitions. It must have the same shape that Hardhat and Foundry emit: the `abi` field of an artifact, not the whole artifact.
-## Pointer System
+## Pointer system
-Pointers bridge the EVM and CosmWasm sides of Sei: a CW20 can be exposed as an ERC20 (via an EVM pointer at a `0x` address) and an ERC20 can be exposed as a CW20 (via a CW pointer at a `sei1…` address). The same applies to NFTs (CW721/ERC721) and multi-token contracts (CW1155/ERC1155).
+Pointers bridge the EVM and CosmWasm sides of Sei. A CW20 can be exposed as an ERC20 through an EVM pointer at a `0x` address. An ERC20 can be exposed as a CW20 through a CW pointer at a `sei1…` address. The same applies to NFTs (CW721 and ERC721) and multi-token contracts (CW1155 and ERC1155).
-## Transaction Lookup
+## Transaction lookup
-### Query Transaction by Hash
+### Query transaction by hash
-Equivalent to `eth_getTransactionByHash`:
+This command is equivalent to `eth_getTransactionByHash`:
```bash
seid q evm tx [hash] --evm-rpc [EVM RPC endpoint]
@@ -318,12 +318,12 @@ seid q evm tx 0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14
```
-This is the only `seid q evm` command that takes `--evm-rpc` (an **EVM JSON-RPC** endpoint, typically port 8545) instead of `--node` (a Cosmos RPC). The default if you omit the flag is `http://0.0.0.0:8545`, which only works if you're running a local node. See [RPC endpoints](/evm/networks) for hosted EVM RPCs.
+This is the only `seid q evm` command that takes `--evm-rpc` (an EVM JSON-RPC endpoint, typically port 8545) instead of `--node` (a Cosmos RPC). If you omit the flag, the default is `http://0.0.0.0:8545`, which works only if you run a local node. For hosted EVM RPC endpoints, see [RPC endpoints](/evm/networks).
-## Common Use Cases
+## Common use cases
-### Check Token Balance and Info
+### Check token balance and info
```bash
# Token metadata
@@ -334,7 +334,7 @@ seid q evm erc20 0xtoken... decimals
seid q evm erc20 0xtoken... balanceOf 0xuser...
```
-### Prepare and Send a Transaction
+### Prepare and send a transaction
```bash
# 1. Encode the calldata
diff --git a/evm/reference.mdx b/evm/reference.mdx
index 3aace4d..1fb73ef 100644
--- a/evm/reference.mdx
+++ b/evm/reference.mdx
@@ -7,42 +7,42 @@ keywords: ['json-rpc', 'api reference', 'evm endpoints', 'blockchain api', 'sei
import { RPCMethodsViewer } from '/snippets/rpc-methods-viewer.jsx';
-Sei fully supports the standard Ethereum JSON-RPC API, so existing EVM tooling (ethers.js, viem, Hardhat, Foundry, etc.) works out of the box. Use the explorer below to browse every method Sei exposes, inspect parameters, run requests against a live endpoint, and copy ready-to-use snippets in a range of popular languages. The authoritative prose for the request format, the remaining deprecated `sei_*` extensions, and address resolution follows underneath.
+Sei fully supports the standard Ethereum JSON-RPC API, so existing EVM tools (ethers.js, viem, Hardhat, Foundry, and others) work without changes. Use the explorer below to browse every method that Sei exposes and inspect its parameters. You can also run requests against a live endpoint and copy ready-to-use snippets in a range of popular languages. The text below the explorer is the authoritative reference for the request format, the remaining deprecated `sei_*` extensions, and address resolution.
-By default the explorer lists only the available, current methods. Each is labelled with one of three statuses:
+By default, the explorer lists only the current methods that are available. Each method has one of three status labels:
-- **Supported** — registered with a full implementation and standard Ethereum behavior.
-- **Limited** — callable, but returns a static value or has a Sei-specific caveat (shown in the method's **Sei-specific behavior** note). Examples: `eth_coinbase` returns the fee-collector address and `eth_getProof` returns an IAVL proof.
-- **Unavailable** — not registered, explicitly errors, or not applicable to Sei's architecture. This includes blob methods (`eth_blobBaseFee`), proof-of-work and uncle methods, and the `admin`/`miner`/`clique`/`engine`/`les`/`personal` namespaces.
+- **Supported**: The method is registered and has a full implementation with standard Ethereum behavior.
+- **Limited**: The method is callable, but it returns a static value or has a Sei-specific caveat (shown in the method's **Sei-specific behavior** note). For example, `eth_coinbase` returns the fee-collector address, and `eth_getProof` returns an IAVL proof.
+- **Unavailable**: The method is not registered, returns an explicit error, or does not apply to Sei's architecture. This includes blob methods (`eth_blobBaseFee`), proof-of-work and uncle methods, and the `admin`, `miner`, `clique`, `engine`, `les`, and `personal` namespaces.
-The remaining deprecated `sei_*` extensions and the unavailable methods are hidden by default. Enable **Show deprecated & unavailable methods** to browse them. The deprecated extensions are also documented under [Sei custom endpoints](#sei-custom-endpoints).
+By default, the explorer hides the remaining deprecated `sei_*` extensions and the unavailable methods. To browse them, enable **Show deprecated & unavailable methods**. The deprecated extensions are also documented under [Sei custom endpoints](#sei-custom-endpoints).
## Overview
-Sei supports the [Ethereum JSON-RPC API](https://ethereum.org/en/developers/docs/apis/json-rpc/) with some Sei-specific extensions to support cross-VM operations, synthetic transactions, and other advanced features. Because Sei has [instant finality](/evm/differences-with-ethereum#finality), the `safe`, `finalized`, and `latest` block tags all resolve to the same (latest committed) block.
+Sei supports the [Ethereum JSON-RPC API](https://ethereum.org/en/developers/docs/apis/json-rpc/). It also has some Sei-specific extensions for cross-VM operations, synthetic transactions, and other advanced features. Because Sei has [instant finality](/evm/differences-with-ethereum#finality), the `safe`, `finalized`, and `latest` block tags all resolve to the same (latest committed) block.
All endpoints follow the standard JSON-RPC format:
-
-**Request Format**
+
+**Request format**
-- HTTP method: always "`POST`"
+- HTTP method: always `POST`
- Header: `accept: application/json`
- Header: `content-type: application/json`
- Body (JSON):
- `id`: an arbitrary string identifier
- `jsonrpc`: always "2.0"
- - `method`: endpoint name (e.g. "eth_sendRawTransaction")
+ - `method`: endpoint name (for example, `eth_sendRawTransaction`)
- `params`: an array that differs from endpoint to endpoint
-**Response Format**
+**Response format**
- Body (JSON):
- - `id`: the same identifier in request
+ - `id`: the same identifier as in the request
- `jsonrpc`: always "2.0"
- `result`: an object that differs from endpoint to endpoint
- `error` (if applicable): error details
@@ -56,17 +56,17 @@ All endpoints follow the standard JSON-RPC format:
| Sei Mainnet | `1329` (`0x531`) | `https://evm-rpc.sei-apis.com` | `wss://evm-ws.sei-apis.com` |
| Sei Testnet | `1328` (`0x530`) | `https://evm-rpc-testnet.sei-apis.com` | `wss://evm-ws-testnet.sei-apis.com` |
-For additional public and commercial endpoints, see [RPC providers](/learn/rpc-providers) and [Chains & endpoints](/learn/dev-chains).
+For more public and commercial endpoints, see [RPC providers](/learn/rpc-providers) and [Chains & endpoints](/learn/dev-chains).
### Tendermint `/status` endpoint
-Alongside the EVM JSON-RPC surface, Sei nodes expose the underlying Tendermint/CometBFT RPC, including the `/status` endpoint. Its `SyncInfo` object reports a `last_committed_block_height` field: the height of the last block finalized by consensus.
+In addition to the EVM JSON-RPC surface, Sei nodes expose the underlying Tendermint (CometBFT) RPC, including the `/status` endpoint. Its `SyncInfo` object reports a `last_committed_block_height` field: the height of the last block finalized by consensus.
```bash
curl -s $SEI_TENDERMINT_RPC/status | jq '.result.sync_info.last_committed_block_height'
```
-The field is JSON-serialized as a string (`last_committed_block_height`), matching the other height fields in `SyncInfo`.
+The field is serialized to JSON as a string (`last_committed_block_height`), like the other height fields in `SyncInfo`.
| Field | JSON | Description |
| :- | :- | :- |
@@ -74,55 +74,62 @@ The field is JSON-serialized as a string (`last_committed_block_height`), matchi
**Consensus-engine behavior:**
-- **Under CometBFT** — commit and app-apply happen in a single step, so `last_committed_block_height` is guaranteed to equal `latest_block_height`.
-- **Under Autobahn** — the value is derived from the latest `CommitQC`. Because consensus finalizes a block before the app executes it, the invariant is `last_committed_block_height >= latest_block_height`; the two can briefly differ while the app catches up.
+- **Under CometBFT**: Commit and app-apply happen in a single step, so `last_committed_block_height` is guaranteed to equal `latest_block_height`.
+- **Under Autobahn**: The value is derived from the latest `CommitQC`. Consensus finalizes a block before the app executes it, so the invariant is `last_committed_block_height >= latest_block_height`. The two values can differ for a short time while the app catches up.
-**`validator_info` shape.** The `/status` response's `validator_info` object always includes both a `pub_key` and an `address` field. On nodes that are not validators, `pub_key` is a zero (empty) public key with `address` derived from it and `voting_power` is `0`, rather than the fields being omitted — a stable response shape so clients like CosmJS can parse `/status` without special-casing non-validator nodes. On validator nodes, `pub_key` and `voting_power` carry the real values.
+**`validator_info` shape.** The `validator_info` object in the `/status` response always includes both a `pub_key` and an `address` field. On nodes that are not validators, the response does not omit these fields. Instead, `pub_key` is a zero (empty) public key, `address` is derived from it, and `voting_power` is `0`. This keeps the response shape stable, so clients like CosmJS can parse `/status` without special handling for non-validator nodes. On validator nodes, `pub_key` and `voting_power` carry the real values.
-Under Autobahn (`AutobahnConfigFile` set) the CometBFT block store is not populated, so `/status` derives `latest_block_height` and `latest_app_hash` from the app layer (`ABCIInfo`) instead of the block store. Several other `SyncInfo` fields (block hash/time, earliest-block metadata, `catching_up`, and peer-height fields) remain unpopulated in this mode.
+Under Autobahn (`AutobahnConfigFile` set), the CometBFT block store is not populated. For this reason, `/status` derives `latest_block_height` and `latest_app_hash` from the app layer (`ABCIInfo`), not from the block store. Several other `SyncInfo` fields are also not populated in this mode: block hash and time, earliest-block metadata, `catching_up`, and the peer-height fields.
### Tendermint block and validator endpoints under Autobahn
-Under Autobahn (`AutobahnConfigFile` set) the CometBFT `BlockStore` and `StateStore` are not populated. Rather than returning empty or failing responses, the `/block` and `/block_by_hash` Tendermint RPC endpoints route through the GigaRouter's in-memory state (the finalized global blocks retained by the Autobahn data layer), while `/block_results` and `/validators` synthesize their responses (an empty result set and the genesis committee, respectively). This keeps downstream consumers — including evmrpc, block explorers, and monitoring tooling — working without individually branching on the consensus engine.
+Under Autobahn (`AutobahnConfigFile` set), the CometBFT `BlockStore` and `StateStore` are not populated. These Tendermint RPC endpoints do not return empty or failing responses in this mode. Instead:
-For `/block` and `/block_by_hash`, responses are served only for heights still inside Autobahn's retained window (heights pruned per `RetainHeight` are no longer available); `/block_results` and `/validators` do not read the retained block data and respond for any height up to the current ABCI head. Requests are validated against the current ABCI head, so heights above it return the same `ErrHeightExceedsChainHead`-class errors as the CometBFT path, and pruned heights on `/block` return `ErrHeightNotAvailable`.
+- `/block` and `/block_by_hash` route through the GigaRouter's in-memory state (the finalized global blocks that the Autobahn data layer retains).
+- `/block_results` and `/validators` synthesize their responses (an empty result set and the genesis committee, respectively).
+
+This keeps downstream consumers, including evmrpc, block explorers, and monitoring tools, working without each one branching on the consensus engine.
+
+`/block` and `/block_by_hash` serve responses only for heights that are still inside Autobahn's retained window. Heights pruned per `RetainHeight` are no longer available. `/block_results` and `/validators` do not read the retained block data. They respond for any height up to the current ABCI head. Requests are validated against the current ABCI head, so heights above it return the same `ErrHeightExceedsChainHead`-class errors as the CometBFT path. Pruned heights on `/block` return `ErrHeightNotAvailable`.
| Endpoint | Autobahn behavior |
| :- | :- |
-| `/block` | Returns the fully-populated translated block at the requested height: `BlockID.Hash` (the Autobahn header hash), the header (`ChainID`, `Height`, `Time`), and `Data.Txs`. Other header fields (`AppHash`, `ProposerAddress`, `LastCommit`, …) stay at zero values. |
-| `/block_by_hash` | Resolves the block by its Autobahn header hash via an in-memory hash index. An unknown or wrong-size hash returns `{Block: nil}` with no error, matching CometBFT semantics for a missing block. |
-| `/block_results` | Returns a valid-but-empty `ResultBlockResults` at the requested height. `ConsensusParamUpdates.Block.MaxGas` is populated from the producer config; `TxsResults` (per-tx `ExecTxResult` details) is intentionally empty because `FinalizeBlock` responses are not persisted under Autobahn. |
-| `/validators` | Returns the genesis committee for any height up to the current ABCI head — the committee is fixed at genesis under Autobahn (no validator-updates path), and the endpoint does not read the retained block data, so pruned heights still answer. `block_height` matches the requested height, and pagination (`page`/`per_page`) behaves the same as the CometBFT path. |
+| `/block` | Returns the fully populated translated block at the requested height: `BlockID.Hash` (the Autobahn header hash), the header (`ChainID`, `Height`, `Time`), and `Data.Txs`. Other header fields, such as `AppHash`, `ProposerAddress`, and `LastCommit`, stay at zero values. |
+| `/block_by_hash` | Resolves the block by its Autobahn header hash through an in-memory hash index. An unknown or wrong-size hash returns `{Block: nil}` with no error. This matches CometBFT semantics for a missing block. |
+| `/block_results` | Returns a valid but empty `ResultBlockResults` at the requested height. `ConsensusParamUpdates.Block.MaxGas` is populated from the producer config. `TxsResults` (per-transaction `ExecTxResult` details) is empty on purpose, because `FinalizeBlock` responses are not persisted under Autobahn. |
+| `/validators` | Returns the genesis committee for any height up to the current ABCI head. Under Autobahn, the committee is fixed at genesis (there is no validator-updates path). The endpoint does not read the retained block data, so pruned heights still answer. `block_height` matches the requested height. Pagination (`page` and `per_page`) behaves the same as on the CometBFT path. |
-Because `FinalizeBlock` responses are not stored on disk under Autobahn, `/block_results` cannot surface per-transaction execution results (`TxsResults` is empty). For per-transaction EVM data, use the EVM JSON-RPC methods (`eth_getTransactionReceipt`, `eth_getBlockReceipts`) instead.
+Because `FinalizeBlock` responses are not stored on disk under Autobahn, `/block_results` cannot return per-transaction execution results (`TxsResults` is empty). For per-transaction EVM data, use the EVM JSON-RPC methods `eth_getTransactionReceipt` and `eth_getBlockReceipts` instead.
### Filter and subscription limits
-Log filters (`eth_getLogs`, `eth_getFilterLogs`) are subject to the following limits by default:
+By default, log filters (`eth_getLogs`, `eth_getFilterLogs`) have these limits:
- **Open-ended block range:** up to 10,000 logs in one response
-- **Close-ended block range:** up to 2,000 blocks to query over
+- **Close-ended block range:** up to 2,000 blocks in one query
-Real-time subscriptions (`eth_subscribe` for `newHeads` and `logs`) are available over WebSocket only. See [WebSocket connections](/evm/evm-parity/websocket) for transport details.
+Real-time subscriptions (`eth_subscribe` for `newHeads` and `logs`) are available over WebSocket only. For transport details, see [WebSocket connections](/evm/evm-parity/websocket).
## Standard Ethereum endpoints
-Every method below is also browsable interactively in the explorer above; this section is the static, copy-friendly reference. Methods are grouped by purpose and labelled with their Sei support status. Block parameters accept a hex number or one of the tags `latest`, `earliest`, `pending`, `safe`, or `finalized`. On Sei, `safe`, `finalized`, and `latest` all resolve to the latest committed block due to [instant finality](/evm/differences-with-ethereum#finality). The remaining deprecated `sei_*` extensions are documented separately under [Sei custom endpoints](#sei-custom-endpoints).
+You can also browse every method below in the interactive explorer above. This section is the static, copy-friendly reference. Methods are grouped by purpose and labeled with their Sei support status. Block parameters accept a hex number or one of the tags `latest`, `earliest`, `pending`, `safe`, or `finalized`. On Sei, `safe`, `finalized`, and `latest` all resolve to the latest committed block because of [instant finality](/evm/differences-with-ethereum#finality). The remaining deprecated `sei_*` extensions are documented separately under [Sei custom endpoints](#sei-custom-endpoints).
#### `eth_sendRawTransaction`
**Supported.** Submits a signed, RLP-encoded raw EVM transaction to the network and returns its hash.
-**Sei-specific behavior:** Decodes to an ethtypes.Transaction, wraps it in a Cosmos MsgEVMTransaction, and broadcasts via CometBFT (CheckTx-level BroadcastTx, i.e. `broadcast_tx_sync`, by default; slow mode uses BroadcastTxCommit). Non-zero CheckTx codes surface as ABCI errors, not geth mempool errors. Legacy (non-1559) txs must set gasPrice at or above the governance minimum (currently 50 gwei on mainnet); blob (EIP-4844) txs are not enabled. Supports per-sender EvmProxy forwarding.
+**Sei-specific behavior:** Decodes the bytes to an ethtypes.Transaction, wraps it in a Cosmos MsgEVMTransaction, and broadcasts it through CometBFT. By default, it uses a CheckTx-level BroadcastTx (that is, `broadcast_tx_sync`), and slow mode uses BroadcastTxCommit. Non-zero CheckTx codes are returned as ABCI errors, not geth mempool errors. Legacy (non-1559) transactions must set gasPrice at or above the governance minimum (currently 50 gwei on Sei Mainnet). Blob (EIP-4844) transactions are not enabled. The method supports per-sender EvmProxy forwarding.
+
+**Under Autobahn (`AutobahnConfigFile` set):** Transaction broadcast routes through Autobahn's producer-backed mempool instead of CometBFT's `TxMempool`. This mempool admits EVM transactions strictly in sequential nonce order for each sender. It rejects a transaction with a bad-nonce error if its nonce does not match the sender's next expected nonce. Senders must therefore submit nonces contiguously.
-**Under Autobahn (`AutobahnConfigFile` set):** transaction broadcast routes through Autobahn's producer-backed mempool instead of CometBFT's `TxMempool`. This mempool admits EVM transactions strictly in sequential per-sender nonce order: a transaction whose nonce does not match the sender's next expected nonce is rejected with a bad-nonce error, so senders must submit nonces contiguously. The default CheckTx-synchronous broadcast (`broadcast_tx_sync`, the same path named above) blocks while the mempool is full and only returns once capacity is available — meaning a default `eth_sendRawTransaction` under Autobahn can stall for as long as the mempool stays full — whereas the async path (`broadcast_tx_async`) may silently drop the transaction instead. The `unsafe_flush_mempool` Tendermint RPC endpoint is not supported under Autobahn and returns `unsafe_flush_mempool is not supported with autobahn mempool`.
+Under Autobahn, the default CheckTx-synchronous broadcast (`broadcast_tx_sync`, the same path named above) blocks while the mempool is full. It returns only after capacity is available. As a result, a default `eth_sendRawTransaction` call can stall for as long as the mempool stays full. The async path (`broadcast_tx_async`) may silently drop the transaction instead. The `unsafe_flush_mempool` Tendermint RPC endpoint is not supported under Autobahn and returns `unsafe_flush_mempool is not supported with autobahn mempool`.
**Parameters:**
@@ -145,15 +152,15 @@ Every method below is also browsable interactively in the explorer above; this s
#### `eth_sendTransaction`
-**Limited.** Signs (with a node-hosted key) and submits a transaction in one call.
+**Limited.** Signs a transaction with a node-hosted key and submits it in one call.
-**Sei-specific behavior:** Requires the 'from' address's private key in the node's local test keyring; production/public RPC nodes hold no hosted keys, so this returns 'from address does not have hosted key'. Always signs as LegacyTxType. Sign client-side and use eth_sendRawTransaction instead.
+**Sei-specific behavior:** Requires the private key of the 'from' address in the node's local test keyring. Production and public RPC nodes hold no hosted keys, so on those nodes this method returns 'from address does not have hosted key'. Always signs as LegacyTxType. Sign client-side and use `eth_sendRawTransaction` instead.
**Parameters:**
| # | Name | Type | Description |
| :- | :- | :- | :- |
-| 1 | `args` | object | Transaction object (from, to, value, data, gas, nonce, etc.). |
+| 1 | `args` | object | Transaction object (from, to, value, data, gas, nonce, and other fields). |
**Example request:**
@@ -174,9 +181,9 @@ Every method below is also browsable interactively in the explorer above; this s
#### `eth_signTransaction`
-**Limited.** Signs a transaction with a node-hosted key and returns the signed payload without broadcasting.
+**Limited.** Signs a transaction with a node-hosted key and returns the signed payload without broadcasting it.
-**Sei-specific behavior:** Requires a node-hosted key for the from address; not usable on public RPC nodes that hold no keys. Returns both the raw RLP bytes and the decoded tx.
+**Sei-specific behavior:** Requires a node-hosted key for the from address. It does not work on public RPC nodes that hold no keys. Returns both the raw RLP bytes and the decoded transaction.
**Parameters:**
@@ -208,7 +215,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Signs an EIP-191 personal message with a node-hosted key for the given address.
-**Sei-specific behavior:** Only works for addresses in the node's local test keyring; production/public RPC nodes hold no hosted keys, so this returns 'address does not have hosted key'. Applies the EIP-191 personal-message TextHash before signing.
+**Sei-specific behavior:** Works only for addresses in the node's local test keyring. Production and public RPC nodes hold no hosted keys, so on those nodes this method returns 'address does not have hosted key'. Applies the EIP-191 personal-message TextHash before signing.
**Parameters:**
@@ -236,9 +243,9 @@ Every method below is also browsable interactively in the explorer above; this s
#### `eth_getTransactionByHash`
-**Supported.** Returns the EVM transaction matching the given hash, or null if not found.
+**Supported.** Returns the EVM transaction that matches the given hash, or null if it is not found.
-**Sei-specific behavior:** Sees EVM transactions only; if the hash resolves to a non-EVM Cosmos tx it errors. Pending lookups resolve the transaction directly from the CometBFT mempool via an EVM-hash index (rather than a geth txpool), so a pending EVM tx is found by its hash without scanning through unconfirmed-transaction pages.
+**Sei-specific behavior:** Looks up EVM transactions only. If the hash resolves to a non-EVM Cosmos transaction, the method returns an error. Pending lookups resolve the transaction directly from the CometBFT mempool through an EVM-hash index, not a geth txpool. As a result, the method finds a pending EVM transaction by its hash without scanning through pages of unconfirmed transactions.
**Parameters:**
@@ -261,9 +268,15 @@ Every method below is also browsable interactively in the explorer above; this s
#### `eth_getTransactionReceipt`
-**Supported.** Returns the receipt of a transaction by hash, or null if not found.
+**Supported.** Returns the receipt of a transaction by hash, or null if it is not found.
+
+**Sei-specific behavior:** The receipt is reconstructed from keeper.GetReceipt and CometBFT block data, not from a native MPT receipt trie. The status and logs use the standard Ethereum format.
+
+Under the Giga executor, an EVM transaction can bump the sender's nonce and then fail during state transition. For such a transaction, the method returns a `status=0` failed-transaction receipt. It does not return null indefinitely, which would hang clients that poll for the receipt. The known natural case is an EIP-7623 floor-data-gas shortfall (post-Pectra), which fails inside go-ethereum's `Execute()` before any opcode runs. This synthetic receipt is written at EndBlock, with `gasUsed` and `effectiveGasPrice` of 0.
-**Sei-specific behavior:** Receipt is reconstructed from keeper.GetReceipt + CometBFT block data rather than from a native MPT receipt trie; status/logs are standard Ethereum format. Under the Giga executor, an EVM transaction that bumps the sender's nonce but then fails during state transition now returns a `status=0` failed-tx receipt, rather than returning null indefinitely and hanging clients that poll for it. The known natural case is an EIP-7623 floor-data-gas shortfall (post-Pectra), which fails inside go-ethereum's `Execute()` before any opcode runs. The receipt is a synthetic one written at EndBlock, with `gasUsed` and `effectiveGasPrice` of 0. The `VmError` reason is not part of the `eth_getTransactionReceipt` response; retrieve it with the non-standard `eth_getVMError` method. If a receipt exists but its block height is above the safe-latest watermark (for example when Tendermint status momentarily lags the receipt store), the method returns JSON null rather than an error — the Ethereum JSON-RPC 'not yet mined' signal — so clients simply poll again, matching `eth_getBlockByNumber` behavior.
+The `VmError` reason is not part of the `eth_getTransactionReceipt` response. To get it, use the non-standard `eth_getVMError` method.
+
+If a receipt exists but its block height is above the safe-latest watermark, the method returns JSON null rather than an error. This can happen, for example, when the Tendermint status lags the receipt store for a moment. JSON null is the Ethereum JSON-RPC 'not yet mined' signal, so clients poll again. This matches the behavior of `eth_getBlockByNumber`.
**Parameters:**
@@ -288,7 +301,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the EVM transaction at the given index within the block at the specified number.
-**Sei-specific behavior:** Index maps over EVM transactions only; an out-of-range index yields a null result rather than an error.
+**Sei-specific behavior:** The index counts EVM transactions only. An out-of-range index returns a null result, not an error.
**Parameters:**
@@ -315,7 +328,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the EVM transaction at the given index within the block identified by hash.
-**Sei-specific behavior:** Index maps over EVM transactions only; same null-on-overflow semantics as the block-number variant.
+**Sei-specific behavior:** The index counts EVM transactions only. As with the block-number variant, an out-of-range index returns null.
**Parameters:**
@@ -342,14 +355,14 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the number of transactions sent from an address (nonce) at a given block.
-**Sei-specific behavior:** For the 'pending' tag Sei returns EvmNextPendingNonce from the CometBFT mempool (or redirects to an EvmProxy if the sender is sharded there). safe/finalized/latest are equivalent due to instant finality.
+**Sei-specific behavior:** For the 'pending' tag, Sei returns EvmNextPendingNonce from the CometBFT mempool. If the sender is sharded to an EvmProxy, Sei redirects the request there. The safe, finalized, and latest tags are equivalent because of instant finality.
**Parameters:**
| # | Name | Type | Description |
| :- | :- | :- | :- |
| 1 | `address` | DATA, 20 bytes | Account address. |
-| 2 | `blockNrOrHash` | BLOCKNUMBER or DATA | Block number, tag, or hash; 'pending' returns the next pending nonce. |
+| 2 | `blockNrOrHash` | BLOCKNUMBER or DATA | Block number, tag, or hash. The 'pending' tag returns the next pending nonce. |
**Example request:**
@@ -369,7 +382,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Sei-specific helper that returns the current EVM nonce for an address (latest state only).
-**Sei-specific behavior:** Non-standard Sei extension exposed as eth_getNonce, implemented as StateAPI.GetNonce in state.go (NOT on TransactionAPI). Unlike eth_getTransactionCount it takes no block tag (latest-only via ctxProvider(LatestCtxHeight)) and returns a bare uint64 with no block-tag argument. Prefer eth_getTransactionCount for standard nonce queries.
+**Sei-specific behavior:** This non-standard Sei extension is exposed as `eth_getNonce` and implemented as StateAPI.GetNonce in `state.go` (not on TransactionAPI). Unlike `eth_getTransactionCount`, it takes no block tag (latest only, through ctxProvider(LatestCtxHeight)) and returns a bare uint64. For standard nonce queries, prefer `eth_getTransactionCount`.
**Parameters:**
@@ -394,7 +407,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Sei extension that returns the recorded VM error string for a transaction by hash (empty string if it succeeded or is not found).
-**Sei-specific behavior:** Non-standard Sei extension registered under the eth namespace. Unlike eth_getVMError, a not-found lookup returns an empty string and no error.
+**Sei-specific behavior:** This non-standard Sei extension is registered under the eth namespace. Unlike `eth_getVMError`, this method returns an empty string and no error for a not-found lookup.
**Parameters:**
@@ -419,7 +432,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Sei extension that returns the EVM VM error string recorded in a transaction's receipt by hash.
-**Sei-specific behavior:** Non-standard Sei extension registered under the eth namespace. Returns the receipt's VmError field and propagates a not-found error (unlike eth_getTransactionErrorByHash, which returns an empty string on not-found).
+**Sei-specific behavior:** This non-standard Sei extension is registered under the eth namespace. It returns the receipt's VmError field and propagates a not-found error. In contrast, `eth_getTransactionErrorByHash` returns an empty string when the transaction is not found.
**Parameters:**
@@ -447,7 +460,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the wei balance of an account at a given block.
-**Sei-specific behavior:** Balance reflects the account's SEI bank balance (18-decimal wei representation) and can change from both EVM and non-EVM (Cosmos bank send / wasm) transactions. Height is resolved via the watermark manager with a state-version guard.
+**Sei-specific behavior:** The balance reflects the account's SEI bank balance (18-decimal wei representation). Both EVM and non-EVM transactions (Cosmos bank send or wasm) can change it. The height is resolved through the watermark manager with a state-version guard.
**Parameters:**
@@ -499,7 +512,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the value stored at a storage slot of an address at a given block.
-**Sei-specific behavior:** Reads the EVM keeper's slot value directly rather than from an MPT trie. The slot key must decode to at most 32 bytes.
+**Sei-specific behavior:** Reads the slot value directly from the EVM keeper, not from an MPT trie. The slot key must decode to at most 32 bytes.
**Parameters:**
@@ -528,7 +541,9 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Returns a Merkle proof for an account and the requested storage slots.
-**Sei-specific behavior:** Sei stores state in an IAVL-style tree, not an Ethereum Merkle-Patricia trie. The handler unwraps the EVM store through any intervening wrappers (cache, tracing, Giga cache, prefix stores) until it reaches an underlying proof-capable queryable store — classic IAVL, a store/v2 memiavl commitment, or any other proof-capable root — so proofs work across these backends rather than only classic IAVL. If no proof-capable queryable store can be reached it returns `cannot find a proof-capable queryable KV store`. The result is a Sei-specific ProofResult{address, hexValues, storageProof} where storageProof entries are CometBFT/IAVL crypto.ProofOps, NOT eth-style MPT proof nodes. There is no accountProof, balance, codeHash, nonce, or storageHash field (Sei has no per-account state root); standard eth_getProof verifiers will not work.
+**Sei-specific behavior:** Sei stores state in an IAVL-style tree, not an Ethereum Merkle-Patricia trie. The handler unwraps the EVM store through any intervening wrappers (cache, tracing, Giga cache, prefix stores). It continues until it reaches an underlying proof-capable queryable store: classic IAVL, a store/v2 memiavl commitment, or any other proof-capable root. Proofs therefore work across these backends, not only on classic IAVL. If the handler cannot reach a proof-capable queryable store, it returns `cannot find a proof-capable queryable KV store`.
+
+The result is a Sei-specific ProofResult{address, hexValues, storageProof}. Its storageProof entries are CometBFT/IAVL crypto.ProofOps, not eth-style MPT proof nodes. The result has no accountProof, balance, codeHash, nonce, or storageHash field (Sei has no per-account state root). Standard `eth_getProof` verifiers do not work with it.
**Parameters:**
@@ -559,7 +574,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Returns the list of addresses for which the node holds hosted keys.
-**Sei-specific behavior:** Sourced from the node's local test keyring only; production/public RPC nodes hold no hosted keys, so this returns an empty list. Sign client-side and use eth_sendRawTransaction.
+**Sei-specific behavior:** The list comes only from the node's local test keyring. Production and public RPC nodes hold no hosted keys, so on those nodes this method returns an empty list. Sign client-side and use `eth_sendRawTransaction`.
**Parameters:** none.
@@ -570,14 +585,14 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns block information by number or tag, with full transactions when fullTx is true.
-**Sei-specific behavior:** Under the eth namespace only EVM transactions are indexed (synthetic/bank-transfer txs excluded). Block number 0 returns a synthetic genesis block (for The Graph compatibility); future/non-existent numeric blocks return null. Uncle/PoW header fields (sha3Uncles, nonce, mixHash, difficulty) are placeholders and the uncles array is always empty (CometBFT consensus). safe/finalized/latest are equivalent due to instant finality.
+**Sei-specific behavior:** Under the eth namespace, only EVM transactions are indexed. Synthetic and bank-transfer transactions are excluded. Block number 0 returns a synthetic genesis block, for compatibility with The Graph. Future or non-existent numeric blocks return null. Uncle and PoW header fields (sha3Uncles, nonce, mixHash, difficulty) are placeholders, and the uncles array is always empty (CometBFT consensus). The safe, finalized, and latest tags are equivalent because of instant finality.
**Parameters:**
| # | Name | Type | Description |
| :- | :- | :- | :- |
| 1 | `number` | BLOCKNUMBER | Block number (hex) or tag (latest/safe/finalized/pending/earliest). |
-| 2 | `fullTx` | boolean | If true include full transaction objects, else only hashes. |
+| 2 | `fullTx` | boolean | If true, the block includes full transaction objects. Otherwise, it includes only hashes. |
**Example request:**
@@ -597,14 +612,16 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns block information by block hash, with full transactions when fullTx is true.
-**Sei-specific behavior:** Block hashes are CometBFT block hashes (computed from the Tendermint header), so they differ from Ethereum block hashes and are not interchangeable across chains. Under the eth namespace synthetic txs and bank transfers are excluded. The genesis block hash (`0xF9D3845DF25B43B1C6926F3CEDA6845C17F5624E12212FD8847D0BA01DA1AB9E`, a synthetic constant identical on every Sei network, returned by the node in this uppercase form; lookups are case-insensitive) is recognized and returns the encoded genesis block directly, keeping hash-based lookups consistent with `eth_getBlockByNumber("0x0")`; other unknown/zero hashes return null. Uncles array is always empty.
+**Sei-specific behavior:** Block hashes are CometBFT block hashes, computed from the Tendermint header. They differ from Ethereum block hashes and are not interchangeable across chains. Under the eth namespace, synthetic transactions and bank transfers are excluded. The uncles array is always empty.
+
+The genesis block hash is `0xF9D3845DF25B43B1C6926F3CEDA6845C17F5624E12212FD8847D0BA01DA1AB9E`. It is a synthetic constant, identical on every Sei network. The node returns it in this uppercase form, and lookups are case-insensitive. The method recognizes this hash and returns the encoded genesis block directly. This keeps hash-based lookups consistent with `eth_getBlockByNumber("0x0")`. Other unknown or zero hashes return null.
**Parameters:**
| # | Name | Type | Description |
| :- | :- | :- | :- |
| 1 | `blockHash` | DATA, 32 bytes | Block hash. |
-| 2 | `fullTx` | boolean | If true include full transaction objects, else only hashes. |
+| 2 | `fullTx` | boolean | If true, the block includes full transaction objects. Otherwise, it includes only hashes. |
**Example request:**
@@ -624,7 +641,9 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the number of EVM transactions in a block by number, as a hex quantity.
-**Sei-specific behavior:** Counts the same transactions that appear in `eth_getBlockByNumber`'s transaction list. EVM transactions are counted only when a receipt exists for them, while synthetic (wasm `MsgExecuteContract`) and bank-transfer (`MsgSend`) transactions remain excluded. Genesis returns 0x0; non-existent/future blocks return null. Because the receipt store can be configured with a smaller `KeepRecent` than the block/state stores, this method now verifies that the requested block's receipts have not been pruned before counting: if they have, it returns an error of the form `requested height N receipts have been pruned; earliest available is M` rather than a count. This means the call can fail for older blocks even when the block data itself is still available.
+**Sei-specific behavior:** Counts the same transactions that appear in the transaction list of `eth_getBlockByNumber`. EVM transactions are counted only when a receipt exists for them. Synthetic (wasm `MsgExecuteContract`) and bank-transfer (`MsgSend`) transactions remain excluded. Genesis returns 0x0. Non-existent or future blocks return null.
+
+The receipt store can be configured with a smaller `KeepRecent` than the block and state stores. For this reason, the method verifies that the requested block's receipts have not been pruned before it counts. If they have, it returns an error of the form `requested height N receipts have been pruned; earliest available is M` instead of a count. As a result, the call can fail for older blocks even when the block data itself is still available.
**Parameters:**
@@ -649,7 +668,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the number of EVM transactions in a block by hash, as a hex quantity.
-**Sei-specific behavior:** Counts EVM transactions only; synthetic/bank-transfer txs are excluded. Genesis hash returns 0x0; unknown hash returns null. Like `eth_getBlockTransactionCountByNumber`, returns a "receipts have been pruned" error when the requested block's receipts have been pruned from the receipt store.
+**Sei-specific behavior:** Counts EVM transactions only. Synthetic and bank-transfer transactions are excluded. The genesis hash returns 0x0, and an unknown hash returns null. Like `eth_getBlockTransactionCountByNumber`, it returns a "receipts have been pruned" error if the requested block's receipts have been pruned from the receipt store.
**Parameters:**
@@ -674,7 +693,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns all EVM transaction receipts for a given block.
-**Sei-specific behavior:** Under the eth namespace synthetic/shell receipts are excluded (includeShellReceipts=false). Genesis returns an empty array. An empty (zero) or non-existent/unknown block hash returns `result: null` rather than an error, matching the Ethereum RPC spec. transactionIndex is recomputed sequentially over the compacted receipt list.
+**Sei-specific behavior:** Under the eth namespace, synthetic and shell receipts are excluded (includeShellReceipts=false). Genesis returns an empty array. An empty (zero), non-existent, or unknown block hash returns `result: null` instead of an error. This matches the Ethereum RPC spec. The transactionIndex value is recomputed sequentially over the compacted receipt list.
**Parameters:**
@@ -702,7 +721,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the number of the most recent committed EVM block as a hex uint64.
-**Sei-specific behavior:** Block height comes from CometBFT latest height; the latest committed block is already final on Sei (instant finality, so latest == safe == finalized).
+**Sei-specific behavior:** The block height comes from the latest CometBFT height. The latest committed block is already final on Sei (instant finality, so latest == safe == finalized).
**Parameters:** none.
@@ -710,7 +729,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the EVM chain ID as a hex big int.
-**Sei-specific behavior:** Sourced from the x/evm keeper. Sei Mainnet = 1329 (`0x531`); Sei Testnet = 1328 (`0x530`).
+**Sei-specific behavior:** The value comes from the x/evm keeper. Sei Mainnet is 1329 (`0x531`), and Sei Testnet is 1328 (`0x530`).
**Parameters:** none.
@@ -718,7 +737,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Returns the block reward beneficiary (coinbase) address.
-**Sei-specific behavior:** Sei has no miner; this returns the Cosmos fee-collector module address (GetFeeCollectorAddress), not a validator/miner address. The COINBASE opcode returns the same value.
+**Sei-specific behavior:** Sei has no miner. This method returns the Cosmos fee-collector module address (GetFeeCollectorAddress), not a validator or miner address. The COINBASE opcode returns the same value.
**Parameters:** none.
@@ -726,7 +745,9 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Returns a suggested gas price in wei (hex).
-**Sei-specific behavior:** Sei-specific congestion heuristic, not a raw mempool oracle. InfoAPI.GasPrice/GasPriceHelper (info.go): when uncongested it returns baseFee * 110/100 (base fee +10%); when congested it returns medianRewardPrevBlock + baseFee (50th-percentile priority-fee reward from the previous block added to base fee). The base fee comes from the x/evm keeper (GetNextBaseFeePerGas), which is itself floored at the governance-set minimum base fee; the RPC handler applies no additional explicit lower-bound clamp. The mainnet minimum gas price (~50 gwei) is enforced for transaction acceptance at the mempool/ante-handler level, not inside eth_gasPrice.
+**Sei-specific behavior:** The method uses a Sei-specific congestion heuristic, not a raw mempool oracle. The logic is in InfoAPI.GasPrice and GasPriceHelper (`info.go`). When the chain is uncongested, the method returns baseFee * 110/100 (base fee +10%). When the chain is congested, it returns medianRewardPrevBlock + baseFee. This is the 50th-percentile priority-fee reward from the previous block, added to the base fee.
+
+The base fee comes from the x/evm keeper (GetNextBaseFeePerGas) and is itself floored at the governance-set minimum base fee. The RPC handler applies no other explicit lower-bound clamp. The Sei Mainnet minimum gas price (approximately 50 gwei) is enforced for transaction acceptance at the mempool or ante-handler level, not inside `eth_gasPrice`.
**Parameters:** none.
@@ -734,7 +755,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Returns a suggested priority fee (tip) per gas in wei (hex).
-**Sei-specific behavior:** Sei-specific: returns a hardcoded 1 gwei (defaultPriorityFeePerGas) when the chain is uncongested; only when congested does it derive the tip from the previous block's 50th-percentile reward. Sei docs advise using a single gasPrice and omitting EIP-1559 fee fields.
+**Sei-specific behavior:** When the chain is uncongested, the method returns a hardcoded 1 gwei (defaultPriorityFeePerGas). It derives the tip from the previous block's 50th-percentile reward only when the chain is congested. The Sei docs advise you to use a single gasPrice and omit the EIP-1559 fee fields.
**Parameters:** none.
@@ -742,7 +763,11 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns base fees, gas-used ratios, and reward percentile data over a range of blocks.
-**Sei-specific behavior:** Base fees and rewards reflect Sei's x/evm fee market (GetNextBaseFee), not an Ethereum EIP-1559 mempool, and Sei does not burn the base fee. Watermark-aware: pruned/historical blocks may not be available as far back as on Ethereum archive nodes. Matching go-ethereum/execution-apis semantics, on ranges where every block has base-fee data, `baseFeePerGas` contains one more element than `gasUsedRatio`: the trailing element is the projected base fee for the child of the newest block in the range, appended only when the newest block's own header base fee was available. Heights with pruned or partial base-fee data are skipped from `baseFeePerGas` while still contributing a `gasUsedRatio` row (0.0 fallback), so the two arrays can diverge from that `+1` relationship on ranges with pruned history. Each block's base fee uses header base fee semantics (the same value reported in the block header — `GetNextBaseFee` at the parent's committed height) with a `DefaultMinFeePerGas` fallback for early blocks.
+**Sei-specific behavior:** Base fees and rewards reflect Sei's x/evm fee market (GetNextBaseFee), not an Ethereum EIP-1559 mempool. Sei does not burn the base fee. The method is watermark-aware: pruned or historical blocks may not be available as far back as on Ethereum archive nodes.
+
+On ranges where every block has base-fee data, `baseFeePerGas` contains one more element than `gasUsedRatio`. This matches go-ethereum and execution-apis semantics. The trailing element is the projected base fee for the child of the newest block in the range. It is appended only when the newest block's own header base fee was available.
+
+Heights with pruned or partial base-fee data are skipped in `baseFeePerGas`, but they still contribute a `gasUsedRatio` row (0.0 fallback). On ranges with pruned history, the two arrays can therefore diverge from that `+1` relationship. Each block's base fee uses header base fee semantics. That is the same value that the block header reports: `GetNextBaseFee` at the parent's committed height. For early blocks, the base fee falls back to `DefaultMinFeePerGas`.
**Parameters:**
@@ -773,9 +798,9 @@ Every method below is also browsable interactively in the explorer above; this s
#### `net_version`
-**Supported.** Returns the network/chain ID as a decimal string.
+**Supported.** Returns the network ID (chain ID) as a decimal string.
-**Sei-specific behavior:** Returns the EVM chain ID in decimal (alias of `eth_chainId`): `'1329'` on Sei Mainnet and `'1328'` on Sei Testnet.
+**Sei-specific behavior:** Returns the EVM chain ID in decimal (an alias of `eth_chainId`): `'1329'` on Sei Mainnet and `'1328'` on Sei Testnet.
**Parameters:** none.
@@ -783,7 +808,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Returns the client version string.
-**Sei-specific behavior:** Reports a synthetic 'Geth/<os>-<arch>/<goVersion>' string (Sei's EVM is backed by go-ethereum); it does NOT embed the actual sei-chain/seid version, so it is not a reliable Sei version indicator.
+**Sei-specific behavior:** Reports a synthetic 'Geth/<os>-<arch>/<goVersion>' string (Sei's EVM is backed by go-ethereum). The string does not include the actual sei-chain or `seid` version, so it is not a reliable Sei version indicator.
**Parameters:** none.
@@ -794,7 +819,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Creates a log filter for the given criteria and returns a filter ID for later polling.
-**Sei-specific behavior:** Subject to the same range/size caps as eth_getLogs: open-ended ranges return up to 10,000 logs (DefaultMaxLogLimit); close-ended ranges are limited to 2,000 blocks (DefaultMaxBlockRange), with large-query rate limiting.
+**Sei-specific behavior:** Has the same range and size caps as `eth_getLogs`. Open-ended ranges return up to 10,000 logs (DefaultMaxLogLimit). Close-ended ranges are limited to 2,000 blocks (DefaultMaxBlockRange), and large queries are rate-limited.
**Parameters:**
@@ -829,7 +854,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Supported.** Polls a filter and returns new logs (log filters) or block hashes (block filters) since the last poll.
-**Sei-specific behavior:** For log filters, returns an empty array (`[]`) rather than `null` when no logs match or a bounded filter's block range has been fully consumed, in line with the Ethereum JSON-RPC spec.
+**Sei-specific behavior:** For log filters, the method returns an empty array (`[]`) instead of `null` when no logs match. It does the same when a bounded filter's block range has been fully consumed. This is in line with the Ethereum JSON-RPC spec.
**Parameters:**
@@ -852,9 +877,9 @@ Every method below is also browsable interactively in the explorer above; this s
#### `eth_getFilterLogs`
-**Supported.** Returns all logs matching a previously created log filter, including historical logs.
+**Supported.** Returns all logs that match a previously created log filter, including historical logs.
-**Sei-specific behavior:** Bounded by the same caps as eth_getLogs (2,000-block range, 10,000-log limit) with large-query rate limiting.
+**Sei-specific behavior:** Has the same caps as `eth_getLogs` (2,000-block range, 10,000-log limit). Large queries are rate-limited.
**Parameters:**
@@ -877,9 +902,9 @@ Every method below is also browsable interactively in the explorer above; this s
#### `eth_getLogs`
-**Supported.** Returns logs matching the given filter criteria.
+**Supported.** Returns the logs that match the given filter criteria.
-**Sei-specific behavior:** Returns EVM logs only. Hard limits: max 2,000 blocks per close-ended query and up to 10,000 logs per response; exceeding the range errors with 'block range too large'. Large queries are globally rate-limited.
+**Sei-specific behavior:** Returns EVM logs only. The hard limits are a maximum of 2,000 blocks per close-ended query and up to 10,000 logs per response. A query that exceeds the range limit fails with 'block range too large'. Large queries are rate-limited globally.
**Parameters:**
@@ -907,9 +932,9 @@ Every method below is also browsable interactively in the explorer above; this s
#### `eth_uninstallFilter`
-**Supported.** Removes a previously installed filter by ID; returns true if it existed and was removed.
+**Supported.** Removes a previously installed filter by ID. Returns true if the filter existed and was removed.
-**Sei-specific behavior:** Returns false if the filter did not exist rather than erroring. Filters also expire automatically when not polled.
+**Sei-specific behavior:** Returns false, not an error, if the filter did not exist. Filters also expire automatically when they are not polled.
**Parameters:**
@@ -934,7 +959,7 @@ Every method below is also browsable interactively in the explorer above; this s
**Limited.** Opens a WebSocket-only push subscription for newHeads or logs notifications.
-**Sei-specific behavior:** WebSocket-only (SubscriptionAPI is not registered on the HTTP server; returns rpc.ErrNotificationsUnsupported over HTTP). Only 'newHeads' and 'logs' are implemented in source; there is no 'newPendingTransactions' subscription despite some client docs implying otherwise. newHeads subscriptions are capped by MaxSubscriptionsNewHead.
+**Sei-specific behavior:** Available over WebSocket only. SubscriptionAPI is not registered on the HTTP server, so over HTTP the method returns rpc.ErrNotificationsUnsupported. Only 'newHeads' and 'logs' are implemented in source. There is no 'newPendingTransactions' subscription, although some client docs imply otherwise. MaxSubscriptionsNewHead caps newHeads subscriptions.
**Parameters:**
@@ -964,15 +989,15 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
#### `eth_unsubscribe`
-**Supported.** Cancels an existing WebSocket subscription by ID; returns true on success.
+**Supported.** Cancels an existing WebSocket subscription by ID. Returns true on success.
-**Sei-specific behavior:** WebSocket only; has no effect over HTTP (notifications unsupported there).
+**Sei-specific behavior:** Available over WebSocket only. It has no effect over HTTP, where notifications are not supported.
**Parameters:**
| # | Name | Type | Description |
| :- | :- | :- | :- |
-| 1 | `subscriptionID` | string | The subscription ID returned by a prior eth_subscribe call. |
+| 1 | `subscriptionID` | string | The subscription ID returned by a prior `eth_subscribe` call. |
**Example request:**
@@ -992,9 +1017,9 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
#### `eth_call`
-**Supported.** Executes a read-only message call against state without creating a transaction; supports state and block overrides.
+**Supported.** Executes a read-only message call against state without creating a transaction. Supports state and block overrides.
-**Sei-specific behavior:** Gas is capped by RPCGasCap and execution time by RPCEVMTimeout; a fail-fast limiter may reject with 'eth_call rejected due to rate limit: server busy'. Canonical EVM<->Sei address resolution uses eth_call to the addr precompile at 0x0000000000000000000000000000000000001004.
+**Sei-specific behavior:** Gas is capped by RPCGasCap, and execution time is capped by RPCEVMTimeout. A fail-fast limiter may reject the call with 'eth_call rejected due to rate limit: server busy'. Canonical EVM<->Sei address resolution uses `eth_call` to the addr precompile at 0x0000000000000000000000000000000000001004.
**Parameters:**
@@ -1026,14 +1051,14 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
**Supported.** Estimates the gas needed to execute a transaction.
-**Sei-specific behavior:** Bounded by RPCGasCap and protected by a fail-fast limiter. Block gas limit on Sei is 12.5M; parallel execution can cause estimates to vary slightly, so size gasLimit with a modest buffer.
+**Sei-specific behavior:** The method is bounded by RPCGasCap and protected by a fail-fast limiter. The block gas limit on Sei is 12.5M. Parallel execution can make estimates vary slightly, so set gasLimit with a modest buffer.
**Parameters:**
| # | Name | Type | Description |
| :- | :- | :- | :- |
| 1 | `args` | object | Transaction call object. |
-| 2 | `blockNrOrHash` | BLOCKNUMBER or DATA | Optional block number, tag, or hash; defaults to latest. |
+| 2 | `blockNrOrHash` | BLOCKNUMBER or DATA | Optional block number, tag, or hash. Defaults to latest. |
| 3 | `overrides` | object | Optional state overrides. |
**Example request:**
@@ -1055,9 +1080,9 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
#### `eth_estimateGasAfterCalls`
-**Limited.** Estimates gas for a transaction after first applying a sequence of preceding calls against the same simulated state.
+**Limited.** Estimates gas for a transaction after it applies a sequence of preceding calls to the same simulated state.
-**Sei-specific behavior:** Non-standard Sei/geth extension (not part of the standard Ethereum JSON-RPC spec). Same gas-cap and fail-fast-limiter behavior as eth_estimateGas.
+**Sei-specific behavior:** This is a non-standard Sei/geth extension (not part of the standard Ethereum JSON-RPC spec). It has the same gas-cap and fail-fast-limiter behavior as `eth_estimateGas`.
**Parameters:**
@@ -1065,7 +1090,7 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
| :- | :- | :- | :- |
| 1 | `args` | object | The final call to estimate gas for. |
| 2 | `calls` | array of object | Ordered list of preceding calls applied before the estimate. |
-| 3 | `blockNrOrHash` | BLOCKNUMBER or DATA | Optional block number, tag, or hash; defaults to latest. |
+| 3 | `blockNrOrHash` | BLOCKNUMBER or DATA | Optional block number, tag, or hash. Defaults to latest. |
| 4 | `overrides` | object | Optional state overrides. |
**Example request:**
@@ -1090,14 +1115,14 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
**Supported.** Generates an EIP-2930 access list (and gas used) for a transaction.
-**Sei-specific behavior:** Defaults to the pending block tag (matching geth). A VM error during simulation is surfaced in the result's 'error' field rather than failing the RPC.
+**Sei-specific behavior:** Defaults to the pending block tag, as geth does. If a VM error occurs during simulation, the method reports it in the result's 'error' field instead of failing the RPC.
**Parameters:**
| # | Name | Type | Description |
| :- | :- | :- | :- |
| 1 | `args` | object | Transaction call object. |
-| 2 | `blockNrOrHash` | BLOCKNUMBER or DATA | Optional block number, tag, or hash; defaults to pending. |
+| 2 | `blockNrOrHash` | BLOCKNUMBER or DATA | Optional block number, tag, or hash. Defaults to pending. |
**Example request:**
@@ -1123,7 +1148,7 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
**Limited.** Returns the transactions currently in the pool, grouped by sender address and nonce into pending and queued buckets.
-**Sei-specific behavior:** Sei-specific simplification: every unconfirmed EVM tx from the CometBFT mempool is reported under 'pending' and 'queued' is always empty (no geth-style pending/queued nonce-gap distinction). The result set is truncated to the node's MaxTxPoolTxs config, so it may not reflect the entire mempool.
+**Sei-specific behavior:** As a simplification, the method reports every unconfirmed EVM transaction from the CometBFT mempool under 'pending'. The 'queued' bucket is always empty (there is no geth-style nonce-gap distinction between pending and queued). The result set is truncated to the node's MaxTxPoolTxs config, so it may not reflect the entire mempool.
**Parameters:** none.
@@ -1132,9 +1157,11 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
#### `debug_traceTransaction`
-**Supported.** Replays a transaction by hash and returns an execution trace using the configured tracer.
+**Supported.** Replays a transaction by hash and returns an execution trace from the configured tracer.
+
+**Sei-specific behavior:** Available over HTTP only, because the debug namespace is not registered on the WebSocket server. Supports geth tracers: callTracer, prestateTracer, flatCallTracer, and the struct (opcode) logger. TraceBaker pre-bakes and caches the results of callTracer, prestateTracer, and flatCallTracer. Requires trace-enabled or archive state for the target height.
-**Sei-specific behavior:** HTTP-only (the debug namespace is not registered on the WebSocket server). Supports geth tracers (callTracer, prestateTracer, flatCallTracer, struct/opcode logger); callTracer/prestateTracer/flatCallTracer results are pre-baked/cached via TraceBaker. Requires trace-enabled/archive state for the target height. Subject to the max block lookback guard (`max_trace_lookback_blocks`): a request whose target block is older than the configured lookback is rejected with an error of the form `block number X is beyond max lookback of Y`. This guard now applies consistently across all `debug_trace*` endpoints, and such attempts increment the `evmrpc_historical_debug_trace_attempts_total` metric.
+The max block lookback guard (`max_trace_lookback_blocks`) applies. If a request's target block is older than the configured lookback, the request is rejected with an error of the form `block number X is beyond max lookback of Y`. Each such request increments the `evmrpc_historical_debug_trace_attempts_total` metric. This guard applies consistently across all `debug_trace*` endpoints.
**Parameters:**
@@ -1163,7 +1190,7 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
**Supported.** Traces all transactions in a block by number and returns per-transaction execution traces.
-**Sei-specific behavior:** HTTP-only. safe/finalized/latest are equivalent due to instant finality. Subject to the `max_trace_lookback_blocks` historical guard (see `debug_traceTransaction`).
+**Sei-specific behavior:** Available over HTTP only. The safe, finalized, and latest tags are equivalent because of instant finality. The `max_trace_lookback_blocks` historical guard applies (see `debug_traceTransaction`).
**Parameters:**
@@ -1192,7 +1219,7 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
**Supported.** Traces all transactions in a block by hash and returns per-transaction execution traces.
-**Sei-specific behavior:** HTTP-only. Subject to the `max_trace_lookback_blocks` historical guard (see `debug_traceTransaction`).
+**Sei-specific behavior:** Available over HTTP only. The `max_trace_lookback_blocks` historical guard applies (see `debug_traceTransaction`).
**Parameters:**
@@ -1221,7 +1248,7 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
**Supported.** Executes and traces a call against a block's state without creating a transaction.
-**Sei-specific behavior:** HTTP-only. Arbitrary geth tracer names pass through. Tracing on the pending block is not supported. Subject to the `max_trace_lookback_blocks` historical guard (see `debug_traceTransaction`).
+**Sei-specific behavior:** Available over HTTP only. Arbitrary geth tracer names pass through. Tracing on the pending block is not supported. The `max_trace_lookback_blocks` historical guard applies (see `debug_traceTransaction`).
**Parameters:**
@@ -1255,7 +1282,7 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
**Limited.** Sei extension that replays a transaction and returns its app/tendermint/receipt state-access traces.
-**Sei-specific behavior:** Sei-specific extension (not part of upstream go-ethereum's debug namespace). HTTP-only and subject to historical-debug-trace availability guards. Subject to the `max_trace_lookback_blocks` historical guard (see `debug_traceTransaction`).
+**Sei-specific behavior:** This Sei-specific extension is not part of the upstream go-ethereum debug namespace. It is available over HTTP only and subject to the availability guards for historical debug traces. The `max_trace_lookback_blocks` historical guard applies (see `debug_traceTransaction`).
**Parameters:**
@@ -1278,9 +1305,13 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
#### `debug_traceTransactionProfile`
-**Limited.** Sei extension that replays a transaction by hash and returns its execution trace alongside a detailed timing and store-access profile.
+**Limited.** Sei extension that replays a transaction by hash and returns its execution trace with a detailed timing and store-access profile.
-**Sei-specific behavior:** Sei-specific extension (not part of upstream go-ethereum's debug namespace). HTTP-only and subject to historical-debug-trace availability guards. In addition to the standard trace result, it returns a `profile` object breaking down where time was spent — total wall time, historical DB lookup time, and per-phase timings (transaction lookup, block load, historical tx replay, block-context build, tx prepare, execution, and trace-result assembly) — plus a per-module `store` access trace (reads, iterators with the keys they surfaced, and per-operation `stats` roll-ups). Per-tx caps bound the trace size: at most 16 iterators and 64 keys per iterator are retained per module, with overflow flagged via `truncated`. To run this method across a whole block range and generate aggregate reports, use the `seidb trace-profile-report` command. Subject to the `max_trace_lookback_blocks` historical guard (see `debug_traceTransaction`).
+**Sei-specific behavior:** This Sei-specific extension is not part of the upstream go-ethereum debug namespace. It is available over HTTP only and subject to the availability guards for historical debug traces.
+
+In addition to the standard trace result, the method returns a `profile` object that shows where the time was spent. The profile has the total wall time, the historical DB lookup time, and per-phase timings. The phases are transaction lookup, block load, historical transaction replay, block-context build, transaction preparation, execution, and trace-result assembly. The method also returns a per-module `store` access trace. This trace has reads, iterators with the keys they surfaced, and per-operation `stats` roll-ups.
+
+Per-transaction caps bound the trace size. For each module, the trace retains at most 16 iterators and 64 keys per iterator, and `truncated` flags any overflow. To run this method across a whole block range and generate aggregate reports, use the `seidb trace-profile-report` command. The `max_trace_lookback_blocks` historical guard applies (see `debug_traceTransaction`).
**Parameters:**
@@ -1289,13 +1320,13 @@ The `filter` object applies only to `logs` subscriptions. For `newHeads`, pass t
| 1 | `hash` | DATA, 32 bytes | Transaction hash to trace and profile. |
| 2 | `config` | object | Optional tracer config (tracer name, tracerConfig, timeout, reexec, disableStorage/Stack/Memory). |
-The response `result` contains a `trace` field (the standard tracer output) and a `profile` object shaped as follows:
+The response `result` contains a `trace` field (the standard tracer output) and a `profile` object with this shape:
-- `totalNanos` — total wall-clock nanoseconds for the profiled trace.
-- `historicalDbLookupNanos` — nanoseconds spent in historical store lookups (get/has/iterator/iteratorNext).
-- `otherNanos` — remaining time not attributed to historical lookups or execution.
-- `phases` — per-phase timings: `lookupTransactionNanos`, `loadBlockNanos`, `replayHistoricalTxsNanos`, `buildBlockContextNanos`, `prepareTxNanos`, `executionNanos`, `traceResultNanos`.
-- `store` — per-module store access trace: `modules` (each with `reads`, `has`, `iterators`, and per-op `stats`) and top-level `stats`.
+- `totalNanos`: total wall-clock nanoseconds for the profiled trace.
+- `historicalDbLookupNanos`: nanoseconds spent in historical store lookups (get, has, iterator, iteratorNext).
+- `otherNanos`: remaining time not attributed to historical lookups or execution.
+- `phases`: the per-phase timings `lookupTransactionNanos`, `loadBlockNanos`, `replayHistoricalTxsNanos`, `buildBlockContextNanos`, `prepareTxNanos`, `executionNanos`, and `traceResultNanos`.
+- `store`: the per-module store access trace, with `modules` (each with `reads`, `has`, `iterators`, and per-operation `stats`) and top-level `stats`.
**Example request:**
@@ -1346,22 +1377,22 @@ The response `result` contains a `trace` field (the standard tracer output) and
Sei keeps four legacy custom endpoints for address resolution, cross-VM transaction lookup, and synthetic receipts.
-The `sei2_*` namespace has been removed. Most legacy `sei_*` methods have also been removed, including block, filter, log, signing, association, and transaction lookup methods. The `sei_*` cleanup is tracked in [sei-chain PR #3927](https://github.com/sei-protocol/sei-chain/pull/3927).
+For new integrations, use standard `eth_*` and `debug_*` methods. The four remaining `sei_*` methods are deprecated and scheduled for removal.
-The four remaining `sei_*` methods are deprecated and scheduled for removal. Use standard `eth_*` and `debug_*` methods for new integrations.
+The `sei2_*` namespace has been removed. Most legacy `sei_*` methods have also been removed, including block, filter, log, signing, association, and transaction lookup methods. The `sei_*` cleanup is tracked in [sei-chain PR #3927](https://github.com/sei-protocol/sei-chain/pull/3927).
-There is no remaining block or filter method for discovering synthetic logs from Cosmos-originated transactions. If you already know a synthetic transaction hash, enable `sei_getTransactionReceipt` to retrieve its receipt and logs.
+No remaining block or filter method can discover synthetic logs from Cosmos-originated transactions. If you already know a synthetic transaction hash, enable `sei_getTransactionReceipt` to fetch its receipt and logs.
-Access is controlled by the `enabled_legacy_sei_apis` setting under `[evm]` in `app.toml`. Only methods explicitly listed in this allowlist are available. Disabled methods return a standard JSON-RPC error (code `-32601`, data `"legacy_sei_deprecated"`). Allowed single-object calls pass through unchanged, with an optional `Sei-Legacy-RPC-Deprecation` HTTP response header signaling deprecation.
+The `enabled_legacy_sei_apis` setting under `[evm]` in `app.toml` controls access. Only methods explicitly listed in this allowlist are available. Disabled methods return a standard JSON-RPC error (code `-32601`, data `"legacy_sei_deprecated"`). Allowed single-object calls pass through unchanged, with an optional `Sei-Legacy-RPC-Deprecation` HTTP response header that signals deprecation.
-JSON-RPC batches are handled by the gate rather than passed through wholesale. Only allowed methods are forwarded to the inner handler. The handler then merges responses by matching each response's JSON-RPC `id`. Disallowed methods return the usual `-32601` legacy deprecation error in their slot. A batch element that is not a JSON object returns a JSON-RPC `-32600` `"Invalid Request"` error in its slot.
+The gate handles JSON-RPC batches. It does not pass them through as a whole. Only allowed methods are forwarded to the inner handler. The handler then merges the responses by matching the JSON-RPC `id` of each response. Disallowed methods return the usual `-32601` legacy deprecation error in their slot. A batch element that is not a JSON object returns a JSON-RPC `-32600` `"Invalid Request"` error in its slot.
-Per JSON-RPC 2.0, requests that omit the `id` member are notifications and do not produce a response entry, including within a batch. A request with `"id": null` is not a notification and receives a response. If a batch produces no response objects, the gateway returns an empty HTTP body with HTTP 200 rather than an empty JSON array (`[]`).
+In JSON-RPC 2.0, requests that omit the `id` member are notifications. They do not produce a response entry, and this also applies within a batch. A request with `"id": null` is not a notification and receives a response. If a batch produces no response objects, the gateway returns an empty HTTP body with HTTP 200 instead of an empty JSON array (`[]`).
### Legacy API configuration
-The `enabled_legacy_sei_apis` setting controls which remaining `sei_*` methods are accessible on the EVM HTTP endpoint. `seid init` enables the three address and cross-VM lookup helpers by default:
+The `enabled_legacy_sei_apis` setting controls which remaining `sei_*` methods are accessible on the EVM HTTP endpoint. By default, `seid init` enables the three address and cross-VM lookup helpers:
```toml
[evm]
@@ -1379,14 +1410,14 @@ Only these four methods are available:
| Method | Description |
| ------ | ----------- |
-| `sei_getSeiAddress` | Get the Sei address associated with an EVM address. |
-| `sei_getEVMAddress` | Get the EVM address associated with a Sei address. |
-| `sei_getCosmosTx` | Get the wrapping Cosmos transaction hash as uppercase hexadecimal without a `0x` prefix. |
-| `sei_getTransactionReceipt` | Get a receipt, including a synthetic receipt when its transaction hash is known. |
+| `sei_getSeiAddress` | Returns the Sei address associated with an EVM address. |
+| `sei_getEVMAddress` | Returns the EVM address associated with a Sei address. |
+| `sei_getCosmosTx` | Returns the wrapping Cosmos transaction hash as uppercase hexadecimal without a `0x` prefix. |
+| `sei_getTransactionReceipt` | Returns a receipt, including a synthetic receipt when its transaction hash is known. |
### Address resolution
-For resolving the EVM (`0x…`) ↔ Sei (`sei1…`) address pair, use the **`addr` precompile at `0x0000000000000000000000000000000000001004`** via a standard `eth_call`. The precompile is universally available on every Sei RPC, is not part of the deprecated `sei_*` namespace, and is the canonical resolution path going forward.
+To resolve the EVM (`0x…`) ↔ Sei (`sei1…`) address pair, use the **`addr` precompile at `0x0000000000000000000000000000000000001004`** through a standard `eth_call`. The precompile is available on every Sei RPC and is not part of the deprecated `sei_*` namespace. It is the canonical resolution path going forward.
```bash
# EVM → Sei (getSeiAddr(address), selector 0x0c3c20ed)
@@ -1428,15 +1459,15 @@ const evmAddr = await client.readContract({
});
```
-The call reverts when the input address is not yet associated. See [Accounts](/learn/accounts) for the full association lifecycle and how the bidirectional mapping is established.
+The call reverts when the input address is not yet associated. For the full association lifecycle and how the bidirectional mapping is established, see [Accounts](/learn/accounts).
-The legacy JSON-RPC helpers `sei_getSeiAddress` and `sei_getEVMAddress` historically served this role and are still enabled by default on nodes today, but they belong to the deprecated `sei_*` namespace and may be removed in a future release. New integrations should call the precompile.
+In the past, the legacy JSON-RPC helpers `sei_getSeiAddress` and `sei_getEVMAddress` handled address resolution. They are still enabled by default on nodes today. However, they belong to the deprecated `sei_*` namespace and may be removed in a future release. New integrations should call the precompile.
### Cross-VM transaction lookup
-`sei_getCosmosTx` resolves the underlying Cosmos transaction hash for a given EVM transaction. It returns the hash as uppercase hexadecimal without a `0x` prefix. The method does not yet have a precompile equivalent and is enabled by default on Sei nodes.
+`sei_getCosmosTx` resolves the underlying Cosmos transaction hash for a given EVM transaction. It returns the hash as uppercase hexadecimal without a `0x` prefix. The method does not have a precompile equivalent yet. It is enabled by default on Sei nodes.
-
+
#### sei_getCosmosTx
Returns the wrapping Cosmos transaction hash for a given EVM transaction hash.
@@ -1453,7 +1484,7 @@ Returns the wrapping Cosmos transaction hash for a given EVM transaction hash.
| :--- | :---------- |
| `string` | The Cosmos transaction hash as uppercase hexadecimal without a `0x` prefix. |
-**Example Request**
+**Example request**
```json
{
@@ -1468,7 +1499,7 @@ Returns the wrapping Cosmos transaction hash for a given EVM transaction hash.
### Legacy deprecation error
-When a remaining `sei_*` method is called but not listed in `enabled_legacy_sei_apis`, the node returns:
+If a client calls a remaining `sei_*` method that is not listed in `enabled_legacy_sei_apis`, the node returns:
```json
{
@@ -1484,10 +1515,10 @@ When a remaining `sei_*` method is called but not listed in `enabled_legacy_sei_
### Deprecation HTTP header
-When an allowlisted `sei_*` method is successfully called, the response includes an optional HTTP header signaling deprecation:
+When a call to an allowlisted `sei_*` method succeeds, the response includes an optional HTTP header that signals deprecation:
```
Sei-Legacy-RPC-Deprecation: All sei_* JSON-RPC methods are deprecated and scheduled for removal; migrate to eth_* and supported APIs.
```
-Clients can use this header to detect legacy API usage and plan migration.
+Clients can use this header to detect legacy API use and plan their migration.
diff --git a/evm/sei-global-wallet.mdx b/evm/sei-global-wallet.mdx
index e6128c2..917bcfe 100644
--- a/evm/sei-global-wallet.mdx
+++ b/evm/sei-global-wallet.mdx
@@ -4,53 +4,53 @@ sidebarTitle: 'Sei Global Wallet'
description: 'Learn how to integrate and use Sei Global Wallet, a cross-application embedded crypto wallet that provides persistent wallet experience across Sei ecosystem applications.'
keywords: ['sei global wallet', 'embedded wallet', 'EIP-6963', 'wallet integration', 'web3 authentication']
---
-By logging in with Sei Global Wallet, you agree to our [Terms of Use](https://dashboard.sei.io/terms)
+By logging in with Sei Global Wallet, you agree to our [Terms of Use](https://dashboard.sei.io/terms).
-Sei Global Wallet is a cross-application embedded crypto wallet powered by [Dynamic Global Wallets](https://www.dynamic.xyz/docs/react/global-wallets/overview). It gives users a persistent wallet experience across any integrated app within the Sei ecosystem, allowing them to authenticate and interact using familiar login methods like Google, Twitter, or Telegram—no browser extension or prior crypto knowledge required.
+Sei Global Wallet is a cross-application embedded crypto wallet powered by [Dynamic Global Wallets](https://www.dynamic.xyz/docs/react/global-wallets/overview). It gives users a persistent wallet experience across any integrated dApp in the Sei ecosystem. Users can authenticate and interact with familiar login methods, such as Google, Twitter, or Telegram. They do not need a browser extension or prior crypto knowledge.
-Additional auth methods such as existing wallet apps (MetaMask, ..) are possible through Dynamic, but are not currently enabled
+Other authentication methods are possible through Dynamic, such as existing wallet apps (for example, MetaMask). However, these methods are not currently enabled.
## What is Sei Global Wallet?
-Unlike traditional browser extension wallets, Sei Global Wallet is built directly into web applications and allows users to authenticate using familiar methods like Google, Twitter, Telegram, or email—no downloads or crypto knowledge required.
+Unlike traditional browser extension wallets, Sei Global Wallet is built directly into web applications. Users can authenticate with familiar methods, such as Google, Twitter, Telegram, or email. They do not need to download anything or know about crypto.
-## Why Use Sei Global Wallet?
+## Why use Sei Global Wallet?
-**For Users:**
+**For users:**
-- **No Installation Required:** Works directly in your browser without extensions
-- **Familiar Authentication:** Login with Google, Twitter, Telegram, or email
-- **Persistent Across Apps:** Same wallet works across all Sei ecosystem applications
-- **Self-Custodial:** You maintain full control of your keys
+- The wallet works directly in the browser, without extensions.
+- Users log in with Google, Twitter, Telegram, or email.
+- The same wallet works across all Sei ecosystem dApps.
+- The wallet is self-custodial: users keep full control of their keys.
-**For Developers:**
+**For developers:**
-- **One-line integration:** A single EIP-6963 import works with RainbowKit, ConnectKit, Web3-React, and other compatible libraries
-- **ESM-only:** `@sei-js/sei-global-wallet@2` has no `require()` entry. Add the [required consumer overrides](https://github.com/sei-protocol/sei-js/tree/main/packages/sei-global-wallet#required-consumer-overrides) before installing.
+- Integration takes one line: a single EIP-6963 import works with RainbowKit, ConnectKit, Web3-React, and other compatible libraries.
+- `@sei-js/sei-global-wallet@2` is ESM-only and has no `require()` entry. Add the [required consumer overrides](https://github.com/sei-protocol/sei-js/tree/main/packages/sei-global-wallet#required-consumer-overrides) before you install it.
-## How to Create a Sei Global Wallet Account
+## How to create a Sei Global Wallet account
-1. Visit [dashboard.sei.io](https://dashboard.sei.io) or any Sei ecosystem application
-2. Click "Connect Wallet" and select "Sei Global Wallet"
-3. Choose your preferred login method (Google, X, Telegram, or Email)
-4. Complete the authentication flow
-5. Your wallet is automatically created and ready to use across all integrated Sei apps
+1. Go to [dashboard.sei.io](https://dashboard.sei.io) or any Sei ecosystem dApp.
+2. Click **Connect Wallet**. Then select **Sei Global Wallet**.
+3. Choose your preferred login method (Google, X, Telegram, or Email).
+4. Complete the authentication flow.
+5. Your wallet is created automatically. You can use it across all integrated Sei dApps.
-## How to Integrate Sei Global Wallet
+## How to integrate Sei Global Wallet
### Prerequisites
-**EIP-6963:** A standard that allows multiple wallets to coexist without conflicts. Instead of fighting over `window.ethereum`, wallets announce themselves through events, letting users choose which one to use.
+**EIP-6963:** A standard that lets multiple wallets coexist without conflicts. Instead of competing for `window.ethereum`, wallets announce themselves through events. Users can then choose which wallet to use.
-**Dynamic:** The infrastructure powering Sei Global Wallet. It handles authentication, key management, and cross-app wallet persistence while keeping wallets non-custodial.
+**Dynamic:** The infrastructure that powers Sei Global Wallet. It handles authentication, key management, and cross-app wallet persistence, and it keeps wallets non-custodial.
## Installation
-Add the [required consumer overrides](https://github.com/sei-protocol/sei-js/tree/main/packages/sei-global-wallet#required-consumer-overrides) to your root manifest **before** you install. Dynamic Global Wallet Client pulls `axios` and `uuid` versions with known vulnerabilities, and this package cannot push overrides into your app. The npm block pins `axios` to 1.18.0, `uuid` to 11.1.1, and `ws` to 8.21.0 under `viem`; the Bun block pins `axios` and `uuid` only. Drop the overrides once Dynamic ships a release that fixes those pins.
+Add the [required consumer overrides](https://github.com/sei-protocol/sei-js/tree/main/packages/sei-global-wallet#required-consumer-overrides) to your root manifest **before** you install. Dynamic Global Wallet Client pulls `axios` and `uuid` versions with known vulnerabilities. This package cannot push overrides into your app. The npm block pins `axios` to 1.18.0, `uuid` to 11.1.1, and `ws` to 8.21.0 under `viem`. The Bun block pins only `axios` and `uuid`. When Dynamic ships a release that fixes those pins, remove the overrides.
-Install Sei Global Wallet Package:
+Install the Sei Global Wallet package:
```bash
npm install @sei-js/sei-global-wallet
@@ -72,15 +72,15 @@ import '@sei-js/sei-global-wallet/eip6963';
`@sei-js/sei-global-wallet@2` is ESM-only. The `/eip6963` import still registers the provider. It also exports `registerEIP6963Provider`, `unregisterEIP6963Provider`, and `eip6963ProviderInfo`. Other entrypoints are `/ethereum`, `/solana`, and `/zerodev`.
-**Important:** Importing the package registers the wallet for discovery, but you'll need to ensure your application's provider stack is properly configured to interact with it. Most wallet connection libraries that support EIP-6963 will automatically detect the wallet after import.
+Make sure that the provider stack of your dApp is configured correctly to interact with the wallet. Importing the package only registers the wallet for discovery. Most wallet connection libraries that support EIP-6963 detect the wallet automatically after the import.
---
-## Integration Examples
+## Integration examples
-Below are integration examples for different frameworks and wallet provider libraries to properly integrate the pre-configured Sei Global Wallet package.
+These examples show how to integrate the preconfigured Sei Global Wallet package with different frameworks and wallet provider libraries.
-
+
**Create a new Vite app:**
```bash
@@ -88,13 +88,13 @@ npm create vite@latest my-sei-dapp -- --template react-ts
cd my-sei-dapp
```
-**Install Dependencies:**
+**Install dependencies:**
```bash
npm install @rainbow-me/rainbowkit wagmi viem @tanstack/react-query @sei-js/sei-global-wallet
```
-**Update App.tsx:**
+**Update `App.tsx`:**
```tsx
import '@rainbow-me/rainbowkit/styles.css';
@@ -156,7 +156,7 @@ export default function App() {
}
```
-**Run Your App:**
+**Run your app:**
```bash
npm run dev
@@ -164,7 +164,7 @@ npm run dev
-
+
**Create a new Vite app:**
```bash
@@ -172,13 +172,13 @@ npm create vite@latest my-sei-dapp -- --template react-ts
cd my-sei-dapp
```
-**Install Dependencies:**
+**Install dependencies:**
```bash
npm install connectkit wagmi viem @tanstack/react-query @sei-js/sei-global-wallet
```
-**Update App.tsx:**
+**Update `App.tsx`:**
```tsx
import '@sei-js/sei-global-wallet/eip6963';
@@ -244,7 +244,7 @@ export default function App() {
}
```
-**Run Your App:**
+**Run your app:**
```bash
npm run dev
@@ -252,7 +252,7 @@ npm run dev
-
+
**Create a new Vite app:**
```bash
@@ -260,13 +260,13 @@ npm create vite@latest my-sei-dapp -- --template react-ts
cd my-sei-dapp
```
-**Install Dependencies:**
+**Install dependencies:**
```bash
npm install @web3-react/core @web3-react/eip1193 @web3-react/types @sei-js/sei-global-wallet
```
-**Update App.tsx:**
+**Update `App.tsx`:**
```tsx
import '@sei-js/sei-global-wallet/eip6963';
@@ -388,7 +388,7 @@ export default function App() {
}
```
-**Run Your App:**
+**Run your app:**
```bash
npm run dev
@@ -396,7 +396,7 @@ npm run dev
-
+
**Create a new Vite app:**
```bash
@@ -404,7 +404,7 @@ npm create vite@latest my-sei-dapp -- --template react-ts
cd my-sei-dapp
```
-**Install Dependencies:**
+**Install dependencies:**
```bash
npm install @dynamic-labs/sdk-react-core \
@@ -412,7 +412,7 @@ npm install @dynamic-labs/sdk-react-core \
wagmi viem @tanstack/react-query @sei-js/sei-global-wallet
```
-**Update App.tsx:**
+**Update `App.tsx`:**
```tsx
import React from 'react';
@@ -520,17 +520,17 @@ function AccountInfo() {
}
```
-**Run Your App:**
+**Run your app:**
```bash
npm run dev
```
-**Note:** Replace `"REPLACE-WITH-YOUR-ENVIRONMENT-ID"` with your actual Dynamic environment ID from your [Dynamic dashboard](https://app.dynamic.xyz/dashboard/overview).
+**Note:** Replace `"REPLACE-WITH-YOUR-ENVIRONMENT-ID"` with your Dynamic environment ID from your [Dynamic dashboard](https://app.dynamic.xyz/dashboard/overview).
-
+
**Create a new Next.js app:**
```bash
@@ -538,7 +538,7 @@ npx create-next-app@latest my-sei-dapp --typescript --tailwind --eslint
cd my-sei-dapp
```
-**Install Dependencies:**
+**Install dependencies:**
```bash
npm install @dynamic-labs/sdk-react-core \
@@ -547,7 +547,7 @@ npm install @dynamic-labs/sdk-react-core \
@dynamic-labs/ethereum
```
-**layout.tsx:**
+**`layout.tsx`:**
```tsx
'use client';
@@ -571,7 +571,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
}
```
-**lib/providers.tsx:**
+**`lib/providers.tsx`:**
```tsx
'use client';
@@ -651,9 +651,9 @@ export default function Providers({ children }: { children: React.ReactNode }) {
}
```
-**Note:** Replace `"REPLACE-WITH-YOUR-ENVIRONMENT-ID"` with your actual Dynamic environment ID from your [Dynamic dashboard](https://app.dynamic.xyz/dashboard/overview).
+**Note:** Replace `"REPLACE-WITH-YOUR-ENVIRONMENT-ID"` with your Dynamic environment ID from your [Dynamic dashboard](https://app.dynamic.xyz/dashboard/overview).
-**page.tsx**
+**`page.tsx`:**
```tsx
'use client';
@@ -676,7 +676,7 @@ export default function Home() {
}
```
-**Run Your App:**
+**Run your app:**
```bash
npm run dev
@@ -684,23 +684,23 @@ npm run dev
-
-For projects using plain HTML/JavaScript without a build system, you can create a bundled version of Sei Global Wallet to include directly in your HTML pages.
+
+If your project uses plain HTML and JavaScript without a build system, you can create a bundled version of Sei Global Wallet. You can then include it directly in your HTML pages.
-**Create Bundle Directory**
+**Create a bundle directory**
```bash
mkdir sei-global-wallet-bundle
cd sei-global-wallet-bundle
```
-**Initialize npm Project**
+**Initialize an npm project**
```bash
npm init -y
```
-**Install Dependencies**
+**Install dependencies**
```bash
npm install @sei-js/sei-global-wallet
@@ -710,16 +710,16 @@ npm install @sei-js/sei-global-wallet
npm install --save-dev esbuild
```
-**Create Bundle Source File**
-Create bundle.js:
+**Create a bundle source file**
+Create `bundle.js`:
```js
// bundle.js
import '@sei-js/sei-global-wallet/eip6963';
```
-**Update package.json**
-Add this build script to your package.json:
+**Update `package.json`**
+Add this build script to your `package.json` file:
```json
{
@@ -729,17 +729,17 @@ Add this build script to your package.json:
}
```
-**Build the Bundle**
+**Build the bundle**
```bash
npm run build
```
-This creates sei-wallet-bundled.js
+This command creates `sei-wallet-bundled.js`.
-**Use in Your HTML Project**
+**Use the bundle in your HTML project**
-Copy sei-wallet-bundled.js to your web project and use it:
+Copy `sei-wallet-bundled.js` to your web project. Then load it in your HTML, as in this example:
```html
@@ -847,7 +847,7 @@ Copy sei-wallet-bundled.js to your web project and use it:
-
+
**Create a new Vite app:**
```bash
@@ -855,7 +855,7 @@ npm create vite@latest my-sei-dapp -- --template react-ts
cd my-sei-dapp
```
-**Install Dependencies:**
+**Install dependencies:**
```bash
npm install @web3auth/modal \
@@ -863,7 +863,7 @@ npm install @web3auth/modal \
@sei-js/sei-global-wallet
```
-**Create Web3Auth Context (src/web3authContext.ts):**
+**Create a Web3Auth context (`src/web3authContext.ts`):**
```ts
import '@sei-js/sei-global-wallet/eip6963';
@@ -882,7 +882,7 @@ const web3AuthContextConfig: Web3AuthContextConfig = {
export default web3AuthContextConfig;
```
-**Update App.tsx:**
+**Update `App.tsx`:**
```tsx
import './App.css';
@@ -965,7 +965,7 @@ function App() {
export default App;
```
-**Setup your main.tsx with Web3Auth Provider:**
+**Set up `main.tsx` with the Web3Auth provider:**
```tsx
import { StrictMode } from 'react';
@@ -1001,13 +1001,13 @@ createRoot(document.getElementById('root')!).render(
);
```
-**Run Your App:**
+**Run your app:**
```bash
npm run dev
```
-**Note:** Replace the `clientId` in `web3authContext.ts` with your actual Web3Auth client ID from your [Web3Auth Dashboard](https://dashboard.web3auth.io).
+**Note:** Replace the `clientId` in `web3authContext.ts` with your Web3Auth client ID from your [Web3Auth dashboard](https://dashboard.web3auth.io).
@@ -1016,11 +1016,11 @@ npm run dev
-### Troubleshooting & Debugging Tips
+### Troubleshooting & debugging tips
-#### Common Issues
+#### Common issues
-**Issue:** Sei Global Wallet doesn't appear in wallet list
+**Issue:** Sei Global Wallet does not appear in the wallet list
```bash
# Ensure the import is at the top of your App.tsx
@@ -1053,7 +1053,7 @@ chainId: '0x531'; // for Sei Mainnet (1329)
chainId: '0x530'; // for Sei Testnet (1328)
```
-### Debugging Commands
+### Debugging commands
```javascript
window.addEventListener('eip6963:announceProvider', (event) => {
@@ -1063,21 +1063,21 @@ window.addEventListener('eip6963:announceProvider', (event) => {
window.dispatchEvent(new Event('eip6963:requestProvider'));
```
-### Testing Tips
+### Testing tips
-1. **Test with multiple browsers** to ensure cross-browser compatibility
-2. **Clear browser cache** if wallets aren't appearing
-3. **Check browser console** for EIP-6963 events and errors
-4. **Test both testnet and mainnet** connections
-5. **Verify social login methods** work across different auth providers
+1. Test with multiple browsers to check cross-browser compatibility.
+2. If wallets do not appear, clear the browser cache.
+3. Check the browser console for EIP-6963 events and errors.
+4. Test connections to both Sei Testnet and Sei Mainnet.
+5. Verify that social login methods work across different authentication providers.
-### Security Considerations
+### Security considerations
-- Sei Global Wallet is **self-custodial** - users control their private keys
-- All communications between app and wallet are **encrypted**
-- **Multi-factor authentication** is available for enhanced security
-- Keys can be **exported** to other wallets like MetaMask
-- Platform has been **audited by Cure53** for security compliance
+- Sei Global Wallet is self-custodial: users control their private keys.
+- All communications between the dApp and the wallet are encrypted.
+- Multi-factor authentication is available for extra security.
+- Users can export their keys to other wallets, such as MetaMask.
+- Cure53 has audited the platform for security compliance.
@@ -1085,78 +1085,78 @@ window.dispatchEvent(new Event('eip6963:requestProvider'));
#### Q: What is Sei Global Wallet?
-Sei Global Wallet is an embedded wallet experience for the Sei network, enabling wallet creation and authentication through social logins. Unlike traditional embedded wallets, Sei Global Wallet offer greater flexibility by allowing users to carry their wallets across different apps within the Sei ecosystem.
+Sei Global Wallet is an embedded wallet for the Sei network. Users create a wallet and authenticate through social logins. Unlike traditional embedded wallets, Sei Global Wallet gives users more flexibility: they can carry their wallets across different dApps in the Sei ecosystem.
#### Q: What are the key benefits of Sei Global Wallet for developers and users?
-**For Developers:**
+**For developers:**
-- **Sei ecosystem front and center:** Add Sei as a login method to your app ("Log in with Sei")
-- **Simple integration:** Compatible with tools like RainbowKit, ConnectKit, and Web3-React
-- **Enhanced security:** Multi-factor authentication (MFA) and secure key management
+- You can add Sei as a login method to your dApp ("Log in with Sei").
+- Integration is simple. The wallet is compatible with tools such as RainbowKit, ConnectKit, and Web3-React.
+- Multi-factor authentication (MFA) and secure key management improve security.
-**For Users:**
+**For users:**
-- **Simplified onboarding:** Create wallets using familiar social logins
-- **Cross-app connectivity:** Navigate seamlessly across Sei ecosystem applications
-- **User-friendly flows:** Transaction simulation helps users understand impacts before confirmation
+- Users create wallets with familiar social logins, which simplifies onboarding.
+- Users can move between Sei ecosystem dApps with the same wallet.
+- Transaction simulation helps users understand the effects of a transaction before they confirm it.
#### Q: What login methods are currently supported?
-Sei Global Wallet support email, Google, X (Twitter), and Telegram authentication.
+Sei Global Wallet supports email, Google, X (Twitter), and Telegram authentication.
#### Q: How do the security considerations differ from traditional wallets?
-Key security differences include:
+Security differences include:
-- **Secure encrypted communication:** All communication between app and wallet popup is encrypted
-- **Protection against replay attacks:** Encrypted messaging prevents malicious reuse of data
-- **Trusted Execution Environments (TEEs):** Operations occur within secure environments
-- **Verified origins:** Only verified origins can interact with Sei Global Wallet
+- **Secure encrypted communication:** All communication between the dApp and the wallet popup is encrypted.
+- **Protection against replay attacks:** Encrypted messaging prevents malicious reuse of data.
+- **Trusted Execution Environments (TEEs):** Operations occur in secure environments.
+- **Verified origins:** Only verified origins can interact with Sei Global Wallet.
#### Q: Is Sei Global Wallet self-custodial or custodial?
-Sei Global Wallet is self-custodial, giving full control to end-users. Users can export their keys at any time and import them into other wallets, such as MetaMask.
+Sei Global Wallet is self-custodial, so users have full control. Users can export their keys at any time and import them into other wallets, such as MetaMask.
#### Q: Do Sei Global Wallet require browser extensions?
-No, they operate as embedded wallets that work directly in the browser without requiring extensions.
+No. They are embedded wallets that work directly in the browser, without extensions.
#### Q: Can I link my existing external wallet to my Sei Global Wallet?
-Not currently. In the future, you will be able to link external wallets to a Sei global account.
+No, not currently. In the future, you will be able to link external wallets to a Sei global account.
#### Q: What extra protections can I add to my Sei Global Wallet?
-While Global Wallets are non-custodial, good security practices include:
+Although Global Wallets are non-custodial, good security practices include:
-- **Enable multi-factor authentication (MFA)** for sensitive actions
-- **Be wary of phishing attempts** - verify sources before sharing information
-- **Always have backup methods** - link additional email or social login methods
-- **Never store authentication keys digitally** - keep private keys secure offline
+- Enable multi-factor authentication (MFA) for sensitive actions.
+- Be careful of phishing attempts. Verify sources before you share information.
+- Always have backup methods. Link more email or social login methods.
+- Never store authentication keys digitally. Keep private keys secure and offline.
#### Q: Have Sei Global Wallet been audited?
-Yes, the Dynamic Global Wallets product has been audited by Cure53.
+Yes. Cure53 has audited the Dynamic Global Wallets product.
#### Q: How should bugs be reported?
-Please provide:
+Include this information:
- Device details
- Browser information
-- Clear description of the issue
+- A clear description of the issue
- If possible, a Loom video or screen recording
-## References and Links
+## References and links
-- [Dynamic Global Wallet Documentation](https://www.dynamic.xyz/docs/react/global-wallets/overview)
-- [EIP-6963 Standard](https://eips.ethereum.org/EIPS/eip-6963)
-- [RainbowKit Documentation](https://www.rainbowkit.com/docs/introduction)
-- [ConnectKit Documentation](https://docs.family.co/connectkit)
-- [Web3-React Documentation](https://github.com/Uniswap/web3-react)
-- [Wagmi Documentation](https://wagmi.sh)
+- [Dynamic Global Wallet documentation](https://www.dynamic.xyz/docs/react/global-wallets/overview)
+- [EIP-6963 standard](https://eips.ethereum.org/EIPS/eip-6963)
+- [RainbowKit documentation](https://www.rainbowkit.com/docs/introduction)
+- [ConnectKit documentation](https://docs.family.co/connectkit)
+- [Web3-React documentation](https://github.com/Uniswap/web3-react)
+- [wagmi documentation](https://wagmi.sh)
- [WalletConnect Cloud](https://cloud.walletconnect.com)
diff --git a/evm/sei-js/create-sei.mdx b/evm/sei-js/create-sei.mdx
index fb8bb4e..a82686e 100644
--- a/evm/sei-js/create-sei.mdx
+++ b/evm/sei-js/create-sei.mdx
@@ -9,7 +9,7 @@ keywords: ['create-sei', 'scaffold', 'cli', 'sei', 'nextjs', 'wagmi', 'viem', 't
npx @sei-js/create-sei app -n my-sei-app
```
-The generated project includes Wagmi, Viem, RainbowKit, TypeScript, Tailwind CSS, Mantine UI, and Biome. It pins `@sei-js/precompiles` 3.x.
+The generated project includes wagmi, viem, RainbowKit, TypeScript, Tailwind CSS, Mantine UI, and Biome. It pins `@sei-js/precompiles` 3.x.
## Quick start
@@ -28,14 +28,14 @@ You do not need to install `@sei-js/create-sei` globally. `-n` and `--name` are
-The project name must be an unscoped lowercase npm package name (`my-sei-app`). Scoped names, spaces, and most punctuation are rejected.
+The project name must be an unscoped lowercase npm package name, for example `my-sei-app`. The CLI rejects scoped names, spaces, and most punctuation.
## Interactive setup
-Run the command without `-n` to enter the project name interactively:
+To enter the project name interactively, run the command without `-n`:
```bash
npx @sei-js/create-sei app
@@ -51,7 +51,7 @@ bun run dev
-Open `http://localhost:3000`. The generated dApp connects to Sei Mainnet when `NEXT_PUBLIC_CHAIN` is unset. Set `NEXT_PUBLIC_CHAIN=testnet` in `.env.local` to use Sei Testnet. The template's `.env.example` already sets that value, so copying it to `.env.local` selects testnet.
+Open `http://localhost:3000`. If `NEXT_PUBLIC_CHAIN` is not set, the generated dApp connects to Sei Mainnet. To use Sei Testnet, set `NEXT_PUBLIC_CHAIN=testnet` in `.env.local`. The template's `.env.example` already sets that value. If you copy it to `.env.local`, the dApp uses Sei Testnet.
@@ -67,17 +67,19 @@ Open `http://localhost:3000`. The generated dApp connects to Sei Mainnet when `N
## Default template
-The default template is a Next.js EVM dApp. Wagmi and Viem provide typed blockchain interactions. RainbowKit provides wallet connections and defaults to the generic injected connector, not a MetaMask-only setup.
+The default template is a Next.js EVM dApp. It uses wagmi and viem for typed blockchain interactions. RainbowKit handles wallet connections. It defaults to the generic injected connector, not a MetaMask-only setup.
-The template pins Next.js 15, React 19, Wagmi 2, Viem 2, RainbowKit 2, TanStack Query 5, Tailwind CSS 4, Mantine 8, Biome 2, and `@sei-js/precompiles` 3.x. Exact versions live in the generated `package.json`.
+The template pins Next.js 15, React 19, wagmi 2, viem 2, RainbowKit 2, and TanStack Query 5. It also pins Tailwind CSS 4, Mantine 8, Biome 2, and `@sei-js/precompiles` 3.x. The exact versions are in the generated `package.json`.
```bash
npx @sei-js/create-sei app -n my-sei-app
```
-The template declares `packageManager: bun@1.3.14`, so use Bun 1.3.14 or newer for `bun install` and `bun run dev`. Its `overrides` block pins patched transitive dependencies in the npm and Bun format. Yarn reads `resolutions` and pnpm reads `pnpm.overrides`, so both skip those pins and resolve a different, unverified dependency graph.
+The template declares `packageManager: bun@1.3.14`. Use Bun 1.3.14 or newer for `bun install` and `bun run dev`. Its `overrides` block pins patched transitive dependencies in the npm and Bun format. Yarn reads `resolutions`, and pnpm reads `pnpm.overrides`. Both skip those pins and resolve a different, unverified dependency graph.
-WalletConnect-based wallets need `NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID` in `.env.local`. The injected connector works without it. Next.js image optimization is disabled in the template because of a Sharp version conflict, so `next/image` serves unoptimized images.
+WalletConnect-based wallets need `NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID` in `.env.local`. The injected connector works without it.
+
+The template disables Next.js image optimization because of a Sharp version conflict. As a result, `next/image` serves unoptimized images.
## Extensions
@@ -100,17 +102,17 @@ npx @sei-js/create-sei app -n my-sei-precompile-app --extension precompiles
## Included configuration
- Next.js App Router project structure
-- Wallet connections through Wagmi, RainbowKit, and the injected browser-wallet connector
-- Sei Mainnet and Sei Testnet configuration via `NEXT_PUBLIC_CHAIN`
+- Wallet connections through wagmi, RainbowKit, and the injected browser-wallet connector
+- Sei Mainnet and Sei Testnet configuration through `NEXT_PUBLIC_CHAIN`
- TypeScript, Biome, Mantine UI, and Tailwind CSS
-Install [Node.js](https://nodejs.org/) 20 or newer to run the CLI with `npx`. That is the version the generated project's `.nvmrc` pins. Install [Bun](https://bun.sh/docs/installation) 1.3.14 or newer to install and run the generated project.
+To run the CLI with `npx`, install [Node.js](https://nodejs.org/) 20 or newer. The generated project's `.nvmrc` pins that version. To install and run the generated project, install [Bun](https://bun.sh/docs/installation) 1.3.14 or newer.
## Troubleshooting
-- If `bun install` fails, confirm `bun --version` reports 1.3.14 or newer.
-- For Node.js version conflicts when running `npx`, use `nvm` to switch to Node 20 or newer.
-- For npm permission errors, do not use `sudo`. Use `nvm` or fix your npm permissions.
-- For registry timeouts, run `npm config set registry https://registry.npmjs.org/` before retrying `npx`.
+- If `bun install` fails, confirm that `bun --version` reports 1.3.14 or newer.
+- If you get a Node.js version conflict when you run `npx`, use `nvm` to switch to Node 20 or newer.
+- If you get npm permission errors, do not use `sudo`. Use `nvm` or fix your npm permissions.
+- If the registry times out, run `npm config set registry https://registry.npmjs.org/` before you run `npx` again.
diff --git a/evm/sei-js/index.mdx b/evm/sei-js/index.mdx
index 288a693..1c5f76d 100644
--- a/evm/sei-js/index.mdx
+++ b/evm/sei-js/index.mdx
@@ -4,29 +4,29 @@ sidebarTitle: 'Introduction'
description: 'TypeScript packages for building EVM applications on Sei'
keywords: ['sei-js', 'typescript', 'sdk', 'sei network', 'evm', 'precompiles', 'wallet', 'mcp']
---
-`@sei-js` is a set of TypeScript packages for building EVM applications on Sei. Use the packages for Sei-specific functionality, and use standard EVM libraries such as Viem or Ethers.js for everything else.
+`@sei-js` is a set of TypeScript packages for building EVM applications on Sei. Use the packages for Sei-specific functionality, and use standard EVM libraries such as viem or ethers.js for everything else.
-Sei is EVM-compatible, so you can also use Foundry, Hardhat, Wagmi, and other Ethereum tooling. `@sei-js` adds precompile ABIs, chain definitions, wallet integration, network metadata, scaffolding, and an MCP server.
+Sei is EVM-compatible, so you can also use Foundry, Hardhat, wagmi, and other Ethereum tooling. `@sei-js` adds precompile ABIs, chain definitions, wallet integration, network metadata, scaffolding, and an MCP server.
-@sei-js is open source. Contribute at [github.com/sei-protocol/sei-js](https://github.com/sei-protocol/sei-js).
+`@sei-js` is open source. Contribute at [github.com/sei-protocol/sei-js](https://github.com/sei-protocol/sei-js).
-Current npm majors are ESM-only: `@sei-js/precompiles@3`, `@sei-js/registry@2`, `@sei-js/create-sei@2`, `@sei-js/sei-global-wallet@2`, and `@sei-js/mcp-server@1`. Use `import`. `require()` does not resolve these packages. `@sei-js/precompiles` needs Viem 2.55.16 or newer. The MCP server needs Node.js 20 or newer. `@sei-js/ledger` is not part of the current monorepo.
+The current npm major versions are ESM-only: `@sei-js/precompiles@3`, `@sei-js/registry@2`, `@sei-js/create-sei@2`, `@sei-js/sei-global-wallet@2`, and `@sei-js/mcp-server@1`. Use `import`. `require()` does not resolve these packages. `@sei-js/precompiles` needs viem 2.55.16 or newer. The MCP server needs Node.js 20 or newer. `@sei-js/ledger` is not part of the current monorepo.
## Why @sei-js?
- Typed ABIs and addresses for Sei precompiles
-- Viem's Sei Mainnet and Sei Testnet chain definitions re-exported for convenience, plus a `seiLocal` definition for local nodes
+- Sei Mainnet and Sei Testnet chain definitions from viem, re-exported for convenience, plus a `seiLocal` definition for local nodes
- Packages that work with standard EVM libraries
## Packages
### [@sei-js/precompiles](/evm/precompiles)
-Import precompile addresses and raw `*_PRECOMPILE_ABI` constants from the package root, `@sei-js/precompiles/precompiles`, or `@sei-js/precompiles/viem`. Ethers factories live on `@sei-js/precompiles/ethers`.
+Import precompile addresses and raw `*_PRECOMPILE_ABI` constants from the package root, `@sei-js/precompiles/precompiles`, or `@sei-js/precompiles/viem`. Import the ethers factories from `@sei-js/precompiles/ethers`.
-Viem owns the `sei` and `seiTestnet` chain definitions, so import those from `viem/chains`. The root and `viem` entrypoints re-export them if you would rather use a single import, and they also export `seiLocal` for a local node.
+The `sei` and `seiTestnet` chain definitions are part of viem, so import them from `viem/chains`. If you prefer a single import, the root and `viem` entrypoints re-export them. These entrypoints also export `seiLocal` for a local node.
```bash
npm install @sei-js/precompiles@^3
@@ -42,7 +42,7 @@ npx @sei-js/create-sei app
### [@sei-js/sei-global-wallet](/evm/sei-global-wallet)
-Add the EIP-6963 compatible Sei Global Wallet to a dApp.
+Add the EIP-6963-compatible Sei Global Wallet to a dApp.
```bash
npm install @sei-js/sei-global-wallet
@@ -66,24 +66,24 @@ npx @sei-js/mcp-server
## Deprecated packages
-The five packages above are the entire current monorepo. Every other `@sei-js` package is deprecated on npm and no longer maintained. If one of these appears in your `package.json`, migrate off it.
+The five packages above are the entire current monorepo. Every other `@sei-js` package is deprecated on npm and no longer maintained. If your `package.json` includes one of these deprecated packages, migrate away from it.
| Deprecated package | What to use instead |
| --- | --- |
-| `@sei-js/evm` | `@sei-js/precompiles` — same library, renamed |
-| `@sei-js/ledger` | No replacement. See [Ledger with ethers](/evm/ledger-ethers) for the EVM signing flow |
+| `@sei-js/evm` | `@sei-js/precompiles` (the same library, renamed) |
+| `@sei-js/ledger` | No replacement. For the EVM signing flow, see [Ledger with ethers](/evm/ledger-ethers) |
| `@sei-js/x402` | `@x402/core` and `@x402/evm`. See [x402 on Sei](/ai/x402) |
| `@sei-js/x402-fetch` | `@x402/fetch` and `@x402/evm` |
| `@sei-js/x402-axios` | `@x402/axios` and `@x402/evm` |
| `@sei-js/x402-express` | `@x402/express`, `@x402/core`, and `@x402/evm` |
| `@sei-js/x402-hono` | `@x402/hono`, `@x402/core`, and `@x402/evm` |
| `@sei-js/x402-next` | `@x402/next`, `@x402/core`, and `@x402/evm` |
-| `@sei-js/core` | No replacement. Use Viem or Ethers.js for EVM access |
+| `@sei-js/core` | No replacement. Use viem or ethers.js for EVM access |
| `@sei-js/cosmjs` | No replacement |
| `@sei-js/cosmos` | No replacement |
| `@sei-js/proto` | No replacement |
-The last four covered Cosmos SDK access, which is deprecated under [SIP-3](/learn/sip-03-migration). Build on the EVM instead.
+The last four packages covered Cosmos SDK access, which is deprecated under [SIP-3](/learn/sip-03-migration). Build on the EVM instead.
## Quick start
@@ -96,47 +96,47 @@ bun install
bun run dev
```
-See [Scaffold Sei](/evm/sei-js/create-sei) for the generated template and CLI options.
+For the generated template and CLI options, see [Scaffold Sei](/evm/sei-js/create-sei).
## Examples
-End-to-end code examples using viem and ethers with Sei:
+These end-to-end code examples use viem and ethers with Sei:
-
+
Read chain data, send transactions, and interact with contracts in a Node.js script or backend.
-
- The same patterns using ethers v6, including browser provider and event listening.
+
+ The same patterns with ethers v6, including the browser provider and event listening.
-
- Connect wallets, read balances, and write contracts in a React app using Wagmi hooks.
+
+ Connect wallets, read balances, and write contracts in a React dApp with wagmi hooks.
-
+
Read metadata, check balances, transfer tokens, approve spenders, and query transfer history.
-
+
Check ownership, transfer NFTs, manage approvals, and watch transfer events.
-
+
Batch balance queries, single and batch transfers, operator approvals, and event watching.
- Batch multiple contract reads into a single RPC call with Multicall3 and viem/ethers/wagmi.
+ Batch multiple contract reads into a single RPC call with Multicall3 and viem, ethers, or wagmi.
-
+
Look up pointer addresses for existing CW20 and CW721 contracts, then interact with them through ERC interfaces.
-
+
Native balances, staking, rewards, and governance voting from JavaScript.
-
- Deploy contracts with viem, ethers, Foundry, or Hardhat and verify on Seiscan via Sourcify.
+
+ Deploy contracts with viem, ethers, Foundry, or Hardhat, and verify them on Seiscan through Sourcify.
-
+
Send transactions, wait for receipts, and decode event logs.
-
+
Decode reverts, handle wallet rejections, and retry transient RPC failures.
diff --git a/evm/sei-js/registry.mdx b/evm/sei-js/registry.mdx
index 636de8e..5217ecd 100644
--- a/evm/sei-js/registry.mdx
+++ b/evm/sei-js/registry.mdx
@@ -8,7 +8,7 @@ keywords: ['sei-js', 'registry', 'chain constants', 'rpc endpoints', 'token list
`@sei-js/registry` exports typed chain IDs, endpoints, token metadata, and wallet information for Sei Mainnet and Sei Testnet. Network and wallet data comes from the official [sei-protocol/chain-registry](https://github.com/sei-protocol/chain-registry). Token metadata comes from the community-maintained [Seitrace asset list](https://github.com/Seitrace/sei-assetlist).
-The package is ESM-only. Sei Mainnet and Sei Testnet are the only supported networks. `CHAIN_IDS.devnet`, `GAS_INFO`, and `IBC_INFO` are no longer exported.
+The package is ESM-only. Sei Mainnet and Sei Testnet are the only supported networks. The package no longer exports `CHAIN_IDS.devnet`, `GAS_INFO`, or `IBC_INFO`.
## Installation
@@ -19,7 +19,7 @@ npm install @sei-js/registry
## CHAIN_IDS
-Canonical chain IDs for each Sei network:
+`CHAIN_IDS` has the canonical chain ID for each Sei network:
```ts
import { CHAIN_IDS } from '@sei-js/registry';
@@ -28,11 +28,11 @@ CHAIN_IDS.mainnet // 'pacific-1'
CHAIN_IDS.testnet // 'atlantic-2'
```
-Use these constants anywhere you reference a Sei network by chain ID to avoid hardcoding strings.
+To avoid hardcoded strings, use these constants wherever you reference a Sei network by chain ID.
## NETWORKS
-RPC, REST, gRPC, EVM RPC, WebSocket, and explorer endpoints for each network:
+`NETWORKS` has the RPC, REST, gRPC, EVM RPC, WebSocket, and explorer endpoints for each network:
```ts
import { NETWORKS, type Network } from '@sei-js/registry';
@@ -50,7 +50,7 @@ const evmWs = mainnet.evm_ws?.[0].url;
const rest = mainnet.rest[0].url;
```
-Each endpoint has `provider` and `url` fields. You can iterate through the available providers to implement fallback logic:
+Each endpoint has `provider` and `url` fields. To implement fallback logic, you can iterate through the available providers:
```ts
async function getWorkingRpc(network: Network) {
@@ -73,10 +73,10 @@ async function getWorkingRpc(network: Network) {
## TOKEN_LIST
-Token metadata per network includes names, symbols, base denominations, decimal exponents, images, and CoinGecko IDs:
+The token metadata for each network includes names, symbols, base denominations, decimal exponents, images, and CoinGecko IDs:
-`TOKEN_LIST` filters assets whose base or denomination starts with `ibc/`, along with assets marked as ICS-20. The community asset list may still contain legacy tokenfactory entries for display or compatibility. Do not treat those entries as supported integration targets. Tokenfactory is not supported for new development.
+Do not treat legacy tokenfactory entries as supported integration targets. Tokenfactory is not supported for new development. `TOKEN_LIST` filters assets whose base or denomination starts with `ibc/`, along with assets marked as ICS-20. The community asset list may still contain legacy tokenfactory entries for display or compatibility.
```ts
@@ -94,11 +94,11 @@ console.log(sei?.type_asset);
console.log(sei?.pointer_contract);
```
-Exported entries use `RegistryToken`, so `type_asset` is required. `images.png`, `images.svg`, and `coingecko_id` are optional. NFT entries can have an empty `denom_units` array. Some assets also include optional `pointer_contract` metadata (`address` plus `cw20` or `erc20`). Identify an asset by network and `base` denomination, not by pointer data alone.
+Exported entries use the `RegistryToken` type, so `type_asset` is required. `images.png`, `images.svg`, and `coingecko_id` are optional. NFT entries can have an empty `denom_units` array. Some assets also include optional `pointer_contract` metadata (`address` plus `cw20` or `erc20`). Identify an asset by network and `base` denomination, not by pointer data alone.
## CHAIN_INFO
-`CHAIN_INFO` contains mainnet metadata such as the `seid` binary name, Bech32 prefix, fee token, SLIP-44 coin type, and supported native wallets:
+`CHAIN_INFO` contains Sei Mainnet metadata such as the `seid` binary name, Bech32 prefix, fee token, SLIP-44 coin type, and supported native wallets:
```ts
import { CHAIN_INFO } from '@sei-js/registry';
@@ -135,7 +135,7 @@ const keplr = WALLETS.find(w => w.identifier === 'keplr');
// url: 'https://www.keplr.app', capabilities: ['native', 'evm'] }
```
-The current list is MetaMask (`evm`), Keplr (`native` and `evm`), and Coin98 (`native`). That is separate from `CHAIN_INFO.supported_wallets`, which is the upstream native-wallet list (`keplr`, `coin98`).
+The current list is MetaMask (`evm`), Keplr (`native` and `evm`), and Coin98 (`native`). This list is separate from `CHAIN_INFO.supported_wallets`, which is the upstream native-wallet list (`keplr`, `coin98`).
## Supported networks
@@ -145,4 +145,4 @@ The current list is MetaMask (`evm`), Keplr (`native` and `evm`), and Coin98 (`n
| EVM chain ID | 1329 | 1328 |
| EVM RPC | `NETWORKS['pacific-1'].evm_rpc` | `NETWORKS['atlantic-2'].evm_rpc` |
| EVM WebSocket | `NETWORKS['pacific-1'].evm_ws` | `NETWORKS['atlantic-2'].evm_ws` |
-| Faucets | — | `NETWORKS['atlantic-2'].faucets` |
+| Faucets | None | `NETWORKS['atlantic-2'].faucets` |
diff --git a/evm/solidity-resources.mdx b/evm/solidity-resources.mdx
index 4fddcea..20cdf34 100644
--- a/evm/solidity-resources.mdx
+++ b/evm/solidity-resources.mdx
@@ -9,65 +9,65 @@ keywords:
- ethereum development
- web3 resources
---
-Most development resources for developing with Soldity on Ethereum Mainnet also apply to development on Sei.
+Most Solidity development resources for Ethereum Mainnet also apply to Sei.
-This page suggests a minimal set of resources for getting started with building a decentralized app for Sei EVM.
+This page lists a minimal set of resources to help you start building a dApp on Sei EVM.
## IDEs
- **[Remix](https://remix.ethereum.org)**
- An interactive Solidity IDE that is the easiest and fastest way to start coding and compiling Solidity smart contracts without any additional installations.
+ An interactive Solidity IDE. You can use it to start coding and compiling Solidity smart contracts without installing anything.
- **[VSCode](https://code.visualstudio.com)** + **[Solidity extension](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity)**
## Basic Solidity
- **[CryptoZombies](https://cryptozombies.io/en/course)**
- A great end-to-end introduction to building dApps on the EVM. It offers lessons suitable for complete beginners as well as developers from other disciplines.
+ An end-to-end introduction to building dApps on the EVM. It has lessons for complete beginners and for developers from other disciplines.
- **[Solidity by Example](https://solidity-by-example.org)**
- Introduces Solidity concepts progressively through simple examples – ideal for developers with some programming background.
+ Introduces Solidity concepts progressively through simple examples. It suits developers who have some programming background.
- **[Blockchain Basics course by Cyfrin Updraft](https://updraft.cyfrin.io/courses/blockchain-basics)**
Covers the fundamentals of blockchain, DeFi, and smart contracts.
- **[Solidity Smart Contract Development by Cyfrin Updraft](https://updraft.cyfrin.io/courses/solidity)**
- Offers hands-on experience to become a smart contract developer.
+ Gives you hands-on experience to become a smart contract developer.
## Intermediate Solidity
- **[The Solidity Language](https://docs.soliditylang.org)**
- Official documentation providing an end-to-end description of smart contracts, blockchain basics, compiling, and deployment on an EVM.
+ Official documentation with an end-to-end description of smart contracts, blockchain basics, compiling, and deployment on an EVM.
- **[Solidity Patterns](https://github.com/fravoll/solidity-patterns)**
- A repository of code templates with explanations of their usage.
+ A repository of code templates, with explanations of how to use them.
- **[OpenZeppelin](https://www.openzeppelin.com)**
- Provides a library of customizable template contracts for common Ethereum token deployments (e.g., ERC20, ERC721, ERC1155, Proxy). Note that these are not gas optimized. They provide the defacto standard for smart contract templates and are used across almost all existing smart contracts.
+ A library of customizable template contracts for common Ethereum token deployments, such as ERC-20, ERC-721, ERC-1155, and Proxy. These contracts are not gas optimized. They are the de facto standard for smart contract templates, and almost all existing smart contracts use them.
- **[Uniswap](https://github.com/Uniswap)**
- A professional, easy-to-digest smart contract of the [Uniswap V2 pools](https://github.com/Uniswap/v2-core) that gives an overview of an in-production Solidity dApp. A guided walkthrough is available [here](https://ethereum.org/en/developers/tutorials/uniswap-v2-annotated-code/). For the more advanced Uniswap Pools, check out the Uniswap V3 [here](https://github.com/Uniswap/v3-core) and Uniswap V4 [here](https://github.com/Uniswap/v4-core).
+ A professional, easy-to-read smart contract for the [Uniswap V2 pools](https://github.com/Uniswap/v2-core). It gives an overview of a Solidity dApp in production. A [guided walkthrough](https://ethereum.org/en/developers/tutorials/uniswap-v2-annotated-code/) is available. For the more advanced Uniswap pools, see [Uniswap V3](https://github.com/Uniswap/v3-core) and [Uniswap V4](https://github.com/Uniswap/v4-core).
- **[Morpho Finance](https://github.com/morpho-org)**
- Morpho Finance's contracts provides an excellent real-world example of production-grade Solidity smart contracts, demonstrating how a successful DeFi lending protocol is structured and implemented. By studying Morpho's codebase, you can learn advanced patterns for gas optimization, security best practices, and complex financial logic implementation in a production environment. The accompanying documentation [here](https://docs.morpho.org/overview/) offers additional context to understand the protocol's architecture and design principles.
+ Morpho Finance's contracts are a real-world example of production-grade Solidity smart contracts. They show how a successful DeFi lending protocol is structured and implemented. In Morpho's codebase, you can learn advanced patterns for gas optimization and security best practices. You can also see how to implement complex financial logic in production. The accompanying [documentation](https://docs.morpho.org/overview/) gives more context on the protocol's architecture and design principles.
- **[Sky / Maker DAO](https://github.com/makerdao)**
- A pioneering DeFi protocol that created the DAI and USDS stablecoin. MakerDAO's codebase showcases complex financial mechanisms including collateralized debt positions, oracles, and governance systems. The project demonstrates how to implement a stable cryptocurrency backed by crypto collateral through sophisticated risk management systems.
+ An early DeFi protocol that created the DAI and USDS stablecoins. MakerDAO's codebase shows complex financial mechanisms, including collateralized debt positions, oracles, and governance systems. The project demonstrates how to implement a stable cryptocurrency, backed by crypto collateral, through sophisticated risk management systems.
- **[Rareskills Blog](https://rareskills.io/blog)**
- Features in-depth articles on various Solidity concepts and their [Book of Gas Optimization](https://www.rareskills.io/post/gas-optimization).
+ Has in-depth articles on various Solidity concepts. It also has the [Book of Gas Optimization](https://www.rareskills.io/post/gas-optimization).
- **[Foundry Fundamentals course by Cyfrin Updraft](https://updraft.cyfrin.io/courses/foundry)**
- A comprehensive web3 development course covering Foundry—the industry-standard framework for building, deploying, and testing smart contracts.
+ A web3 development course on Foundry, the industry-standard framework for building, deploying, and testing smart contracts.
- **[Smart Contract Programmer YT channel](https://www.youtube.com/@smartcontractprogrammer)**
- Contains many in-depth videos covering topics from ABI encoding to EVM memory management.
+ Has many in-depth videos on topics from ABI encoding to EVM memory management.
- **[DeFi developer roadmap](https://github.com/OffcierCia/DeFi-Developer-Road-Map)**
## Advanced Solidity
- **[Solmate repository](https://github.com/transmissions11/solmate)** and **[Solady repository](https://github.com/Vectorized/solady)**
- Gas-optimized contracts using Solidity or Yul.
+ Gas-optimized contracts written in Solidity or Yul.
- **[Yul](https://docs.soliditylang.org/en/latest/yul.html)**
- An intermediate language for Solidity, akin to inline assembly for the EVM, offering control flow constructs while exposing low-level memory management.
+ An intermediate language for Solidity, similar to inline assembly for the EVM. It has control flow constructs and exposes low-level memory management.
- **[Advanced Foundry course by Cyfrin Updraft](https://updraft.cyfrin.io/courses/advanced-foundry)**
- Teaches advanced smart contract development including building DeFi protocols, stablecoins, DAOs, and more.
+ Teaches advanced smart contract development, including how to build DeFi protocols, stablecoins, DAOs, and more.
- **[Smart Contract Security course by Cyfrin Updraft](https://updraft.cyfrin.io/courses/security)**
- Provides comprehensive training on auditing and writing secure protocols.
+ Teaches you how to audit protocols and write secure ones.
- **[Assembly and Formal Verification course by Cyfrin Updraft](https://updraft.cyfrin.io/courses/formal-verification)**
- Covers Assembly, using Yul, EVM opcodes, formal verification testing, and related tools.
+ Covers assembly with Yul, EVM opcodes, formal verification testing, and related tools.
- **[Smart Contract DevOps course by Cyfrin Updraft](https://updraft.cyfrin.io/courses/wallets)**
Focuses on post-deployment security, wallet access control, and ongoing protocol maintenance.
- **[Secureum YT Channel](https://www.youtube.com/@SecureumVideos)**
- Features a variety of videos covering topics from Solidity basics to advanced subjects such as fuzzing and auditing.
+ Has videos on topics from Solidity basics to advanced subjects such as fuzzing and auditing.
## Tutorials
@@ -79,11 +79,11 @@ This page suggests a minimal set of resources for getting started with building
## Testing
- **[Echidna](https://github.com/crytic/echidna)**
- Fuzz testing tool for Solidity.
+ A fuzz testing tool for Solidity.
- **[Slither](https://github.com/crytic/slither)**
- A static analysis framework for detecting vulnerabilities.
+ A static analysis framework that detects vulnerabilities.
- **[solidity-coverage](https://github.com/sc-forks/solidity-coverage)**
- Provides code coverage metrics for Solidity tests.
+ Gives code coverage metrics for Solidity tests.
## Smart contract archives
@@ -91,37 +91,37 @@ This page suggests a minimal set of resources for getting started with building
A collection of contracts verified on Etherscan.
- **[EVM function signature database](https://www.4byte.directory)**
- **[EVM verified contracts on Etherscan](https://etherscan.io/contractsVerified)**
- If you are adventurous: Check the verified contracts on Etherscan directly.
+ Browse the verified contracts on Etherscan directly.
## Using the OpenZeppelin Wizard
-OpenZeppelin provides a convenient web-based wizard to create standard contracts. Visit the docs section for it [here](/evm/evm-wizard) or [https://wizard.openzeppelin.com/](https://wizard.openzeppelin.com/) to access it.
+OpenZeppelin has a web-based wizard for creating standard contracts. To use it, see the [EVM Contract Wizard](/evm/evm-wizard) page in these docs, or go to [https://wizard.openzeppelin.com/](https://wizard.openzeppelin.com/).
-The wizard allows you to:
+With the wizard, you can:
-1. Select the contract type (ERC20, ERC721, ERC1155, etc.)
+1. Select the contract type (for example, ERC-20, ERC-721, or ERC-1155)
2. Configure settings, features, and access controls
3. Add custom functionality through a user-friendly interface
4. Generate ready-to-use Solidity code
-The wizard is perfect for:
+The wizard is useful for:
-- Beginners learning smart contract development
+- Beginners who are learning smart contract development
- Quickly bootstrapping standard token contracts
- Exploring different configuration options
- Understanding best practices in contract development
-## Best Practices & Security Considerations
+## Best practices & security considerations
-When developing on Sei EVM with OpenZeppelin contracts, follow these best practices:
+When you develop on Sei EVM with OpenZeppelin contracts, follow these best practices:
1. **Always use the latest version** of OpenZeppelin contracts
-2. **Start with existing, audited components** rather than building from scratch
-3. **Run comprehensive tests** before deploying to mainnet
+2. **Start with existing, audited components** instead of building from scratch
+3. **Run comprehensive tests** before you deploy to Sei Mainnet
4. **Consider upgradeability** for complex applications
-5. **Use access controls** like `Ownable` or `AccessControl` for privileged functions
+5. **Use access controls** such as `Ownable` or `AccessControl` for privileged functions
6. **Implement reentrancy guards** where needed
-7. **Avoid `transfer()` and `send()`** for ETH transfers, use `call()` with reentrancy protection
+7. **Avoid `transfer()` and `send()`** for ETH transfers. Use `call()` with reentrancy protection instead.
8. **Validate all inputs** and check for edge cases
9. **Consider gas optimization**, but not at the expense of security
10. **Consider getting an audit** for high-value contracts
diff --git a/evm/templates.mdx b/evm/templates.mdx
index 49da99e..4db5f78 100644
--- a/evm/templates.mdx
+++ b/evm/templates.mdx
@@ -29,12 +29,12 @@ bun install
bun run dev
```
-Open `http://localhost:3000`. The dApp connects to Sei Mainnet unless `.env.local` sets `NEXT_PUBLIC_CHAIN=testnet`. Copy the template's `.env.example` to `.env.local` to use Sei Testnet.
+Open `http://localhost:3000`. The dApp connects to Sei Mainnet unless `.env.local` sets `NEXT_PUBLIC_CHAIN=testnet`. To use Sei Testnet, copy the template's `.env.example` to `.env.local`.
## Templates
-
+
The [default template](/evm/sei-js/create-sei#default-template) is a Next.js App Router dApp with typed wallet connections and contract reads and writes. That page lists its stack and pinned versions.
```bash
@@ -43,7 +43,7 @@ Open `http://localhost:3000`. The dApp connects to Sei Mainnet unless `.env.loca
- The default template plus a Bank [precompile](/evm/precompiles/example-usage) example that queries the native SEI supply through `@sei-js/precompiles`.
+ This is the default template plus a Bank [precompile](/evm/precompiles/example-usage) example. The example queries the native SEI supply through `@sei-js/precompiles`.
```bash
npx @sei-js/create-sei app -n my-sei-precompile-app --extension precompiles
@@ -52,23 +52,23 @@ Open `http://localhost:3000`. The dApp connects to Sei Mainnet unless `.env.loca
- Run `npx @sei-js/create-sei list-extensions` to see every available extension. The [Scaffold Sei](/evm/sei-js/create-sei) page documents all CLI options and the interactive setup.
+ To see every available extension, run `npx @sei-js/create-sei list-extensions`. The [Scaffold Sei](/evm/sei-js/create-sei) page documents all CLI options and the interactive setup.
## What the templates include
- RainbowKit with the generic injected browser-wallet connector. WalletConnect-based wallets also need `NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID` in `.env.local`.
+ The templates use RainbowKit with the generic injected browser-wallet connector. WalletConnect-based wallets also need `NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID` in `.env.local`.
- Sei Mainnet (EVM chain ID `1329`) and Sei Testnet (EVM chain ID `1328`), selected with `NEXT_PUBLIC_CHAIN`.
+ The templates support Sei Mainnet (EVM chain ID `1329`) and Sei Testnet (EVM chain ID `1328`). `NEXT_PUBLIC_CHAIN` selects the network.
- End-to-end TypeScript with Wagmi and Viem, so contract calls and ABIs are typed.
+ The templates use TypeScript end to end with wagmi and viem, so contract calls and ABIs are typed.
- Tailwind CSS and Mantine UI for styling, and Biome for formatting.
+ The templates use Tailwind CSS and Mantine UI for styling, and Biome for formatting.
@@ -78,15 +78,15 @@ Open `http://localhost:3000`. The dApp connects to Sei Mainnet unless `.env.loca
## Contribute a template
-Templates ship as part of `@sei-js/create-sei`. To add one, such as a DeFi starter, an NFT mint, or an x402 payments dApp, open a pull request in [`sei-protocol/sei-js`](https://github.com/sei-protocol/sei-js/tree/main/packages/create-sei). Once it ships in the CLI, it can be listed here.
+Templates ship as part of `@sei-js/create-sei`. To add a template, open a pull request in [`sei-protocol/sei-js`](https://github.com/sei-protocol/sei-js/tree/main/packages/create-sei). For example, you can add a DeFi starter, an NFT mint, or an x402 payments dApp. After the template ships in the CLI, it can be listed here.
## Next steps
- Every `create-sei` option, extension, and troubleshooting step.
+ See every `create-sei` option, extension, and troubleshooting step.
- Wire Wagmi, Viem, and a wallet into a Sei dApp from first principles.
+ Connect wagmi, viem, and a wallet to a Sei dApp from first principles.
diff --git a/evm/tokens.mdx b/evm/tokens.mdx
index 852a0d7..9022b5f 100644
--- a/evm/tokens.mdx
+++ b/evm/tokens.mdx
@@ -4,15 +4,15 @@ sidebarTitle: 'View Tokens'
description: 'Learn how to view and manage different token types in MetaMask with Sei network, including ERC20 tokens, ERC721 NFTs.'
keywords: ['metamask tokens', 'erc20', 'erc721', 'nft display']
---
-#### ERC20 Tokens
+#### ERC20 tokens
-To view ERC20 tokens in MetaMask, the process mirrors that on other EVM chains.
-For tokens not automatically listed, you'll need to manually import them into
-your wallet. Detailed instructions can be found
-[here](https://support.metamask.io/manage-crypto/tokens/how-to-display-tokens-in-metamask/).
+To view ERC20 tokens in MetaMask, follow the same process as on other EVM chains.
+If a token is not listed automatically, import it into your wallet manually. For
+detailed instructions, see the
+[MetaMask guide on how to display tokens](https://support.metamask.io/manage-crypto/tokens/how-to-display-tokens-in-metamask/).
#### ERC721 NFTs
-Viewing NFTs in MetaMask requires manual addition. Follow the steps provided
-[here](https://support.metamask.io/manage-crypto/nfts/nft-tokens-in-your-metamask-wallet/)
-to add and view your NFTs in the wallet.
+You must add NFTs to MetaMask manually before you can view them. To add and view
+your NFTs in the wallet, follow the steps in the
+[MetaMask NFT guide](https://support.metamask.io/manage-crypto/nfts/nft-tokens-in-your-metamask-wallet/).
diff --git a/evm/tracing/index.mdx b/evm/tracing/index.mdx
index b99b7a6..4edd7ec 100644
--- a/evm/tracing/index.mdx
+++ b/evm/tracing/index.mdx
@@ -6,7 +6,7 @@ keywords: ['debug tracing', 'evm debugging', 'transaction analysis', 'gas optimi
---
## Requirements
-The examples in this guide call the debug JSON-RPC endpoints directly with `curl` — no SDK or additional libraries are required. Optionally install [`jq`](https://jqlang.github.io/jq/) to pretty-print the JSON responses:
+The examples in this guide call the debug JSON-RPC endpoints directly with `curl`. You do not need an SDK or other libraries. To pretty-print the JSON responses, you can install [`jq`](https://jqlang.github.io/jq/):
```bash
# macOS
@@ -16,51 +16,51 @@ brew install jq
sudo apt-get install jq
```
-Debug tracing is your primary tool for understanding EVM transaction execution on Sei. This comprehensive system allows you to analyze transaction flow, optimize gas usage, debug smart contract interactions, and troubleshoot production issues.
+Debug tracing is your primary tool to understand how EVM transactions execute on Sei. With it, you can analyze transaction flow, optimize gas usage, debug smart contract interactions, and troubleshoot production issues.
-## What You Can Trace
+## What you can trace
-### Transaction Execution
+### Transaction execution
- Step-by-step opcode execution
- Contract call hierarchy
- Gas consumption breakdown
- State changes and storage access
-### Contract Interactions
+### Contract interactions
- Cross-contract calls and returns
- Event emission analysis
- Precompile usage tracking
- External library calls
-### Performance Analysis
+### Performance analysis
- Gas optimization opportunities
- Bottleneck identification
-- Cache hit/miss patterns
+- Cache hit and miss patterns
- State access efficiency
-### Security Analysis
+### Security analysis
- Suspicious operation detection
- Reentrancy pattern analysis
- Access control verification
- Vulnerability scanning
-## Available Tracing Methods
+## Available tracing methods
-| Method | Purpose | Use Case |
-| -------------------------- | -------------------------- | ----------------------------- |
-| `debug_traceTransaction` | Trace specific transaction | Debugging failed transactions |
-| `debug_traceBlockByNumber` | Trace entire block | Block-level analysis |
-| `debug_traceCall` | Simulate and trace | Testing before execution |
-| `debug_traceStateAccess` | State access patterns | Performance optimization |
+| Method | Purpose | Use case |
+| -------------------------- | ---------------------------- | ----------------------------- |
+| `debug_traceTransaction` | Trace a specific transaction | Debugging failed transactions |
+| `debug_traceBlockByNumber` | Trace an entire block | Block-level analysis |
+| `debug_traceCall` | Simulate and trace | Testing before execution |
+| `debug_traceStateAccess` | State access patterns | Performance optimization |
| `debug_traceTransactionProfile` | Trace plus timing/store-access profiling | Latency breakdown and DB-access analysis |
-## Transaction Analysis Example
+## Transaction analysis example
-Tracing an ERC-20 transfer transaction:
+This example traces an ERC-20 transfer transaction:
@@ -268,11 +268,11 @@ curl -X POST -H "Content-Type: application/json" \
-## Debugging Failed Transactions
+## Debugging failed transactions
-Steps to analyze and resolve transaction failures:
+Use these steps to analyze and fix transaction failures:
-### Step 1: Identify the Problem
+### Step 1: Identify the problem
```bash
# Get transaction receipt
@@ -288,7 +288,7 @@ curl -X POST -H "Content-Type: application/json" \
https://evm-rpc.sei-apis.com
```
-### Step 2: Trace the Execution
+### Step 2: Trace the execution
```bash
# Trace to see where it failed
@@ -310,7 +310,7 @@ curl -X POST -H "Content-Type: application/json" \
https://evm-rpc.sei-apis.com
```
-Response
+**Response:**
```json
{
@@ -332,7 +332,7 @@ Response
}
```
-### Step 3: Fix and Test
+### Step 3: Fix and test
```bash
# Simulate the fix with debug_traceCall
@@ -363,31 +363,31 @@ curl -X POST \
https://evm-rpc.sei-apis.com
```
-## Common Debugging Scenarios
+## Common debugging scenarios
-### Transaction Reverted
+### Transaction reverted
-**Problem**: Transaction failed with revert
-**Solution**: Use `callTracer` to find the exact revert reason
+**Problem**: The transaction failed with a revert.
+**Solution**: Use `callTracer` to find the exact revert reason.
-### Out of Gas
+### Out of gas
-**Problem**: Transaction ran out of gas
-**Solution**: Use gas analysis tracer to optimize gas usage
+**Problem**: The transaction ran out of gas.
+**Solution**: Use the gas analysis tracer to optimize gas usage.
-### Unexpected Behavior
+### Unexpected behavior
-**Problem**: Transaction succeeded but wrong result
-**Solution**: Use opcode tracer for step-by-step analysis
+**Problem**: The transaction succeeded, but the result is wrong.
+**Solution**: Use the opcode tracer for step-by-step analysis.
-### Slow Performance
+### Slow performance
-**Problem**: Transaction uses too much gas
-**Solution**: Use state access tracer to find inefficiencies
+**Problem**: The transaction uses too much gas.
+**Solution**: Use the state access tracer to find inefficiencies.
-## Quick Reference
+## Quick reference
-### Essential Commands
+### Essential commands
```bash
# Trace transaction
@@ -403,53 +403,53 @@ debug_traceCall(tx, "latest", {tracer: "callTracer"})
debug_traceStateAccess(hash)
```
-### Common Tracers
+### Common tracers
- **`callTracer`**: Contract call hierarchy
- **`opcodeTracer`**: Opcode-level execution
- **Custom JS**: Custom analysis logic
-## Pre-Baked Trace Cache
+## Pre-baked trace cache
-RPC nodes can optionally pre-compute and cache `debug_trace*` results in the background so that trace requests are served from a local on-disk cache instead of re-executing the block live on every call. This is an opt-in feature configured through new `[evm]` fields in `app.toml` and is recommended for RPC nodes only.
+RPC nodes can optionally pre-compute and cache `debug_trace*` results in the background. The node then serves trace requests from a local on-disk cache instead of re-executing the block live on every call. You configure this opt-in feature through `[evm]` fields in `app.toml`. It is recommended for RPC nodes only.
-When enabled, a background worker re-executes each committed block with the configured tracers and stores the results in a Pebble database at `/data/trace_db`. The following methods serve from this cache on hit, and otherwise fall through to live re-execution:
+When the feature is enabled, a background worker re-executes each committed block with the configured tracers. It stores the results in a Pebble database at `/data/trace_db`. These methods serve results from this cache on a cache hit. Otherwise, they fall through to live re-execution:
- `debug_traceTransaction`
- `debug_traceBlockByNumber` and `debug_traceBlockByHash`
### When the cache is used
-A request is only served from cache when trace baking is enabled **and** the request uses a *bakeable* tracer configuration:
+The node serves a request from the cache only when trace baking is enabled **and** the request uses a *bakeable* tracer configuration:
- The tracer is one of `callTracer`, `prestateTracer`, or `flatCallTracer`.
-- No custom `tracerConfig` is supplied. A per-call `tracerConfig` (for example `{"withLog": true}`) is not part of the cache key, so any custom tracer config makes the request un-bakeable and it falls through to live re-execution.
+- The request does not include a custom `tracerConfig`. A per-call `tracerConfig` (for example, `{"withLog": true}`) is not part of the cache key. Any custom tracer config makes the request un-bakeable, so it falls through to live re-execution.
-Requests that use the struct logger (no tracer), a JavaScript tracer, or any other named tracer are always executed live.
+Requests that use the struct logger (no tracer), a JavaScript tracer, or any other named tracer always run live.
### Configuration
-Trace baking is controlled by these `[evm]` fields in `app.toml`:
+These `[evm]` fields in `app.toml` control trace baking:
| Field | Default | Description |
| ----- | ------- | ----------- |
| `trace_bake_enabled` | `false` | Enables the background trace-baking worker that caches results at `/data/trace_db`. RPC nodes only. |
| `trace_bake_workers` | `1` | Number of re-execution worker goroutines. |
-| `trace_bake_queue_size` | `4096` | Bounds the in-flight height queue. Heights are dropped when the queue is full so consensus never blocks; dropped blocks fall through to live re-execution. |
+| `trace_bake_queue_size` | `4096` | Bounds the in-flight height queue. When the queue is full, heights are dropped so that consensus never blocks. Dropped blocks fall through to live re-execution. |
| `trace_bake_tracers` | `["callTracer"]` | Which tracers to bake per block. Eligible values: `callTracer`, `prestateTracer`, `flatCallTracer`. |
-| `trace_bake_window_blocks` | `0` | Rolling prune window: blocks older than `(latest - window)` are pruned. `0` disables pruning, so the cache grows forever. |
+| `trace_bake_window_blocks` | `0` | Rolling prune window: blocks older than `(latest - window)` are pruned. `0` disables pruning, so the cache grows without limit. |
| `trace_bake_use_snapshot` | `false` | Uses in-memory memiavl snapshots as the state backend for trace baking when the store backend supports snapshots. |
-| `trace_bake_snapshot_window` | `64` | Number of recent memiavl snapshots to retain for trace baking. |
+| `trace_bake_snapshot_window` | `64` | Number of recent memiavl snapshots to keep for trace baking. |
-Enabling trace baking adds a persistent on-disk store at `/data/trace_db` and increases disk usage. The store's write-ahead log is flushed when the node shuts down cleanly.
+Trace baking adds a persistent on-disk store at `/data/trace_db` and increases disk usage. The node flushes the store's write-ahead log when it shuts down cleanly.
## Removed legacy trace filters
-The legacy `*ExcludeTraceFail` endpoints have been removed. Use `debug_traceBlockByNumber` or `debug_traceBlockByHash` for block tracing and `eth_getTransactionReceipt` for EVM receipts. There is no block or filter method for discovering synthetic logs from Cosmos-originated transactions. If you already know a synthetic transaction hash, enable `sei_getTransactionReceipt` to retrieve its receipt and logs.
+The legacy `*ExcludeTraceFail` endpoints have been removed. For block tracing, use `debug_traceBlockByNumber` or `debug_traceBlockByHash`. For EVM receipts, use `eth_getTransactionReceipt`. There is no block or filter method to discover synthetic logs from Cosmos-originated transactions. If you already know a synthetic transaction hash, enable `sei_getTransactionReceipt` to get its receipt and logs.
-## Next Steps
+## Next steps
-1. **[JavaScript Tracers](/evm/tracing/javascript-tracers)** - Custom analysis scripts
-2. **[Troubleshooting](/evm/tracing/troubleshooting)** - Common issues and solutions
+1. **[JavaScript tracers](/evm/tracing/javascript-tracers)**: Custom analysis scripts
+2. **[Troubleshooting](/evm/tracing/troubleshooting)**: Common issues and solutions
-Start with `callTracer` for general debugging, then use specialized tracers for specific analysis needs.
+Start with `callTracer` for general debugging. Then use specialized tracers for specific analysis needs.
diff --git a/evm/tracing/javascript-tracers.mdx b/evm/tracing/javascript-tracers.mdx
index ac27ae6..c09de20 100644
--- a/evm/tracing/javascript-tracers.mdx
+++ b/evm/tracing/javascript-tracers.mdx
@@ -3,11 +3,11 @@ title: 'JavaScript Tracers'
description: 'Create custom debugging logic with JavaScript tracers for advanced EVM transaction analysis on Sei. Learn performance optimization, memory management, and advanced debugging patterns.'
keywords: ['javascript tracers', 'custom tracers', 'evm debugging', 'tracer optimization', 'sei debugging']
---
-JavaScript tracers allow you to create custom debugging logic for analyzing EVM transactions on Sei. This powerful feature enables sophisticated analysis patterns beyond what built-in tracers provide.
+JavaScript tracers let you create custom debugging logic to analyze EVM transactions on Sei. You can use them for more complex analysis than the built-in tracers support.
-## Interface Overview
+## Interface overview
-Every JavaScript tracer follows this structure:
+Every JavaScript tracer has this structure:
```javascript
{
@@ -35,33 +35,33 @@ Every JavaScript tracer follows this structure:
}
```
-## Core Methods
+## Core methods
### step(log, db)
-Called for each EVM opcode execution. This is where your main analysis logic goes.
+This method runs for each EVM opcode that executes. Put your main analysis logic here.
**Parameters:**
-- `log`: Current execution context with methods like `getPC()`, `op.toString()`, `getCost()`
-- `db`: Database interface for querying state
+- `log`: The current execution context, with methods such as `getPC()`, `op.toString()`, and `getCost()`
+- `db`: The database interface to query state
-**Gas Cost**: Varies by tracer complexity
+**Gas cost**: Varies by tracer complexity
### result(ctx, db)
-Called at the end of execution to return your analysis results.
+This method runs at the end of execution and returns your analysis results.
**Parameters:**
-- `ctx`: Execution context with `gasUsed`, transaction info
-- `db`: Database interface for final queries
+- `ctx`: The execution context, with `gasUsed` and transaction information
+- `db`: The database interface for final queries
-## Advanced Tracer Examples
+## Advanced tracer examples
-### State Change Tracker
+### State change tracker
-Monitor all state modifications with detailed analysis:
+Track every state change in detail:
```javascript
{
@@ -96,7 +96,7 @@ Monitor all state modifications with detailed analysis:
}
```
-### DeFi Transaction Analysis
+### DeFi transaction analysis
Analyze complex DeFi transactions with multiple contract interactions:
@@ -132,7 +132,7 @@ Analyze complex DeFi transactions with multiple contract interactions:
}
```
-### Security Analysis Tracer
+### Security analysis tracer
Detect suspicious patterns and potential vulnerabilities:
@@ -185,7 +185,7 @@ Detect suspicious patterns and potential vulnerabilities:
}
```
-### Gas Optimization Tracer
+### Gas optimization tracer
Identify expensive operations for gas optimization:
@@ -221,11 +221,11 @@ Identify expensive operations for gas optimization:
}
```
-## Performance Optimization
+## Performance optimization
-**Performance**: JavaScript tracers can significantly slow down tracing. Optimize your tracer code and use timeouts for production use.
+Optimize your tracer code, and use timeouts in production. JavaScript tracers can slow down tracing significantly.
-### Memory-Efficient Patterns
+### Memory-efficient patterns
```javascript
// ✅ Efficient - Use summary data
@@ -257,7 +257,7 @@ Identify expensive operations for gas optimization:
}
```
-### Selective Operation Tracking
+### Selective operation tracking
```javascript
{
@@ -289,9 +289,9 @@ Identify expensive operations for gas optimization:
}
```
-## Configuration Options
+## Configuration options
-### Basic Configuration
+### Basic configuration
```json
{
@@ -306,7 +306,7 @@ Identify expensive operations for gas optimization:
}
```
-### Production Settings
+### Production settings
```json
{
@@ -320,9 +320,9 @@ Identify expensive operations for gas optimization:
}
```
-## Practical Integration Examples
+## Practical integration examples
-### Smart Contract Debugger
+### Smart contract debugger
```solidity
contract TransactionAnalyzer {
@@ -351,7 +351,7 @@ contract TransactionAnalyzer {
}
```
-### DeFi Analytics Dashboard
+### DeFi analytics dashboard
```javascript
// Off-chain analytics service
@@ -384,18 +384,18 @@ class DeFiAnalytics {
}
```
-## Best Practices
+## Best practices
-1. **Start Simple**: Begin with basic tracers before adding complexity
-2. **Limit Data Collection**: Only collect necessary information
-3. **Use Efficient Data Structures**: Prefer counters over arrays when possible
-4. **Set Appropriate Timeouts**: Balance thoroughness with performance
-5. **Test Incrementally**: Validate tracers on simple transactions first
-6. **Handle Errors Gracefully**: Include error handling in your tracers
+1. **Start simple**: Begin with basic tracers before you add complexity.
+2. **Limit data collection**: Collect only the information that you need.
+3. **Use efficient data structures**: Prefer counters to arrays when possible.
+4. **Set appropriate timeouts**: Balance thoroughness with performance.
+5. **Test incrementally**: Validate tracers on simple transactions first.
+6. **Handle errors gracefully**: Include error handling in your tracers.
-## Common Use Cases
+## Common use cases
-### Gas Profiling
+### Gas profiling
```javascript
const gasProfiler = `{
@@ -423,7 +423,7 @@ const gasProfiler = `{
}`;
```
-### Event Extraction
+### Event extraction
```javascript
const eventExtractor = `{
@@ -451,4 +451,4 @@ const eventExtractor = `{
}`;
```
-**Need Help?** If you encounter issues with JavaScript tracers, check out our [Troubleshooting Guide](/evm/tracing/troubleshooting) for common solutions and debugging tips.
+If you have issues with JavaScript tracers, see the [Troubleshooting guide](/evm/tracing/troubleshooting) for common solutions and debugging tips.
diff --git a/evm/tracing/troubleshooting.mdx b/evm/tracing/troubleshooting.mdx
index d0184e8..a7f083e 100644
--- a/evm/tracing/troubleshooting.mdx
+++ b/evm/tracing/troubleshooting.mdx
@@ -3,15 +3,15 @@ title: 'Troubleshooting Guide'
description: 'Comprehensive troubleshooting guide for EVM transaction tracing on Sei. Resolve common issues with timeouts, memory limits, JavaScript errors, and performance optimization.'
keywords: ['tracing troubleshooting', 'debug errors', 'tracer timeout', 'memory limits', 'javascript tracer errors']
---
-This guide covers common issues encountered when using EVM transaction tracing on Sei and provides practical solutions to resolve them.
+This guide covers common issues with EVM transaction tracing on Sei and gives practical solutions for them.
-## Common Error Categories
+## Common error categories
-### 1. Timeout Errors
+### 1. Timeout errors
**Error**: `execution timeout`
-**Cause**: Tracer execution exceeded the configured timeout duration.
+**Cause**: The tracer execution exceeded the configured timeout.
**Solutions**:
@@ -23,18 +23,18 @@ This guide covers common issues encountered when using EVM transaction tracing o
}
```
-**Best Practices**:
+**Best practices**:
- Start with shorter timeouts (30s) for testing
-- Increase gradually based on transaction complexity
-- Use built-in tracers when possible (they're faster)
+- Increase the timeout gradually, based on transaction complexity
+- Use built-in tracers when possible, because they are faster
- Optimize JavaScript tracer code for performance
-### 2. Memory Limit Errors
+### 2. Memory limit errors
**Error**: `out of memory` or `memory limit exceeded`
-**Cause**: Tracer collected too much data or inefficient memory usage.
+**Cause**: The tracer collected too much data or used memory inefficiently.
**Solutions**:
@@ -48,7 +48,7 @@ This guide covers common issues encountered when using EVM transaction tracing o
}
```
-**Memory-Efficient Tracer Pattern**:
+**Memory-efficient tracer pattern**:
```javascript
{
@@ -77,11 +77,11 @@ This guide covers common issues encountered when using EVM transaction tracing o
}
```
-### 3. JavaScript Tracer Errors
+### 3. JavaScript tracer errors
-**Error**: `SyntaxError` or `ReferenceError` in JavaScript tracer
+**Error**: `SyntaxError` or `ReferenceError` in a JavaScript tracer
-**Common Issues**:
+**Common issues**:
```javascript
// ❌ Incorrect - Missing quotes
@@ -109,7 +109,7 @@ This guide covers common issues encountered when using EVM transaction tracing o
}
```
-**Debugging JavaScript Tracers**:
+**Debugging JavaScript tracers**:
```javascript
{
@@ -140,7 +140,7 @@ This guide covers common issues encountered when using EVM transaction tracing o
}
```
-### 4. Network and Connection Issues
+### 4. Network and connection issues
**Error**: `connection refused` or `network timeout`
@@ -159,11 +159,11 @@ curl --connect-timeout 30 --max-time 120 \
http://localhost:8545
```
-### 5. Transaction Not Found
+### 5. Transaction not found
**Error**: `transaction not found`
-**Debugging Steps**:
+**Debugging steps**:
```bash
# 1. Verify transaction exists
@@ -182,11 +182,11 @@ curl -X POST -H "Content-Type: application/json" \
http://localhost:8545
```
-## Performance Optimization
+## Performance optimization
-### Tracer Performance Tips
+### Tracer performance tips
-1. **Limit Data Collection**:
+1. **Limit data collection**:
```javascript
{
@@ -208,7 +208,7 @@ curl -X POST -H "Content-Type: application/json" \
}
```
-2. **Use Efficient Data Structures**:
+2. **Use efficient data structures**:
```javascript
// ❌ Inefficient - Object lookups
@@ -239,7 +239,7 @@ curl -X POST -H "Content-Type: application/json" \
}
```
-3. **Selective Tracing**:
+3. **Selective tracing**:
```javascript
{
@@ -257,7 +257,7 @@ curl -X POST -H "Content-Type: application/json" \
}
```
-### Node Configuration for Better Performance
+### Node configuration for better performance
```toml
# In your node configuration
@@ -272,9 +272,9 @@ trace-memory-limit = "1GB"
trace-cache-size = 1000
```
-## Debugging Workflows
+## Debugging workflows
-### 1. Failed Transaction Analysis
+### 1. Failed transaction analysis
```bash
#!/bin/bash
@@ -297,7 +297,7 @@ curl -s -X POST -H "Content-Type: application/json" \
http://localhost:8545 | jq '.result'
```
-### 2. Gas Optimization Workflow
+### 2. Gas optimization workflow
```javascript
// Step 1: Identify expensive operations
@@ -348,53 +348,53 @@ const storageTracer = `{
}`;
```
-## Error Code Reference
+## Error code reference
-### Common HTTP Error Codes
+### Common HTTP error codes
-| Code | Error | Solution |
-| ---- | --------------------- | -------------------------------------------- |
-| 400 | Bad Request | Check JSON-RPC format and parameters |
-| 404 | Not Found | Verify transaction hash and node sync status |
-| 500 | Internal Server Error | Check node logs and resource limits |
-| 503 | Service Unavailable | Node may be syncing or overloaded |
+| Code | Error | Solution |
+| ---- | --------------------- | ------------------------------------------------ |
+| 400 | Bad Request | Check the JSON-RPC format and parameters |
+| 404 | Not Found | Verify the transaction hash and node sync status |
+| 500 | Internal Server Error | Check the node logs and resource limits |
+| 503 | Service Unavailable | The node may be syncing or overloaded |
-### Tracer-Specific Errors
+### Tracer-specific errors
-| Error | Cause | Solution |
-| ------------------- | ----------------------------- | ------------------------------------------------ |
-| `execution timeout` | Tracer took too long | Increase timeout or optimize tracer |
-| `out of memory` | Too much data collected | Reduce data collection or disable memory tracing |
-| `invalid tracer` | JavaScript syntax error | Validate tracer syntax |
-| `tracer not found` | Built-in tracer doesn't exist | Check available tracers |
+| Error | Cause | Solution |
+| ------------------- | ---------------------------------- | ------------------------------------------------ |
+| `execution timeout` | The tracer took too long | Increase the timeout or optimize the tracer |
+| `out of memory` | Too much data collected | Reduce data collection or disable memory tracing |
+| `invalid tracer` | JavaScript syntax error | Validate the tracer syntax |
+| `tracer not found` | The built-in tracer does not exist | Check the available tracers |
-## Best Practices Summary
+## Best practices summary
### ✅ Do's
-- **Start Simple**: Begin with built-in tracers before custom JavaScript
-- **Set Timeouts**: Always configure appropriate timeouts
-- **Limit Data**: Collect only necessary information
-- **Test Incrementally**: Test tracers on simple transactions first
-- **Monitor Resources**: Watch memory and CPU usage
-- **Cache Results**: Store expensive trace results when possible
+- **Start simple**: Begin with built-in tracers before you write custom JavaScript.
+- **Set timeouts**: Always configure appropriate timeouts.
+- **Limit data**: Collect only the information that you need.
+- **Test incrementally**: Test tracers on simple transactions first.
+- **Monitor resources**: Watch memory and CPU usage.
+- **Cache results**: Store expensive trace results when possible.
### ❌ Don'ts
-- **Don't Collect Everything**: Avoid tracing all operations unnecessarily
-- **Don't Ignore Errors**: Always handle tracer errors gracefully
-- **Don't Use Complex Logic**: Keep tracer step functions simple
-- **Don't Forget Timeouts**: Never run tracers without timeout limits
-- **Don't Trace in Production**: Avoid heavy tracing on production nodes
+- **Do not collect everything**: Avoid tracing all operations unnecessarily.
+- **Do not ignore errors**: Always handle tracer errors gracefully.
+- **Do not use complex logic**: Keep tracer step functions simple.
+- **Do not forget timeouts**: Never run tracers without timeout limits.
+- **Do not trace in production**: Avoid heavy tracing on production nodes.
-## Getting Help
+## Getting help
-If you encounter issues not covered in this guide:
+If you have an issue that this guide does not cover:
-1. **Check Node Logs**: Look for error messages in your Sei node logs
-2. **Verify Configuration**: Ensure your node has tracing enabled
-3. **Test Connectivity**: Confirm RPC endpoints are accessible
-4. **Simplify Tracers**: Try built-in tracers first
-5. **Community Support**: Ask in the [Sei Discord](https://discord.gg/sei) #dev-support channel
+1. **Check node logs**: Look for error messages in your Sei node logs.
+2. **Verify the configuration**: Make sure that tracing is enabled on your node.
+3. **Test connectivity**: Confirm that the RPC endpoints are accessible.
+4. **Simplify tracers**: Try built-in tracers first.
+5. **Community support**: Ask in the #dev-support channel of the [Sei Discord](https://discord.gg/sei).
-When reporting issues, include your tracer code, the transaction hash, and any error messages you receive. This helps the community provide better assistance.
+When you report an issue, include your tracer code, the transaction hash, and any error messages that you receive. This helps the community help you.
diff --git a/evm/transactions-with-seid.mdx b/evm/transactions-with-seid.mdx
index fbeb74f..5f55812 100644
--- a/evm/transactions-with-seid.mdx
+++ b/evm/transactions-with-seid.mdx
@@ -5,41 +5,41 @@ keywords: ['seid transactions', 'evm transactions', 'contract deployment', 'toke
---
## Overview
-EVM transactions on Sei allow you to interact with smart contracts, transfer tokens, deploy contracts, and manage various blockchain operations through the command line interface. This guide covers all available transaction types using the `seid` CLI, from basic token transfers to complex contract interactions and precompile calls.
+EVM transactions on Sei let you interact with smart contracts, transfer tokens, deploy contracts, and manage other blockchain operations from the command line. This guide covers all available transaction types in the `seid` CLI, from basic token transfers to complex contract interactions and precompile calls.
## Prerequisites
-Sending transactions via CLI requires you to have keys configured in your local keyring. You can then specify the key you want to use by appending `--from=[key name]` to your command.
+To send transactions with the CLI, you must have keys configured in your local keyring. To select the key for a command, append `--from=[key name]` to it.
-If you don't already have keys configured, you'll need to either generate a new key or import an existing one into your local keyring. Refer to this guide on [how to create a key](/evm/installing-seid-cli) for more details.
+If you do not have keys configured yet, generate a new key or import an existing one into your local keyring. For details, see [how to create a key](/evm/installing-seid-cli).
-## Network Configuration
+## Network configuration
-If the machine you run these commands from are not a node of the network, you'd need to append the following to your commands:
+If you run these commands from a machine that is not a network node, append this flag to each command:
```bash
--evm-rpc http://
```
-Refer to the [RPC endpoints](/evm/networks) page for the list of available RPC endpoints.
+For a list of available RPC endpoints, see [RPC endpoints](/evm/networks).
-Most commands support `--evm-rpc` flag to specify custom RPC endpoints. The default is `http://localhost:8545`.
+Most commands support the `--evm-rpc` flag, which sets a custom RPC endpoint. The default is `http://localhost:8545`.
-## Common Transaction Flags
+## Common transaction flags
All transaction commands support these common flags:
-- `--from=` - Specifies the key name to use for signing
-- `--gas-fee-cap=` - Gas fee cap for the transaction (default varies by command)
-- `--gas-limit=` - Gas limit for the transaction (default varies by command)
-- `--evm-rpc=` - EVM RPC endpoint URL (default: `http://localhost:8545`)
-- `--nonce=` - Nonce override for the transaction (-1 means auto-calculate)
+- `--from=`: Specifies the key name to use for signing
+- `--gas-fee-cap=`: Maximum fee per unit of gas for the transaction (default varies by command)
+- `--gas-limit=`: Gas limit for the transaction (default varies by command)
+- `--evm-rpc=`: EVM RPC endpoint URL (default: `http://localhost:8545`)
+- `--nonce=`: Nonce override for the transaction (-1 means auto-calculate)
## Address management commands
### Associate an address
-Associates the Sei address and EVM address on-chain for the sending key. This is required for cross-layer interactions.
+This command associates the Sei address and the EVM address of the sending key on-chain. Cross-layer interactions require this association.
```bash
seid tx evm native-associate [custom-message] --from=
@@ -56,13 +56,13 @@ seid tx evm native-associate "associate" \
--node https://rpc.sei-apis.com
```
-The legacy `seid tx evm associate-address` command and its `sei_associate` JSON-RPC method have been removed.
+The legacy `seid tx evm associate-address` command and its `sei_associate` JSON-RPC method were removed.
-## Token Transfer Commands
+## Token transfer commands
-### Send Native Tokens
+### Send native tokens
-Sends native tokens (usei) to the target EVM address.
+This command sends native tokens (usei) to the target EVM address.
```bash
seid tx evm send [to EVM address] [amount in wei] --from= --gas-fee-cap= --gas-limit= --evm-rpc=
@@ -70,10 +70,10 @@ seid tx evm send [to EVM address] [amount in wei] --from= --gas-fee-cap=
**Parameters:**
-- `[to EVM address]` - Destination EVM address (0x format)
-- `[amount in wei]` - Amount to send in wei (smallest unit)
+- `[to EVM address]`: Destination EVM address (0x format)
+- `[amount in wei]`: Amount to send in wei (smallest unit)
-**Default Flags:**
+**Default flags:**
- `--gas-fee-cap=1000000000000` (1000 Gwei)
- `--gas-limit=21000`
@@ -84,15 +84,15 @@ seid tx evm send [to EVM address] [amount in wei] --from= --gas-fee-cap=
seid tx evm send 0x1234567890abcdef1234567890abcdef12345678 1000000000000000000 --from=mykey
```
-**Output :**
+**Output:**
```
Transaction hash: 0x...
```
-### Send ERC20 Tokens
+### Send ERC20 tokens
-Sends ERC20 tokens from a specific contract to a recipient.
+This command sends ERC20 tokens from a specific contract to a recipient.
```bash
seid tx evm erc20-send [contract addr] [recipient] [amount] --from= --gas-fee-cap= --gas-limit= --evm-rpc=
@@ -100,11 +100,11 @@ seid tx evm erc20-send [contract addr] [recipient] [amount] --from= --ga
**Parameters:**
-- `[contract addr]` - ERC20 contract address
-- `[recipient]` - Recipient EVM address
-- `[amount]` - Amount in smallest unit of the token
+- `[contract addr]`: ERC20 contract address
+- `[recipient]`: Recipient EVM address
+- `[amount]`: Amount in the smallest unit of the token
-**Default Flags:**
+**Default flags:**
- `--gas-fee-cap=1000000000000` (1000 Gwei)
- `--gas-limit=7000000`
@@ -115,17 +115,17 @@ seid tx evm erc20-send [contract addr] [recipient] [amount] --from= --ga
seid tx evm erc20-send 0xTokenContract123... 0xRecipient456... 1000000 --from=mykey
```
-**Output :**
+**Output:**
```
Transaction hash: 0x...
```
-## Contract Deployment Commands
+## Contract deployment commands
-### Deploy Contract
+### Deploy contract
-Deploys an EVM contract from a binary file.
+This command deploys an EVM contract from a binary file.
```bash
seid tx evm deploy [path to binary] --from= --gas-fee-cap= --gas-limit= --evm-rpc=
@@ -133,9 +133,9 @@ seid tx evm deploy [path to binary] --from= --gas-fee-cap= --gas-li
**Parameters:**
-- `[path to binary]` - Path to the contract binary file
+- `[path to binary]`: Path to the contract binary file
-**Default Flags:**
+**Default flags:**
- `--gas-fee-cap=1000000000000` (1000 Gwei)
- `--gas-limit=5000000`
@@ -146,7 +146,7 @@ seid tx evm deploy [path to binary] --from= --gas-fee-cap= --gas-li
seid tx evm deploy ./MyContract.bin --from=mykey --gas-limit=8000000
```
-**Output :**
+**Output:**
```
Deployer: 0x...
@@ -154,11 +154,11 @@ Deployed to: 0x...
Transaction hash: 0x...
```
-## Contract Interaction Commands
+## Contract interaction commands
-### Call Contract
+### Call contract
-Calls an EVM contract with a specific payload. You can generate payload by taking a look at docs [here](/evm/querying-the-evm#payload-generation).
+This command calls an EVM contract with a specific payload. To generate the payload, see [Payload generation](/evm/querying-the-evm#payload-generation).
```bash
seid tx evm call-contract [addr] [payload hex] --value= --from= --gas-fee-cap= --gas-limit= --evm-rpc=
@@ -166,14 +166,14 @@ seid tx evm call-contract [addr] [payload hex] --value= --from=
**Parameters:**
-- `[addr]` - Contract address
-- `[payload hex]` - Function call data in hex format
+- `[addr]`: Contract address
+- `[payload hex]`: Function call data in hex format
-**Default Flags:**
+**Default flags:**
- `--gas-fee-cap=1000000000000` (1000 Gwei)
- `--gas-limit=7000000`
-- `--value=0` - SEI value to send with the call
+- `--value=0`: SEI value to send with the call
**Example:**
@@ -181,15 +181,15 @@ seid tx evm call-contract [addr] [payload hex] --value= --from=
seid tx evm call-contract 0xContract123... 0xa9059cbb000000... --value=1000000000000000000 --from=mykey
```
-**Output :**
+**Output:**
```
Transaction hash: 0x...
```
-### Call Precompile
+### Call precompile
-Calls a method on a precompiled contract. Precompiles provide EVM access to Cosmos-SDK functionality.
+This command calls a method on a precompiled contract. Precompiles give EVM access to Cosmos SDK functionality.
```bash
seid tx evm call-precompile [precompile name] [method] [args...] --value= --from= --gas-fee-cap= --gas-limit= --evm-rpc=
@@ -197,42 +197,42 @@ seid tx evm call-precompile [precompile name] [method] [args...] --value=For detailed information about each precompile's methods, parameters, and usage patterns, refer to the [EVM Precompiles documentation](/evm/precompiles/example-usage).
+For each precompile's methods, parameters, and usage patterns, see the [EVM precompiles documentation](/evm/precompiles/example-usage).
-**Output :**
+**Output:**
```
Transaction hash: 0x...
```
-## Advanced Usage
+## Advanced usage
-### Custom Gas Settings
+### Custom gas settings
You can customize gas settings for any transaction:
@@ -243,9 +243,9 @@ seid tx evm send 0x... 1000000000000000000 \
--from=mykey
```
-### Nonce Management
+### Nonce management
-Override automatic nonce calculation:
+Override the automatic nonce calculation:
```bash
seid tx evm send 0x... 1000000000000000000 \
@@ -253,35 +253,35 @@ seid tx evm send 0x... 1000000000000000000 \
--from=mykey
```
-## Error Handling
+## Error handling
-**Common Issues:**
+**Common issues:**
-- Insufficient balance for transaction + gas
-- Incorrect address formats (use 0x prefix for EVM addresses)
+- Insufficient balance for the transaction amount and gas
+- Incorrect address formats (use the 0x prefix for EVM addresses)
- Gas limit too low for complex operations
-- Nonce conflicts in rapid successive transactions
+- Nonce conflicts when you send transactions in rapid succession
-## Best Practices
+## Best practices
-1. **Gas Estimation**: Start with default gas limits and adjust based on transaction complexity
-2. **Address Validation**: Always verify addresses before sending transactions
-3. **Key Management**: Use secure key storage and never expose private keys
-4. **Network Verification**: Confirm you're connected to the correct network
-5. **Transaction Monitoring**: Save transaction hashes for tracking purposes
+1. Start with the default gas limits, and adjust them for transaction complexity.
+2. Always verify addresses before you send transactions.
+3. Use secure key storage, and never expose private keys.
+4. Confirm that you are connected to the correct network.
+5. Save transaction hashes so that you can track the transactions.
-## Transaction Requirements
+## Transaction requirements
-- **Key Configuration**: Local keyring must contain the signing key
-- **Sufficient Balance**: Account must have enough tokens for transaction amount + gas
-- **Address Formats**: Use proper formats (0x... for EVM, seivaloper... for validators)
-- **Network Access**: Ensure connectivity to the specified RPC endpoint
-- **Gas Limits**: Set appropriate gas limits for transaction complexity
+- The local keyring must contain the signing key.
+- The account must have enough tokens for the transaction amount and gas.
+- Use the correct address formats: 0x... for EVM addresses and seivaloper... for validators.
+- Make sure that you can connect to the specified RPC endpoint.
+- Set gas limits that suit the transaction complexity.
-For more detailed information about specific commands, use the help flag:
+For details about a specific command, use the help flag:
```bash
seid tx evm [command] --help
diff --git a/evm/transactions.mdx b/evm/transactions.mdx
index 1d0a970..203c18c 100644
--- a/evm/transactions.mdx
+++ b/evm/transactions.mdx
@@ -5,73 +5,73 @@ description: 'Comprehensive guide on Transactions on Sei. Learn key concepts, co
keywords: ['transactions', 'EVM transactions', 'gas', 'EIP-1559', 'nonce', 'transaction lifecycle', 'sei']
---
-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.
+Sei supports EVM transactions, so it works with Ethereum-based tools and contracts. Transactions are signed messages from an externally owned account (EOA) that trigger state changes on the blockchain.
-## Transaction Lifecycle
+## Transaction lifecycle
| Stage | Description |
| ----------------- | -------------------------------------------------------------------------------------------------------------------- |
-| 1. Creation | A transaction is created by an EOA, specifying the recipient, value, gas parameters, and other fields. |
-| 2. Signing | The transaction is signed with the sender's private key to create a valid signature. |
-| 3. Submission | The signed transaction is submitted to the network through an RPC endpoint. |
-| 4. Mempool | The transaction enters the mempool (transaction pool) where it awaits inclusion in a block. |
-| 5. Execution | When selected by a validator, the transaction is executed in the EVM, causing state changes. |
-| 6. Validation | The transaction and its state changes are validated by the consensus mechanism. |
-| 7. Confirmation | Once validated, the transaction is included in a block and confirmed on-chain. |
-| 8. Finality | On Sei, transactions achieve immediate finality once included in a block. |
+| 1. Creation | An EOA creates a transaction and specifies the recipient, value, gas parameters, and other fields. |
+| 2. Signing | The sender's private key signs the transaction and creates a valid signature. |
+| 3. Submission | The sender submits the signed transaction to the network through an RPC endpoint. |
+| 4. Mempool | The transaction enters the mempool (transaction pool), where it waits for inclusion in a block. |
+| 5. Execution | When a validator selects the transaction, the EVM executes it and updates the state. |
+| 6. Validation | The consensus mechanism validates the transaction and its state changes. |
+| 7. Confirmation | After validation, the transaction is included in a block and confirmed on-chain. |
+| 8. Finality | On Sei, transactions reach immediate finality when they are included in a block. |
- 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.
+ On other EVM chains, you need to wait for multiple confirmations. Sei's consensus mechanism gives immediate transaction finality. After a transaction is included in a block, it cannot be reversed.
-## Gas Mechanics
+## Gas mechanics
-Gas is a unit of computational work in the EVM that helps prevent spam and allocate resources efficiently:
+Gas is a unit of computational work in the EVM. It helps prevent spam and allocate resources efficiently:
| Term | Description |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------- |
-| Gas Limit | The maximum amount of gas the transaction may consume, set by the sender. |
-| Base Fee | The minimum gas price required to be included in a block. On Sei, the base fee is not burned — all fees go to validators. |
-| Priority Fee | An additional fee (tip) paid to validators for faster inclusion. |
-| Gas Price | In legacy transactions, the price per unit of gas the sender is willing to pay. |
-| Effective Gas Price | The actual price paid per unit of gas (base fee + priority fee in EIP-1559). |
+| Gas limit | The maximum amount of gas the transaction may consume. The sender sets it. |
+| Base fee | The minimum gas price required for inclusion in a block. On Sei, the base fee is not burned. All fees go to validators. |
+| Priority fee | An extra fee (tip) paid to validators for faster inclusion. |
+| Gas price | In legacy transactions, the price per unit of gas the sender is willing to pay. |
+| Effective gas price | The actual price paid per unit of gas (base fee + priority fee in EIP-1559). |
- **Gas Requirements for Common Operations:**
+ **Gas requirements for common operations:**
- Simple SEI transfer: 21,000 gas
- - ERC-20 transfer: ~45,000 gas
- - Contract deployment: Varies based on contract size and complexity
- - Always estimate gas before sending transactions using `eth_estimateGas`
+ - ERC-20 transfer: approximately 45,000 gas
+ - Contract deployment: Depends on contract size and complexity
+ - Always estimate gas with `eth_estimateGas` before you send transactions
-## Transaction Structure
+## Transaction structure
-EVM transactions in Sei follow the Ethereum transaction format with standard properties:
+EVM transactions on Sei follow the Ethereum transaction format and its standard properties:
| Property | Description |
| --- | --- |
- | `from` | The address of the sender who will sign the transaction. This must be an externally-owned account (EOA) as contract accounts cannot send transactions. |
- | `to` | The receiving address. If this is an EOA, the transaction transfers value. If a contract address, the transaction executes the contract code. If empty or null, the transaction creates a new contract. |
- | `signature` | The cryptographic signature generated when the sender's private key signs the transaction. This confirms the sender has authorized the transaction and includes the v, r, and s components. |
- | `nonce` | A sequentially incrementing counter that indicates the transaction number from the account. This prevents replay attacks and ensures transaction ordering. |
+ | `from` | The address of the sender that signs the transaction. This must be an externally owned account (EOA), because contract accounts cannot send transactions. |
+ | `to` | The receiving address. If it is an EOA, the transaction transfers value. If it is a contract address, the transaction executes the contract code. If it is empty or null, the transaction creates a new contract. |
+ | `signature` | The cryptographic signature generated when the sender's private key signs the transaction. It confirms that the sender authorized the transaction, and it includes the v, r, and s components. |
+ | `nonce` | A sequentially incrementing counter that indicates the transaction number from the account. It prevents replay attacks and keeps transactions in order. |
| `data` | The input data (also called 'input' or 'calldata') for contract execution. For simple transfers, this is usually empty. For contract interactions, this contains the function selector and encoded arguments. |
- | `value` | Amount of SEI to transfer from sender to recipient (denominated in WEI, where 1 SEI equals 1e+18 WEI). |
- | `gasLimit` | The maximum amount of gas units that can be consumed by the transaction. Often referred to as 'gas' in transaction objects. |
- | `maxPriorityFeePerGas` | The maximum price of the consumed gas to be included as a tip to the validator (denominated in WEI). Used in EIP-1559 transactions. |
- | `maxFeePerGas` | The maximum fee per unit of gas willing to be paid for the transaction (inclusive of baseFeePerGas and maxPriorityFeePerGas). Used in EIP-1559 transactions. |
- | `gasPrice` | The price per unit of gas the sender is willing to pay (denominated in WEI). Used in legacy transactions. |
- | `chainId` | The chain identifier number. Prevents transaction reuse across different chains. |
- | `accessList` | A list of addresses and storage keys that the transaction plans to access. Used in EIP-2930 and EIP-1559 transactions to reduce gas costs for accessing specified addresses and storage slots. |
+ | `value` | The amount of SEI to transfer from the sender to the recipient, in wei (1 SEI equals 1e+18 wei). |
+ | `gasLimit` | The maximum number of gas units that the transaction can consume. Transaction objects often call it 'gas'. |
+ | `maxPriorityFeePerGas` | The maximum tip per unit of consumed gas that goes to the validator, in wei. Used in EIP-1559 transactions. |
+ | `maxFeePerGas` | The maximum fee per unit of gas that the sender is willing to pay for the transaction, including baseFeePerGas and maxPriorityFeePerGas. Used in EIP-1559 transactions. |
+ | `gasPrice` | The price per unit of gas that the sender is willing to pay, in wei. Used in legacy transactions. |
+ | `chainId` | The chain identifier number. It prevents transaction reuse across different chains. |
+ | `accessList` | A list of addresses and storage keys that the transaction plans to access. EIP-2930 and EIP-1559 transactions use it to reduce the gas cost of access to those addresses and storage slots. |
| `type` | The transaction type: 0 for legacy (pre-EIP-2718), 1 for EIP-2930 access list transactions, and 2 for EIP-1559 fee market transactions. |
- | `hash` | The transaction hash, a unique identifier for the transaction generated after signing. |
+ | `hash` | The transaction hash: a unique identifier for the transaction, generated after signing. |
- ### Legacy Transactions (Type 0)
+ ### Legacy transactions (type 0)
- Pre-EIP-1559 transaction format that specifies a single gasPrice.
+ This format predates EIP-1559 and specifies a single gasPrice.
```json
{
@@ -85,9 +85,9 @@ EVM transactions in Sei follow the Ethereum transaction format with standard pro
}
```
- ### Access List Transactions (Type 1, EIP-2930)
+ ### Access list transactions (type 1, EIP-2930)
- Transactions with an optional access list of addresses and storage keys to reduce gas costs.
+ These transactions can include an access list of addresses and storage keys to reduce gas costs.
```json
{
@@ -110,9 +110,9 @@ EVM transactions in Sei follow the Ethereum transaction format with standard pro
}
```
- ### Fee Market Transactions (Type 2, EIP-1559)
+ ### Fee market transactions (type 2, EIP-1559)
- Transaction format that supports dynamic base fees with a priority fee tip to validators.
+ This format supports dynamic base fees and a priority fee (tip) to validators.
```json
{
@@ -131,7 +131,7 @@ EVM transactions in Sei follow the Ethereum transaction format with standard pro
- ### Example Request: Sending an EIP-1559 Transaction
+ ### Example request: sending an EIP-1559 transaction
```json
{
@@ -156,7 +156,7 @@ EVM transactions in Sei follow the Ethereum transaction format with standard pro
### JavaScript example with web3.js
- Public RPC endpoints such as `https://evm-rpc.sei-apis.com` do not manage or unlock accounts, so `eth_getAccounts` and `eth_sendTransaction` are not available. Sign transactions locally with a private key and broadcast the raw transaction instead.
+ Public RPC endpoints such as `https://evm-rpc.sei-apis.com` do not manage or unlock accounts. On these endpoints, `eth_accounts` returns an empty list and `eth_sendTransaction` returns an error. Sign transactions locally with a private key and broadcast the raw transaction instead.
```javascript
@@ -229,7 +229,7 @@ EVM transactions in Sei follow the Ethereum transaction format with standard pro
"value": "0x1234",
"type": "0x2",
"accessList": [],
- "chainId": "0x1",
+ "chainId": "0x531",
"maxFeePerGas": "0x1234",
"maxPriorityFeePerGas": "0x1234",
"v": "0x0",
@@ -266,52 +266,50 @@ EVM transactions in Sei follow the Ethereum transaction format with standard pro
-## Transaction Guidelines
+## Transaction guidelines
- **Transaction Best Practices:**
-
- - **Set appropriate gas parameters:** Use network conditions to estimate optimal values for `maxFeePerGas` and `maxPriorityFeePerGas`.
- - **Manage nonces carefully:** Track and increment nonces correctly to avoid transaction failures.
- - **Use typed transactions:** Prefer EIP-1559 transactions (type 2) for more predictable fees.
- - **Implement proper error handling:** Account for potential transaction failures and revert reasons.
- - **Verify recipient addresses:** Always double-check destination addresses, as transactions cannot be reversed.
+ - Use network conditions to estimate appropriate values for `maxFeePerGas` and `maxPriorityFeePerGas`.
+ - Track and increment nonces correctly to avoid transaction failures.
+ - Prefer EIP-1559 transactions (type 2) for more predictable fees.
+ - Handle possible transaction failures and revert reasons in your code.
+ - Always double-check destination addresses, because transactions cannot be reversed.
-| Common Issue | Cause | Solution |
+| Common issue | Cause | Solution |
| --- | --- | --- |
| Transaction Underpriced | Gas price or priority fee too low | Increase `maxFeePerGas` and `maxPriorityFeePerGas` |
-| Nonce Too Low | Using a nonce that's already been used | Query current nonce with `getTransactionCount` |
-| 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 |
+| Nonce Too Low | The nonce was already used | Query the current nonce with `getTransactionCount` |
+| Out of Gas | Gas limit too low for the operation | Use `eth_estimateGas` to set an appropriate limit |
+| Contract Execution Failed | Contract function reverted | Test with `eth_call` before you send the transaction |
-## Transaction Validation
+## Transaction validation
-Before an EVM transaction is accepted, Sei performs strict semantic validation of its fields, enforced since v6.5.0. If you construct and sign transactions manually, make sure they are well-formed to avoid rejection.
+Before Sei accepts an EVM transaction, it performs strict semantic validation of the transaction fields. Sei enforces this validation from v6.5.0 onward. If you construct and sign transactions manually, make sure they are well formed to avoid rejection.
-- The canonical field-level reference (signature-value byte caps and zero-padding rules, access-list entries, EIP-7702 authorization lists) lives in [Transaction Types](/evm/evm-parity/transaction-types#access-list-and-auth-list-entry-validation).
-- Envelope-level restrictions (no Cosmos wrapper fields, canonical protobuf encoding, whole-block rejection on decode failure) are covered in [Differences with Ethereum](/evm/differences-with-ethereum#evm-transaction-envelope-restrictions).
+- [Transaction types](/evm/evm-parity/transaction-types#access-list-and-auth-list-entry-validation) is the canonical field-level reference. It covers signature-value byte caps and zero-padding rules, access-list entries, and EIP-7702 authorization lists.
+- [Differences with Ethereum](/evm/differences-with-ethereum#evm-transaction-envelope-restrictions) covers envelope-level restrictions: no Cosmos wrapper fields, canonical protobuf encoding, and whole-block rejection on decode failure.
### Receipts for nonce-bumping failed transactions
-Some EVM transactions pass basic validation and bump the sender's nonce, yet still fail during state transition — for example, a transaction whose gas limit clears the intrinsic-gas check but falls short of the EIP-7623 floor-data-gas requirement (which can occur in normal operation after Pectra). Because these transactions bump the nonce, they are considered to have happened and therefore produce a receipt.
+Some EVM transactions pass basic validation and bump the sender's nonce, but still fail during state transition. One example is a transaction whose gas limit clears the intrinsic-gas check but falls short of the EIP-7623 floor-data-gas requirement. This can occur in normal operation after Pectra. Because these transactions bump the nonce, they are considered to have happened and therefore produce a receipt.
-For such failures, Sei writes a synthetic `status=0` (failed) receipt at the end of the block. The receipt reports a `gasUsed` of 0 and an `effectiveGasPrice` of 0, and carries a `VmError` describing the state-transition reason. `eth_getTransactionReceipt` returns this failed-tx receipt instead of `null`. The `VmError` is stored on Sei's internal receipt record and is not included in the `eth_getTransactionReceipt` JSON response; retrieve it with the non-standard `eth_getVMError` method.
+For such failures, Sei writes a synthetic `status=0` (failed) receipt at the end of the block. The receipt reports a `gasUsed` of 0 and an `effectiveGasPrice` of 0. It also carries a `VmError` that describes the state-transition reason. `eth_getTransactionReceipt` returns this failed-transaction receipt instead of `null`. Sei stores the `VmError` on its internal receipt record, not in the `eth_getTransactionReceipt` JSON response. To get it, use the non-standard `eth_getVMError` method.
- Previously, a nonce-bumping transaction that failed during state transition could return `null` from `eth_getTransactionReceipt` indefinitely, causing clients that poll for a receipt to hang. Clients should now expect a `status=0` receipt for these transactions and treat it as a normal failed-transaction result.
+ Previously, a nonce-bumping transaction that failed during state transition could return `null` from `eth_getTransactionReceipt` indefinitely. Clients that polled for a receipt could then hang. Clients should now expect a `status=0` receipt for these transactions and treat it as a normal failed-transaction result.
-## Additional Resources
+## Additional resources
-
- Complete documentation of Sei's EVM RPC endpoints for transaction creation and monitoring
+
+ Sei's EVM RPC endpoints for creating and monitoring transactions
-
+
Learn more about gas calculation, fee estimation, and cost optimization on Sei
- Understanding Externally Owned Accounts and Contract Accounts on Sei
+ Externally owned accounts and contract accounts on Sei
diff --git a/evm/usdc-on-sei.mdx b/evm/usdc-on-sei.mdx
index 2781cc7..af10770 100644
--- a/evm/usdc-on-sei.mdx
+++ b/evm/usdc-on-sei.mdx
@@ -3,7 +3,7 @@ title: 'USDC on Sei'
description: 'Guide to integrating USDC stablecoin on Sei using Viem and Node.js for transfers and balance checks.'
keywords: ['USDC', 'Sei', 'Circle', 'stablecoin', 'ERC-20', 'Viem', 'payments', 'token transfer', 'web3', 'cryptocurrency']
---
-## Addresses and Decimals
+## Addresses and decimals
- Sei Testnet USDC: [`0x4fCF1784B31630811181f670Aea7A7bEF803eaED`](https://testnet.seiscan.io/address/0x4fCF1784B31630811181f670Aea7A7bEF803eaED)
- Sei Mainnet USDC: [`0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392`](https://seiscan.io/address/0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392)
@@ -11,33 +11,33 @@ keywords: ['USDC', 'Sei', 'Circle', 'stablecoin', 'ERC-20', 'Viem', 'payments',
## Overview
-USDC is a digital dollar issued by [Circle](http://developers.circle.com), also known as a stablecoin, running on many of the world's leading blockchains. Designed to represent US dollars on the internet, USDC is backed 100% by highly liquid cash and cash-equivalent assets so that it's always redeemable 1:1 for USD. It is commonly used for payments, trading, and on/off-ramps in web3 apps.
+USDC is a digital dollar, also known as a stablecoin, issued by [Circle](http://developers.circle.com). It runs on many of the world's leading blockchains. USDC is designed to represent US dollars on the internet. It is backed 100% by highly liquid cash and cash-equivalent assets, so it is always redeemable 1:1 for USD. It is commonly used for payments, trading, and on-ramps and off-ramps in dApps.
-On the **Sei**, USDC can be transferred like any standard ERC-20 token — enabling fast, secure, and programmable digital dollar transactions.
+On Sei, you can transfer USDC like any standard ERC-20 token.
-This guide walks you through building a standalone index.js script using **Viem** and **Node.js** to check your USDC balance and send a test transfer to another address. The sample is a minimal, generic ERC‑20 flow using USDC as the example token.
+This guide shows how to build a standalone `index.js` script with viem and Node.js. The script checks your USDC balance and sends a test transfer to another address. The sample is a minimal, generic ERC-20 flow that uses USDC as the example token.
### Prerequisites
-- Node.js v18+ with "type": "module" in package.json
+- Node.js v18 or later, with `"type": "module"` in `package.json`
- viem and dotenv installed
-- Sei wallet with USDC and SEI for gas on your selected network (default: testnet).
-- To get testnet USDC on Sei, use the [Circle Faucet](https://faucet.circle.com) or use [Circle’s CCTP v2](https://github.com/circlefin/circle-cctp-crosschain-transfer) Sample application to transfer USDC cross-chain to your Sei wallet.
-- Private key and recipient address stored in a .env file
+- A Sei wallet that holds USDC and SEI (for gas) on your selected network. The default network is Sei Testnet.
+- To get USDC on Sei Testnet, use the [Circle Faucet](https://faucet.circle.com). You can also use the [Circle CCTP v2](https://github.com/circlefin/circle-cctp-crosschain-transfer) sample application to transfer USDC cross-chain to your Sei wallet.
+- A private key and a recipient address, stored in a `.env` file
- Optional: set `SEI_NETWORK=testnet|mainnet` (defaults to `testnet`)
-## Project Setup
+## Project setup
Follow these steps to set up your project and environment:
-- Initialize a Node.js project and install dependencies: create a project folder and run:
+- To initialize a Node.js project and install the dependencies, create a project folder. Then run these commands in it:
```shell
npm init -y
npm install viem dotenv
```
-- **Prepare environment variables**: In the project root, create a file named .env and add your private key and recipient address:
+- **Prepare environment variables**: In the project root, create a file named `.env`. Add your private key and the recipient address to it:
```
PRIVATE_KEY= # 0x-prefixed 64-hex-character key
@@ -46,15 +46,15 @@ RECIPIENT_ADDRESS=0x
SEI_NETWORK=testnet
```
-- **Create the script file**: Create an index.js file in the project directory. We will build this script step by step in the next section. Ensure that your Node environment can handle ES module imports (the code uses import syntax).
+- **Create the script file**: Create an `index.js` file in the project directory. You build this script step by step in the next section. Make sure that your Node.js environment can handle ES module imports, because the code uses `import` syntax.
-## Script Breakdown
+## Script breakdown
-Open index.js in your editor and add the following sections. Each part of the script is explained below:
+Open `index.js` in your editor. Then add these script sections. An explanation follows each one:
-1\. Import Modules and Define Chain/Token Constants: First, import required functions from Viem and set up constants for Sei networks (testnet and mainnet) and the USDC token contract.
+1\. Import modules and define chain and token constants: First, import the required functions from viem. Then set up constants for the Sei networks (Sei Testnet and Sei Mainnet) and the USDC token contract.
-This includes chain ID, RPC URL, token address, decimals, and a minimal ABI for the USDC contract’s balanceOf and transfer functions (just the function signatures we need):
+The constants include the chain ID, RPC URL, token address, decimals, and a minimal ABI for the `balanceOf` and `transfer` functions of the USDC contract. The ABI has only the function signatures that the script needs:
```ts
import 'dotenv/config';
@@ -114,9 +114,9 @@ const USDC_ABI = [
];
```
-2\. **Load Environment Variables and Validate Input:**
+2\. **Load environment variables and validate input:**
-Next, load the private key and recipient from the environment and validate them. The script checks that the variables exist and that the recipient address looks valid, then normalizes the private key string:
+Next, load and validate the private key and the recipient address from the environment. The script checks that the variables exist and that the recipient address looks valid. Then it normalizes the private key string:
```ts
// --- Environment Variables ---
@@ -140,13 +140,13 @@ if (!/^0x[a-fA-F0-9]{40}$/.test(RECIPIENT)) {
const PRIVATE_KEY = PRIVATE_KEY_RAW.startsWith('0x') ? PRIVATE_KEY_RAW : '0x' + PRIVATE_KEY_RAW;
```
-This ensures we have the necessary inputs. If the private key or recipient address is missing or malformed, the script logs an error and exits. The private key is prefixed with "0x" if not already present (Viem expects a 0x-prefixed key).
+This code makes sure that the script has the necessary inputs. If the private key or the recipient address is missing or malformed, the script logs an error and exits. If the private key does not start with "0x", the script adds the prefix, because viem expects a 0x-prefixed key.
-After this, PRIVATE_KEY is a clean hex string and RECIPIENT is a validated address.
+After this step, `PRIVATE_KEY` is a clean hex string, and `RECIPIENT` is a validated address.
-3\. Initialize Viem Clients:
+3\. Initialize viem clients:
-Using the chain config and credentials, we create a public client for reading blockchain data and a wallet client for writing (signing transactions). We also derive an account object from the private key:
+Use the chain config and the credentials to create two clients. The public client reads blockchain data. The wallet client writes to the chain by signing transactions. Also derive an account object from the private key:
```ts
// --- Client Setup ---
@@ -155,17 +155,17 @@ const publicClient = createPublicClient({ chain, transport: http() });
const walletClient = createWalletClient({ account, chain, transport: http() });
```
-- privateKeyToAccount converts the hex private key into an account object (with the corresponding address, etc.).
-- createPublicClient connects to the selected Sei network RPC for read-only calls (no private key needed).
-- createWalletClient uses our account and the RPC to allow sending transactions.
+- `privateKeyToAccount` converts the hex private key into an account object. The object includes the corresponding address and other account properties.
+- `createPublicClient` connects to the RPC endpoint of the selected Sei network for read-only calls. It does not need a private key.
+- `createWalletClient` uses your account and the RPC endpoint to send transactions.
-At this point, we’re set up to interact with the selected Sei network: publicClient will call eth_call for contract reads, and walletClient will handle signing and sending transactions from our account.
+The script can now interact with the selected Sei network. `publicClient` calls `eth_call` for contract reads, and `walletClient` signs and sends transactions from your account.
-4\. Main Transfer Logic:
+4\. Main transfer logic:
-Finally, we write an asynchronous function to perform the USDC transfer. It will check the sender’s USDC balance, ensure it’s sufficient, then invoke the USDC contract’s transfer function.
+Finally, write an asynchronous function that performs the USDC transfer. The function checks the sender's USDC balance and makes sure that it is sufficient. Then it calls the `transfer` function of the USDC contract.
-We also log key info and handle errors:
+The function also logs the transfer details and handles errors:
```ts
// --- Main Transfer Logic ---
@@ -209,18 +209,18 @@ We also log key info and handle errors:
})();
```
-- The script uses publicClient.readContract to call the USDC contract’s balanceOf(address) and get the sender’s token balance.
+- The script uses `publicClient.readContract` to call `balanceOf(address)` on the USDC contract and get the sender's token balance.
-- We format the balance from smallest units (6 decimals for USDC) into a human-readable number with formatUnits. The amount is set to 10 USDC in this example – you can adjust this value. We compare the desired amount to the current balance; if insufficient, it logs an error and exits.
+- `formatUnits` converts the balance from the smallest units (6 decimals for USDC) into a human-readable number. This example sets the amount to 10 USDC. You can change this value. The script compares the amount to the current balance. If the balance is not sufficient, the script logs an error and exits.
-- If the balance is adequate, we use parseUnits to convert 10 USDC into the raw token amount (10 \* 10^6, since USDC has 6 decimals).
- Then walletClient.writeContract calls the USDC contract’s transfer(to, amount) function. This sends a transaction from our account to transfer the tokens. On success, it returns a transaction hash, which we log alongside a URL to view the transaction on the Sei block explorer.
+- If the balance is sufficient, the script uses `parseUnits` to convert 10 USDC into the raw token amount (10 \* 10^6, because USDC has 6 decimals).
+ Then `walletClient.writeContract` calls the `transfer(to, amount)` function of the USDC contract. This sends a transaction from your account to transfer the tokens. On success, it returns a transaction hash. The script logs the hash and a URL where you can view the transaction on the Sei block explorer.
-- Errors in the try/catch (for example, RPC issues or a transaction failure) will log “Transfer failed” with the error message. The script ends with process.exit(0) to terminate after completing the async function.
+- If an error occurs, such as an RPC issue or a transaction failure, the `try`/`catch` block logs "Transfer failed" with the error message. The script ends with `process.exit(0)`, which stops the process after the async function completes.
-## Run the Script
+## Run the script
-With index.js completed, you can run the script from your terminal:
+When `index.js` is complete, you can run the script from your terminal:
```shell
# Default: testnet
@@ -230,7 +230,7 @@ node index.js
SEI_NETWORK=mainnet node index.js
```
-The expected output will look like the following if the transfer succeeds (your addresses and values will differ):
+If the transfer succeeds, the output looks like this, with your own addresses and values:
```
Sender: 0x1A2b...7890 # your sender address
@@ -241,14 +241,14 @@ Tx hash: 0xabc123...def456 # transaction hash of the transfer
Explorer: https://testnet.seiscan.io/tx/0xabc123...def456
```
-You should see “Transfer successful\!” and a transaction hash. You can copy the explorer URL into a browser to view the transaction details on Seiscan.
+You should see "Transfer successful\!" and a transaction hash. To view the transaction details on Seiscan, you can copy the explorer URL into a browser.
-Continue building by checking for more information in the [Circle Developer Docs.](https://developers.circle.com/)
+For more information, see the [Circle Developer Docs](https://developers.circle.com/).
-### Important Notes
+### Important notes
-- Testnet Only: Sei Testnet USDC has no real value. Don’t use mainnet keys or expect real funds.
-- Security: Store private keys in `.env`; never commit secrets. Use best practices for key management.
-- Gas Fees: You’ll need a small amount of testnet SEI to cover gas.
-- Lightweight ABI: Only `balanceOf` and `transfer` are used — enough for simple transfers.
-- Viem Behavior: `readContract` and `writeContract` handle reads/writes. The private key is auto-prefixed with `0x`.
+- Testnet only: Sei Testnet USDC has no real value. Do not use Sei Mainnet keys, and do not expect real funds.
+- Security: Store private keys in `.env`. Never commit secrets. Follow best practices for key management.
+- Gas: You need a small amount of SEI on Sei Testnet to pay for gas.
+- Lightweight ABI: The script uses only `balanceOf` and `transfer`. These functions are enough for simple transfers.
+- viem behavior: `readContract` handles reads, and `writeContract` handles writes. The script adds the `0x` prefix to the private key automatically.
diff --git a/evm/videos.mdx b/evm/videos.mdx
index 7ee7f11..83e98f6 100644
--- a/evm/videos.mdx
+++ b/evm/videos.mdx
@@ -3,13 +3,13 @@ title: 'Video Tutorials'
description: 'Watch video tutorials covering Sei EVM development, smart contract tooling, precompiles, and more.'
keywords: ['sei video tutorials', 'sei evm videos', 'hardhat tutorial', 'foundry tutorial', 'precompiles tutorial']
---
-A collection of video walkthroughs to help you get started building on Sei.
+These video walkthroughs help you start building on Sei.
-## EVM Development
+## EVM development
-### Sei EVM Overview
+### Sei EVM overview
-An introduction to developing on Sei's parallelized EVM, covering smart contract languages, tooling, and key concepts.
+This video introduces development on Sei's parallelized EVM. It covers smart contract languages, tooling, and key concepts.
@@ -19,7 +19,7 @@ Related docs: [EVM General](/evm/evm-general) · [EVM with Hardhat](/evm/evm-har
### Development with Foundry
-Step-by-step guide to setting up Foundry for Sei, creating contracts with OpenZeppelin, and deploying to testnet and mainnet.
+This step-by-step guide shows how to set up Foundry for Sei, create contracts with OpenZeppelin, and deploy to Sei Testnet and Sei Mainnet.
@@ -29,9 +29,9 @@ Related docs: [EVM with Foundry](/evm/evm-foundry)
## Precompiles
-### Staking Precompile
+### Staking precompile
-Learn how to interact with Sei's native staking module directly from EVM smart contracts — delegation, undelegation, redelegation, and validator queries.
+Learn how to interact with Sei's native staking module directly from EVM smart contracts. The video covers delegation, undelegation, redelegation, and validator queries.
@@ -39,9 +39,9 @@ Related docs: [Staking Precompile](/evm/precompiles/staking)
---
-### Distribution Precompile
+### Distribution precompile
-Manage staking rewards and validator commissions through the distribution precompile — withdraw rewards, set withdrawal addresses, and more.
+Learn how to manage staking rewards and validator commissions through the distribution precompile. For example, you can withdraw rewards and set withdrawal addresses.
diff --git a/evm/vrf/pyth-network-vrf.mdx b/evm/vrf/pyth-network-vrf.mdx
index b654683..f5e2a37 100644
--- a/evm/vrf/pyth-network-vrf.mdx
+++ b/evm/vrf/pyth-network-vrf.mdx
@@ -4,32 +4,32 @@ sidebarTitle: 'Pyth Network'
description: 'Complete guide to integrating Pyth Network VRF with Sei Network'
keywords: ['pyth entropy', 'VRF', 'verifiable randomness', 'random number generator', 'gaming', 'sei']
---
-Pyth Entropy is an on-chain random number generator (RNG) that provides cryptographically secure, verifiable randomness for blockchain applications. Entropy uses a two-party commit-reveal protocol, a well-known protocol in the cryptography space for generating a random number, offering lower fees, direct integration with Pyth Network, scalability, and faster response times compared to traditional VRF solutions. Entropy delivers randomness that is trustless, low-latency, cost-efficient, and requires no registration.
+Pyth Entropy is an on-chain random number generator (RNG) that supplies cryptographically secure, verifiable randomness to blockchain applications. Entropy uses a two-party commit-reveal protocol, which is a well-known way to generate a random number in cryptography. Compared to traditional VRF solutions, Entropy offers lower fees, direct integration with Pyth Network, scalability, and faster response times. Entropy delivers trustless, low-latency, cost-efficient randomness. It does not require registration.
-## What You'll Be Doing in This Guide
+## What you'll be doing in this guide
-In this tutorial, you'll learn how to:
+This tutorial shows you how to:
1. Integrate Pyth Entropy's commit-reveal randomness system into your Sei EVM application
-2. Create smart contracts that request and consume verifiable random numbers using the Entropy protocol
+2. Create smart contracts that request and consume verifiable random numbers with the Entropy protocol
3. Implement a complete gaming application with fair, transparent randomness
-4. Handle fees, callbacks, and error management for production-ready randomness
+4. Handle fees, callbacks, and errors for production-ready randomness
-By the end of this guide, you'll have a working demo that can request cryptographically secure random numbers on the Sei network with proper verification mechanisms using Pyth Entropy.
+By the end of this guide, you will have a working demo that uses Pyth Entropy. It can request cryptographically secure random numbers on the Sei network, with proper verification mechanisms.
## Prerequisites
-Before starting this tutorial, ensure you have:
+Before you start this tutorial, make sure that you have:
-### Technical Requirements
+### Technical requirements
-- **Solidity Knowledge**: Basic understanding of Solidity smart contract development
-- **JavaScript/Node.js**: For off-chain interaction and frontend integration
-- **Development Environment**: Remix IDE, Hardhat, Foundry, or similar Solidity development setup
-- **Sei Network Access**: RPC endpoint and familiarity with Sei's EVM environment
-- **Native Tokens**: SEI tokens required for paying Entropy request fees
+- **Solidity knowledge**: A basic understanding of smart contract development in Solidity
+- **JavaScript and Node.js**: For off-chain interaction and frontend integration
+- **Development environment**: Remix IDE, Hardhat, Foundry, or a similar Solidity development setup
+- **Sei network access**: An RPC endpoint and familiarity with the Sei EVM environment
+- **Native tokens**: SEI tokens, which you need to pay Entropy request fees
-### Required Dependencies
+### Required dependencies
- Pyth Entropy Solidity SDK (`@pythnetwork/entropy-sdk-solidity`)
@@ -46,87 +46,87 @@ yarn add @pythnetwork/entropy-sdk-solidity
pnpm add @pythnetwork/entropy-sdk-solidity
```
-### Sei Network Configuration
+### Sei network configuration
-Make sure your development environment is configured for Sei:
+Make sure that your development environment is configured for Sei:
- **Mainnet RPC**: `https://evm-rpc.sei-apis.com`
-- **Chain ID**: 1329 (mainnet)
+- **Chain ID**: 1329 (Sei Mainnet)
- **Testnet RPC**: `https://evm-rpc-testnet.sei-apis.com`
-- **Testnet Chain ID**: 1328 (testnet)
+- **Testnet chain ID**: 1328 (Sei Testnet)
-## Pyth Entropy Architecture Overview
+## Pyth Entropy architecture overview
-Entropy uses a two-party commit-reveal protocol consisting of:
+Entropy uses a two-party commit-reveal protocol that has these parts:
-1. **Entropy Provider**: Off-chain service that commits to a sequence of random numbers using hash chains
-2. **User Commitment**: Users contribute their own random input to ensure unpredictability
-3. **Commit-Reveal Protocol**: Two-party system where both parties contribute to final randomness
-4. **On-Chain Verification**: Smart contracts verify the randomness proofs and execute callbacks
-5. **Keeper Network**: Decentralized bots that fulfill randomness requests by revealing provider commitments
+1. **Entropy provider**: An off-chain service that commits to a sequence of random numbers with hash chains
+2. **User commitment**: Users contribute their own random input to make sure that the result is unpredictable
+3. **Commit-reveal protocol**: A two-party system where both parties contribute to the final randomness
+4. **On-chain verification**: Smart contracts verify the randomness proofs and execute callbacks
+5. **Keeper network**: Decentralized bots that fulfill randomness requests by revealing provider commitments
-## Key Concepts
+## Key concepts
-Before implementing, it's important to understand the key aspects of working with Pyth Entropy:
+Before you implement the integration, make sure that you understand these main aspects of Pyth Entropy:
-### Two-Phase Process
+### Two-phase process
Entropy uses a two-phase approach:
-- **Request Phase**: Your contract calls `entropy.requestV2()` and receives a `sequenceNumber`
-- **Fulfillment Phase**: Off-chain keepers fulfill the request by calling your contract's `entropyCallback()` method
+- **Request phase**: Your contract calls `entropy.requestV2()` and receives a `sequenceNumber`
+- **Fulfillment phase**: Off-chain keepers call your contract's `entropyCallback()` method to fulfill the request
-### Asynchronous Nature
+### Asynchronous nature
Unlike synchronous random number generation, Entropy requests are asynchronous:
- The random number is not available immediately after the request
-- Your application must handle the waiting period (typically 1-3 blocks)
-- Use events and polling to know when randomness is fulfilled
+- Your application must handle the waiting period (typically 1 to 3 blocks)
+- Use events and polling to detect when the randomness is fulfilled
-### Fee Management
+### Fee management
Entropy requires payment for each randomness request:
-- Always call `getFeeV2()` to get the current fee before making requests
+- Before you make a request, always call `getFeeV2()` to get the current fee
- Fees are paid in the native token (SEI) as `msg.value`
- Fees are dynamic and may change based on network conditions
-### Callback Implementation
+### Callback implementation
Your contract must implement the `entropyCallback` function:
-- This method is called automatically when randomness is fulfilled
+- This method is called automatically when the randomness is fulfilled
- It receives the `sequenceNumber`, `providerAddress`, and `randomNumber`
-- All your game logic should be handled in this callback
+- Handle all your game logic in this callback
-### Sequence Number Tracking
+### Sequence number tracking
Each request has a unique `sequenceNumber`:
-- Use this to map requests to your application state
-- Store game/request data using the sequence number as the key
-- Multiple requests can be pending simultaneously
+- Use it to map requests to your application state
+- Store game or request data with the sequence number as the key
+- Multiple requests can be pending at the same time
-### Error Handling
+### Error handling
Always implement proper error handling:
-- Requests can fail or timeout
+- Requests can fail or time out
- Network issues may prevent fulfillment
- Have fallback mechanisms for failed requests
-### Gas Considerations
+### Gas considerations
The callback execution has gas limits:
- Keep callback logic simple to avoid out-of-gas errors
-- For complex logic, consider using custom gas limits with `requestV2` variants
+- For complex logic, consider custom gas limits with `requestV2` variants
- Store expensive computations for later execution
-## Steps to Integrate Pyth Entropy into Sei
+## Steps to integrate Pyth Entropy into Sei
-### Step 1: Smart Contract Integration
+### Step 1: Smart contract integration
Create a consumer contract that integrates with Pyth Entropy:
@@ -341,20 +341,20 @@ contract SeiEntropyDemo is IEntropyConsumer {
}
```
-Deploy this contract using [Remix](https://remix.ethereum.org/) with the Entropy contract address for your target network:
+Deploy this contract with [Remix](https://remix.ethereum.org/). Use the Entropy contract address for your target network:
-| Network | Entropy Contract Address |
+| Network | Entropy contract address |
| --------------- | ------------------------------------------------------------------------------------------- |
| **Sei Mainnet** | [`0x98046bd286715d3b0bc227dd7a956b83d8978603`](https://docs.pyth.network/entropy/chainlist) |
| **Sei Testnet** | [`0x36825bf3fbdf5a29e2d5148bfe7dcf7b5639e320`](https://docs.pyth.network/entropy/chainlist) |
-Note: Entropy V2 uses a default provider system, so you no longer need to specify a provider address in the constructor.
+Entropy V2 uses a default provider system, so you do not need to specify a provider address in the constructor.
-### Step 2: JavaScript Integration for Entropy Management
+### Step 2: JavaScript integration for Entropy management
-Create a module to interact with Entropy and manage randomness requests:
+Create a module that interacts with Entropy and manages randomness requests:
-Note: The JavaScript examples below use CommonJS (`require`/`module.exports`). If your project uses `"type": "module"`, rename these files to `.cjs` or convert the snippets to ES Modules.
+The JavaScript examples below use CommonJS (`require` and `module.exports`). If your project uses `"type": "module"`, rename these files to `.cjs` or convert the snippets to ES Modules.
```javascript
const { ethers } = require('ethers');
@@ -584,9 +584,9 @@ if (require.main === module) {
}
```
-### Step 3: Complete Integration Example
+### Step 3: Complete integration example
-Here's a simple usage example that puts it all together:
+This simple example combines all the parts:
First, create a `.env` file in your project root (never commit this file):
@@ -625,7 +625,7 @@ demonstratePythEntropyIntegration()
// monitorEntropyEvents(process.env.CONTRACT_ADDRESS);
```
-### Expected Output
+### Expected output
To run the complete demo, execute the `demo.js` script:
@@ -633,7 +633,7 @@ To run the complete demo, execute the `demo.js` script:
node demo.js
```
-When you run the Pyth Entropy integration, you should see output similar to:
+When you run the Pyth Entropy integration, you should see output similar to this:
```
🚀 Starting Sei Pyth Entropy Integration Demo...
@@ -672,34 +672,34 @@ When you run the Pyth Entropy integration, you should see output similar to:
- Block: 184783333
```
-### Data Structure Details
+### Data structure details
-Pyth Entropy V2 responses include several important fields:
+Pyth Entropy V2 responses include these fields:
-- **sequenceNumber**: Unique identifier for the randomness request (uint64)
+- **sequenceNumber**: The unique identifier of the randomness request (uint64)
- **randomNumber**: The cryptographically secure random bytes32 value
-- **providerAddress**: Address of the entropy provider that fulfilled the request
-- **blockNumber**: Block number when the request was fulfilled
+- **providerAddress**: The address of the Entropy provider that fulfilled the request
+- **blockNumber**: The block number when the request was fulfilled
-### Fee Structure
+### Fee structure
-- **Dynamic Fees**: Always use the on-chain method `entropy.getFeeV2()` to get the current fee
-- **Native Token Payment**: Fees are paid in the native blockchain token (SEI)
-- **Per-Request Basis**: Each randomness request has its own fee
-- **No User Commitment Required**: Entropy V2 simplifies the process by removing the need for user random numbers
+- **Dynamic fees**: Always use the on-chain method `entropy.getFeeV2()` to get the current fee
+- **Native token payment**: Fees are paid in the native blockchain token (SEI)
+- **Per-request basis**: Each randomness request has its own fee
+- **No user commitment required**: Entropy V2 does not need user random numbers. This makes the process simpler.
-## Best Practices
+## Best practices
-1. **Fee Management**: Always check current fees using `getFeeV2()` before submitting requests
-2. **Callback Gas Limits**: Set appropriate gas limits for complex callback logic using Entropy V2's custom gas limit features
-3. **Error Handling**: Implement proper timeout and error handling for unfulfilled requests
-4. **Sequential Processing**: Handle multiple requests appropriately as they may be fulfilled out of order
-5. **Storage Optimization**: Remember that fulfilled randomness is not stored by the contract - save it if needed for multiple uses
+1. **Fee management**: Before you submit a request, always check the current fee with `getFeeV2()`
+2. **Callback gas limits**: For complex callback logic, set appropriate gas limits with the custom gas limit features of Entropy V2
+3. **Error handling**: Implement proper timeout and error handling for unfulfilled requests
+4. **Sequential processing**: Handle multiple requests appropriately, because they may be fulfilled out of order
+5. **Storage optimization**: The contract does not store fulfilled randomness. If you need it for multiple uses, save it.
## Resources
-- [Pyth Entropy Documentation](https://docs.pyth.network/entropy)
-- [Entropy Contract Addresses](https://docs.pyth.network/entropy/chainlist)
-- [Example Applications](https://github.com/pyth-network/pyth-examples/tree/main/entropy)
+- [Pyth Entropy documentation](https://docs.pyth.network/entropy)
+- [Entropy contract addresses](https://docs.pyth.network/entropy/chainlist)
+- [Example applications](https://github.com/pyth-network/pyth-examples/tree/main/entropy)
- [Entropy Explorer](https://entropy-explorer.pyth.network/)
-- [Protocol Design](https://docs.pyth.network/entropy/protocol-design)
+- [Protocol design](https://docs.pyth.network/entropy/protocol-design)
diff --git a/evm/wallet-integrations/particle.mdx b/evm/wallet-integrations/particle.mdx
index 96feeb6..160b2a7 100644
--- a/evm/wallet-integrations/particle.mdx
+++ b/evm/wallet-integrations/particle.mdx
@@ -4,41 +4,41 @@ sidebarTitle: 'Particle'
description: 'Comprehensive guide on Social logins with Particle Connect on Sei. Learn key concepts, commands, and best practices.'
keywords: ['particle network', 'social login', 'wallet abstraction', 'account abstraction', 'smart accounts', 'sei']
---
-[Particle Network](https://particle.network) simplifies onboarding into both
-EOAs and ERC-4337 smart accounts using its Wallet Abstraction stack.
-Specifically, Particle enables an aggregated modal featuring both social logins
-and wallet adapters (such as MetaMask) fully compatible with Sei, enabling
-2-click onboarding.
-
-The Particle Connect user flow begins with social login, either through custom
-authentication or predefined options offered by the platform (like email,
-Google, X). This process generates an EOA using MPC-TSS, which then can act as
-the Signer for a smart account. This can include implementations like
-`SimpleAccount` or Biconomy (V1/V2), depending on the application's
-requirements.
-
-This guide provides a high-level overview of the steps required to build a demo
-application on Sei using the
+[Particle Network](https://particle.network) uses its Wallet Abstraction stack
+to simplify onboarding into both EOAs and ERC-4337 smart accounts. Particle
+gives you an aggregated modal with social logins and wallet adapters, such as
+MetaMask. The modal is fully compatible with Sei and supports 2-click
+onboarding.
+
+The Particle Connect user flow starts with social login. Users log in with
+custom authentication or with predefined options from the platform, such as
+email, Google, or X. This process uses MPC-TSS to generate an EOA. The EOA can
+then be the signer for a smart account. You can use a smart account
+implementation such as `SimpleAccount` or Biconomy (V1 or V2), depending on the
+requirements of your dApp.
+
+This guide gives a high-level overview of how to build a demo dApp on Sei. The
+demo uses the
[Particle Connect SDK](https://developers.particle.network/social-logins/connect/desktop/web),
-Particle's leading onboarding solution. We'll implement the aforementioned
-modal, enabling social logins and wallet connection, while also using account
-abstraction to send a gasless transaction.
+Particle's onboarding solution. It implements the modal described above for
+social logins and wallet connection. It also uses account abstraction to send a
+gasless transaction.
-Thus, the demo application we'll build will:
+In this guide, you build a demo dApp that:
-1. Use a **SimpleAccount** instance of a smart account to onboard users via
+1. Uses a `SimpleAccount` instance of a smart account to onboard users through
social login.
-2. Execute a **gasless (sponsored) transaction**, showcasing the SDK's
- capability to simplify user interactions on the Sei blockchain.
+2. Executes a gasless (sponsored) transaction. This shows how the SDK
+ simplifies user interactions on Sei.
## Getting started
### Dependencies
-To integrate Particle Connect into your Sei application, you'll need just a few
-dependencies. While Particle Connect includes built-in support for Account
-Abstraction (AA), this example demonstrates using the Particle AA SDK alongside
-an EIP-1193 provider, such as ethers.js.
+To integrate Particle Connect into your Sei dApp, you need only a few
+dependencies. Particle Connect has built-in support for account abstraction
+(AA). However, this example uses the Particle AA SDK with an EIP-1193 provider,
+such as ethers.js.
```bash
yarn add @particle-network/connectkit viem@^2 @particle-network/aa ethers
@@ -46,29 +46,28 @@ yarn add @particle-network/connectkit viem@^2 @particle-network/aa ethers
### Setting up the Particle dashboard
-Before jumping into the configuration process, you'll need to go to the
-[Particle dashboard](https://dashboard.particle.network) to retrieve three keys
-required for your project.
+Before you start the configuration, go to the
+[Particle dashboard](https://dashboard.particle.network) to get the three keys
+that your project requires.
-When using any SDK offered by Particle Network, you'll routinely need a
-`projectId`, `clientKey`, and `appId`. These exist to authenticate your project
-and create a connection between your instance of Particle Auth and the Particle
-dashboard (which allows you to customize the application-embedded modals, track
-users, fund gasless transactions, and so on).
+When you use any SDK from Particle Network, you routinely need a `projectId`, a
+`clientKey`, and an `appId`. These keys authenticate your project. They also
+connect your instance of Particle Auth to the Particle dashboard. In the
+dashboard, you can customize the modals embedded in your dApp, track users, and
+fund gasless transactions, among other tasks.
-Once you've navigated to the Particle dashboard, follow the process below:
+In the Particle dashboard, follow these steps:
1. Create a new project through **Add New Project**.
-2. Click **Web** under **Your Apps** (if you intend to use an alternative
- platform, take a look at the
- [platform-specific guides on Particle's documentation](https://developers.particle.network/social-logins/connect/introduction))
-3. Choose a name and domain for your application (if you have yet to deploy or
- decide on a domain where you intend to deploy, feel free to use any filler
- one).
-4. Copy the **Project ID**, **Client Key** and **App ID**.
+2. Under **Your Apps**, click **Web**. If you intend to use a different
+ platform, see the
+ [platform-specific guides in the Particle documentation](https://developers.particle.network/social-logins/connect/introduction).
+3. Choose a name and a domain for your dApp. If you have not deployed yet, or
+ you have not decided where to deploy, you can use any placeholder domain.
+4. Copy the **Project ID**, **Client Key**, and **App ID**.
-Given the nature of these values, it's recommended that you store them within a
-`.env` file with this format:
+Because these values authenticate your project, store them in a `.env` file
+with this format:
```shell
NEXT_PUBLIC_PROJECT_ID='PROJECT_ID'
@@ -79,13 +78,12 @@ NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID='WALLETCONNECT_PROJECT_ID'
## Configuring Particle Connect
-To get started, we'll configure and initialize Particle Connect. Begin by
-creating a new `ConnectKit.tsx` file in your `src` directory.
+First, configure and initialize Particle Connect. Create a new `ConnectKit.tsx`
+file in your `src` directory.
-This file will define the `ParticleConnectKit` component, which wraps the
-configured `ConnectKitProvider` instance. This component will be the central hub
-for managing and providing Particle Connect configuration across your
-application.
+This file defines the `ParticleConnectKit` component, which wraps the
+configured `ConnectKitProvider` instance. This component manages the Particle
+Connect configuration and makes it available across your dApp.
```typescript
"use client";
@@ -130,18 +128,19 @@ export const ParticleConnectkit = ({ children }: React.PropsWithChildren) => {
};
```
-This code sets up Particle Connect with a configuration for wallet
-authentication and blockchain interactions on Sei and Sei Testnet. It includes
-social logins and traditional Web3 options through WalletConnect and enables
-Account Abstraction (AA) with a `SimpleAccount` instance version 2.0.0. The
-configured `ConnectKitProvider` component then wraps the app’s content, making
-this configuration available.
+This code configures Particle Connect for wallet authentication and blockchain
+interactions on Sei Mainnet and Sei Testnet. It includes social logins and
+traditional Web3 options through WalletConnect. It also enables account
+abstraction (AA) with a `SimpleAccount` instance, version 2.0.0. The configured
+`ConnectKitProvider` component then wraps the content of your dApp and makes
+this configuration available to it.
-## Integrate Particle Connect in Your App
+## Integrate Particle Connect in your app
-Once configured, wrap your application with the `ParticleConnectKit` component
-to make the Particle Connect SDK accessible throughout the app. Update the
-`layout.tsx` file in the `src` directory as shown below:
+After you configure Particle Connect, wrap your dApp with the
+`ParticleConnectKit` component. This makes the Particle Connect SDK available
+throughout the dApp. Update the `layout.tsx` file in the `src` directory with
+this code:
```tsx
import { ParticleConnectkit } from '@/components/Connectkit';
@@ -171,22 +170,22 @@ export default function RootLayout({
}
```
-## Building the Application
+## Building the application
-With your project set up, dependencies installed, and Particle Connect
-configured, you can start building in the `page.tsx` file.
+With your project set up, the dependencies installed, and Particle Connect
+configured, you can start to build in the `page.tsx` file.
-In `page.tsx`, you’ll define the core features: login flow, transaction
+In `page.tsx`, you define the core features: the login flow, transaction
handling, and the UI.
-### Connecting the Wallet
+### Connecting the wallet
-With `layout.tsx` configured, the next step is to add a primary **Connect
-Wallet** button to facilitate user login. Import `ConnectButton` from
-`@particle-network/connectkit` and add it to the interface. After the user logs
-in, the `ConnectButton` component will throw a unified login modal upon
-clicking, an example of this modal is viewable
-[here](https://demo.particle.network).
+After you configure `layout.tsx`, add a primary **Connect Wallet** button so
+that users can log in. Import `ConnectButton` from
+`@particle-network/connectkit`. Then add it to the interface. When a user clicks
+the `ConnectButton` component to log in, it opens a unified login modal. You can
+see an example of this modal in the
+[Particle demo](https://demo.particle.network).
```tsx
'use client';
@@ -213,17 +212,16 @@ const HomePage = () => {
export default HomePage;
```
-### Sending Transactions with an EIP-1193 Provider
+### Sending transactions with an EIP-1193 provider
-Particle Connect includes AA features out of the box, but using it with the
-Particle AA SDK allows you to work with EIP-1193 providers, like `ethers`. This
-approach is especially helpful if you're already familiar with these providers
-or are integrating Particle Connect into an existing app.
+Particle Connect has built-in AA features. If you also use the Particle AA SDK,
+you can work with EIP-1193 providers, such as `ethers`. This approach is
+especially helpful if you already know these providers or you are integrating
+Particle Connect into an existing dApp.
-To implement this, wrap the smart account provided by Particle Connect in an
-instance of `ethers` to create a `customProvider`. With this setup, you can use
-`ethers` as usual, with the smart account handling the signing of transactions
-in the background.
+To do this, wrap the smart account from Particle Connect in an instance of
+`ethers` to create a `customProvider`. You can then use `ethers` as usual. The
+smart account signs the transactions in the background.
```tsx
import { useSmartAccount } from '@particle-network/connectkit';
@@ -253,29 +251,28 @@ const executeTxEthers = async () => {
};
```
-This transaction will be gasless because it meets two key conditions:
+This transaction is gasless because it meets two conditions:
-1. **Gasless Mode Configuration**: By setting `SendTransactionMode.Gasless`
- within `AAWrapProvider`, we've specified that the transaction should be
+1. **Gasless mode configuration**: The code sets `SendTransactionMode.Gasless`
+ in `AAWrapProvider`. This setting specifies that the transaction should be
gasless and sponsored.
-2. **Funding Requirements**: On Sei Testnet, all transactions are
- automatically sponsored, meaning you don't need to deposit funds to cover
- transaction fees. However, on Sei Mainnet, the Paymaster (configurable
- in the [Particle dashboard](https://dashboard.particle.network)) would need
- sufficient funds to sponsor these transactions.
-
-This example demonstrates how to use an existing EIP-1193 provider, but you can
-also construct a `userOp` directly with Particle Connect. For an example, refer
-to the
+2. **Funding requirements**: On Sei Testnet, all transactions are sponsored
+ automatically, so you do not need to deposit funds to pay transaction fees.
+ On Sei Mainnet, however, the paymaster needs sufficient funds to sponsor
+ these transactions. You can configure the paymaster in the
+ [Particle dashboard](https://dashboard.particle.network).
+
+This example shows how to use an existing EIP-1193 provider. You can also build
+a `userOp` directly with Particle Connect. For an example, see the
[starter repository](https://github.com/Particle-Network/connectkit-aa-demo/blob/2017262daf297624362d51f3d50cccd3b4606ef9/app/page.tsx#L117).
## Full app example
-With the setup complete, Particle Connect can now be leveraged, as demonstrated
-in the example application below.
+With the setup complete, you can use Particle Connect as this example dApp
+shows.
-In this example, the application creates a smart account on Sei using a social
-login or a Web3 login and sends a gasless transaction of 0.001 SEI via the
+In this example, the dApp uses a social login or a Web3 login to create a smart
+account on Sei. Then it sends a gasless transaction of 0.001 SEI through the
`ethers` provider.
```tsx
@@ -392,25 +389,22 @@ export default function Home() {
}
```
-### Available Particle Connect Hooks
+### Available Particle Connect hooks
-This example illustrates a basic use of Particle Connect. For a complete list of
-available hooks, refer to the
+This example shows a basic use of Particle Connect. For the complete list of
+available hooks, see the
[Particle Connect documentation](https://developers.particle.network/social-logins/connect/desktop/web#key-react-hooks-for-particle-connect).
## Conclusion
-Building an application on Sei that takes advantage of social logins and smart
-accounts simultaneously only takes a few lines of code, and is even more
-succinct if you're already using Ethers, Web3.js, or any other standard library
-that supports EIP-1193 providers.
+A Sei dApp that uses both social logins and smart accounts needs only a few
+lines of code. If you already use ethers, Web3.js, or another standard library
+that supports EIP-1193 providers, the code is even shorter.
-To view the complete demo application leveraging the code snippets covered
-throughout this document, take a look at the
-[GitHub repository](https://github.com/Particle-Network/sei-aa-connect).
+To see the complete demo dApp that uses the code snippets in this guide, go to
+the [GitHub repository](https://github.com/Particle-Network/sei-aa-connect).
-Additionally, to learn more about Particle Network, explore the following
-resources:
+To learn more about Particle Network, see these resources:
- [Website](https://particle.network)
- [Blog](https://blog.particle.network)
diff --git a/evm/wallet-integrations/pimlico.mdx b/evm/wallet-integrations/pimlico.mdx
index be77b0d..eca3e2f 100644
--- a/evm/wallet-integrations/pimlico.mdx
+++ b/evm/wallet-integrations/pimlico.mdx
@@ -4,35 +4,35 @@ sidebarTitle: 'Pimlico'
description: "Learn how to integrate Pimlico's account abstraction services with Sei network for gasless transactions and smart account functionality."
keywords: ['pimlico', 'account abstraction', 'gasless transactions', 'smart accounts']
---
-[Pimlico](https://pimlico.io) is an Account Abstraction infrastructure provider that enables developers to easily integrate smart accounts and gasless transactions into their Sei applications. This guide will walk you through creating a smart account and sending your first gasless transaction on Sei Testnet using Pimlico's infrastructure.
+[Pimlico](https://pimlico.io) is an account abstraction (AA) infrastructure provider. With Pimlico, you can integrate smart accounts and gasless transactions into your Sei dApps. This guide shows how to use Pimlico's infrastructure to create a smart account and send your first gasless transaction on Sei Testnet.
-## Getting Started
+## Getting started
### Dependencies
-To integrate Pimlico into your Sei application, you'll need to install the following dependencies:
+To integrate Pimlico into your Sei dApp, install these dependencies:
```bash
pnpm install permissionless viem dotenv
```
-permissionless.js is an AA SDK that works with any account, paymaster, or bundler implementation - no vendor lock-in.
+permissionless.js is an AA SDK that works with any account, paymaster, or bundler implementation. It does not lock you in to one vendor.
-### Setting up Pimlico Dashboard
+### Setting up Pimlico dashboard
-Before starting the integration:
+Before you start the integration:
-1. Visit the [Pimlico dashboard](https://dashboard.pimlico.io)
-2. Create an account and generate an API key
+1. Go to the [Pimlico dashboard](https://dashboard.pimlico.io).
+2. Create an account. Then generate an API key.
3. Store your API key in a `.env` file:
```shell
PIMLICO_API_KEY='pim_xxxxxxxxxxxxxxxxxxxxxx'
```
-## Configuring Pimlico Client
+## Configuring Pimlico client
-First, let's set up the necessary clients and configurations.
+First, set up the necessary clients and configurations.
```typescript
import { createSmartAccountClient } from 'permissionless';
@@ -71,9 +71,9 @@ export const pimlicoClient = createPimlicoClient({
});
```
-## Creating a Smart Account
+## Creating a smart account
-Now let's create a simple smart account instance. This account will be controlled by a single EOA signer:
+Next, create a simple smart account instance. A single EOA signer controls this account:
```typescript
import { toSimpleSmartAccount } from 'permissionless/accounts';
@@ -86,11 +86,11 @@ const account = await toSimpleSmartAccount({
console.log(`Smart account address: ${account.address}`);
```
-For a full list of all supported smart account types in permissionless.js see [here](https://docs.pimlico.io/permissionless/how-to/accounts/comparison)
+For the full list of smart account types that permissionless.js supports, see the [smart account comparison](https://docs.pimlico.io/permissionless/how-to/accounts/comparison).
-## Setting up the Smart Account Client
+## Setting up the smart account client
-To interact with the smart account, we need to create a SmartAccountClient:
+To interact with the smart account, create a `SmartAccountClient`:
```typescript
import { createSmartAccountClient } from 'permissionless';
@@ -108,9 +108,9 @@ const smartAccountClient = createSmartAccountClient({
});
```
-## Sending a Gasless Transaction
+## Sending a gasless transaction
-With everything set up, we can now send a gasless transaction from our smart account:
+When the setup is complete, you can send a gasless transaction from your smart account:
```typescript
const txHash = await smartAccountClient.sendTransaction({
@@ -123,9 +123,9 @@ console.log(`Transaction included: ${txHash}`);
return txHash;
```
-## Complete Example
+## Complete example
-Here's a complete example that puts everything together:
+This complete example combines all of the steps:
```typescript
import { createSmartAccountClient } from 'permissionless';
@@ -199,32 +199,32 @@ async function main() {
main().catch(console.error);
```
-## What's Happening Under the Hood?
+## What's happening under the hood?
-When you send a transaction using the smart account client:
+When you send a transaction with the smart account client:
-1. The client builds a user operation (a transaction format for smart accounts)
-2. Requests sponsorship from Pimlico's paymaster
-3. Signs the operation with the smart account owners's private key
-4. Submits it to Pimlico's bundler
-5. The bundler monitors the chain until the operation is included in a block
+1. The client builds a user operation (a transaction format for smart accounts).
+2. The client requests sponsorship from Pimlico's paymaster.
+3. The client signs the operation with the private key of the smart account owner.
+4. The client submits the operation to Pimlico's bundler.
+5. The bundler monitors the chain until the operation is included in a block.
-The first transaction will also deploy your smart account contract if it hasn't been deployed yet.
+If your smart account contract is not deployed yet, the first transaction also deploys it.
## Conclusion
-You've now learned how to:
+This guide showed how to:
- Set up Pimlico's infrastructure
- Create a smart account
- Send gasless transactions
-This implementation enables a seamless user experience where end users don't need to worry about gas or managing native tokens to interact with your dApp.
+With this implementation, users do not need to handle gas or manage native tokens to interact with your dApp.
-For more information about Pimlico and its features, check out:
+For more information about Pimlico and its features, see these resources:
-- [Pimlico Documentation](https://docs.pimlico.io)
-- [Pimlico Dashboard](https://dashboard.pimlico.io)
+- [Pimlico documentation](https://docs.pimlico.io)
+- [Pimlico dashboard](https://dashboard.pimlico.io)
- [Pimlico GitHub](https://github.com/pimlicolabs)
-Join the [Pimlico Telegram](https://t.me/pimlicoHQ) community to get help and share what you're building!
+To get help and share what you build, join the [Pimlico Telegram](https://t.me/pimlicoHQ) community.
diff --git a/evm/wallet-integrations/thirdweb-7702.mdx b/evm/wallet-integrations/thirdweb-7702.mdx
index a9a6967..12d8fc5 100644
--- a/evm/wallet-integrations/thirdweb-7702.mdx
+++ b/evm/wallet-integrations/thirdweb-7702.mdx
@@ -7,53 +7,53 @@ keywords: ['thirdweb', 'EIP-7702', 'account abstraction', 'smart accounts', 'gas
## Overview
-This comprehensive guide demonstrates how to integrate thirdweb's EIP-7702 Account Abstraction SDK into your application. EIP-7702 represents the next generation of account abstraction, allowing Externally Owned Accounts (EOAs) to temporarily function as smart contracts, enabling gasless transactions and advanced wallet features without requiring users to migrate to new wallet addresses.
+This guide shows how to integrate thirdweb's EIP-7702 Account Abstraction SDK into your dApp. EIP-7702 is the next generation of account abstraction. It lets externally owned accounts (EOAs) temporarily behave like smart contracts. This makes gasless transactions and advanced wallet features possible. Users do not need to migrate to new wallet addresses.
-## What This Guide Covers
+## What this guide covers
- Understanding EIP-7702
- Setting up a React application with thirdweb's EIP-7702 implementation
- Implementing social logins with smart account features
-- Creating gasless transaction experiences on Sei Network
+- Creating gasless transactions on Sei
## Prerequisites
-Before starting, ensure you have:
+Before you start, make sure that you have:
-- Node.js v18+ installed
+- Node.js v18 or later installed
- Basic knowledge of React and TypeScript
-- A thirdweb account with API key from [thirdweb Dashboard](https://thirdweb.com/dashboard)
-- **For Mainnet**: An active thirdweb Pay As You Go subscription ($5/month minimum) for gas sponsorship
+- A thirdweb account with an API key from the [thirdweb dashboard](https://thirdweb.com/dashboard)
+- **For Sei Mainnet**: An active thirdweb Pay As You Go subscription ($5/month minimum) for gas sponsorship
## What is EIP-7702?
-EIP-7702 is an Ethereum Improvement Proposal that introduces native account abstraction by allowing EOAs to temporarily delegate execution to smart contracts. This approach offers several advantages over traditional ERC-4337 implementations:
+EIP-7702 is an Ethereum Improvement Proposal that introduces native account abstraction. It lets EOAs temporarily delegate execution to smart contracts. This approach has several advantages over traditional ERC-4337 implementations:
-- **Same Address**: Users keep their existing EOA address—no migration to a new smart contract wallet required
-- **Native Protocol Support**: Built into the protocol layer, not requiring external bundler infrastructure
-- **Lower Gas Costs**: More efficient than ERC-4337 since it doesn't need separate UserOperation bundling
-- **Temporary Delegation**: EOAs can temporarily act as smart contracts for a single transaction, then revert to normal behavior
-- **Backward Compatible**: Works with existing wallets and infrastructure without breaking changes
+- **Same address**: Users keep their existing EOA address. They do not need to migrate to a new smart contract wallet.
+- **Native protocol support**: It is built into the protocol layer and does not need external bundler infrastructure.
+- **Lower gas costs**: It is more efficient than ERC-4337, because it does not need separate UserOperation bundling.
+- **Temporary delegation**: EOAs can temporarily act as smart contracts for a single transaction and then return to normal behavior.
+- **Backward compatible**: It works with existing wallets and infrastructure without breaking changes.
-## Sei Network Configuration
+## Sei network configuration
-**Testnet:**
+**Sei Testnet:**
- **RPC URL**: `https://evm-rpc-testnet.sei-apis.com`
- **Chain ID**: 1328
-- **Block Explorer**: [Seiscan Testnet](https://testnet.seiscan.io)
+- **Block explorer**: [Seiscan Testnet](https://testnet.seiscan.io)
-**Mainnet:**
+**Sei Mainnet:**
- **RPC URL**: `https://evm-rpc.sei-apis.com`
- **Chain ID**: 1329
-- **Block Explorer**: [Seiscan](https://seiscan.io)
+- **Block explorer**: [Seiscan](https://seiscan.io)
-## Step 1: Deploy a Storage Contract
+## Step 1: Deploy a Storage contract
-For this example, we'll deploy a simple Storage contract that stores and retrieves numbers. This will demonstrate gasless transactions and smart account features with EIP-7702.
+For this example, deploy a simple Storage contract that stores and retrieves numbers. The contract demonstrates gasless transactions and smart account features with EIP-7702.
-### Storage Contract (Solidity)
+### Storage contract (Solidity)
```solidity
// SPDX-License-Identifier: MIT
@@ -72,11 +72,11 @@ contract Storage {
}
```
-Deploy this contract using [Remix](https://remix.ethereum.org/) or your preferred deployment tool. Note the contract address for later use.
+Deploy this contract with [Remix](https://remix.ethereum.org/) or your preferred deployment tool. Save the contract address, because you need it later.
-## Step 2: Project Setup
+## Step 2: Project setup
-### Create a New Project
+### Create a new project
```bash
npm create vite@latest eip7702-demo -- --template react-ts
@@ -84,13 +84,13 @@ cd eip7702-demo
npm install
```
-### Install Dependencies
+### Install dependencies
```bash
npm install thirdweb@^5
```
-### Install and Configure Tailwind CSS
+### Install and configure Tailwind CSS
Install Tailwind CSS and its dependencies:
@@ -112,7 +112,7 @@ export default {
};
```
-Replace the contents of `src/index.css` with:
+Replace the contents of `src/index.css` with this code:
```css
@tailwind base;
@@ -120,7 +120,7 @@ Replace the contents of `src/index.css` with:
@tailwind utilities;
```
-### Configure Environment Variables
+### Configure environment variables
Create a `.env` file in your project root:
@@ -129,15 +129,15 @@ VITE_TEMPLATE_CLIENT_ID=your_thirdweb_client_id_here
VITE_STORAGE_CONTRACT_ADDRESS=your_deployed_contract_address_here
```
-Get your Client ID from [thirdweb Dashboard](https://thirdweb.com/dashboard) → Project → Overview
+Get your Client ID from the [thirdweb dashboard](https://thirdweb.com/dashboard) under **Project** → **Overview**.
-### Enable Gas Sponsorship (Production)
+### Enable gas sponsorship (production)
-For mainnet gas sponsorship:
+To sponsor gas on Sei Mainnet:
-1. Visit [thirdweb Dashboard Billing](https://thirdweb.com/dashboard/settings/billing)
-2. Subscribe to the **Pay As You Go** plan ($5/month minimum)
-3. Enable gas sponsorship in your project settings
+1. Go to the [billing settings](https://thirdweb.com/dashboard/settings/billing) in the thirdweb dashboard.
+2. Subscribe to the **Pay As You Go** plan ($5/month minimum).
+3. Enable gas sponsorship in your project settings.
## Step 3: Configure Vite
@@ -152,7 +152,7 @@ export default defineConfig({
});
```
-## Step 4: Configure thirdweb Client
+## Step 4: Configure thirdweb client
Create `src/client.ts`:
@@ -166,7 +166,7 @@ export const client = createThirdwebClient({
## Step 5: Setup ThirdwebProvider
-First, update `src/main.tsx` to include the ThirdwebProvider:
+First, update `src/main.tsx` to include `ThirdwebProvider`:
```typescript
import React from 'react'
@@ -184,15 +184,15 @@ ReactDOM.createRoot(document.getElementById('root')!).render(
)
```
-## Step 6: EIP-7702 Smart Account Implementation
+## Step 6: EIP-7702 smart account implementation
-Now replace `src/App.tsx` with the complete EIP-7702 implementation.
+Replace `src/App.tsx` with the complete EIP-7702 implementation.
-**Key Configuration:**
+**Key configuration:**
The `executionMode` configuration enables EIP-7702 features:
-- `mode: "EIP7702"` - Enables EIP-7702 account abstraction (EOA acts as smart contract temporarily)
-- `sponsorGas: true` - Enables gasless transactions (thirdweb pays gas on behalf of users)
+- `mode: "EIP7702"`: Enables EIP-7702 account abstraction. The EOA temporarily acts as a smart contract.
+- `sponsorGas: true`: Enables gasless transactions. thirdweb pays the gas for users.
```typescript
import React, { useState } from "react";
@@ -453,7 +453,7 @@ export default App;
```
-## Step 7: Package Configuration
+## Step 7: Package configuration
Update your `package.json`:
@@ -485,52 +485,52 @@ Update your `package.json`:
}
```
-## Step 8: Run the Application
+## Step 8: Run the application
-### Start Development Server
+### Start development server
```bash
npm run dev
```
-### Test EIP-7702 Features
+### Test EIP-7702 features
-1. **Open** `http://localhost:5173` in your browser
-2. **Connect** using any social login (Google, email, etc.)
-3. **Observe** the automatic smart account creation (no gas required!)
-4. **Test** gasless storage operations:
- - Store the predefined value (37) using the "Store 37" button
- - Store custom numbers using the "Store Custom Number" button
- - Read stored values displayed in the interface
-5. **Monitor** console for transaction hashes and status updates
-6. **Thirdweb Dashboard**: View more details in your thirdweb dashboard
+1. Open `http://localhost:5173` in your browser.
+2. Connect with any social login, such as Google or email.
+3. Observe that the smart account is created automatically, without gas.
+4. Test the gasless storage operations:
+ - To store the predefined value (37), click **Store 37**.
+ - To store a custom number, click **Store Custom Number**.
+ - Read the stored value that the interface displays.
+5. Monitor the console for transaction hashes and status updates.
+6. View more details in your thirdweb dashboard.
## Troubleshooting
-### Network Issues
+### Network issues
-If experiencing connectivity problems:
+If you have connectivity problems:
-1. Check the [thirdweb status page](https://status.thirdweb.com)
-2. Verify your API key is active and has sufficient credits
-3. Ensure you're connected to the correct network (Chain ID 1329 for mainnet, 1328 for testnet)
+1. Check the [thirdweb status page](https://status.thirdweb.com).
+2. Make sure that your API key is active and has sufficient credits.
+3. Make sure that you are connected to the correct network: EVM chain ID 1329 for Sei Mainnet, or 1328 for Sei Testnet.
-### Transaction Verification
+### Transaction verification
After a successful transaction, you can verify it on the block explorer:
-- **Mainnet**: [Seiscan](https://seiscan.io)
-- **Testnet**: [Seiscan Testnet](https://testnet.seiscan.io)
+- **Sei Mainnet**: [Seiscan](https://seiscan.io)
+- **Sei Testnet**: [Seiscan Testnet](https://testnet.seiscan.io)
-Search for your transaction hash to see full details including gas used, status, and event logs.
+Search for your transaction hash to see the full details, including gas used, status, and event logs.
## Resources
-### thirdweb Documentation & Tools
+### thirdweb documentation & tools
-- **[thirdweb Portal](https://portal.thirdweb.com/)**: Comprehensive SDK documentation
-- **[EIP-7702 Documentation](https://portal.thirdweb.com/connect/account-abstraction/eip-7702)**: Official thirdweb EIP-7702 guide
-- **[thirdweb Dashboard](https://thirdweb.com/dashboard)**: Manage projects and API keys
-- **[GitHub Repository](https://github.com/thirdweb-dev)**: Source code and examples
-- **[Developer Blog](https://blog.thirdweb.com/)**: Latest updates and tutorials
-- **[EIP-7702 Specification](https://eips.ethereum.org/EIPS/eip-7702)**: Official Ethereum Improvement Proposal
+- **[thirdweb Portal](https://portal.thirdweb.com/)**: SDK documentation
+- **[EIP-7702 documentation](https://portal.thirdweb.com/connect/account-abstraction/eip-7702)**: Official thirdweb EIP-7702 guide
+- **[thirdweb dashboard](https://thirdweb.com/dashboard)**: Manage projects and API keys
+- **[GitHub repository](https://github.com/thirdweb-dev)**: Source code and examples
+- **[Developer blog](https://blog.thirdweb.com/)**: Latest updates and tutorials
+- **[EIP-7702 specification](https://eips.ethereum.org/EIPS/eip-7702)**: Official Ethereum Improvement Proposal
diff --git a/evm/wallet-integrations/thirdweb.mdx b/evm/wallet-integrations/thirdweb.mdx
index 8b95322..37fd71b 100644
--- a/evm/wallet-integrations/thirdweb.mdx
+++ b/evm/wallet-integrations/thirdweb.mdx
@@ -6,53 +6,53 @@ keywords: ['thirdweb', 'account abstraction', 'smart wallets', 'gasless transact
---
## Overview
-This guide provides a comprehensive, step-by-step tutorial for integrating thirdweb's Account Abstraction SDK on Sei. By the end of this guide, you will understand how to create seamless wallet connectivity with social logins and build decentralized applications with sponsored gas transactions.
+This step-by-step guide shows how to integrate thirdweb's Account Abstraction SDK on Sei. By the end of the guide, you will know how to set up wallet connection with social logins and build dApps with sponsored gas.
-## What This Guide Covers
+## What this guide covers
-- Core concepts and benefits for user experience
-- Creating a React application with thirdweb SDK and Vite
+- Core concepts and the benefits for user experience
+- Creating a React application with the thirdweb SDK and Vite
- Setting up social logins and gasless transactions
- Interacting with smart contracts
## Prerequisites
-Before starting, ensure you have:
+Before you start, make sure that you have:
-- Node.js v18+ installed
+- Node.js v18 or later installed
- Basic knowledge of React and TypeScript
-- A thirdweb account with API key from [thirdweb Dashboard](https://thirdweb.com/dashboard)
-- A deployed smart contract on SEI (we'll use a simple Storage contract)
+- A thirdweb account with an API key from the [thirdweb dashboard](https://thirdweb.com/dashboard)
+- A smart contract deployed on Sei (this guide uses a simple Storage contract)
-**For Mainnet**: An active thirdweb Pay As You Go subscription ($5/month minimum) is required for gas sponsorship on mainnet.
+**For Sei Mainnet**: Gas sponsorship requires an active thirdweb Pay As You Go subscription ($5/month minimum).
-## What is Account Abstraction?
+## What is account abstraction?
-Account Abstraction (AA) is a paradigm that transforms how users interact with blockchain applications. Instead of traditional externally-owned accounts (EOAs), users get smart contract wallets that enable advanced features.
+Account abstraction (AA) changes how users interact with dApps. Instead of traditional externally owned accounts (EOAs), users get smart contract wallets that support advanced features.
-### Core Concepts
+### Core concepts
-- **Smart Wallets**: Contract-based accounts with programmable logic
-- **Gas Sponsorship**: Dapps pay transaction fees on behalf of users
-- **Social Recovery**: Alternative authentication methods beyond private keys
-- **Batch Transactions**: Multiple operations in a single transaction
+- **Smart wallets**: Contract-based accounts with programmable logic
+- **Gas sponsorship**: dApps pay transaction fees for users
+- **Social recovery**: Authentication methods other than private keys
+- **Batch transactions**: Multiple operations in a single transaction
-## Network Information
+## Network information
-### SEI Mainnet Configuration
+### Sei Mainnet configuration
-- **Network Name**: SEI EVM
+- **Network name**: SEI EVM
- **Chain ID**: 1329
- **Public RPC URL**: `https://evm-rpc.sei-apis.com`
- **Explorer**: [https://seiscan.io/](https://seiscan.io/)
- **Currency**: SEI
- **thirdweb RPC**: `https://1329.rpc.thirdweb.com/{YOUR_CLIENT_ID}`
-### Step 1: Deploy a Storage Contract
+### Step 1: Deploy a Storage contract
-Before integrating the SDK, deploy a simple Storage contract on SEI. This contract will store and retrieve a number.
+Before you integrate the SDK, deploy a simple Storage contract on Sei. This contract stores and retrieves a number.
-#### Storage Contract (Solidity)
+#### Storage contract (Solidity)
```solidity title="Storage.sol"
// SPDX-License-Identifier: MIT
@@ -71,11 +71,11 @@ contract Storage {
}
```
-Deploy this contract using [Remix](https://remix.ethereum.org/) on Sei. Note down the contract address - you'll need it in the code.
+Use [Remix](https://remix.ethereum.org/) to deploy this contract on Sei. Save the contract address, because you need it in the code.
-### Step 2: Project Setup
+### Step 2: Project setup
-#### Create a New Project
+#### Create a new project
```bash
npm create vite@latest sei-thirdweb-app -- --template react-ts
@@ -83,13 +83,13 @@ cd sei-thirdweb-app
npm install
```
-#### Install Dependencies
+#### Install dependencies
```bash
npm install thirdweb@^5
```
-#### Configure Environment Variables
+#### Configure environment variables
Create a `.env` file in your project root:
@@ -97,17 +97,17 @@ Create a `.env` file in your project root:
VITE_TEMPLATE_CLIENT_ID=your_thirdweb_client_id_here
```
-Get your Client ID from [thirdweb Dashboard](https://thirdweb.com/dashboard) → Settings → API Keys.
+Get your Client ID from the [thirdweb dashboard](https://thirdweb.com/dashboard) under **Settings** → **API Keys**.
-#### Enable Gas Sponsorship
+#### Enable gas sponsorship
-If you want to sponsor gas on mainnet:
+To sponsor gas on Sei Mainnet:
-1. Go to [thirdweb Dashboard Billing](https://thirdweb.com/dashboard/settings/billing)
-2. Subscribe to the **Pay As You Go** plan ($5/month)
-3. Without this, sponsored transactions will fail on mainnet
+1. Go to the [billing settings](https://thirdweb.com/dashboard/settings/billing) in the thirdweb dashboard.
+2. Subscribe to the **Pay As You Go** plan ($5/month).
+3. Without this plan, sponsored transactions fail on Sei Mainnet.
-### Step 3: Configure thirdweb Client
+### Step 3: Configure thirdweb client
Create `src/client.ts`:
@@ -119,9 +119,9 @@ export const client = createThirdwebClient({
});
```
-### Step 4: Smart Contract Integration
+### Step 4: Smart contract integration
-Replace `src/App.tsx`:
+Replace the contents of `src/App.tsx` with this code:
```typescript title="src/App.tsx" lines
import {
@@ -302,20 +302,20 @@ function App() {
export default App;
```
-#### Understanding Key Components
+#### Understanding key components
| Component | Description |
| --- | --- |
| `ConnectButton` | Pre-built UI component for wallet connection |
| `TransactionButton` | Simplified transaction execution with loading states |
-| `useActiveAccount` | Hook to get currently connected account |
-| `prepareContractCall` | Prepares transaction for contract interaction |
+| `useActiveAccount` | Hook to get the currently connected account |
+| `prepareContractCall` | Prepares a transaction for a contract interaction |
| `inAppWallet` | Smart wallet with social login capabilities |
-### Step 5: Package Configuration
+### Step 5: Package configuration
-Ensure your `package.json` includes:
+Make sure that your `package.json` includes these entries:
```json title="package.json"
{
@@ -342,68 +342,72 @@ Ensure your `package.json` includes:
}
```
-### Step 6: Run the Application
+### Step 6: Run the application
-#### Start Development Server
+#### Start development server
```bash
npm run dev
```
-#### Test the Application
+#### Test the application
-1. Open your browser and navigate to `http://localhost:5173`
-2. Click "Connect to Sei Network"
-3. Choose your preferred login method (Google, email, etc.)
-4. A smart wallet is automatically created for you (no gas!)
-5. After connecting, you'll see three interaction buttons
-6. Try storing number 37 or a custom number
-7. Retrieve the stored value - all transactions are gasless!
-8. Monitor the browser console for: - Transaction hashes - Error messages - Connection status - Smart contract interactions
+1. In your browser, go to `http://localhost:5173`.
+2. Click **Connect to Sei Network**.
+3. Choose your preferred login method, such as Google or email.
+4. A smart wallet is created for you automatically. You do not pay gas for it.
+5. After you connect, you see three interaction buttons.
+6. Store the number 37 or a custom number.
+7. Retrieve the stored value. All transactions are gasless.
+8. Monitor the browser console for these items:
+ - Transaction hashes
+ - Error messages
+ - Connection status
+ - Smart contract interactions
-Gas fees are automatically sponsored when using Account Abstraction, so users don't need SEI tokens to interact with the contract.
+Gas is sponsored automatically when you use account abstraction, so users do not need SEI tokens to interact with the contract.
### Step 7: Done!
-You've successfully integrated thirdweb's Account Abstraction SDK with Sei! Users can now connect with social logins and interact with your contracts without needing to hold SEI tokens for gas.
+Your dApp now uses thirdweb's Account Abstraction SDK on Sei. Users can connect with social logins and interact with your contracts without holding SEI tokens for gas.
-## What You've Accomplished
+## What you've accomplished
-- Created a React application with thirdweb SDK v5
-- Configured Account Abstraction for SEI network
+- Created a React application with the thirdweb SDK v5
+- Configured account abstraction for Sei
- Implemented social login authentication
-- Deployed gasless transaction capabilities
+- Enabled gasless transactions
- Built contract interaction interfaces
-- Learned error handling for web3 applications
+- Learned error handling for dApps
## Troubleshooting
-### Common Issues and Solutions
+### Common issues and solutions
| Error | Problem | Solution |
| --- | --- | --- |
-| `Client ID not found` | Environment variable not loading | Check `.env` file and restart dev server |
-| `Sponsored transactions failing` | No active subscription | Subscribe to [Pay As You Go plan](https://thirdweb.com/dashboard/settings/billing) |
-| `Transaction reverted` | Invalid contract address | Verify contract on [Sei Explorer](https://seiscan.io/) |
-| `Cannot connect wallet` | Network configuration issue | Check Client ID and RPC URL format |
-| `Gas estimation failed` | Contract method issue | Verify contract ABI and function signature |
+| `Client ID not found` | Environment variable does not load | Check the `.env` file and restart the dev server |
+| `Sponsored transactions failing` | No active subscription | Subscribe to the [Pay As You Go plan](https://thirdweb.com/dashboard/settings/billing) |
+| `Transaction reverted` | Invalid contract address | Verify the contract on [Seiscan](https://seiscan.io/) |
+| `Cannot connect wallet` | Network configuration issue | Check the Client ID and the RPC URL format |
+| `Gas estimation failed` | Contract method issue | Verify the contract ABI and the function signature |
-### Network Connection Issues
+### Network connection issues
-If the RPC endpoint is not responding:
+If the RPC endpoint does not respond:
-1. Verify your Client ID is active
-2. Check internet connectivity
-3. Try using the public RPC: `https://evm-rpc.sei-apis.com`
+1. Make sure that your Client ID is active.
+2. Check your internet connection.
+3. Try the public RPC endpoint: `https://evm-rpc.sei-apis.com`
## Resources
-- **thirdweb Documentation**: [https://portal.thirdweb.com/](https://portal.thirdweb.com/)
-- **thirdweb Dashboard**: [https://thirdweb.com/dashboard](https://thirdweb.com/dashboard)
-- **SEI Explorer**: [https://seiscan.io/](https://seiscan.io/)
+- **thirdweb documentation**: [https://portal.thirdweb.com/](https://portal.thirdweb.com/)
+- **thirdweb dashboard**: [https://thirdweb.com/dashboard](https://thirdweb.com/dashboard)
+- **Seiscan**: [https://seiscan.io/](https://seiscan.io/)
- **Remix IDE**: [https://remix.ethereum.org/](https://remix.ethereum.org/)
diff --git a/index.mdx b/index.mdx
index 7cec6e0..325508d 100644
--- a/index.mdx
+++ b/index.mdx
@@ -6,52 +6,52 @@ keywords: ["Sei", "EVM", "blockchain", "smart contracts", "Solidity", "paralleli
import { NetworkTabs } from '/snippets/network-tabs.jsx';
-The first parallelized EVM blockchain delivering unmatched scalability and speed.
+Sei is the first parallelized EVM blockchain, built for scalability and speed.
-## Quick Start
+## Quick start
-
+
Deploy EVM contracts with parallelized execution.
-
- Create powerful dApps with Sei's fast finality.
+
+ Create dApps that use Sei's fast finality.
- Bootstrap a full-stack Sei project in seconds.
+ Set up a full-stack Sei project in seconds.
-
+
Verify and publish your contract source code.
-
- viem, ethers, ERC-20/721, pointer contracts, and Sei behavior differences.
+
+ viem, ethers, ERC-20, ERC-721, pointer contracts, and differences in Sei behavior.
-## Essential Resources
+## Essential resources
-
- RPC URLs & Chain IDs
+
+ RPC URLs and chain IDs
- Testnet tokens
+ Sei Testnet tokens
-
+
Inspect transactions
Supported wallets
-
+
Infrastructure partners
-
- Pricing & optimization
+
+ Pricing and optimization
-## Ecosystem & Integrations
+## Ecosystem & integrations
@@ -61,21 +61,21 @@ The first parallelized EVM blockchain delivering unmatched scalability and speed
sei-skill, MCP Server, and agent frameworks for AI-powered development on Sei.
- View and manage SEI and ERC-20/721 in wallets.
+ View and manage SEI, ERC-20, and ERC-721 tokens in wallets.
- Query on-chain data with Goldsky, The Graph, and more.
+ Query on-chain data with Goldsky, The Graph, and other indexers.
- Chainlink, Pyth, Redstone, and API3 price feeds.
+ Chainlink, Pyth, RedStone, and API3 price feeds.
-
+
Fast, low-fee payments with immediate finality.
-
+
Monetize APIs with HTTP-native payments.
-
+
Embed token swaps directly in your dApp.
@@ -84,72 +84,72 @@ The first parallelized EVM blockchain delivering unmatched scalability and speed
- Key differences to know.
+ The main differences to know.
-
+
Migrate existing EVM dApps.
- Transition from Solana to Sei.
+ Move from Solana to Sei.
## Learn
-
- Next-gen design enabling gigagas execution bandwidth.
+
+ Next-generation design for gigagas execution bandwidth.
Sub-second finality and fast block production.
-
+
Optimistic, multi-core transaction execution.
State access optimized for high throughput.
- Proposals, voting, and staking overview.
+ Overview of proposals, voting, and staking.
EVM and CosmWasm cross-VM communication.
-## Smart Contracts
+## Smart contracts
-
- Write, deploy, and debug Solidity smart contracts with your favorite toolchain. Sei is fully EVM-compatible with 400 ms blocks and parallelized execution.
+
+ Write, deploy, and debug Solidity smart contracts with your preferred toolchain. Sei is fully EVM-compatible, with 400 ms blocks and parallelized execution.
-
-
+
+
-## Infrastructure & Tools
+## Infrastructure & tools
-
+
Participate in the Sei network.
- - [Full Node](/node/node-operators)
- - [Validator Node](/node/validators)
+ - [Full node](/node/node-operators)
+ - [Validator node](/node/validators)
Access native Sei features from Solidity contracts.
-
+
Libraries, tools, and learning materials.
-
- Key deployed contract addresses on Sei.
+
+ Addresses of the main contracts deployed on Sei.
-## Network Information
+## Network information
diff --git a/learn/accounts.mdx b/learn/accounts.mdx
index 2c24930..1c1ad7e 100644
--- a/learn/accounts.mdx
+++ b/learn/accounts.mdx
@@ -5,89 +5,87 @@ description: "Understand how Sei's unified account system works with both EVM (0
keywords: ['sei accounts', 'dual address system', 'address association', 'EVM address', 'Cosmos address', 'wallet linking']
---
-Every account on Sei has a unique public key. This public key can be used to
-generate multiple wallet addresses, but it is important to note that the two are
-functionally the same. They appear different, and depending on the app they may
-be used interchangeably, but they both point to the same destination - your
-account. The difference is like the difference between the numeral "2" and the
-word "two". They both define the same value, but may be used in different
-contexts.
+Every account on Sei has a unique public key. You can use this public key to
+generate multiple wallet addresses, and these addresses are functionally the
+same. They look different, but they both point to the same destination: your
+account. Depending on the dApp, they may be used interchangeably. The difference
+is like the difference between the numeral "2" and the word "two". They both
+define the same value, but they may be used in different contexts.
-- **"hex" Address**: Starts with `0x` and is EVM-based.
+- **"hex" address**: Starts with `0x` and is EVM-based.
-- **"bech32" Address**: Starts with `sei1` and is used for Cosmos functions.
+- **"bech32" address**: Starts with `sei1` and is used for Cosmos functions.

-Although these addresses appear different, they actually share the same
-underlying account. Once the two addresses are linked through association
-(described below), whatever action you take with one address also affects the
-other.
+Although these addresses look different, they share the same underlying
+account. After the two addresses are linked through association (described
+below), any action that you take with one address also affects the other.
-Once associated, if you deposit funds into your EVM address you can access and
-use those same funds with your SEI address, and vice versa — they behave as one
-account, ensuring seamless integration between the EVM and SEI ecosystems. Until
-the addresses are associated, they are treated as separate accounts with
-separate balances (see **Before Linking** below).
+After association, if you deposit funds into your EVM address, you can access
+and use the same funds with your Sei address. The reverse is also true. The two
+addresses behave as one account. Until the addresses are associated, they are
+treated as separate accounts with separate balances (see **Before linking**
+below).
-Both addresses for a single account are derived from the same **public key**, but the chain can only determine their association **after the public key is known by the chain** via association.
+Both addresses of an account are derived from the same **public key**. The chain can recognize the link between them only **after it knows the public key**. The chain learns the public key through association.
-## Key Points
+## Key points
-### Before Linking
+### Before linking
- The Bech32 (`sei...`) and EVM (`0x...`) addresses are treated as **separate
accounts**.
-- They will have separate balances until linked.
-- Cosmos tokens received by the EVM address prior to association will be held in
- a temporary Cosmos Bech32 address, which will transfer to the associated address upon
- linking.
-- Some types of transactions will **not be possible** (see table below).
+- They have separate balances until they are linked.
+- If the EVM address receives Cosmos tokens before association, a temporary
+ Cosmos Bech32 address holds them. The tokens transfer to the associated
+ address when the addresses are linked.
+- Some types of transactions are **not possible** (see the table below).
-### After Linking
+### After linking
-- Balances are reflected consistently across both addresses.
-- Applications can query either address format seamlessly.
+- Both addresses show the same balance.
+- Applications can query either address format.
-## Wallet Association and Transfer Limitations
+## Wallet association and transfer limitations
-Certain actions are **not possible** before wallets are associated:
+Some actions are **not possible** before the wallets are associated:
-- Transfers of **CW-based tokens** (e.g., CW20/721/1155) from a non-EVM wallet
- to an **unassociated EVM address**.
-- Transfers of **ERC-based tokens** (e.g., ERC20/721/1155) from an EVM wallet to
- an **unassociated Cosmos address**.
+- Transfers of **CW-based tokens** (for example, CW20, CW721, and CW1155) from a
+ non-EVM wallet to an **unassociated EVM address**.
+- Transfers of **ERC-based tokens** (for example, ERC-20, ERC-721, and ERC-1155)
+ from an EVM wallet to an **unassociated Cosmos address**.
-## Methods of Association
+## Methods of association
-| Method | Security Risk | User Action Required |
+| Method | Security risk | User action required |
| --- | --- | --- |
-| 1. Broadcast a Transaction | Low | Association happens automatically |
-| 2. Direct Private Key | High | Provide private key directly |
-| 3. Signed Message | Medium | Sign a predefined message to prove ownership *(recommended for wallets)* |
-| 4. Public Key | Low | Provide a compressed public key for association |
+| 1. Broadcast a transaction | Low | Association happens automatically |
+| 2. Direct private key | High | Use the private key directly |
+| 3. Signed message | Medium | Sign a predefined message to prove ownership *(recommended for wallets)* |
+| 4. Public key | Low | Send a compressed public key for association |
-Each method ensures the **public key** is known to the chain, enabling automatic association between the EVM-compatible and Bech32 addresses. All four go through the on-chain `addr` precompile (`0x0000000000000000000000000000000000001004`) or the EVM ante handler and are available on every Sei EVM RPC.
+Each method makes the **public key** known to the chain. The chain then associates the EVM-compatible and Bech32 addresses automatically. All four methods go through the on-chain `addr` precompile (`0x0000000000000000000000000000000000001004`) or the EVM ante handler. They are available on every Sei EVM RPC.
-The legacy `sei_associate` JSON-RPC method has been removed. Method 3 provides the same wallet-signed-message flow through the `addr` precompile.
+The legacy `sei_associate` JSON-RPC method is no longer available. Method 3 offers the same wallet-signed-message flow through the `addr` precompile.
-Constants for the `addr` precompile can also be found in the repo
-[Sei-Chain/precompiles](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/addr):
+You can also find constants for the `addr` precompile in the
+[Sei-Chain/precompiles](https://github.com/sei-protocol/sei-chain/tree/main/precompiles/addr) repository.
-## Method 1: Broadcast a Transaction
+## Method 1: Broadcast a transaction
-- When an account **broadcasts a transaction** (e.g., sending tokens), its
- public key is recorded on-chain.
-- Once the public key is known, the **EVM address** and **Bech32 address** are
+- When an account broadcasts a transaction, such as a token transfer, its public
+ key is recorded on-chain.
+- After the public key is known, the EVM address and the Bech32 address are
linked automatically.
-- This ensures balances and transactions are accessible across both address
+- As a result, balances and transactions are accessible from both address
formats.
-## Method 2: Direct Private Key Association
+## Method 2: Direct private key association
-**Security Risk**: **High** – Requires the private key to be directly available. Exposing the private key can compromise the wallet.
+**Security risk**: **High**. This method requires direct access to the private key. An exposed private key can compromise the wallet.
-This method directly uses the private key to interact with the network.
+This method uses the private key directly to interact with the network.
```ts
import { createPublicClient, createWalletClient, http } from 'viem';
@@ -116,12 +114,11 @@ const response = await client.writeContract({
console.log(response);
```
-## Method 3: Associate via Signed Message
+## Method 3: Associate via signed message
-**Security Risk**: **Medium** – Requires signing a specific message using the private key.
+**Security risk**: **Medium**. This method requires you to sign a specific message with the private key.
-This method involves signing a predefined message to prove ownership of the
-account.
+In this method, you sign a predefined message to prove that you own the account.
```ts
import { createWalletClient, http, parseSignature, toHex } from 'viem';
@@ -155,9 +152,9 @@ const associate = async () => {
associate();
```
-## Method 4: Associate via Public Key
+## Method 4: Associate via public key
-**Security Risk**: **Low** – Involves using the public key, which is less sensitive than the private key.
+**Security risk**: **Low**. This method uses the public key, which is less sensitive than the private key.
This method compresses the public key and sends it for association.
@@ -192,11 +189,11 @@ const associateViaPubkey = async () => {
associateViaPubkey();
```
-## Query Linked Addresses
+## Query linked addresses
-Resolve either side of an existing association by calling the `addr` precompile at `0x0000000000000000000000000000000000001004` over a standard `eth_call`. The precompile is universally available on every Sei RPC.
+To resolve either side of an existing association, call the `addr` precompile at `0x0000000000000000000000000000000000001004` with a standard `eth_call`. The precompile is available on every Sei RPC.
-### Fetch Bech32 Address for an EVM Address
+### Fetch Bech32 address for an EVM address
```bash
curl -X POST $SEIEVM -H "Content-Type: application/json" -d '{
@@ -210,7 +207,7 @@ curl -X POST $SEIEVM -H "Content-Type: application/json" -d '{
}'
```
-The selector `0x0c3c20ed` is `getSeiAddr(address)`. The returned ABI-encoded string is the bech32 `sei1…` address, or the call reverts if the EVM address is not yet associated.
+The selector `0x0c3c20ed` is `getSeiAddr(address)`. The call returns the bech32 `sei1…` address as an ABI-encoded string. If the EVM address is not associated yet, the call reverts.
In TypeScript with viem:
@@ -238,7 +235,7 @@ const seiAddr = await client.readContract({
});
```
-### Fetch EVM Address for a Sei Address
+### Fetch EVM address for a Sei address
```ts
const evmAddr = await client.readContract({
@@ -249,24 +246,24 @@ const evmAddr = await client.readContract({
});
```
-The precompile reverts if the address has never been associated; surface this as "not linked" rather than re-throwing.
+If the address has never been associated, the precompile reverts. Handle the revert as a "not linked" result instead of re-throwing it.
-## Deriving Addresses from the Public Key
+## Deriving addresses from the public key
Both address formats come from the same secp256k1 public key, but they use
-**different hashing schemes**: the bech32 (`sei1…`) side follows the standard
-Cosmos derivation (`SHA256` then `RIPEMD160` of the **compressed** pubkey), and
-the EVM (`0x…`) side follows the standard Ethereum derivation (`keccak256` of
-the **uncompressed** pubkey without its `0x04` prefix byte).
+**different hashing schemes**. The bech32 (`sei1…`) side follows the standard
+Cosmos derivation (`SHA256` then `RIPEMD160` of the **compressed** public key).
+The EVM (`0x…`) side follows the standard Ethereum derivation (`keccak256` of
+the **uncompressed** public key without its `0x04` prefix byte).
-### Sei Address Derivation
+### Sei address derivation
-The Cosmos address is derived from the public key using the following steps:
+The Cosmos address is derived from the public key in these steps:
-1. Take the **compressed** secp256k1 public key (33 bytes; first byte `0x02` or `0x03`).
+1. Take the **compressed** secp256k1 public key (33 bytes, with a first byte of `0x02` or `0x03`).
2. Hash it with `SHA256`.
3. Hash the result with `RIPEMD160` to get a 20-byte digest.
-4. Encode that digest in **Bech32 format** with the `sei` prefix.
+4. Encode that digest in Bech32 format with the `sei` prefix.
Example implementation:
@@ -284,14 +281,14 @@ export function deriveSeiAddress(compressedPublicKey: Uint8Array): string {
}
```
-### EVM Address Derivation
+### EVM address derivation
-The EVM-compatible address is derived as follows:
+The EVM-compatible address is derived in these steps:
-1. Take the **uncompressed** secp256k1 public key (65 bytes; first byte `0x04`).
-2. Drop the leading `0x04` prefix byte so the input to the hash is the bare 64-byte `(x, y)` coordinate pair.
-3. Hash with `keccak256`.
-4. Take the **last 20 bytes** of the hash and format as `0x…` hex.
+1. Take the **uncompressed** secp256k1 public key (65 bytes, with a first byte of `0x04`).
+2. Drop the leading `0x04` prefix byte, so that the input to the hash is the bare 64-byte `(x, y)` coordinate pair.
+3. Hash these bytes with `keccak256`.
+4. Take the **last 20 bytes** of the hash and format them as `0x…` hex.
Example implementation:
@@ -309,75 +306,74 @@ export function deriveEVMAddress(uncompressedPublicKey: Uint8Array): string {
### Summary
-- **Sei Address**: `bech32('sei', RIPEMD160(SHA256(compressedPubKey)))` — 20 bytes, Cosmos-standard derivation.
-- **EVM Address**: `'0x' + keccak256(uncompressedPubKey[1:])[-20:]` — last 20 bytes of the keccak256 hash, Ethereum-standard derivation.
-- The two formats share an account because the chain stores the **public key** itself on association; either format can be derived from it deterministically.
+- **Sei address**: `bech32('sei', RIPEMD160(SHA256(compressedPubKey)))` (20 bytes, Cosmos-standard derivation).
+- **EVM address**: `'0x' + keccak256(uncompressedPubKey[1:])[-20:]` (the last 20 bytes of the keccak256 hash, Ethereum-standard derivation).
+- The two formats share an account because the chain stores the **public key** itself on association. Either format can be derived deterministically from the public key.
-### Why It Works
+### Why it works
-Both formats are deterministic, public-key-derived address schemes. Once the
-public key is on-chain (via any of the four association methods above, or
-implicitly via a first signed transaction), the chain can derive both formats
-itself and route any incoming reference to the same account.
+Both formats are deterministic address schemes derived from the public key. The
+public key is recorded on-chain through any of the four association methods
+above, or implicitly through a first signed transaction. After that, the chain can derive
+both formats itself and route any incoming reference to the same account.
### Recap
-- Accounts are automatically linked when a transaction is broadcast, or can be
- associated manually via the `addr` precompile (`associate` / `associatePubKey`).
+- Accounts are linked automatically when a transaction is broadcast. You can
+ also associate them manually through the `addr` precompile (`associate` or
+ `associatePubKey`).
- Both address formats share the same **public key**.
-- Linking enables dApps and tools to access balances consistently across both
+- After linking, dApps and tools can access balances consistently across both
address formats.
-## HD Paths and Coin Types
+## HD paths and coin types
-When deriving a private key from a mnemonic phrase, the hierarchical
-deterministic (HD) path involves multiple parameters, including the coin type.
-The coin type determines the blockchain ecosystem for which the key is derived,
-making it crucial when dealing with different wallets and blockchains.
+When you derive a private key from a mnemonic phrase, the hierarchical
+deterministic (HD) path has multiple parameters, including the coin type. The
+coin type determines the blockchain ecosystem that the key is derived for. This
+matters when you work with different wallets and blockchains.
-### Coin Type Parameter
+### Coin type parameter
-The second parameter in the HD path specifies the coin type, which is defined by
-the BIP-44 standard. This parameter identifies the blockchain ecosystem
-associated with the derived keys.
+The second parameter in the HD path specifies the coin type, which the BIP-44
+standard defines. This parameter identifies the blockchain ecosystem of the
+derived keys.
-- **Ethereum (Coin Type 60)**: Wallets like MetaMask use coin type 60. The HD
- path for Ethereum typically looks like this: `m/44'/60'/0'/0/0`.
-- **Cosmos (Coin Type 118)**: Wallets for Cosmos-based chains, such as OKX,
- use coin type 118. The HD path for Cosmos typically looks like this:
- `m/44'/118'/0'/0/0`.
+- **Ethereum (coin type 60)**: Wallets such as MetaMask use coin type 60. The
+ typical HD path for Ethereum is `m/44'/60'/0'/0/0`.
+- **Cosmos (coin type 118)**: Wallets for Cosmos-based chains, such as OKX,
+ use coin type 118. The typical HD path for Cosmos is `m/44'/118'/0'/0/0`.
### Implications
-Due to the different coin types, a mnemonic phrase used to derive keys for
-Ethereum (coin type 60) cannot be directly used in a Cosmos wallet (coin
-type 118) to access the same accounts. This is because the HD path determines a
-different set of keys for each coin type, meaning the derived addresses will
-differ.
+You cannot use an Ethereum mnemonic phrase (coin type 60) directly in a Cosmos
+wallet (coin type 118) to access the same accounts. The HD path determines a
+different set of keys for each coin type, so the derived addresses differ.
-### Private Key Export
+### Private key export
-Users can export their private key from MetaMask (derived using coin type 60)
-and import it into any Cosmos wallet. This works because the private key, once
-derived, can be used across different blockchain ecosystems, provided the
-receiving wallet supports the import function. This allows users to manage their
-assets across various blockchains using the same underlying cryptographic key.
+You can export your private key from MetaMask (derived with coin type 60) and
+import it into any Cosmos wallet. This works because a derived private key can
+be used across different blockchain ecosystems, if the receiving wallet supports
+the import function. You can then manage your assets across various blockchains
+with the same underlying cryptographic key.
-### Example HD Paths
+### Example HD paths
-- **Traditional Cosmos Path**: `m/44'/118'/0'/0/0`
-- **Traditional EVM Path**: `m/44'/60'/0'/0/0`
+- **Traditional Cosmos path**: `m/44'/118'/0'/0/0`
+- **Traditional EVM path**: `m/44'/60'/0'/0/0`
-## Generating Wallets
+## Generating wallets
### Deriving bech32 and hex addresses from pubkey
-Sei derives both the Cosmos/Tendermint style bech32 address and the
-Ethereum-style hex address from the same public key, but each format uses its
-own hashing scheme: the bech32 address uses the Cosmos-standard `SHA256` then
-`RIPEMD160`, while the hex address uses the `keccak256` method common in EVM
-networks. These extensively commented snippets demonstrate the 'proper' method
-of deriving both bech32 and hex addresses from a given ECDSA SECP256k1 key:
+Sei derives a bech32 address (Cosmos and Tendermint style) and a hex address
+(Ethereum style) from the same public key. Each format uses its own hashing
+scheme. The bech32 address uses the Cosmos-standard
+`SHA256` then `RIPEMD160`. The hex address uses the `keccak256` method, which is
+common in EVM networks. These snippets have detailed comments. They show the
+correct method to derive both bech32 and hex addresses from a given ECDSA
+secp256k1 key:
@@ -443,7 +439,7 @@ print(f"Ethereum Address: {eth_address_hex}")
-
+
```typescript
import { fromBase64 } from '@cosmjs/encoding';
@@ -530,7 +526,7 @@ console.log(`Ethereum Address: ${ethAddress}`);
-
+
```typescript
import { sha256 } from '@noble/hashes/sha256';
diff --git a/learn/dev-chains.mdx b/learn/dev-chains.mdx
index ab8a357..b3089e0 100644
--- a/learn/dev-chains.mdx
+++ b/learn/dev-chains.mdx
@@ -7,18 +7,18 @@ keywords: ['sei chains', 'blockchain networks', 'sei mainnet', 'sei testnet', 'c
import { AddSeiButton } from '/snippets/add-sei-button.jsx';
-Sei utilizes multiple chains for various stages of the development lifecycle.
-This multi-chain approach allows developers to build, deploy, manage, and
-iterate confidently, ensuring thorough testing and feedback before updates go
-live on the mainnet.
+Sei uses multiple chains for different stages of the development lifecycle.
+With this multi-chain approach, you can build, deploy, manage, and iterate with
+confidence. Updates also get thorough testing and feedback before they go live
+on Sei Mainnet.
-All chain updates are first deployed to the testnet for thorough testing and validation before they are released to the mainnet. This process allows developers to test their applications thoroughly and raise any concerns regarding the upgrades before they go live on the mainnet.
+Every chain update goes to Sei Testnet first for thorough testing and validation. After that, the update is released to Sei Mainnet. This lets you test your dApps thoroughly and raise any concerns about an update before it goes live on Sei Mainnet.
## Mainnet
-Mainnet is the live, production environment where actual transactions and
-smart contract deployments occur. This chain is used for all real-world
-applications and activities.
+Sei Mainnet is the live production environment, where real transactions and
+smart contract deployments happen. All real-world dApps and activities use
+this chain.
- **Purpose**: Production
- **Cosmos chain ID**: `pacific-1`
@@ -31,10 +31,10 @@ applications and activities.
## Testnet
-Testnet is used for testing and development purposes. Developers can
-deploy and test their dApps and smart contracts in a controlled environment that
-simulates the mainnet conditions. This chain is crucial for ensuring that
-applications work as expected before going live.
+Sei Testnet is for testing and development. You can deploy and test your dApps
+and smart contracts in a controlled environment that simulates Sei Mainnet
+conditions. Use this chain to make sure that your dApps work as expected before
+they go live.
- **Purpose**: Staging
- **Cosmos chain ID**: `atlantic-2`
@@ -45,25 +45,25 @@ applications work as expected before going live.
-## Local Chains
+## Local chains
-Developers can also run local chains on their machines for testing and
-development purposes. Local chains are isolated environments that mimic the
-behavior of the mainnet or testnet chains. They are useful for testing
-new features, debugging issues, and experimenting with smart contracts with full
-control over all tokens and governance decisions.
+You can also run local chains on your machine for testing and development.
+Local chains are isolated environments that mimic the behavior of Sei Mainnet
+or Sei Testnet. On a local chain, you have full control over all tokens and
+governance decisions. This makes local chains useful for testing new features,
+debugging issues, and experimenting with smart contracts.
- **Purpose**: Development
-- **Cosmos chain ID**: Set by user (default: `sei-chain`)
+- **Cosmos chain ID**: Set by you (default: `sei-chain`)
-Please read the [Nodes Introduction](/node) section for more
-information on how to set up and run a local chain.
+To learn how to set up and run a local chain, read the
+[Nodes Introduction](/node) section.
- TIP: View more chain specific information, RPC endpoints, and Explorers for the [EVM](/evm/networks).
+ For more chain-specific information, RPC endpoints, and explorers, see [Sei EVM networks](/evm/networks).
-## Chain Registry
+## Chain registry
The [Sei Chain Registry](https://github.com/sei-protocol/chain-registry)
-contains additional information about each chain.
+has more information about each chain.
diff --git a/learn/dev-gas.mdx b/learn/dev-gas.mdx
index 2723363..bd0eb6e 100644
--- a/learn/dev-gas.mdx
+++ b/learn/dev-gas.mdx
@@ -3,81 +3,79 @@ title: 'Gas'
description: 'Understand gas pricing, limits, and optimization strategies for Sei transactions, with guides for sending transactions using seid and EVM interfaces.'
keywords: ['gas fees', 'transaction costs', 'gas optimization', 'sei transactions', 'gas limits', 'gas estimation']
---
-Gas is a measure of computational effort required to execute a transaction or
-contract on the Sei network. Gas fees are paid in Sei and are used to
+Gas measures the computational effort required to execute a transaction or
+contract on the Sei network. Transaction fees are paid in SEI, and they
incentivize validators to process transactions and smart contracts.
-## Key Terms and Concepts
+## Key terms and concepts
### Gas
-A unit of measurement representing the work done to execute a transaction, "gas"
-varies based on the complexity of the transaction being executed.
+Gas is a unit of measurement for the work done to execute a transaction. The
+amount of gas depends on the complexity of the transaction.
-### Gas Price
+### Gas price
-The amount of Sei paid per unit of gas used when executing a transaction. The
-gas price is set by the user and is used to calculate the fee for the
-transaction.
+The gas price is the amount of SEI paid per unit of gas that a transaction
+uses. You set the gas price, and it is used to calculate the transaction fee.
-### Gas Limit
+### Gas limit
-The maximum amount of gas the user wants the transaction to use. If the gas
-limit is set too low, the node attempting to run the transaction will run out of
-gas and fail to complete the transaction, using up the entire max gas without
-completing the transaction.
+The gas limit is the maximum amount of gas that you want the transaction to
+use. If the gas limit is too low, the node that executes the transaction runs
+out of gas. The transaction then fails, and it uses up the entire gas limit.
### Fee
`Fee = Gas Price * Gas Used`.
-The gas limit caps the maximum possible charge at `Gas Price * Gas Limit`. Note
-that on Sei, excess gas (the gas limit beyond the actual gas used) may not be
-refunded in full or in part, so avoid setting gas limits far above what a
-transaction actually needs. See
-[Sei EVM vs Ethereum](/evm/differences-with-ethereum) for details.
+The gas limit caps the maximum possible charge at `Gas Price * Gas Limit`. On
+Sei, excess gas (the gas limit beyond the actual gas used) may not be refunded
+in full or in part. Because of this, avoid gas limits far above what a
+transaction needs. For details, see
+[Sei EVM vs Ethereum](/evm/differences-with-ethereum).
-To estimate fees on Sei, query the network directly using the standard EVM
+To estimate fees on Sei, query the network directly with the standard EVM
JSON-RPC methods `eth_gasPrice`, `eth_maxPriorityFeePerGas`, and
-`eth_feeHistory`. These return real-time gas pricing straight from the chain
-with no third-party service required. See
-[Estimating gas prices](#estimating-gas-prices) below for examples.
+`eth_feeHistory`. These methods return real-time gas pricing from the chain, so
+you do not need a third-party service. For examples, see
+[Estimating gas prices](#estimating-gas-prices) below.
-### Maximum Gas
+### Maximum gas
-The maximum gas limit for a transaction ensures that complex transactions do not
-consume excessive resources. You can find the maximum gas limits for each chain
-in the
-[Sei chain registry](https://github.com/sei-protocol/chain-registry/blob/main/gas.json)
-or by querying the `/consensus_params` of the RPC node itself (ex.
+The maximum gas limit for a transaction prevents complex transactions from
+using excessive resources. You can find the maximum gas limits for each chain in
+the
+[Sei chain registry](https://github.com/sei-protocol/chain-registry/blob/main/gas.json).
+You can also query the `/consensus_params` endpoint of the RPC node (for example,
https://rpc.sei-apis.com/consensus_params).
-### Minimum Gas Price
+### Minimum gas price
Sei enforces minimum gas prices to prevent spam transactions. These prices are
-set per chain and are detailed in the
-[chain registry](https://github.com/sei-protocol/chain-registry/blob/main/gas.json).
+set per chain, and the
+[chain registry](https://github.com/sei-protocol/chain-registry/blob/main/gas.json)
+lists them.
-### Max Bytes
+### Max bytes
-Each transaction has a maximum size in bytes, which is set per chain. This limit
-can be queried on the RPC node directly using the `/consensus_params` endpoint.
+Each transaction has a maximum size in bytes, which is set per chain. You can
+query this limit directly on the RPC node with the `/consensus_params` endpoint.
-### Max Gas for Queries
+### Max gas for queries
-Since queries also use gas, there is a maximum gas limit for queries. This limit
-is RPC specific, so check with your RPC provider to determine the maximum gas
-limit for queries.
+Because queries also use gas, there is a maximum gas limit for queries. This
+limit is specific to each RPC. To find it, check with your RPC provider.
-## Sending Gas in Transactions
+## Sending gas in transactions
-When submitting a TX to be broadcast, users specify the gas price and the gas
-limit to create the fee.
+When you submit a transaction for broadcast, you specify the gas price and the
+gas limit to create the fee.
### Using `seid`
-When using `seid`, the fee is set using the `--fees` flag, gas limit and gas
-price can be set with `--gas` and `--gas-prices` flags respectively.
+With `seid`, the `--fees` flag sets the fee. You can set the gas limit with the
+`--gas` flag and the gas price with the `--gas-prices` flag.
```sh
seid tx bank send --gas --gas-prices --fees
@@ -98,21 +96,21 @@ await sendTransaction(config, {
});
```
-## Optimizing Gas Prices for Smart Contracts
+## Optimizing gas prices for smart contracts
-Optimizing gas prices involves efficient smart contract coding practices:
+To optimize gas prices, follow efficient coding practices for smart contracts:
- Minimize storage operations.
- Use fixed-size data structures where possible.
- Avoid unnecessary computations.
-## Estimating Gas Prices
+## Estimating gas prices
-Sei's EVM RPC exposes the standard Ethereum JSON-RPC methods for gas estimation, so you can read real-time pricing directly from the network without relying on a third-party service:
+You can read real-time gas pricing directly from the network, without a third-party service. Sei's EVM RPC exposes the standard Ethereum JSON-RPC methods for gas estimation:
-- `eth_gasPrice` — current recommended gas price for legacy transactions.
-- `eth_maxPriorityFeePerGas` — suggested priority fee (tip) for EIP-1559 transactions.
-- `eth_feeHistory` — recent base fees and priority-fee percentiles, useful for building custom fee strategies.
+- `eth_gasPrice`: Returns the current recommended gas price for legacy transactions.
+- `eth_maxPriorityFeePerGas`: Returns the suggested priority fee (tip) for EIP-1559 transactions.
+- `eth_feeHistory`: Returns recent base fees and priority-fee percentiles. It helps you build custom fee strategies.
Query the current gas price on Sei Mainnet directly:
diff --git a/learn/dev-interoperability.mdx b/learn/dev-interoperability.mdx
index 4d9d239..dcd78fc 100644
--- a/learn/dev-interoperability.mdx
+++ b/learn/dev-interoperability.mdx
@@ -6,44 +6,46 @@ keywords: ['blockchain interoperability', 'EVM Cosmos bridge', 'dual address sys
---
- **CosmWasm deployments are frozen, and IBC is disabled in both directions.** Per [Proposal 115](https://seistream.app/proposals/115), no new CosmWasm contracts can be uploaded or instantiated on Sei. Proposals [116](https://seistream.app/proposals/116), [120](https://seistream.app/proposals/120), and [121](https://seistream.app/proposals/121) disabled inbound and then outbound IBC transfers, so no asset can be bridged into or out of Sei over IBC. The interoperability features described on this page apply to **already-deployed** CosmWasm contracts, native Bank Module assets, and Cosmos-SDK modules accessed via precompiles. Tokenfactory is not a supported development path, and you should not use native-denom pointers or Bank Module interfaces to build tokenfactory integrations. For new smart contract development, build directly on the EVM. See [SIP-3](https://github.com/sei-protocol/sips/blob/main/sips/sip-3.md), [Tokenfactory is not supported](/cosmos-sdk#tokenfactory-is-not-supported), and the [SIP-03 Migration Guide](/learn/sip-03-migration).
+ **CosmWasm deployments are frozen, and IBC is disabled in both directions.** Per [Proposal 115](https://seistream.app/proposals/115), no new CosmWasm contracts can be uploaded or instantiated on Sei. Proposals [116](https://seistream.app/proposals/116), [120](https://seistream.app/proposals/120), and [121](https://seistream.app/proposals/121) disabled inbound and then outbound IBC transfers. No asset can be bridged into or out of Sei over IBC.
+
+ The interoperability features on this page apply to **already-deployed** CosmWasm contracts, native Bank Module assets, and Cosmos-SDK modules accessed through precompiles. Tokenfactory is not a supported development path. Do not use native-denom pointers or Bank Module interfaces to build tokenfactory integrations. For new smart contract development, build directly on the EVM. See [SIP-3](https://github.com/sei-protocol/sips/blob/main/sips/sip-3.md), [Tokenfactory is not supported](/cosmos-sdk#tokenfactory-is-not-supported), and the [SIP-03 Migration Guide](/learn/sip-03-migration).
-## Dual Address Support
+## Dual address support
-Sei utilizes two distinct address types:
+Sei uses two distinct address types:
-- **EVM (0x) address:** Ethereum-style addresses, with "0x" prefix.
-- **Cosmos address:** Bech-32 addresses, with "sei1" prefix.
+- **EVM (0x) address:** Ethereum-style addresses with the "0x" prefix.
+- **Cosmos address:** Bech32 addresses with the "sei1" prefix.
-Both addresses are derived from the same public key, ensuring seamless asset
-integration across formats. You can find your corresponding wallet addresses
-directly in the Sei Dashboard.
+Both addresses are derived from the same public key, so your assets work across
+both formats. You can find your corresponding wallet addresses in the Sei
+Dashboard.
-For more details on interoperability, explore our article
-[here](https://blog.sei.io/sei-v2-interoperability/).
+For more details, read our
+[article on interoperability](https://blog.sei.io/sei-v2-interoperability/).
-## Virtual Machine Interoperability
+## Virtual machine interoperability
-EVM and existing CosmWasm-based smart contracts co-exist on Sei, but live in
-different execution environments. This creates a challenge for users, who use
-wallets that typically only support a single execution environment. Likewise for
-developers, existing tooling and libraries can only interact with either EVM or
-Wasm (Think EthersJS vs CosmJS).
+EVM and existing CosmWasm smart contracts coexist on Sei, but they run in
+different execution environments. This is a problem for users, because their
+wallets typically support only one execution environment. Developers have the
+same problem. Existing tools and libraries can interact with only EVM or only
+Wasm (for example, EthersJS for EVM and CosmJS for Wasm).
-To bridge the gap between EVM and Wasm, Sei exposes Cosmos-SDK modules and
-already-deployed CosmWasm contracts to the EVM via precompiled contracts. New
-smart contracts on Sei should be deployed on the EVM directly.
+To connect EVM and Wasm, Sei exposes Cosmos-SDK modules and already-deployed
+CosmWasm contracts to the EVM through precompiled contracts. New smart contracts
+on Sei should be deployed directly on the EVM.
-## Precompile Contracts
+## Precompile contracts
-Sei precompiles are smart contracts embedded directly within the Sei EVM
-environment. They provide a gateway for users and developers to access Cosmos-SDK functions through the EVM RPC interface.
+Sei precompiles are smart contracts built directly into the Sei EVM
+environment. Users and developers can use them to access Cosmos-SDK functions through the EVM RPC interface.
-For instructions on utilizing EVM precompiles, refer to the
+To learn how to use EVM precompiles, see the
[Example Usage](/evm/precompiles/example-usage) section.
-## Example Diagram
+## Example diagram

-*Enabling seamless access to all tokens and contracts on Sei*
+*Access to all tokens and contracts on Sei*
diff --git a/learn/dev-token-standards.mdx b/learn/dev-token-standards.mdx
index daa7ba5..0631935 100644
--- a/learn/dev-token-standards.mdx
+++ b/learn/dev-token-standards.mdx
@@ -5,29 +5,29 @@ keywords: ['token standards', 'erc20', 'cw20', 'nfts']
---
- **Use ERC20 / ERC721 / ERC1155 for new tokens.** Per [Proposal 115](https://seistream.app/proposals/115), CosmWasm code uploads and contract instantiations are disabled on Sei, so no new CW20 / CW721 / CW1155 tokens can be deployed. The CW standards described below are documented for users and developers interacting with already-deployed legacy contracts.
+ **Use ERC20, ERC721, or ERC1155 for new tokens.** Per [Proposal 115](https://seistream.app/proposals/115), CosmWasm code uploads and contract instantiations are disabled on Sei. As a result, no new CW20, CW721, or CW1155 tokens can be deployed. The CW standards below are documented for users and developers who interact with already-deployed legacy contracts.
**Do not use tokenfactory for new tokens or integrations.** Tokenfactory tutorials and development support have been retired. Legacy module surfaces may remain available for compatibility, but tokenfactory is not a supported development path. Use ERC20 for new fungible tokens. See [Tokenfactory is not supported](/cosmos-sdk#tokenfactory-is-not-supported).
-In this section, we delve into the various token standards supported on Sei.
-Understanding these standards is crucial for developers as they form the
-foundation of many decentralized applications.
+This section describes the token standards that Sei supports. As a developer,
+you need to understand these standards, because they are the foundation of many
+dApps.
-Sei offers support for the following token types:
+Sei supports these token types:
-- [Sei Token](#sei-token)
-- [Smart Contract Tokens](#smart-contract-tokens)
+- [Sei token](#sei-token)
+- [Smart contract tokens](#smart-contract-tokens)
-## Sei Token
+## Sei token
-The Sei token is the native token of the Sei blockchain, serving multiple roles
-within the ecosystem.
+The Sei token is the native token of Sei. It has multiple roles in the
+ecosystem:
-- **Fee Token**: Used to pay transaction fees on the Sei network.
-- **Governance Token**: Used to participate in governance decisions affecting
+- **Fee token**: Used to pay transaction fees on the Sei network.
+- **Governance token**: Used to participate in governance decisions that affect
the network.
**EVM**
@@ -46,48 +46,49 @@ within the ecosystem.
`1 gwei = 1 nsei`
-## Fungible Tokens
+## Fungible tokens
Fungible tokens are digital assets that are interchangeable with one another and
-are not unique. Sei supports both ERC20 and CW20 fungible token standards.
+are not unique. Sei supports both the ERC20 and CW20 fungible token standards.
-### Smart Contract Tokens
+### Smart contract tokens
- **ERC20** (recommended): The ERC20 standard defines a common set of rules for
fungible tokens on EVM-based blockchains. These tokens can be transferred,
- approved, and queried using standard functions. **Use ERC20 for any new
+ approved, and queried with standard functions. **Use ERC20 for any new
fungible token on Sei.**
- **CW20** (legacy only): The Cosmos-side fungible token standard. Per
[Prop 115](https://seistream.app/proposals/115), no new CW20 contracts
- can be deployed. Existing CW20 tokens continue to function and can still have
- pointer contracts created for them.
-- **Interoperability and Pointer Contracts**:
+ can be deployed. Existing CW20 tokens continue to work, and you can still
+ create pointer contracts for them.
+- **Interoperability and pointer contracts**:
[Pointer contracts](/learn/pointers) expose existing CW20 tokens as ERC20 on
- the EVM. A registry tracks pointer contracts and facilitates discovery.
+ the EVM. A registry tracks pointer contracts and helps you discover them.
- **Interoperability:** Existing CW20 tokens can have ERC20 pointer contracts deployed for them. New tokens should be deployed as ERC20 directly.
+ **Interoperability:** You can deploy ERC20 pointer contracts for existing CW20 tokens. New tokens should be deployed as ERC20 directly.
- For more detailed guidance, refer to the
- [Pointer Contracts Documentation](/learn/pointers).
+ For more detailed guidance, see the
+ [pointer contracts documentation](/learn/pointers).
## NFTs
-Non-fungible tokens (NFTs) represent unique digital assets. Sei supports
-ERC721 and ERC1155 (and their royalty-aware counterparts via ERC2981) as the
-standards for new NFT collections, along with legacy CW721 / CW1155 contracts.
+Non-fungible tokens (NFTs) represent unique digital assets. For new NFT
+collections, Sei supports ERC721 and ERC1155, and their royalty-aware
+counterparts through ERC2981. Sei also supports legacy CW721 and CW1155
+contracts.
-- **ERC721 / ERC1155** (recommended): EVM standards for non-fungible and
+- **ERC721 and ERC1155** (recommended): EVM standards for non-fungible and
semi-fungible tokens. **Use these for any new NFT collection on Sei.**
-- **ERC2981**: Defines a royalty mechanism for NFTs, ensuring creators receive
+- **ERC2981**: Defines a royalty mechanism for NFTs so that creators receive
a percentage of sales.
-- **CW721 / CW1155** (legacy only): Per [Prop 115](https://seistream.app/proposals/115),
- no new CW721 / CW1155 contracts can be deployed. Existing collections continue
- to function and can be surfaced on the EVM via pointer contracts.
-- **Interoperability**: Similar to fungible tokens, legacy CW NFT collections
- can interact with the EVM using pointer contracts.
+- **CW721 and CW1155** (legacy only): Per [Prop 115](https://seistream.app/proposals/115),
+ no new CW721 or CW1155 contracts can be deployed. Existing collections continue
+ to work, and you can expose them on the EVM through pointer contracts.
+- **Interoperability**: As with fungible tokens, legacy CW NFT collections
+ can interact with the EVM through pointer contracts.
## Wrapped Sei (wSei)
-Some dApps may require Sei tokens to be wrapped in order to interact with them (similar to Wrapped ETH on Ethereum). The Wrapped Sei Token WSEI is deployed under the contract address [`0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7`](https://seiscan.io/address/0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7).
+To interact with some dApps, you may need to wrap your Sei tokens first (similar to Wrapped ETH on Ethereum). The Wrapped Sei Token (WSEI) is deployed at the contract address [`0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7`](https://seiscan.io/address/0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7).
diff --git a/learn/explorers.mdx b/learn/explorers.mdx
index d932183..3e40673 100644
--- a/learn/explorers.mdx
+++ b/learn/explorers.mdx
@@ -4,49 +4,51 @@ sidebarTitle: 'Block Explorers'
description: 'A comprehensive overview of block explorers for the Sei Network across different environments. Access tools for tracking transactions, analyzing addresses, and monitoring network activity.'
keywords: ['sei blockchain explorer', 'transaction tracking', 'block analysis', 'blockchain monitoring', 'network statistics']
---
-## What Is a Block Explorer?
+## What is a block explorer?
-Rather than downloading the entire blockchain ledger, using a block explorer is
-the most common method to look up all kinds of useful on-chain information.
+A block explorer is the most common way to look up all kinds of on-chain
+information. With an explorer, you do not need to download the entire
+blockchain ledger.
-Most block explorers offer tools for viewing, and sometimes even interacting
-with the network including:
+Most block explorers have tools to view the network, and some have tools to
+interact with it. These tools include:
-- Transaction Tracking: View and track individual transactions on the
- blockchain. Typically includes information such as transaction hashes, input
- and output data, the address of other wallets or contracts a given wallet has
- interacted with, tokens transferred, fees paid and any error messages that may
- be associated with the transaction.
+- Transaction tracking: View and track individual transactions on the
+ blockchain. The information typically includes transaction hashes, input and
+ output data, tokens transferred, fees paid, and any error messages for the
+ transaction. It also includes the addresses of other wallets or contracts
+ that a given wallet has interacted with.
-- Block Information: Details about each block like height (sequence), timestamp,
- total size, and details on transactions included in each block.
+- Block information: Details about each block, such as height (sequence),
+ timestamp, total size, and details on the transactions in the block.
-- Address Queries: Find specific wallet addresses, with token balances and
- transaction history, details on contract addresses and non-wallet accounts.
+- Address queries: Find specific wallet addresses with their token balances and
+ transaction history. You can also get details on contract addresses and
+ non-wallet accounts.
-- Network Statistics: Statistics and analytics about the blockchain, such as
- total number of blocks, transaction throughput, network hash rate, staking and
- governance data, and much more.
+- Network statistics: Statistics and analytics about the blockchain, such as
+ the total number of blocks, transaction throughput, network hash rate, and
+ staking and governance data.
-- Smart Contracts: Query smart contract states, deployments and interactions
- with other wallets or addresses. Some may include the raw code for the
- contract.
+- Smart contracts: Query smart contract states, deployments, and interactions
+ with other wallets or addresses. Some explorers may also show the raw code of
+ the contract.
- Note: In rare cases, some information may be misinterpreted. Off-chain data should be used as a guide only.
+ In rare cases, some information may be misinterpreted. Use off-chain data as a guide only.
-## Sei Explorers
+## Sei explorers
- - [Seiscan](https://seiscan.io) — A user-friendly block explorer for Sei Mainnet.
- - [Seistream](https://seistream.app/) — Real-time transaction streaming and monitoring tool for Sei Mainnet.
- - [NG Explorer](https://sei.explorers.guru) — Comprehensive blockchain explorer provided by Nodes Guru for Sei Mainnet.
+ - [Seiscan](https://seiscan.io): A block explorer for Sei Mainnet.
+ - [Seistream](https://seistream.app/): A real-time transaction streaming and monitoring tool for Sei Mainnet.
+ - [NG Explorer](https://sei.explorers.guru): A blockchain explorer from Nodes Guru for Sei Mainnet.
- - [Seiscan](https://testnet.seiscan.io) — A user-friendly block explorer for Sei Testnet.
- - [Seistream](https://testnet.seistream.app/) — Real-time transaction streaming and monitoring tool for Sei Testnet.
- - [NG Explorer](https://testnet.sei.explorers.guru) — Comprehensive blockchain explorer provided by Nodes Guru for Sei Testnet.
+ - [Seiscan](https://testnet.seiscan.io): A block explorer for Sei Testnet.
+ - [Seistream](https://testnet.seistream.app/): A real-time transaction streaming and monitoring tool for Sei Testnet.
+ - [NG Explorer](https://testnet.sei.explorers.guru): A blockchain explorer from Nodes Guru for Sei Testnet.
diff --git a/learn/faucet.mdx b/learn/faucet.mdx
index 5e7b501..d595062 100644
--- a/learn/faucet.mdx
+++ b/learn/faucet.mdx
@@ -7,25 +7,25 @@ keywords: ['sei testnet', 'blockchain faucet', 'test tokens', 'development token
import { Faucet } from '/snippets/faucet.jsx';
-This faucet distributes Sei Testnet tokens only, which have no real-world value and are intended for testing purposes.
+This faucet distributes only Sei Testnet tokens. These tokens have no real-world value and are intended for testing.
-## Request Tokens
+## Request tokens
-Enter your EVM (`0x`) address below to receive testnet SEI.
+To receive SEI on Sei Testnet, enter your EVM (`0x`) address below.
-## Usage Notes
+## Usage notes
-- **Rate Limits** — Each address can request tokens once per day. Wait 24 hours between requests.
-- **Testnet Only** — Tokens are distributed on Sei Testnet and cannot be used on Sei Mainnet.
-- **Gas Coverage** — A single request provides enough SEI to cover hundreds of testnet transactions.
+- **Rate limits**: Each address can request tokens once per day. Wait 24 hours between requests.
+- **Testnet only**: Tokens are distributed on Sei Testnet and cannot be used on Sei Mainnet.
+- **Gas coverage**: One request gives enough SEI to cover hundreds of transactions on Sei Testnet.
## Testnet USDC
-Need testnet USDC for testing ERC-20 workflows? Use the Circle Faucet to receive USDC on Sei's testnet.
+If you need USDC to test ERC-20 workflows, use the Circle Faucet to get USDC on Sei Testnet.
- [Circle Faucet](https://faucet.circle.com)
- [USDC on Sei Guide](/evm/usdc-on-sei)
-If the faucet is temporarily unavailable, try again later or reach out in the [Sei Discord](https://discord.gg/sei) or [Telegram](https://t.me/+KZdhZ1eE-G01NmZk) developer channels for assistance.
+If the faucet is temporarily unavailable, try again later. You can also ask for help in the [Sei Discord](https://discord.gg/sei) or [Telegram](https://t.me/+KZdhZ1eE-G01NmZk) developer channels.
diff --git a/learn/general-brand-kit.mdx b/learn/general-brand-kit.mdx
index e21e359..126f2da 100644
--- a/learn/general-brand-kit.mdx
+++ b/learn/general-brand-kit.mdx
@@ -12,12 +12,12 @@ sidebarTitle: 'Brand Kit'
---
- Please adhere to these guidelines when featuring Sei in marketing communications, advertising, articles, websites, partner materials, and any printed assets.
+ Follow these guidelines when you feature Sei in marketing communications, advertising, articles, websites, partner materials, and any printed assets.
**Download the full brand kit:** [sei-brand-assets.zip](https://brand.sei.io/sei-brand-assets.zip) · Full interactive version at [brand.sei.io](https://brand.sei.io)
-Black and white carry the brand. Maroon and Gold are heritage accents — use them only for emphasis and legacy moments, never as the base palette.
+Black and white carry the brand. Maroon and Gold are heritage accents. Use them only for emphasis and legacy moments, and never as the base palette.
Sei is a parallelized EVM Layer 1. Sei Giga is designed to extend that architecture with Multi-Proposer consensus and asynchronous execution. In external communications, use sourced performance figures and distinguish live features from roadmap targets.
@@ -31,9 +31,9 @@ Sei is a parallelized EVM Layer 1. Sei Giga is designed to extend that architect
01 — Logo
-## Primary Logo
+## Primary logo
-The Sei primary lock-up consists of two elements: the **symbol** and the **wordmark**. This lock-up is the main representation of the brand and should be used consistently as a combined unit.
+The Sei primary lockup has two elements: the **symbol** and the **wordmark**. This lockup is the main representation of the brand. Use it consistently as a combined unit.
@@ -54,7 +54,7 @@ The Sei primary lock-up consists of two elements: the **symbol** and the **wordm
## Symbol
-The **symbol** is the standalone Sei mark. Use it on its own only when the wordmark is already established elsewhere on the surface (favicons, app icons, watermarks).
+The **symbol** is the standalone Sei mark. Use it on its own only when the wordmark is already established elsewhere on the surface (for example, favicons, app icons, and watermarks).
@@ -86,7 +86,7 @@ The **token mark** appears in Maroon. Black and white are fallbacks for constrai
## Powered by Sei
-For ecosystem and partner surfaces. Keep the lockup intact and match the clearspace rules.
+This lockup is for ecosystem and partner surfaces. Keep the lockup intact, and follow the clearspace rules.
@@ -127,9 +127,9 @@ For ecosystem and partner surfaces. Keep the lockup intact and match the clearsp
## Color
-Black and white carry the brand. Maroon and Gold are heritage accents — use them only for emphasis and legacy moments, never as the base palette.
+Black and white carry the brand. Maroon and Gold are heritage accents. Use them only for emphasis and legacy moments, and never as the base palette.
-### Primary Palette
+### Primary palette
@@ -162,7 +162,7 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
-### Neutral Ramp
+### Neutral ramp
@@ -203,9 +203,9 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
03 — Typography
-## Primary Typeface
+## Primary typeface
-**Lateral** is our primary typeface. Use it for headlines, product UI, and anything that needs presence. Give it room when setting editorially.
+**Lateral** is our primary typeface. Use it for headlines, product UI, and anything that needs presence. Give it room in editorial layouts.
@@ -228,7 +228,7 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
-## Secondary Typefaces
+## Secondary typefaces
@@ -273,22 +273,22 @@ Black and white carry the brand. Maroon and Gold are heritage accents — use th
## Clearspace
-To maintain the logo's clarity and prominence, follow the clearspace guidelines. A certain amount of space is required around the lockup to prevent surrounding artwork, imagery, or the edge of a page from crowding it.
+To keep the logo clear and prominent, follow the clearspace guidelines. Leave the required space around the lockup. This space stops surrounding artwork, imagery, or the edge of a page from crowding it.
-
Use only approved colors.Black, white, Maroon 100, or Gold 100 — nothing else.
-
Keep proportions locked.Symbol and wordmark ship as one unit. Don't rescale their relationship.
-
Respect clearspace and minimum size.X on all sides, 25 px tall minimum.
+
Use only approved colors.The approved colors are black, white, Maroon 100, and Gold 100.
+
Keep proportions locked.The symbol and wordmark ship as one unit. Do not change their relative scale.
+
Respect clearspace and minimum size.Leave a clearspace of X on all sides. The minimum height is 25 px.
## Cobranding
-Our lockup for brand partnerships is dictated by the clearspace rule, which should also be applied to the partner brand. Ensure both lockups are the same height.
+Our lockup for brand partnerships follows the clearspace rule. Apply the same rule to the partner brand. Make sure that both lockups are the same height.
@@ -308,5 +308,5 @@ Our lockup for brand partnerships is dictated by the clearspace rule, which shou
---
- Need something not listed here? See the full interactive brand site at [brand.sei.io](https://brand.sei.io) or download the [complete brand kit zip](https://brand.sei.io/sei-brand-assets.zip).
+ If you need something that is not listed here, see the full interactive brand site at [brand.sei.io](https://brand.sei.io). You can also download the [complete brand kit zip](https://brand.sei.io/sei-brand-assets.zip).
diff --git a/learn/general-governance.mdx b/learn/general-governance.mdx
index 2541b60..7b1f58b 100644
--- a/learn/general-governance.mdx
+++ b/learn/general-governance.mdx
@@ -3,89 +3,81 @@ title: 'General Governance'
sidebarTitle: 'Overview'
description: "Learn about Sei's governance system and how to participate in the decision-making process"
---
-**Decentralized Decision Making**
+Sei uses an on-chain governance system that lets SEI holders participate in decisions about the network. The system is built on the Cosmos SDK governance module, with several enhancements specific to Sei's architecture.
-Sei employs an on-chain governance system that enables SEI holders to participate in the decision-making process for the network. This system is built on the Cosmos SDK governance module with several enhancements specific to Sei's architecture.
+## How governance works
-## How Governance Works
+1. **Proposal submission**: Anyone can submit a governance proposal with an initial deposit.
+2. **Deposit period**: Community members can contribute to the proposal deposit.
+3. **Voting period**: When the proposal reaches the minimum deposit, voting begins.
+4. **Execution**: Approved proposals are executed automatically.
-1. **Proposal Submission** — Anyone can submit a governance proposal with an initial deposit.
-2. **Deposit Period** — Community members can contribute to the proposal deposit.
-3. **Voting Period** — Once minimum deposit is reached, voting begins.
-4. **Execution** — Approved proposals are automatically executed.
+### Governance logic
-### Governance Logic
+- **Quorum requirement**: For a proposal to be valid, a minimum percentage of bonded tokens must participate in the vote.
+- **Approval threshold**: To pass, a proposal must receive more than 50% approval (excluding abstain votes), or 66.7% for expedited proposals.
+- **Veto protection**: If more than 33.4% of votes are "NoWithVeto", the proposal is vetoed, regardless of other vote counts.
-- **Quorum Requirement** — A minimum percentage of bonded tokens must participate in voting for a proposal to be valid.
-- **Approval Threshold** — A proposal must receive more than 50% approval (excluding abstain votes) to pass, or 66.7% for expedited proposals.
-- **Veto Protection** — If more than 33.4% of votes are "NoWithVeto", the proposal is vetoed regardless of other vote counts.
-
-## Network Parameters
+## Network parameters
### Sei Mainnet
-Live network parameters for Sei Mainnet
+These are the live network parameters for Sei Mainnet.
| Parameter | Value | Description |
| --- | --- | --- |
-| Minimum Deposit | 3500 SEI | Required to enter voting period |
-| Expedited Minimum Deposit | 7000 SEI | Required to enter expedited voting period |
-| Deposit Period | 2 days | Time to collect minimum deposit |
-| Voting Period | 3 days | Duration for voting |
-| Expedited Voting Period | 24 hours | Duration for expedited voting |
+| Minimum deposit | 3500 SEI | Required to enter the voting period |
+| Expedited minimum deposit | 7000 SEI | Required to enter the expedited voting period |
+| Deposit period | 2 days | Time to collect the minimum deposit |
+| Voting period | 3 days | Duration for voting |
+| Expedited voting period | 24 hours | Duration for expedited voting |
| Quorum | 33.4% | Minimum participation required |
-| Expedited Quorum | 66.7% | Fast-track proposals |
-| Approval Threshold | 50% | Standard proposals |
-| Expedited Threshold | 66.7% | Fast-track proposals |
-| Veto Threshold | 33.4% | Maximum veto votes allowed |
+| Expedited quorum | 66.7% | Fast-track proposals |
+| Approval threshold | 50% | Standard proposals |
+| Expedited threshold | 66.7% | Fast-track proposals |
+| Veto threshold | 33.4% | Maximum veto votes allowed |
### Sei Testnet
-Changed testing parameters for Sei Testnet
+Sei Testnet uses these changed parameters for testing.
| Parameter | Value | Description |
| --- | --- | --- |
-| Minimum Deposit | 10 SEI | Reduced for testing |
-| Expedited Minimum Deposit | 20 SEI | Reduced for testing |
-| Voting Period | 12 hours | Fast testing cycles |
-| Expedited Voting Period | 6 hours | Fast testing cycles |
-
-## Vote Types
+| Minimum deposit | 10 SEI | Reduced for testing |
+| Expedited minimum deposit | 20 SEI | Reduced for testing |
+| Voting period | 12 hours | Fast testing cycles |
+| Expedited voting period | 6 hours | Fast testing cycles |
-### Voting Options
+## Vote types
-Understand the different voting options available.
+### Voting options
-1. **Yes** — Support the proposal as written. Counts toward approval threshold.
-2. **No** — Oppose the proposal. Counts against approval threshold.
-3. **Abstain** — Neutral position. Counts toward quorum but not approval threshold.
-4. **NoWithVeto** — Strong opposition. Can veto a proposal if threshold is exceeded.
+1. **Yes**: Support the proposal as written. This vote counts toward the approval threshold.
+2. **No**: Oppose the proposal. This vote counts against the approval threshold.
+3. **Abstain**: Take a neutral position. This vote counts toward quorum, but not toward the approval threshold.
+4. **NoWithVeto**: Strongly oppose the proposal. If these votes exceed the veto threshold, they can veto the proposal.
-## Weighted Voting
+## Weighted voting
-**Advanced Voting**
+With weighted voting, validators and delegators can split their voting power across multiple options.
-Validators and delegators can split their voting power across multiple options using weighted voting.
+- You can distribute voting power across different options based on the strength of your preference.
+- You can use percentage allocations to express a nuanced position on a complex proposal.
-- **Flexibility** — Distribute voting power across different options based on preference strength.
-- **Precision** — Express nuanced positions on complex proposals with percentage allocations.
-
-## Proposal Outcomes
+## Proposal outcomes
| Outcome | Conditions |
| --- | --- |
| Passed | Quorum met (≥33.4% participation) · Approval threshold met (≥50% or ≥66.7% for expedited) · Veto threshold not exceeded (less than 33.4% NoWithVeto) |
| Rejected | Quorum met but approval threshold not met · Majority voted "No" |
-| Failed (No Quorum) | Less than 33.4% of bonded tokens participated · Proposal automatically fails |
+| Failed (no quorum) | Less than 33.4% of bonded tokens participated · Proposal automatically fails |
| Vetoed | More than 33.4% of votes were "NoWithVeto" · Indicates strong community opposition |
-## Best Practices
-
-### Community Engagement
+## Best practices
-Guidelines for effective governance participation.
+### Community engagement
-- **Research Thoroughly** — Read proposals and understand their implications before voting.
-- **Engage in Discussion** — Participate in community forums and discussions to better understand different perspectives.
-- **Vote Responsibly** — Consider the long-term implications of proposals for the network and ecosystem.
-- **Stay Informed** — Follow governance updates and participate actively in the democratic process.
+- Read each proposal and understand its implications before you vote.
+- Participate in community forums and discussions to better understand different perspectives.
+- Consider the long-term implications of each proposal for the network and ecosystem.
+- Follow governance updates, and participate actively in the democratic process.
diff --git a/learn/general-staking.mdx b/learn/general-staking.mdx
index 922c1d6..8139e06 100644
--- a/learn/general-staking.mdx
+++ b/learn/general-staking.mdx
@@ -4,15 +4,13 @@ sidebarTitle: 'Staking'
description: "Participate in Sei's proof-of-stake consensus by staking tokens with validators, with detailed explanations of delegation, rewards, slashing risks, and the unbonding process."
keywords: ['sei staking', 'blockchain staking', 'proof of stake', 'delegation', 'validator nodes', 'staking rewards']
---
-Staking is a fundamental aspect of the Sei blockchain, enabling network security
-and consensus through a delegated proof-of-stake (dPoS) mechanism. By
-participating in staking, both validators and delegators play a critical role in
-maintaining and securing the network, ensuring its long-term stability,
-performance, and success. PoS chains rely on staked economic value rather than
-computational power, leading to a more energy-efficient and scalable system.
-Engaging in staking allows developers and users to contribute to the health and
-growth of the Sei ecosystem and participate in [governance](/learn/general-governance)
-decisions by voting on proposals.
+Sei uses staking to secure the network and reach consensus through a delegated
+proof-of-stake (dPoS) mechanism. Validators and delegators who stake help
+maintain and secure the network. PoS chains rely on staked economic value
+instead of computational power. This makes them more energy efficient and
+scalable. Staking also lets you contribute to the health and growth of the Sei
+ecosystem, and take part in [governance](/learn/general-governance) decisions by
+voting on proposals.
In a dPoS system, token holders secure the network by delegating their tokens to
validators. Validators produce new blocks and validate transactions. In return
@@ -21,88 +19,87 @@ validator's weight is based on the number of tokens delegated to them plus their
own stake.
The Sei protocol incentivizes validators and delegators with staking rewards
-from gas and genesis token unlocks. All rewards are distributed
-to delegators proportional to their delegation, and the validator keeps a percentage of this as commission.
-Users can view a validator's commission rate on the Sei Dashboard, or by querying the validator information on-chain.
+from gas and genesis token unlocks. All rewards are distributed to delegators in
+proportion to their delegation, and the validator keeps a percentage as commission.
+You can view a validator's commission rate on the Sei Dashboard, or query the validator information on-chain.
-## How to Stake
+## How to stake
-Staking on Sei can be done through the Sei Dashboard, via the `seid` CLI, or even
-through API calls.
+You can stake on Sei through the Sei Dashboard, the `seid` CLI, or API calls.
- **Sei Dashboard**: [Staking](https://dashboard.sei.io/stake)
-- **seid CLI**: `seid tx staking [command] [flags]`
-- **REST/RPC**: `GET/POST /staking/*`
+- **`seid` CLI**: `seid tx staking [command] [flags]`
+- **REST or RPC**: `GET/POST /staking/*`
-## Key Concepts
+## Key concepts
### Delegation
-Delegating tokens to a validator allows you to earn a portion of the staking
-rewards. By delegating, you add to the validator's total stake, which helps
-secure the network.
+When you delegate tokens to a validator, you earn a portion of the staking
+rewards. Your delegation adds to the validator's total stake, which helps secure
+the network.
### Delegators
-Delegators are users who stake their Sei tokens to a validator, contributing to
-the validator's total stake. Delegators earn a portion of the transaction fees
-as staking rewards. Staked Sei remains under the control of the delegator and
-cannot be traded freely during the staking period.
+Delegators are token holders who stake their SEI tokens with a validator. Their
+tokens add to the validator's total stake. Delegators earn a portion of the
+transaction fees as staking rewards. Staked SEI remains under the control of the
+delegator, but it cannot be traded freely during the staking period.
### Un-delegation
-Un-delegation is the process of withdrawing your staked tokens. This involves a
-21-day un-bonding period during which the tokens are not earning rewards and
-cannot be transferred. After the un-bonding period, the tokens are returned to
-your wallet and are available for transactions.
+Undelegation is the process of withdrawing your staked tokens. It starts a
+21-day unbonding period. During this period, the tokens do not earn rewards and
+cannot be transferred. After the unbonding period, the tokens return to your
+wallet and are available for transactions.
### Re-delegation
-Re-delegation allows you to move staked tokens from one validator to another
-without undergoing the un-bonding period. When re-delegating, the tokens are
-instantly moved, but the new validator is barred from further re-delegations for
-21 days to ensure stability and prevent abuse. Each account can re-delegate a
-maximum of 7 times simultaneously, with a re-delegation not considered complete
-until the 21-day period is up.
+Redelegation lets you move staked tokens from one validator to another without
+the unbonding period. When you redelegate, the tokens move instantly. However,
+the new validator is barred from further redelegations for 21 days. This
+restriction maintains stability and prevents abuse. Each account can have a
+maximum of 7 redelegations in progress at the same time. A redelegation is not
+complete until its 21-day period ends.
### Bonding
-Bonding is the process of committing your Sei tokens to a validator. This can be
-done through delegation. The tokens are locked and contribute to the validator's
-stake, starting to earn rewards immediately.
+Bonding is the process of committing your SEI tokens to a validator. You can do
+this through delegation. The tokens are locked and add to the validator's stake.
+They start to earn rewards immediately.
-### Un-Bonding
+### Un-bonding
-Delegators can un-bond or un-stake their Sei tokens, initiating a 21-day period
-during which the tokens do not earn rewards and cannot be transferred. After
-this period, the tokens return to the delegator's wallet and become available
-for transactions. Users can re-delegate to another validator instantly without
-waiting for the un-bonding period to end.
+Delegators can unbond, or unstake, their SEI tokens. This starts a 21-day
+period. During this period, the tokens do not earn rewards and cannot be
+transferred. After this period, the tokens return to the delegator's wallet and
+become available for transactions. Delegators can redelegate to another
+validator instantly, without waiting for the unbonding period to end.
### Jailing
-To ensure network uptime and overall security, validators must meet strict standards and consistently participate in the consensus process.
-Jailing can occur if these standards are not met. Jailed validators are excluded from
-participating consensus for a period and will not generate rewards during this time.
+For network uptime and overall security, validators must meet strict standards and participate in the consensus process consistently.
+If a validator does not meet these standards, it can be jailed. A jailed validator is excluded from
+participating in consensus for a period and does not generate rewards during this time.
- When a validator misbehaves and gets jailed, users can still perform all staking operations including claiming rewards, delegating, and undelegating from that validator. Note that misbehaviors are currently not penalized in the system, so there are no slashing consequences for validator misconduct.
+ If a validator misbehaves and is jailed, you can still perform all staking operations with that validator, including claiming rewards, delegating, and undelegating. The system currently does not penalize misbehavior, so validator misconduct has no slashing consequences.
### Slashing
-There is no slashing of funds in Sei.
+Sei does not slash funds.
-## Common Questions
+## Common questions
### How are staking rewards calculated?
-Staking rewards are calculated based on the total amount of Sei staked and the validator's performance. Rewards are distributed proportionally to the amount staked by each delegator.
+Staking rewards depend on the total amount of SEI staked and on the validator's performance. Rewards are distributed in proportion to the amount that each delegator stakes.
For more details, see [Delegators](#delegators).
### Can I change my validator without un-bonding?
-Yes, you can use the re-delegation feature to move your stake from one validator to another without waiting for the un-bonding period to end.
+Yes. You can use redelegation to move your stake from one validator to another without waiting for the unbonding period to end.
For more details, see [Re-delegation](#re-delegation).
diff --git a/learn/hardware-wallets.mdx b/learn/hardware-wallets.mdx
index 708c505..071fc9e 100644
--- a/learn/hardware-wallets.mdx
+++ b/learn/hardware-wallets.mdx
@@ -6,15 +6,15 @@ keywords:
description: 'Comprehensive guide to Hardware Wallets on Sei. Learn key concepts, commands, and best practices.'
title: Hardware Wallets
---
-Signing transactions manually or using hardware wallets like Ledger ensures
-secure transaction approval. To sign Sei transactions, install the Ethereum app
-(or the dedicated Sei app) on your Ledger device and sign through an EVM wallet
-such as MetaMask.
+Manual signing, or signing with a hardware wallet such as Ledger, keeps
+transaction approval secure. To sign Sei transactions, install the Ethereum app
+(or the dedicated Sei app) on your Ledger device. Then sign through an EVM
+wallet such as MetaMask.
The legacy flow that used the Cosmos app with a Cosmos RPC endpoint is
-deprecated: per [SIP-03](/learn/sip-03-migration), Cosmos-native interfaces
-were slated for deprecation on June 15, 2026. If you still hold funds on a
+deprecated. Per [SIP-03](/learn/sip-03-migration), Cosmos-native interfaces
+were scheduled for deprecation on June 15, 2026. If you still hold funds on a
Ledger Cosmos-app (`sei1...`) account, see
[Migrating a hardware or mnemonic-only wallet](/learn/sip-03-migration#migrating-a-hardware-or-mnemonic-only-wallet).
@@ -23,25 +23,23 @@ Ledger Cosmos-app (`sei1...`) account, see
To connect your Ledger device through MetaMask and sign transactions:
-1. **Install MetaMask**: Ensure MetaMask is installed on your browser.
+1. **Install MetaMask**: Make sure that MetaMask is installed in your browser.
-2. **Connect Ledger**: Open MetaMask, go to the account options, and select
- “Connect Hardware Wallet”.
+2. **Connect Ledger**: Open MetaMask and go to the account options. Then select
+ **Connect Hardware Wallet**.
-3. **Follow Instructions**: Follow the on-screen instructions to connect your
- Ledger device and select the account you want to use.
+3. **Follow instructions**: Follow the on-screen instructions to connect your
+ Ledger device and select the account that you want to use.
-4. **Sign Transactions**: Once connected, you can sign transactions directly
- through MetaMask using your Ledger device.
+4. **Sign transactions**: After you connect, you can sign transactions directly
+ through MetaMask with your Ledger device.
-**Installing the Ethereum App on Ledger**
+**Installing the Ethereum app on Ledger**
-Before you can use your Ledger device to sign transactions through MetaMask,
-ensure you have the Ethereum app installed. You can install it through Ledger
-Live:
+To sign transactions through MetaMask with your Ledger device, you need the
+Ethereum app on the device. You can install it through Ledger Live:
• [Ledger App Store - Ethereum App](https://www.ledger.com/coin/wallet/ethereum)
Alternatively, you can install the dedicated Sei app from the Ledger Live App
-Catalog — see [Ledger Setup](/learn/ledger-setup) for step-by-step
-instructions.
+Catalog. For step-by-step instructions, see [Ledger Setup](/learn/ledger-setup).
diff --git a/learn/index.mdx b/learn/index.mdx
index a8da67a..a5ec638 100644
--- a/learn/index.mdx
+++ b/learn/index.mdx
@@ -5,22 +5,20 @@ description: "Discover Sei Network's architecture, performance features, and eco
keywords: ["sei blockchain", "performance blockchain", "evm compatibility", "blockchain architecture", "consensus mechanism", "developer resources"]
---
-**Performance-Optimized Ethereum Compatibility**
+Sei's EVM implementation is optimized for performance and fully compatible with the Ethereum ecosystem. Three subsystems work together to address traditional performance constraints and deliver high speed.
-Sei's EVM implementation addresses traditional performance constraints through three key subsystems that work together to deliver unparalleled speed while maintaining full compatibility with the Ethereum ecosystem.
-
-## Understand the Sei Ecosystem
+## Understand the Sei ecosystem
### Fundamentals
-
- Understand native & EVM addresses, keys, and account abstraction.
+
+ Understand native and EVM addresses, keys, and account abstraction.
-
- Discover ERC20, ERC721, and native Sei token capabilities.
+
+ See what ERC20, ERC721, and the native Sei token can do.
-
+
Learn how transaction costs are calculated and paid on Sei.
@@ -31,117 +29,115 @@ Sei's EVM implementation addresses traditional performance constraints through t
### Network
-
- Secure the network and earn rewards by participating in staking.
+
+ Secure the network and earn rewards through staking.
-
+
Understand the on-chain proposal and voting process for upgrades.
Connect to Sei Mainnet, Sei Testnet, and development environments.
-
+
Track transactions, blocks, and contract activity on Sei.
-## MCP Server: AI-Powered Blockchain
-
-**Enable AI assistants to interact with Sei through natural language**
+## MCP Server: AI-powered blockchain
-The Sei Model Context Protocol (MCP) Server brings blockchain functionality directly to AI assistants like Claude, ChatGPT, and Cursor. Execute transactions, query data, and build on Sei using conversational AI.
+The Sei Model Context Protocol (MCP) Server lets AI assistants such as Claude, ChatGPT, and Cursor interact with Sei through natural language. You can execute transactions, query data, and build on Sei with conversational AI.
-
+
Check balances, transfer tokens, and manage accounts through AI.
-
- Read and write contract state with natural language commands.
+
+ Read and write contract state with natural-language commands.
-
+
Query blocks, transactions, and network state instantly.
-
- Transfer SEI, ERC20, NFTs, and multi-tokens seamlessly.
+
+ Transfer SEI, ERC20 tokens, NFTs, and multi-tokens.
-
- Get Started with MCP
+
+ Get started with MCP
View on GitHub
-## Sei EVM Platform Details
+## Sei EVM platform details
-### Traditional EVM Constraints Solved by Sei
+### Traditional EVM constraints solved by Sei
-
- Replaces ~15s block times with sub-second finality.
+
+ Replaces Ethereum's 12-second block time with sub-second finality.
-
- Eliminates single-threaded bottlenecks via parallelization.
+
+ Removes single-threaded bottlenecks with parallelization.
-
- Optimizes state reads/writes with SeiDB.
+
+ Optimizes state reads and writes with SeiDB.
-### Core System Architecture
+### Core system architecture
- - Sub-Second Blocks
- - Fast Finality
+ - Sub-second blocks
+ - Fast finality
-
- - Multi-Core Execution
- - Transaction Classification
+
+ - Multi-core execution
+ - Transaction classification
- - Optimized State Access
- - Concurrent Operations
+ - Optimized state access
+ - Concurrent operations
-### Performance Advantages
+### Performance advantages
-
+
- 100 MGas/s capacity
- Sub-second block times
- Immediate transaction inclusion
-
- - Multi-core utilization
+
+ - Uses multiple cores
- Hardware-optimized
- Efficient resource usage
-
+
- 100% Ethereum-compatible
- Full tooling support
- - No code modifications needed
+ - Existing code runs without changes
## Sei Giga: the next-generation architecture
-**Designed to be the first Multi-Proposer EVM Layer 1**
+Sei Giga is designed to be the first Multi-Proposer EVM Layer 1. It will be the next generation of the Sei protocol after the Giga Upgrade. It will arrive as in-place upgrades to the live network.
-Sei Giga will be the next generation of the Sei protocol following the Giga Upgrade. It will arrive as in-place upgrades to the live network. Every validator will propose concurrently, consensus will finalize only the transaction order, and execution will run asynchronously. On an internal devnet this architecture sustained more than 5 gigagas per second with ordering finality under 250 ms. The separate Autobahn public-testnet roadmap target is 200,000 TPS.
+Every validator will propose at the same time. Consensus will finalize only the transaction order. Execution will run asynchronously. On an internal devnet, this architecture sustained more than 5 gigagas per second with ordering finality under 250 ms. Separately, the roadmap target for the Autobahn public testnet is 200,000 TPS.
-
+
Multi-Proposer BFT: per-validator lanes, an effective steady-state cadence of one cut per 1.5 round trips, and sub-250 ms measured ordering finality.
-
- Consensus will fix ordering; execution and state attestation will follow off the critical path.
+
+ Consensus will fix the ordering. Execution and state attestation will follow, off the critical path.
-
+
Block-STM-style optimistic concurrency across all CPU cores.
@@ -150,20 +146,20 @@ Sei Giga will be the next generation of the Sei protocol following the Giga Upgr
**Disclaimer:** The roadmap is subject to change based on development progress, market feedback, and other factors. Actual timelines, figures, and outcomes may vary.
-
+
Architecture, roadmap and status, technical specification, and developer guidance.
-## Key Use Cases
+## Key use cases
-
- Fast settlement, low-latency, and on-chain order books.
+
+ Fast settlement, low latency, and on-chain order books.
-
- Responsive interfaces with reduced confirmation times.
+
+ Responsive interfaces with shorter confirmation times.
-
- Efficient interaction for high-volume applications.
+
+ Efficient interaction for high-volume dApps.
diff --git a/learn/indexers.mdx b/learn/indexers.mdx
index 04802b3..be34abe 100644
--- a/learn/indexers.mdx
+++ b/learn/indexers.mdx
@@ -12,25 +12,23 @@ keywords:
import { EcosystemAppGrid } from '/snippets/ecosystem-app-grid.jsx';
-**Query Sei Data at Scale**
+Indexers collect and organize blockchain data so that dApps can query Sei data at scale. They have structured APIs and real-time updates, and they perform significantly better than direct queries to nodes.
-Indexers collect and organize blockchain data, making it easily queryable for applications. They provide structured APIs, real-time updates, and significantly better performance than querying nodes directly.
+## Why use indexers?
-## Why Use Indexers?
+- Query millions of transactions in milliseconds with optimized database structures.
+- Filter, sort, and aggregate blockchain data with GraphQL and REST APIs.
+- Receive live blockchain data through WebSocket connections and webhooks.
-- **High Performance** — Query millions of transactions in milliseconds with optimized database structures.
-- **Complex Queries** — Filter, sort, and aggregate blockchain data with GraphQL and REST APIs.
-- **Real-time Updates** — Receive live blockchain data through WebSocket connections and webhooks.
+## Available indexers
-## Available Indexers
-
-Indexing solutions for querying Sei blockchain data with high performance and reliability.
+The indexers below let you query Sei data with high performance and reliability.
-Projects listed here are developed by the Sei community. Inclusion on this site does not constitute endorsement. For questions related to each, please contact the project directly.
+The Sei community develops the projects listed here. Inclusion on this site does not constitute endorsement. For questions about a project, contact that project directly.
-- **Production Scale** — Sub-second query response times with GraphQL/REST APIs and real-time subscriptions.
-- **Community Built** — Community-developed projects. Contact directly for support.
+- Indexers give sub-second query response times at production scale, with GraphQL or REST APIs and real-time subscriptions.
+- These are community-developed projects. For support, contact each project directly.
diff --git a/learn/ledger-setup.mdx b/learn/ledger-setup.mdx
index b6d6e30..4ade12c 100644
--- a/learn/ledger-setup.mdx
+++ b/learn/ledger-setup.mdx
@@ -12,128 +12,128 @@ The Sei network supports various crypto assets, including:
- ERC20 tokens
- ERC721 NFTs
-Using a Ledger hardware wallet ensures secure key management for users interacting
-with the Sei network.
+A Ledger hardware wallet manages your keys securely when you interact with the
+Sei network.
## Requirements
-Before proceeding, ensure you have:
+Before you start, make sure that you have:
- A Ledger wallet device
-- [Ledger Live](https://www.ledger.com/ledger-live) app installed on your
+- The [Ledger Live](https://www.ledger.com/ledger-live) app, installed on your
desktop or mobile device
-- A compatible wallet application for Sei network (refer to Sei documentation
- for recommended wallets)
-- USB cable for connecting your device (Bluetooth is an option for some models)
-- Latest firmware installed on your Ledger device
-- Active internet connection
+- A compatible wallet application for Sei (see the Sei documentation for
+ recommended wallets)
+- A USB cable to connect your device (some models can also use Bluetooth)
+- The latest firmware on your Ledger device
+- An active internet connection
-## Installation Instructions
+## Installation instructions
### Install Ledger Live
-1. **Download Ledger Live**: Visit the
- [Ledger official website](https://www.ledger.com/start) and download Ledger
+1. **Download Ledger Live**: Go to the
+ [official Ledger website](https://www.ledger.com/start). Download Ledger
Live for your operating system.
2. **Install Ledger Live**: Follow the installation instructions for your
platform.
-3. **Set Up Ledger Live**: Open Ledger Live and follow the on-screen
+3. **Set up Ledger Live**: Open Ledger Live. Then follow the on-screen
instructions to set up your Ledger device.
-4. **Install the Sei App on Ledger**:
- - In Ledger Live, go to **"My Ledger"**.
+4. **Install the Sei app on Ledger**:
+ - In Ledger Live, go to **My Ledger**.
- Connect and unlock your Ledger device.
- - Search for "Sei" in the App Catalog and click **Install**.
+ - Search for "Sei" in the App Catalog. Then click **Install**.
-Linux users will need to add a `udev rule` to allow access to the device. You can find the script to add a rule in the Ledger repo [here](https://github.com/LedgerHQ/udev-rules).
+On Linux, add a `udev rule` to allow access to the device. You can find the script to add a rule in the [Ledger udev-rules repository](https://github.com/LedgerHQ/udev-rules).
-## Setup Instructions
+## Setup instructions
-### Using a Compatible Wallet Application
+### Using a compatible wallet application
-1. **Connect Your Ledger Device**:
+1. **Connect your Ledger device**:
- - Open your compatible Sei network wallet application.
+ - Open your compatible wallet application for Sei.
- Connect your Ledger device to your computer.
- Unlock your Ledger device and open the Sei app.
-2. **Access the Sei Network**:
+2. **Access the Sei network**:
- In your wallet application, select the option to connect with a Ledger
device.
- - Follow the prompts to establish a connection with your Ledger device.
+ - Follow the prompts to connect to your Ledger device.
-## Viewing Account Balance
+## Viewing account balance
-1. Open your Sei network wallet application.
-2. Ensure your Ledger device is connected and the Sei app is open.
-3. Your account balance and asset details should be displayed on the main screen
- of the wallet application.
+1. Open your wallet application for Sei.
+2. Make sure that your Ledger device is connected and that the Sei app is open.
+3. Your account balance and asset details should appear on the main screen of
+ the wallet application.
-## How to Receive Crypto Assets
+## How to receive crypto assets
-1. **Navigate to the Receive Section**:
+1. **Navigate to the Receive section**:
- - Go to the **Receive** or similar section in your wallet application.
- - Select the crypto asset (if applicable) you wish to receive.
+ - In your wallet application, go to the **Receive** section or a similar
+ section.
+ - If applicable, select the crypto asset that you want to receive.
-2. **Verify the Receiver Address**:
+2. **Verify the receiver address**:
- - The wallet application will display the receiver address.
- - Verify that the address shown on the screen matches the one displayed on
- your Ledger device.
- - Confirm the address on your Ledger device by pressing the appropriate
- buttons.
+ - The wallet application displays the receiver address.
+ - Verify that the address on the screen matches the address on your Ledger
+ device.
+ - To confirm the address, press the appropriate buttons on your Ledger
+ device.
-Always verify the receiver address on your Ledger device before sharing it. This prevents attacks like address spoofing.
+Always verify the receiver address on your Ledger device before you share it. This prevents attacks such as address spoofing.
-3. **Share the Address**:
- - Copy the verified address and share it with the sender or paste it into an
+3. **Share the address**:
+ - Copy the verified address. Share it with the sender, or paste it into an
exchange withdrawal form.
-## How to Send Crypto Assets
+## How to send crypto assets
-1. **Navigate to the Send Section**:
+1. **Navigate to the Send section**:
- - Navigate to the **Send** section (or equivalent) in your wallet
- application.
- - Select the crypto asset you wish to send.
+ - Go to the **Send** section (or equivalent) in your wallet application.
+ - Select the crypto asset that you want to send.
-2. **Enter Transaction Details**:
+2. **Enter transaction details**:
- Enter the recipient's address.
- - Input the amount you want to send.
- - (Optional) Add a memo if required.
+ - Enter the amount that you want to send.
+ - (Optional) Add a memo if one is required.
-3. **Submit the Transaction**:
+3. **Submit the transaction**:
- - Initiate the send process in your wallet application.
+ - Start the send process in your wallet application.
-4. **Verify and Confirm on Ledger Device**:
- - Review the transaction details displayed on the Ledger device.
+4. **Verify and confirm on the Ledger device**:
+ - Review the transaction details on the Ledger device.
- Verify that the recipient's address, amount, and other transaction details
are correct.
- - Confirm and broadcast the transaction by pressing the appropriate buttons
+ - To confirm and broadcast the transaction, press the appropriate buttons
on your Ledger device.
-Always double-check the transaction details on your Ledger device before confirming. This is your last line of defense against potential attacks or errors.
+Always double-check the transaction details on your Ledger device before you confirm. This check is your last protection against possible attacks or errors.
## Support
-For further assistance, you can reach out to the following support channels:
+For more help, you can contact these support channels:
-- **Sei Network Community**: Join the official Sei network community
+- **Sei network community**: Join the official Sei network community on
[Telegram](https://t.me/seinetwork) or [Discord](https://discord.gg/sei).
-- **Ledger Support**: For Ledger-specific issues, visit the
+- **Ledger support**: For Ledger-specific issues, go to the
[Ledger Support Center](https://support.ledger.com/).
-- **Wallet Support**: For wallet-related questions, check the support resources
- provided by your chosen wallet application.
+- **Wallet support**: For wallet-related questions, see the support resources
+ of your wallet application.
-## Additional Resources
+## Additional resources
- **Ledger Academy**: Learn more about cryptocurrency security on the official
[Ledger Academy](https://www.ledger.com/academy).
-Never share your recovery phrase with anyone. Keep it in a safe, offline location. Your recovery phrase is the only way to restore access to your funds if your device is lost or damaged.
+Never share your recovery phrase with anyone. Keep it in a safe, offline location. If your device is lost or damaged, your recovery phrase is the only way to restore access to your funds.
diff --git a/learn/oracles.mdx b/learn/oracles.mdx
index 2803d11..4979903 100644
--- a/learn/oracles.mdx
+++ b/learn/oracles.mdx
@@ -7,14 +7,14 @@ keywords: ['oracle providers', 'price feeds', 'DeFi infrastructure', 'Sei oracle
import { EcosystemAppGrid } from '/snippets/ecosystem-app-grid.jsx';
-Oracles are the bridge between blockchain networks and real-world data. They provide a secure mechanism for bringing off-chain price data on-chain, enabling DeFi protocols, smart contracts, and dApps to access reliable external information.
+Oracles connect blockchain networks to real-world data. They securely bring off-chain price data on-chain. DeFi protocols, smart contracts, and dApps can then access reliable external information.
-## Use Cases
+## Use cases
-- **DeFi Developers:** Query real-time prices and TWAPs for liquidations and trading
-- **dApp Builders:** Access reliable price feeds for any on-chain application
-- **Infrastructure Providers:** Build enhanced oracle services on top of existing solutions
+- **DeFi developers:** Query real-time prices and time-weighted average prices (TWAPs) for liquidations and trading
+- **dApp builders:** Access reliable price feeds for any dApp
+- **Infrastructure providers:** Build enhanced oracle services on top of existing oracles
-## Available Providers
+## Available providers
diff --git a/learn/parallelization-engine.mdx b/learn/parallelization-engine.mdx
index 629a6e0..25573ba 100644
--- a/learn/parallelization-engine.mdx
+++ b/learn/parallelization-engine.mdx
@@ -6,66 +6,66 @@ keywords: ['parallelization engine', 'multi-core processing', 'blockchain concur
---
## Introduction
-The Sei Parallelization Engine is a core component designed to increase transaction processing throughput beyond the limitations of traditional sequential execution models common in many blockchain systems. The engine enables concurrent execution of non-conflicting transactions within a block and leverages multi-core processors to improve performance and scalability. This document provides a technical explanation of its architecture and mechanisms.
+Many blockchain systems use traditional sequential execution models. The Sei parallelization engine is a core component designed to increase transaction processing throughput beyond the limits of these models. The engine executes non-conflicting transactions in a block concurrently. It uses multi-core processors to improve performance and scalability. This page gives a technical explanation of its architecture and mechanisms.
- The Parallelization Engine is a key innovation that allows Sei to process transactions concurrently across multiple CPU cores, significantly increasing throughput while maintaining deterministic outcomes identical to sequential processing.
+ The parallelization engine lets Sei process transactions concurrently across multiple CPU cores. This significantly increases throughput, and the outcomes stay deterministic and identical to sequential processing.
-## Core Mechanism: Optimistic Concurrency Control
+## Core mechanism: optimistic concurrency control
-At its heart, the Parallelization Engine utilizes an **Optimistic Concurrency Control (OCC)** strategy. Unlike pessimistic approaches that lock state resources before execution, OCC allows transactions to execute in parallel based on an initial _estimation_ of the state they will access. Conflicts (e.g., two transactions writing to the same state key) are detected _during_ or _after_ this parallel execution phase. When conflicts occur, they are resolved through mechanisms that often include re-execution of the conflicting transactions. This approach minimizes overhead when conflicts are infrequent and boosts overall throughput.
+The parallelization engine uses an **Optimistic Concurrency Control (OCC)** strategy. Pessimistic approaches lock state resources before execution. OCC instead lets transactions execute in parallel, based on an initial _estimation_ of the state they will access. Conflicts (for example, two transactions that write to the same state key) are detected _during_ or _after_ this parallel execution phase. When conflicts occur, the engine resolves them, often by re-executing the conflicting transactions. This approach minimizes overhead when conflicts are infrequent and increases overall throughput.
-## System Architecture
+## System architecture
-**Sei Parallelization Engine**
+**Sei parallelization engine**
-
+
- Classifier
- - Batch Formation
- - Gas Estimation
+ - Batch formation
+ - Gas estimation
-
- - Access Analysis
- - Dependency Mapping
- - Contract Interaction
+
+ - Access analysis
+ - Dependency mapping
+ - Contract interaction
-
- - Worker Pool
- - State Transitions
- - Speculative Execution
+
+ - Worker pool
+ - State transitions
+ - Speculative execution
-
- - Conflict Detection
- - Sequential Re-execution
+
+ - Conflict detection
+ - Sequential re-execution
-
+
- State Commit
- - MVCC Support
+ - MVCC support
-This architecture enables the Sei blockchain to process transactions in parallel while ensuring consistency and correctness. Let's explore each component in detail.
+This architecture lets Sei process transactions in parallel and keep the results consistent and correct.
-### 1. Transaction Preprocessing
+### 1. Transaction preprocessing
-Before execution can begin, incoming transactions undergo preparatory processing. Raw transaction bytes transform into structured transaction objects that allow the system to identify message types and transaction characteristics. Initial validation occurs at this stage through ante handlers that verify signatures, fees, and other prerequisites.
+Before execution can begin, incoming transactions go through preparatory processing. The system converts raw transaction bytes into structured transaction objects. These objects let the system identify message types and transaction characteristics. Initial validation also happens at this stage, through ante handlers that verify signatures, fees, and other prerequisites.
-The system also identifies certain critical transactions, such as oracle price feed updates, which may need prioritized execution to ensure timely data processing. This initial analysis leads to transaction grouping into batches for subsequent processing stages and establishes the foundation for parallel execution.
+The system also identifies certain critical transactions, such as oracle price feed updates. These transactions may need prioritized execution so that their data is processed on time. Based on this initial analysis, the system groups transactions into batches for later processing stages. This step is the basis for parallel execution.
-### 2. Dependency Analysis (Estimation)
+### 2. Dependency analysis (estimation)
-This critical stage forms the backbone of the OCC approach. The system estimates potential state accesses for each transaction rather than determining exact dependencies.
+This stage is the backbone of the OCC approach. The system estimates potential state accesses for each transaction instead of determining exact dependencies.
-An access control module analyzes each transaction to predict which state keys it might read or write during execution. Specialized Dependency Generator functions predict potential state access patterns for each transaction type. The precision of this analysis varies depending on transaction complexity:
+An access control module analyzes each transaction to predict which state keys it might read or write during execution. Specialized Dependency Generator functions predict potential state access patterns for each transaction type. The precision of this analysis depends on transaction complexity:
-Simple transactions like token transfers allow precise determination of which account balances will be accessed. Complex smart contract interactions make prediction of all potential storage accesses much more challenging. The generators provide broader estimates for these complex cases and acknowledge areas of uncertainty.
+For simple transactions such as token transfers, the system can determine precisely which account balances the transaction will access. For complex smart contract interactions, it is much harder to predict all potential storage accesses. For these complex cases, the generators give broader estimates that acknowledge areas of uncertainty.
-For example, a token transfer transaction between accounts `A` and `B` will generate estimated read/write sets that include:
+For example, a token transfer between accounts `A` and `B` generates estimated read-write sets that include:
- Read access to account `A`'s balance
- Read access to account `B`'s balance
@@ -79,131 +79,136 @@ The dependency analyzer might also consider secondary effects such as:
- Potential interactions with staking or governance mechanisms if the tokens have such properties
- For smart contract calls, the analyzer employs heuristic methods that consider the contract's address and storage layout, the specific function selectors being called, any parameters passed to the contract functions, and historical patterns of state access from previous similar calls.
+ For smart contract calls, the analyzer uses heuristic methods that consider these inputs:
+
+ - The contract's address and storage layout
+ - The specific function selectors being called
+ - Any parameters passed to the contract functions
+ - Historical patterns of state access from previous similar calls
-The dependency generator outputs an estimated read/write set for each transaction. These sets contain the state keys expected to be accessed, with additional metadata indicating access types (read vs. write) and confidence levels for each prediction. The system uses these confidence levels during scheduling decisions to minimize the likelihood of conflicts.
+The dependency generator outputs an estimated read-write set for each transaction. These sets contain the state keys that the transaction is expected to access. They also carry metadata for each prediction: the access type (read or write) and a confidence level. The system uses these confidence levels in scheduling decisions to minimize the likelihood of conflicts.
-The output from this phase consists of an "estimated writeset" for each transaction—a prediction of its state impact—which serves as crucial input for the next execution planning phase.
+The output of this phase is an "estimated writeset" for each transaction. The writeset predicts the transaction's effect on state. It is an important input for the next phase, execution planning.
-### 3. Parallel Execution
+### 3. Parallel execution
-The system attempts concurrent execution with the estimated writesets through these steps:
+The system uses the estimated writesets to attempt concurrent execution in these steps:
-1. **Batch Organization**: The process organizes transactions and their associated writesets for processing.
+1. **Batch organization**: The system organizes transactions and their associated writesets for processing.
- - Transactions receive logical grouping based on estimated dependencies
+ - Transactions are grouped logically, based on estimated dependencies
- The system creates execution units with appropriate metadata
- Priority queues determine processing order for maximum throughput
- Metadata tags track transaction relationships for later conflict analysis
-2. **Worker Assignment**: A pool of execution workers (typically implemented as goroutines) stands ready to process transactions concurrently.
+2. **Worker assignment**: A pool of execution workers (typically implemented as goroutines) is ready to process transactions concurrently.
- - The worker pool size adapts dynamically based on system resources
+ - The worker pool size adapts dynamically to system resources
- CPU core allocation strategies optimize for NUMA architectures
- - Worker specialization allows for targeted execution of specific transaction types
- - Load balancing algorithms redistribute work for maximum resource utilization
+ - Specialized workers can execute specific transaction types
+ - Load balancing algorithms redistribute work for maximum resource use
-3. **Strategic Scheduling**: Transaction assignment to workers occurs based on estimated writesets, with strategic grouping of non-conflicting transactions.
+3. **Strategic scheduling**: The scheduler assigns transactions to workers based on estimated writesets and groups non-conflicting transactions together.
- Graph-based scheduling algorithms minimize potential conflicts
- The scheduler includes lookahead capabilities for multi-step dependency chains
- Execution time estimates prioritize shorter transactions when appropriate
- Locality-aware scheduling places related transactions on the same worker when beneficial
-4. **Buffered Execution**: Workers execute transactions and write all state modifications to a temporary buffer instead of the main state store.
+4. **Buffered execution**: Workers execute transactions and write all state modifications to a temporary buffer instead of the main state store.
- - Each worker maintains an isolated transaction context
+ - Each worker keeps an isolated transaction context
- The execution engine applies gas metering and limits
- Buffered state operations capture all read and write operations
- Intermediate results remain isolated until conflict detection completes
-5. **Runtime Tracking**: The system monitors which state keys are actually read and written throughout execution to build an accurate picture of real (versus estimated) state access patterns.
+5. **Runtime tracking**: The system monitors which state keys are read and written during execution. This builds an accurate picture of the real (versus estimated) state access patterns.
- Access tracking captures both direct and indirect state interactions
- Runtime statistics feed back into the dependency estimation system
- Execution anomalies trigger adaptive scheduling adjustments
- Performance metrics identify optimization opportunities
-Advanced techniques ensure maximum parallelism extraction:
+The engine uses these advanced techniques to maximize parallelism:
- Adaptive batch sizing based on system load and conflict rates
- Predictive execution of high-probability transaction paths
- Distributed execution capabilities across multiple physical nodes when available
- Resource throttling to prevent worker starvation
-### 4. Conflict Detection & Resolution
+### 4. Conflict detection & resolution
-The system must identify and resolve any conflicts that emerge during and after parallel execution. The process follows this sequence:
+The system must identify and resolve any conflicts that appear during and after parallel execution. The process has these steps:
-1. **Conflict Identification**: The system compares the actual read/write sets recorded during execution. A conflict exists when one transaction reads state that another concurrent transaction wrote, or when multiple transactions write to the same state key.
+1. **Conflict identification**: The system compares the actual read-write sets recorded during execution. A conflict exists when one transaction reads state that another concurrent transaction wrote, or when multiple transactions write to the same state key.
The conflict detector implements several optimized algorithms:
- A hash-based data structure tracks state accesses in memory for efficient lookup
- - Bloom filters provide rapid preliminary conflict checks
+ - Bloom filters run fast preliminary conflict checks
- A deterministic conflict resolution order prevents cyclic dependencies during re-execution
- - Precise timestamp tracking ensures proper sequencing based on arrival order
+ - Precise timestamp tracking makes sure that sequencing follows arrival order
Common conflict patterns include:
- Read-After-Write (RAW): Transaction `B` reads a key that Transaction `A` has modified
- Write-After-Read (WAR): Transaction `B` modifies a key that Transaction `A` has read
- - Write-After-Write (WAW): Multiple transactions attempt to modify the same key
+ - Write-After-Write (WAW): Multiple transactions try to modify the same key
-2. **Conflict Resolution**: The system executes a resolution strategy when it detects conflicts:
+2. **Conflict resolution**: When the system detects conflicts, it runs a resolution strategy:
- It identifies the conflicting transactions as a group
- It removes their results from the temporary state buffer
- - It re-executes the conflicting set in a deterministic, sequential order to ensure correctness
+ - It re-executes the conflicting set in a deterministic, sequential order to make sure the results are correct
- The deterministic ordering relies on transaction prioritization rules:
+ The deterministic order depends on these transaction prioritization rules:
- - Critical system transactions receive highest priority
- - Oracle updates and price feeds receive elevated priority
+ - Critical system transactions get the highest priority
+ - Oracle updates and price feeds get elevated priority
- Standard transactions follow their original sequence in the block
- Gas price and other economic factors may influence the ordering
- The resolution system maintains isolation guarantees through careful state management:
+ The resolution system keeps its isolation guarantees through careful state management:
- Conflict groups remain isolated from successfully processed transactions
- The temporary buffer preserves successfully executed state transitions
- - Resolution attempts track their own read/write sets to detect cascading conflicts
+ - Resolution attempts track their own read-write sets to detect cascading conflicts
- This conflict resolution makes the final state after parallel execution identical to what sequential processing would have produced, which maintains blockchain consistency.
+ This conflict resolution makes the final state after parallel execution identical to the state that sequential processing would produce. This keeps the blockchain consistent.
-### 5. Fallback Mechanism
+### 5. Fallback mechanism
-The OCC approach includes a critical safety mechanism for situations where parallel execution cannot succeed:
+The OCC approach includes a safety mechanism for situations where parallel execution cannot succeed:
-1. **Failure Detection**: The system detects failure conditions when parallel execution encounters excessive conflicts or critical errors.
-2. **State Rollback**: All state changes from the failed parallel attempt are discarded.
-3. **Sequential Reprocessing**: The entire transaction batch undergoes sequential processing as a fallback.
+1. **Failure detection**: The system detects a failure condition when parallel execution encounters excessive conflicts or critical errors.
+2. **State rollback**: The system discards all state changes from the failed parallel attempt.
+3. **Sequential reprocessing**: As a fallback, the system processes the entire transaction batch sequentially.
-This fallback guarantees that the blockchain can always make progress, even in worst-case scenarios where parallelization proves ineffective for a particular block.
+This fallback guarantees that the chain can always make progress, even in worst-case scenarios where parallelization is ineffective for a particular block.
## Interaction with SeiDB
-The parallelization engine works in close concert with SeiDB, Sei's custom storage layer. SeiDB's State Commit layer provides extremely low-latency read/write access needed for high transaction volume concurrent execution. Its asynchronous commit capabilities also allow quick block state finalization, which creates an efficient pipeline for block processing.
+The parallelization engine works closely with SeiDB, Sei's custom storage layer. SeiDB's State Commit layer gives the low-latency read and write access that concurrent execution at high transaction volume needs. Its asynchronous commit also lets block state finalize quickly. This creates an efficient pipeline for block processing.
-SeiDB integration offers several technical advantages crucial for parallelization:
+SeiDB integration has several technical advantages for parallelization:
-**Performance Optimizations:**
+**Performance optimizations:**
- Multi-version concurrency control (MVCC) at the storage level supports multiple execution attempts
- Lock-free read operations prevent stalls during parallel transaction execution
- Memory-mapped state caching reduces I/O overhead for frequently accessed keys
- Batch commit optimizations minimize disk write amplification
-**Parallelization-Specific Features:**
+**Parallelization-specific features:**
-- Snapshot isolation provides consistent views of state for each transaction execution
-- Atomic multi-key operations ensure multi-part state transitions remain consistent
-- Versioned state access allows concurrent reads of different state versions
-- Optimized rollback capabilities support the rapid discarding of speculative state changes
+- Snapshot isolation gives each transaction execution a consistent view of state
+- Atomic multi-key operations keep multi-part state transitions consistent
+- Versioned state access supports concurrent reads of different state versions
+- Optimized rollback lets the engine discard speculative state changes quickly
-**Storage Architecture Alignment:**
+**Storage architecture alignment:**
- The key-value structure mirrors the state access patterns in the dependency analysis
- Prefix-based organization aligns with contract and module-based access patterns
@@ -211,19 +216,19 @@ SeiDB integration offers several technical advantages crucial for parallelizatio
- Asynchronous persistence decouples block execution from storage commit latency
- The tight integration between the parallelization engine and SeiDB enables the system to maintain high throughput even under challenging workloads with complex dependency patterns or high conflict rates.
+ The tight integration between the parallelization engine and SeiDB lets the system maintain high throughput. This holds even under challenging workloads with complex dependency patterns or high conflict rates.
-## Performance Impact
+## Performance impact
-The Parallelization Engine delivers significant performance improvements:
+The parallelization engine improves performance significantly:
-| Transaction Type | Sequential TPS | Parallel TPS | Improvement |
+| Transaction type | Sequential TPS | Parallel TPS | Improvement |
| --- | --- | --- | --- |
-| Simple Transfers | 3,000 | 15,000+ | 5x |
-| ERC-20 Transfers | 2,200 | 9,500+ | 4.3x |
-| DEX Swaps | 800 | 2,800+ | 3.5x |
-| Complex Contracts | 500 | 1,500+ | 3x |
+| Simple transfers | 3,000 | 15,000+ | 5x |
+| ERC-20 transfers | 2,200 | 9,500+ | 4.3x |
+| DEX swaps | 800 | 2,800+ | 3.5x |
+| Complex contracts | 500 | 1,500+ | 3x |
-These improvements scale with CPU core count, allowing Sei to take full advantage of modern server hardware.
+These improvements scale with CPU core count. Sei can therefore take full advantage of modern server hardware.
diff --git a/learn/pointers.mdx b/learn/pointers.mdx
index 0e6a743..8777639 100644
--- a/learn/pointers.mdx
+++ b/learn/pointers.mdx
@@ -6,36 +6,39 @@ keywords: ['pointer contracts', 'cross-vm interoperability', 'evm cosmos bridge'
---
- **Pointer contracts are now primarily a legacy and migration tool.** Per [Proposal 115](https://seistream.app/proposals/115), no new CosmWasm contracts can be uploaded or instantiated on Sei, so the CW20 / CW721 / CW1155 to ERC20 / ERC721 / ERC1155 pointer flow only applies to already-deployed CosmWasm contracts. Do not use native-denom pointers to build IBC or tokenfactory integrations. IBC is disabled in both directions, and tokenfactory is not a supported development path. Existing IBC balances may remain accessible through their pointers, but a pointer does not restore the route to the origin chain. For new tokens or NFTs, deploy ERC20 / ERC721 / ERC1155 contracts directly on the EVM.
+ **Pointer contracts are primarily a legacy and migration tool.** Per [Proposal 115](https://seistream.app/proposals/115), no new CosmWasm contracts can be uploaded or instantiated on Sei. Because of this, the pointer flow from CW20, CW721, and CW1155 to ERC20, ERC721, and ERC1155 applies only to already-deployed CosmWasm contracts.
+
+ Do not use native-denom pointers to build IBC or tokenfactory integrations. IBC is disabled in both directions, and tokenfactory is not a supported development path. Existing IBC balances may remain accessible through their pointers, but a pointer does not restore the route to the origin chain. For new tokens or NFTs, deploy ERC20, ERC721, or ERC1155 contracts directly on the EVM.
-Pointer Contracts enable tokens to be used interoperably in both EVM and
-Cosmos environments. Intended to be efficient and quick to deploy, a pointer
-serves as an interpreter between the two "languages" used in either
-execution environment.
+Pointer contracts let tokens work in both the EVM and Cosmos environments. A
+pointer is intended to be efficient and quick to deploy. It is an interpreter
+between the "languages" of the two execution environments.
-## Why Pointer Contracts
+## Why pointer contracts

*A world without pointer contracts*
-Wallets and clients for feature-rich protocols typically support only a single
-execution environment. EVM wallets handle ERC-20 coins and ERC-721 NFTs but
-cannot interact with Cosmos-SDK based assets due to different token standards and
-interaction methods. The same problem exists for clients built for other
-protocols (like Cosmos and its various SDK modules) which cannot directly interact with Ethereum-based contracts or ERC tokens.
+Wallets and clients for feature-rich protocols typically support only one
+execution environment. EVM wallets handle ERC-20 coins and ERC-721 NFTs. They
+cannot interact with Cosmos-SDK-based assets, because the token standards and
+interaction methods are different. Clients built for other protocols, such as
+Cosmos and its various SDK modules, have the same problem. They cannot directly
+interact with Ethereum-based contracts or ERC tokens.
-Pointer Contracts solve this by enabling interoperability of either protocol,
+Pointer contracts solve this problem. They make either protocol interoperable,
regardless of the client interface.

-*With pointer contracts, all tokens can be accessed by wallets of either environment*
+*With pointer contracts, wallets in either environment can access all tokens*
-## How Pointer Contracts Work
+## How pointer contracts work

-*Pointer contracts enable seamless interoperability*
+*Pointer contracts enable interoperability*
-Each smart contract is limited to **one** associated pointer contract, which
-must be registered on chain when deploying. This prevents conflicts and provides
-a reference point for verifying the authenticity of the paired contract itself.
+Each smart contract can have only **one** associated pointer contract. The
+pointer contract must be registered on chain when it is deployed. This prevents
+conflicts and gives a reference point to verify that the paired contract is
+authentic.
diff --git a/learn/proposals.mdx b/learn/proposals.mdx
index 5008cf2..8b9e32e 100644
--- a/learn/proposals.mdx
+++ b/learn/proposals.mdx
@@ -3,17 +3,17 @@ title: 'Proposals'
description: 'Complete guide to Sei governance proposals. Learn about different proposal types and how to submit them.'
keywords: ['sei governance', 'proposals', 'governance submission', 'blockchain governance', 'proposal commands']
---
-Complete guide to creating and submitting governance proposals on Sei. Learn about different proposal types, requirements, and submission commands.
+This guide shows how to create and submit governance proposals on Sei. It covers the proposal types, their requirements, and the submission commands.
For governance parameters and voting requirements, see the [Overview](/learn/general-governance) section.
-## Proposal Types & Submission
+## Proposal types & submission
-### Text Proposals
+### Text proposals
-**Community Discussion** — Non-binding proposals for community input and consensus building on important topics.
+Text proposals are non-binding proposals for community discussion. Use them to collect community input and build consensus on important topics.
-**Common Uses**
+**Common uses**
- Strategic direction
- Policy agreements
- Network guidelines
@@ -34,18 +34,18 @@ seid tx gov submit-proposal \
--chain-id pacific-1
```
-### Parameter Change Proposals
+### Parameter change proposals
-**Network Configuration** — Modify network parameters without requiring a software upgrade.
+Parameter change proposals modify network parameters without a software upgrade.
-**Common Changes**
+**Common changes**
- Governance parameters
- Staking parameters
- Fee structures
**Prerequisites**
- Valid JSON format
-- Comprehensive change documentation
+- Complete documentation of the change
- Impact assessment
- Testing results
@@ -72,11 +72,11 @@ seid tx gov submit-proposal param-change proposal.json \
}
```
-### Software Upgrade Proposals
+### Software upgrade proposals
-**Network Upgrades** — Coordinate network-wide software upgrades with automatic execution at specified block height.
+Software upgrade proposals coordinate network-wide software upgrades. The upgrade executes automatically at a specified block height.
-**Common Uses**
+**Common uses**
- Protocol upgrades
- Security patches
- New features
@@ -84,7 +84,7 @@ seid tx gov submit-proposal param-change proposal.json \
**Prerequisites**
- Upgrade height specification
-- Binary release info
+- Binary release information
- Migration documentation
- Validator coordination
@@ -99,9 +99,9 @@ seid tx gov submit-proposal software-upgrade v2.1.0 \
--chain-id pacific-1
```
-## Expedited Proposals
+## Expedited proposals
-**Fast-Track Process** — For urgent network changes requiring immediate attention. Higher deposit and approval requirements with accelerated timeline.
+Expedited proposals are a fast-track process for urgent network changes that need immediate attention. They have higher deposit and approval requirements, and a shorter timeline.
- Security patches and critical fixes
- Emergency parameter adjustments
@@ -119,14 +119,14 @@ seid tx gov submit-proposal software-upgrade emergency-patch \
--chain-id pacific-1
```
-## Proposal Management
+## Proposal management
-### Query & Monitor
+### Query & monitor
| Command | Purpose | Example |
| --- | --- | --- |
| `seid q gov proposals` | List all proposals | `--status voting_period` |
-| `seid q gov proposal [id]` | Get specific proposal | `seid q gov proposal 42` |
+| `seid q gov proposal [id]` | Get a specific proposal | `seid q gov proposal 42` |
| `seid q gov votes [id]` | Check voting results | `seid q gov votes 42` |
| `seid q gov tally [id]` | View vote tally | `seid q gov tally 42` |
@@ -144,7 +144,7 @@ seid tx gov vote 42 yes \
--chain-id pacific-1
```
-### Deposit Management
+### Deposit management
```bash
# Add deposit to proposal
diff --git a/learn/rpc-providers.mdx b/learn/rpc-providers.mdx
index bbe2479..e2f0051 100644
--- a/learn/rpc-providers.mdx
+++ b/learn/rpc-providers.mdx
@@ -7,8 +7,7 @@ keywords: ['RPC endpoints', 'blockchain infrastructure', 'Sei connections', 'nod
import { EcosystemAppGrid } from '/snippets/ecosystem-app-grid.jsx';
-RPC providers offer endpoints for developers to interact with the Sei
-blockchain, archive nodes, and more. Some notable providers
-include:
+RPC providers offer endpoints that let you interact with Sei. They also offer
+archive nodes and other services. Providers include:
diff --git a/learn/sei-giga-developers.mdx b/learn/sei-giga-developers.mdx
index 93c6124..20681ab 100644
--- a/learn/sei-giga-developers.mdx
+++ b/learn/sei-giga-developers.mdx
@@ -7,16 +7,26 @@ keywords: ['sei giga development', 'giga developer guide', 'ordering finality',
import { GigaFinalitySignals, GigaParallelismContrast, GigaFeeSplit } from '/snippets/giga-diagrams.jsx';
-Sei Giga is designed so that standard EVM contracts do not need to change. Contracts that depend on retired Sei-native surfaces, including the native Oracle precompile, must migrate separately. The EVM will be equivalent to Ethereum mainnet except for five things (EIP-4844 blobs, `PREVRANDAO`, the state root, the block gas limit, and the transaction fee mechanism), and standard Solidity and Vyper tooling will keep working: Foundry, Hardhat, viem, ethers. What will change is the environment around your contracts. Ordering and state attestation will be separate protocol signals, execution receipts will arrive between them, there will be no traditional public mempool, a priority fee will buy a position in the order rather than a proposer's favor, and state proofs will work differently. Transaction ingress will initially route complete transactions to validator lanes; the later [Sedna](/learn/sei-giga-specs#sedna-private-dissemination) milestone will introduce coded symbol bundles. This page covers each change, plus the patterns that will get the most out of Giga's parallel execution.
+Sei Giga is designed so that standard EVM contracts do not need to change. Contracts that depend on retired Sei-native surfaces, including the native Oracle precompile, must migrate separately. The EVM will be equivalent to Ethereum mainnet, with five exceptions. The exceptions are EIP-4844 blobs, `PREVRANDAO`, the state root, the block gas limit, and the transaction fee mechanism. Standard Solidity and Vyper tooling will keep working: Foundry, Hardhat, viem, and ethers.
+
+The environment around your contracts will change:
+
+- Ordering and state attestation will be separate protocol signals.
+- Execution receipts will arrive between them.
+- There will be no traditional public mempool.
+- A priority fee will buy a position in the order, not a proposer's favor.
+- State proofs will work differently.
+
+Transaction ingress will initially route complete transactions to validator lanes. The later [Sedna](/learn/sei-giga-specs#sedna-private-dissemination) milestone will introduce coded symbol bundles. This page covers each change, plus the patterns that make the best use of Giga's parallel execution.
- Sei Giga will roll out as [phased upgrades to the live network](/learn/sei-giga#how-will-sei-giga-ship); as of August 2026 there is no public Giga testnet yet. Sections describing components that have not activated are forward-looking and subject to change. Statements about Ares v6.6, retired native Oracle queries, and IBC reflect the live network as of August 2026. For building on Sei today, start with the [EVM development guides](/evm/evm-general).
+ Sei Giga will roll out as [phased upgrades to the live network](/learn/sei-giga#how-will-sei-giga-ship). As of August 2026, there is no public Giga testnet yet. Sections about components that have not activated are forward-looking and subject to change. Statements about Ares v6.6, retired native Oracle queries, and IBC reflect the live network as of August 2026. To build on Sei today, start with the [EVM development guides](/evm/evm-general).
## What will stay the same
-- Contract code: Solidity and Vyper will compile against standard EVM semantics. Opcodes and standard Ethereum precompiles will track Ethereum near parity; retired Sei-native precompiles are outside this compatibility statement.
-- Tooling: standard JSON-RPC (`eth_call`, `eth_sendRawTransaction`, `eth_getTransactionReceipt`, `eth_feeHistory`, `eth_subscribe` for new heads), so Foundry, Hardhat, viem, ethers.js, and wagmi will work unchanged.
+- Contract code: Solidity and Vyper will compile against standard EVM semantics. Opcodes and standard Ethereum precompiles will track Ethereum near parity. Retired Sei-native precompiles are outside this compatibility statement.
+- Tooling: the standard JSON-RPC methods will remain (`eth_call`, `eth_sendRawTransaction`, `eth_getTransactionReceipt`, `eth_feeHistory`, `eth_subscribe` for new heads), so Foundry, Hardhat, viem, ethers.js, and wagmi will work unchanged.
- Accounts and signing: the same `0x` addresses and the same ECDSA flow, with a [post-quantum migration path](/learn/sei-giga-specs#post-quantum-migration) specified for the long term.
- The gas token: SEI will stay the native token for gas, staking, and fees.
- The network itself: Giga will upgrade the live Sei network in place, with no new chain to redeploy to.
@@ -25,21 +35,21 @@ Sei Giga is designed so that standard EVM contracts do not need to change. Contr
| Area | On Ethereum / Sei today | On Sei Giga | What you should do |
| ------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
-| Finality | Block inclusion / finalized tag | Ordering finality (measured <250 ms), execution receipt, then state attestation finality | Wait for the stage your flow requires; see [below](#finality-on-giga-which-signal-to-wait-for) |
-| Mempool | Public pending pool, gossip, frontrunning games | No traditional public mempool; complete transactions route to lanes before Sedna, with coded symbol bundles added by the later [Sedna](/learn/sei-giga-specs#sedna-private-dissemination) milestone | Drop pending-pool assumptions; there will be no pending stream to watch |
-| Priority fee | Paid to the block proposer; buys inclusion favor | Strictly enforced for ordering, then socialised across validators by stake × liveness | Use the tip to express urgency; the protocol does not pay a specific proposer for preferential treatment |
-| State proofs | `eth_getProof` against the block state root | No state root; [BUD proofs](/learn/sei-giga-specs#block-update-digests-buds) against attested per-block digests | Don't hard-depend on `eth_getProof`; plan for BUD-based verification |
+| Finality | Block inclusion / finalized tag | Ordering finality (measured <250 ms), execution receipt, then state attestation finality | Wait for the stage your flow requires (see [below](#finality-on-giga-which-signal-to-wait-for)) |
+| Mempool | Public pending pool, gossip, frontrunning games | No traditional public mempool. Complete transactions route to lanes before Sedna. The later [Sedna](/learn/sei-giga-specs#sedna-private-dissemination) milestone adds coded symbol bundles | Drop pending-pool assumptions. There will be no pending stream to watch |
+| Priority fee | Paid to the block proposer, and buys inclusion favor | Strictly enforced for ordering, then socialised across validators by stake × liveness | Use the tip to express urgency. The protocol does not pay a specific proposer for preferential treatment |
+| State proofs | `eth_getProof` against the block state root | No state root. [BUD proofs](/learn/sei-giga-specs#block-update-digests-buds) against attested per-block digests | Avoid a hard dependency on `eth_getProof`. Plan for BUD-based verification |
| Randomness | `PREVRANDAO` (beacon randomness) | `PREVRANDAO` not supported with Ethereum semantics | Use a VRF or oracle for randomness |
| Blob transactions | EIP-4844 type-3 transactions | Will not be supported (Giga will remain an L1, not a rollup DA consumer) | Nothing to do unless you post blobs |
-| Block gas limit | Fixed per-block constant | No Ethereum-style fixed block gas limit; throughput bounded by lane and consensus parameters | Don't encode assumptions about a specific block gas limit |
-| Duplicate submission | Re-broadcasting the same tx is free but useless | Multi-submitting to several validators will be a censorship-resistance feature: one copy will execute, duplicates will pay a distribution fee with a partial tip refund | Optionally multi-submit high-value transactions |
+| Block gas limit | Fixed per-block constant | No Ethereum-style fixed block gas limit. Lane and consensus parameters will bound throughput | Do not encode assumptions about a specific block gas limit |
+| Duplicate submission | Rebroadcasting the same transaction is free but useless | Multi-submitting to several validators will be a censorship-resistance feature. One copy will execute. Duplicates will pay a distribution fee and get a partial tip refund | Optionally multi-submit high-value transactions |
## Finality on Giga: which signal to wait for
Giga will separate consensus from execution. Applications will observe three stages:
-- Ordering finality (measured under 250 ms on the internal devnet): consensus has fixed your transaction's position under the protocol's stated assumptions. Execution follows, so this stage does not provide a receipt or execution result.
-- Execution receipt: a node has executed the ordered transaction and can report its result. This is the first stage at which your application can know whether the transaction succeeded or reverted, but it is not a quorum attestation.
+- Ordering finality (measured under 250 ms on the internal devnet): consensus has fixed your transaction's position under the protocol's stated assumptions. Execution follows, so you do not get a receipt or execution result at this stage.
+- Execution receipt: a node has executed the ordered transaction and can report its result. This is the first stage at which your application can know whether the transaction succeeded or reverted. It is not a quorum attestation.
- State attestation finality, a bounded number of blocks later: a two-thirds voting-power quorum has signed the block's [divergence digest](/learn/sei-giga-specs#lattice-hash-divergence-digests). This confirms the executed results.
@@ -48,38 +58,40 @@ Which signal to wait for depends on the flow:
| Use case | Wait for | Why |
| --------------------------------------------------- | --------------------------- | ------------------------------------------------------------------------ |
-| Interactive UX, games, and payments UI | Execution receipt or state attestation, based on your risk policy | The receipt exposes the result; attestation adds a signed quorum confirmation |
+| Interactive UX, games, and payments UI | Execution receipt or state attestation, based on your risk policy | The receipt exposes the result. Attestation adds a signed quorum confirmation |
| Exchange deposits, bridge withdrawals, high-value settlement | State attestation finality | Adds a signed quorum attestation of executed state before you act on it |
| External verification (light clients, cross-chain) | Attested BUD proofs | Proofs anchor to attested digests, which follow the attestation schedule |
A transaction revert is an execution result and does not invalidate the rest of the block. For today's finality behavior, before Giga, see [EVM finality on Sei](/evm/evm-parity/finality).
-Ordering finality alone does not reveal the execution result. Treat receipt-level action as an application risk decision, not as a substitute for state attestation in high-value or cross-chain flows.
+Treat receipt-level action as an application risk decision, not as a substitute for state attestation in high-value or cross-chain flows. Ordering finality alone does not reveal the execution result.
## Sending transactions without a public mempool
-On Autobahn before the later Sedna milestone, RPC nodes will route complete signed transactions into validator proposal lanes without a shared public pending pool. After Sedna activates, RPC ingress will instead distribute coded symbol bundles and executors will reconstruct the transaction after the finalized symbols cross the decode threshold. Autobahn's pipelining is designed for an effective steady-state cadence of one committed cut per 1.5 network round trips; this is not a submission-to-finality guarantee. In practice:
+On Autobahn before the later Sedna milestone, RPC nodes will route complete signed transactions into validator proposal lanes without a shared public pending pool. After Sedna activates, RPC ingress will distribute coded symbol bundles instead. Executors will reconstruct the transaction after the finalized symbols cross the decode threshold. Autobahn's pipelining is designed for an effective steady-state cadence of one committed cut per 1.5 network round trips. This is not a submission-to-finality guarantee. In practice:
-- There will be no public mempool to scan for victims, and the merged execution order will be a [deterministic function](/learn/sei-giga-specs#deterministic-merge-rule) of finalized lane contents, which is designed to reduce post-consensus proposer discretion. Sedna is intended to add pre-execution privacy; its guarantees depend on coding parameters and the number of colluding lanes.
-- Pending semantics will change. Don't build features on watching a gossiped pending-transaction stream. Pending-nonce queries will be answered by the validator responsible for your sender address; the RPC layer will route this for you.
-- You will control your own censorship resistance. Submit the identical signed transaction to multiple validators if it matters; only one copy will execute, since duplicates will be dropped by hash at merge time, and extra copies will pay a distribution fee and get part of the tip back. A single submission will be the right default for most transactions.
-- Each validator is designed to include at most one copy of a given transaction per epoch, so attempts to amplify a transaction within one validator's lane will struggle to succeed. Cross-validator duplicates remain possible for censorship resistance and will pay the distribution fee.
+- There will be no public mempool to scan for victims. The merged execution order will be a [deterministic function](/learn/sei-giga-specs#deterministic-merge-rule) of finalized lane contents. This is designed to reduce post-consensus proposer discretion. Sedna is intended to add pre-execution privacy. Its guarantees depend on coding parameters and the number of colluding lanes.
+- Pending semantics will change. Do not build features that depend on watching a gossiped pending-transaction stream. The validator responsible for your sender address will answer pending-nonce queries. The RPC layer will route these queries for you.
+- You will control your own censorship resistance. If censorship resistance matters for a transaction, submit the identical signed transaction to multiple validators. Only one copy will execute, because duplicates will be dropped by hash at merge time. Extra copies will pay a distribution fee and get part of the tip back. A single submission will be the right default for most transactions.
+- Each validator is designed to include at most one copy of a given transaction per epoch. Attempts to amplify a transaction within one validator's lane will therefore struggle to succeed. Cross-validator duplicates remain possible for censorship resistance and will pay the distribution fee.
## Fees on Giga
Giga will price three things separately (full details in the [fee model spec](/learn/sei-giga-specs#fee-model)):
-1. The execution fee: an EIP-1559-style dynamic base fee for gas actually consumed. `eth_feeHistory` and `eth_maxPriorityFeePerGas` will remain your estimation tools.
-2. The ordering fee, better known as the priority fee. Giga will enforce it strictly: lanes in each committed cut will be ordered by their highest included tip, so a higher tip will buy earlier execution, deterministically. The fee will also be socialised (pooled per epoch and distributed to validators by stake and liveness), a design intended to reduce protocol-level incentives to tip a specific proposer. Out-of-protocol side payments remain outside the current specification.
+1. The execution fee: an EIP-1559-style dynamic base fee for the gas a transaction consumes. `eth_feeHistory` and `eth_maxPriorityFeePerGas` will remain your estimation tools.
+2. The ordering fee, better known as the priority fee. Giga will enforce it strictly: lanes in each committed cut will be ordered by their highest included tip. A higher tip will therefore buy earlier execution, deterministically. The fee will also be socialised: pooled per epoch and distributed to validators by stake and liveness. This design is intended to reduce protocol-level incentives to tip a specific proposer. Out-of-protocol side payments remain outside the current specification.
3. The distribution fee, charged per duplicate copy when you multi-submit for censorship resistance.
-For gas metering inside the EVM, Sei's existing schedule will continue to apply, including Sei's custom `SSTORE` pricing (see [gas and fees](/evm/evm-parity/gas-and-fees)). The whitepaper defers the final Giga fee mechanism to a dedicated paper, so expect parameter-level details to firm up around the Autobahn testnet.
+For gas metering inside the EVM, Sei's existing schedule will continue to apply, including Sei's custom `SSTORE` pricing (see [gas and fees](/evm/evm-parity/gas-and-fees)). The whitepaper defers the final Giga fee mechanism to a dedicated paper. Expect parameter-level details to become more definite around the Autobahn testnet.
## Writing parallel-friendly contracts
-Giga will execute each block with [Block-STM-style optimistic concurrency](/learn/sei-giga-specs#parallel-execution-block-stm-style-occ): transactions will run in parallel and re-execute only when their read/write sets collide. Sei Labs measured that [64.85% of historical Ethereum transactions could have been parallelized](https://blog.sei.io/research-64-85-of-ethereum-transactions-can-be-parallelized/) under this model. Your contract's storage layout will decide which side of that statistic it lands on. Transactions touching disjoint storage will run simultaneously; transactions contending on one hot slot will serialize (the engine will retry conflicted transactions and, under sustained contention, fall back to sequential execution — a fallback designed to protect correctness at the cost of speed).
+Giga will execute each block with [Block-STM-style optimistic concurrency](/learn/sei-giga-specs#parallel-execution-block-stm-style-occ). Transactions will run in parallel and re-execute only when their read and write sets collide. Sei Labs measured that [64.85% of historical Ethereum transactions could have been parallelized](https://blog.sei.io/research-64-85-of-ethereum-transactions-can-be-parallelized/) under this model. Your contract's storage layout will decide which side of that statistic it lands on.
+
+Transactions that touch disjoint storage will run simultaneously. Transactions that contend on one hot slot will serialize. The engine will retry conflicted transactions. Under sustained contention, it will fall back to sequential execution. This fallback is designed to protect correctness at the cost of speed.
@@ -112,7 +124,7 @@ Global counters, monolithic `totalSupply` updates on every operation, shared rou
### Pattern 2: prefer mappings over shared arrays
-`mapping(address => T)` lookups touch one isolated slot per user. Pushing to a shared array touches the array-length slot on every insert, which makes the length slot a hidden global counter.
+`mapping(address => T)` lookups touch one isolated slot per user. Pushing to a shared array touches the array-length slot on every insert. This makes the length slot a hidden global counter.
### Pattern 3: emit events instead of storing history
@@ -131,11 +143,11 @@ contract EventDrivenAuction {
}
```
-Events will be a particularly good deal on Giga: receipt generation and log indexing will run off the execution hot path in dedicated stores, so keeping history in events will trim your write set without losing queryability.
+Events will be especially cost-effective on Giga. Receipt generation and log indexing will run off the execution hot path, in dedicated stores. Keeping history in events will therefore trim your write set, and the history will stay queryable.
### Pattern 4: pack storage you must share
-When state is genuinely shared, make it cheap: pack related fields into one slot so a conflicting transaction pays one slot conflict instead of three.
+When state must be shared, make it cheap. Pack related fields into one slot, so a conflicting transaction pays for one slot conflict instead of three.
```solidity
struct Position {
@@ -147,17 +159,17 @@ struct Position {
## Sei precompiles under the Giga executor
-[Sei v6.6](https://github.com/sei-protocol/sei-chain/releases/tag/v6.6.0) activated the first Ares execution phase on Sei Mainnet. Eligible transactions use the Ares path; when that path encounters an unsupported case, the individual transaction reruns through the v2 fallback. Eligibility is release-specific, so do not assume every EVM transaction or precompile call uses the same fast path. Follow the [node configuration reference](/node/node-operators#giga-storage-and-giga-executor) for the release you operate.
+[Sei v6.6](https://github.com/sei-protocol/sei-chain/releases/tag/v6.6.0) activated the first Ares execution phase on Sei Mainnet. Eligible transactions use the Ares path. When that path encounters an unsupported case, the individual transaction reruns through the v2 fallback. Eligibility is release-specific, so do not assume that every EVM transaction or precompile call uses the same fast path. Follow the [node configuration reference](/node/node-operators#giga-storage-and-giga-executor) for the release you operate.
The retired native Oracle precompile at `0x0000000000000000000000000000000000001008` is not a supported fallback. Its data-query methods revert. Use one of the third-party providers documented for Sei instead.
## Prepare your app for Giga today
-- Build EVM-only. [SIP-3](/learn/sip-03-migration) consolidates Sei to a streamlined EVM-only stack ahead of Giga: CosmWasm no longer accepts new deployments. IBC is disabled in both directions: Proposals [116](https://seistream.app/proposals/116) and [120](https://seistream.app/proposals/120) disabled inbound transfers, and [121](https://seistream.app/proposals/121) disabled outbound transfers on July 31, 2026. Existing IBC balances can still move within Sei but can no longer be redeemed over IBC on their origin chain. For external data, use the providers documented for Sei: [API3](/evm/oracles/api3), [Chainlink](/evm/oracles/chainlink), [Pyth](/evm/oracles/pyth-network), and [RedStone](/evm/oracles/redstone).
-- Audit for hot slots. Per-user state isolation is the single most effective change for parallel throughput. The first Ares phase went live with the mandatory Sei Mainnet v6.6 upgrade on August 4, 2026; broader Ares work continues in later releases.
-- Classify your confirmation flows. Decide which flows only need the fixed order, which act on an execution receipt, and which wait for state attestation, so the three-stage model will land as a config change rather than a redesign.
+- Build EVM-only. [SIP-3](/learn/sip-03-migration) consolidates Sei to an EVM-only stack ahead of Giga: CosmWasm no longer accepts new deployments. IBC is disabled in both directions: Proposals [116](https://seistream.app/proposals/116) and [120](https://seistream.app/proposals/120) disabled inbound transfers, and [121](https://seistream.app/proposals/121) disabled outbound transfers on July 31, 2026. Existing IBC balances can still move within Sei but can no longer be redeemed over IBC on their origin chain. For external data, use the providers documented for Sei: [API3](/evm/oracles/api3), [Chainlink](/evm/oracles/chainlink), [Pyth](/evm/oracles/pyth-network), and [RedStone](/evm/oracles/redstone).
+- Audit for hot slots. Per-user state isolation is the single most effective change for parallel throughput. The first Ares phase went live with the mandatory Sei Mainnet v6.6 upgrade on August 4, 2026. Broader Ares work continues in later releases.
+- Classify your confirmation flows. Decide which flows only need the fixed order, which act on an execution receipt, and which wait for state attestation. The three-stage model will then need only a configuration change, not a redesign.
- Remove fragile dependencies. Anything that relies on `eth_getProof` and state roots ([current behavior](/evm/evm-parity/state-proofs)), `PREVRANDAO` randomness, blob transactions, or watching the public mempool will need a plan.
-- Don't wait for a "Giga chain." There won't be one; Giga will arrive on the network where you're already deployed. Standard EVM contracts that do not depend on retired Sei-native surfaces are designed to carry over without redeployment.
+- Do not wait for a "Giga chain." There will not be one. Giga will arrive on the network where you are already deployed. Standard EVM contracts that do not depend on retired Sei-native surfaces are designed to carry over without redeployment.
## Related
diff --git a/learn/sei-giga-specs.mdx b/learn/sei-giga-specs.mdx
index 29e3948..206f55a 100644
--- a/learn/sei-giga-specs.mdx
+++ b/learn/sei-giga-specs.mdx
@@ -7,73 +7,73 @@ keywords: ['sei giga specification', 'autobahn consensus', 'proof of availabilit
import { GigaLanesAndCuts, GigaSlotPipeline, GigaAttestationFlow, GigaOccDiagram, GigaStorageArchitecture, GigaBudWindow, GigaMergeRule } from '/snippets/giga-diagrams.jsx';
-This page specifies the Sei Giga protocol as defined in the [Giga whitepaper v2.0](https://arxiv.org/abs/2505.14914) (Marsh, Landers, Jog, Ranchal-Pedrosa; June 2026), with implementation notes from the [sei-chain](https://github.com/sei-protocol/sei-chain) v6.6 release and its Sei Mainnet activation (August 2026). Please note: the specification below is forward-looking and subject to change until the corresponding upgrades activate on the Sei network. For a conceptual introduction, start with the [Sei Giga overview](/learn/sei-giga); for practical guidance, see the [developer guide](/learn/sei-giga-developers).
+This page specifies the Sei Giga protocol as defined in the [Giga whitepaper v2.0](https://arxiv.org/abs/2505.14914) by Marsh, Landers, Jog, and Ranchal-Pedrosa (June 2026). It also includes implementation notes from the [sei-chain](https://github.com/sei-protocol/sei-chain) v6.6 release and its Sei Mainnet activation (August 2026). The specification below is forward-looking and subject to change until the corresponding upgrades activate on the Sei network. For a conceptual introduction, start with the [Sei Giga overview](/learn/sei-giga). For practical guidance, see the [developer guide](/learn/sei-giga-developers).
## Protocol at a glance
| Property | Specification |
| ------------------------- | -------------------------------------------------------------------------------------------------- |
-| Chain type | Permissionless Proof-of-Stake EVM Layer 1; SEI will remain the native gas, fee, and staking asset |
-| Fault model | Whitepaper model: `n = 3f + 1` replicas, up to `f` faulty; the implementation weights votes by stake |
-| Synchrony assumption | Partial synchrony: under the stated fault and cryptographic assumptions, safety does not depend on network timing; liveness resumes after network stabilization |
+| Chain type | Permissionless Proof-of-Stake EVM Layer 1. SEI will remain the native gas, fee, and staking asset |
+| Fault model | Whitepaper model: `n = 3f + 1` replicas, up to `f` faulty. The implementation weights votes by stake |
+| Synchrony assumption | Partial synchrony: under the stated fault and cryptographic assumptions, safety does not depend on network timing. Liveness resumes after network stabilization |
| Consensus | Autobahn: per-validator data lanes with leader-driven cut-of-tips ordering |
-| Data availability quorum | Whitepaper: `f + 1` replica votes (Proof of Availability); implementation thresholds are stake-weighted |
-| Ordering quorum | Whitepaper: `n - f` prepare/commit votes; implementation thresholds are stake-weighted |
-| Consensus cadence | Effective steady-state cadence of one committed cut per 1.5 network round trips under pipelining; not submission-to-finality latency |
-| Execution | Asynchronous, post-ordering; deterministic; Block-STM-style optimistic concurrency control |
+| Data availability quorum | Whitepaper: `f + 1` replica votes (Proof of Availability). Implementation thresholds are stake-weighted |
+| Ordering quorum | Whitepaper: `n - f` prepare/commit votes. Implementation thresholds are stake-weighted |
+| Consensus cadence | Effective steady-state cadence of one committed cut per 1.5 network round trips under pipelining, not submission-to-finality latency |
+| Execution | Asynchronous, post-ordering, and deterministic, with Block-STM-style optimistic concurrency control |
| State attestation | Two-thirds voting-power signatures over per-block lattice-hash divergence digests, included in a later block |
| State commitment | Homomorphic multiset hash (LtHash) over the block write log, with no Merkle state root on the hot path |
| State proofs | Block Update Digests (BUDs) + SuperBUDs, governance-configurable proof window |
-| Transaction ingress | No traditional public mempool; complete transactions route to validator lanes before Sedna, while the later [Sedna](#sedna-private-dissemination) milestone introduces coded symbol bundles |
+| Transaction ingress | No traditional public mempool. Before Sedna, complete transactions route to validator lanes. The later [Sedna](#sedna-private-dissemination) milestone introduces coded symbol bundles |
| Transaction encoding | Flat, length-prefixed, single-pass zero-copy decoding (not RLP) |
| EVM compatibility | Ethereum-equivalent except EIP-4844, `PREVRANDAO`, state root, block gas limit, fee mechanism |
| Fee model | Three-part: EIP-1559-style execution fee + ordering fee (priority) + distribution fee (duplicates) |
-| Measured performance | >5 gigagas/s, sub-250 ms ordering finality (internal devnet: 40 nodes, 20 regions; reported in whitepaper v2.0, June 2026) |
+| Measured performance | >5 gigagas/s, sub-250 ms ordering finality (internal devnet of 40 nodes across 20 regions, reported in whitepaper v2.0, June 2026) |
## Network and security model
-The equations in the whitepaper use a replica-count model with `n = 3f + 1`, of which at most `f` replicas are Byzantine. The `sei-chain` implementation applies stake-weighted voting thresholds, so do not interpret `f` as a raw validator count when reasoning about the live network. Under the whitepaper's fault and cryptographic assumptions, even an extended network delay does not allow two conflicting proposals to receive valid commit certificates. The network may pause during a disruption and resume once message delays return within the protocol's timing bounds.
+The equations in the whitepaper use a replica-count model with `n = 3f + 1`, of which at most `f` replicas are Byzantine. The `sei-chain` implementation applies stake-weighted voting thresholds. When you reason about the live network, do not interpret `f` as a raw validator count. Under the whitepaper's fault and cryptographic assumptions, even an extended network delay does not allow two conflicting proposals to receive valid commit certificates. The network may pause during a disruption and resume when message delays return within the protocol's timing bounds.
-- Safety: no two conflicting proposals can both obtain a valid commit certificate in the same consensus slot. Attesting to two different divergence digests for the same finalized block will be slashable equivocation, because quorum intersection guarantees at least one honest validator would have to sign both.
-- Censorship resistance: once a proposal reaches the availability threshold (`f + 1` replicas in the whitepaper model; stake-weighted in the implementation), at least one honest replica stores its data under the stated assumptions, and a correct leader must include it in a future cut. This is designed to limit censorship to a finite delay. Users will also be able to submit a transaction to multiple validators at once ([deduplicated at merge](#mev-and-fee-design), with a partial tip refund).
+- Safety: no two conflicting proposals can both obtain a valid commit certificate in the same consensus slot. Attesting to two different divergence digests for the same finalized block will be slashable equivocation. This is because quorum intersection guarantees that at least one honest validator would have to sign both.
+- Censorship resistance: when a proposal reaches the availability threshold, at least one honest replica stores its data under the stated assumptions. The threshold is `f + 1` replicas in the whitepaper model and stake-weighted in the implementation. A correct leader must then include the proposal in a future cut. This is designed to limit censorship to a finite delay. Users will also be able to submit a transaction to multiple validators at once ([deduplicated at merge](#mev-and-fee-design), with a partial tip refund).
- Execution divergence: divergence below one-third of voting power can be isolated. Divergence beyond the Byzantine threshold is designed to pause the chain.
-- Staking: validators will continue to bond SEI and can be slashed for malicious behavior. The complete slashing schedule, reward functions, and tokenomics for Giga are deferred to future work; today's staking parameters are documented in [Staking](/learn/general-staking).
+- Staking: validators will continue to bond SEI and can be slashed for malicious behavior. The complete slashing schedule, reward functions, and tokenomics for Giga are deferred to future work. For today's staking parameters, see [Staking](/learn/general-staking).
## Consensus: Autobahn
-Sei Giga will order transactions with [Autobahn](https://arxiv.org/abs/2401.10369) (Giridharan, Suri-Payer, Abraham, Alvisi, Crooks; 2024), a BFT protocol that decouples data dissemination from ordering. The paper positions it between view-based protocols (HotStuff, Tendermint), which can stall during network "blips," and DAG-based protocols (Narwhal-style), which can add good-case latency. Under the paper's evaluated conditions, Autobahn combines an asynchronous data layer with partially synchronous ordering and reports DAG-class throughput at roughly half the latency.
+Sei Giga will order transactions with [Autobahn](https://arxiv.org/abs/2401.10369) (Giridharan, Suri-Payer, Abraham, Alvisi, and Crooks, 2024), a BFT protocol that decouples data dissemination from ordering. The paper positions it between view-based and DAG-based protocols. View-based protocols (HotStuff, Tendermint) can stall during network "blips." DAG-based protocols (Narwhal-style) can add good-case latency. Under the paper's evaluated conditions, Autobahn combines an asynchronous data layer with partially synchronous ordering and reports DAG-class throughput at roughly half the latency.
### Data dissemination: lanes and Proofs of Availability
-- Every validator `r` will maintain its own lane: an append-only, hash-chained sequence of transaction batches (called cars). A proposal is the tuple `Prop = ⟨pos, batch, parentRef⟩` signed by `r`, where `pos` is the lane sequence number and `parentRef` is the hash of the previous proposal in the same lane.
-- Validators that receive a proposal will verify it extends the lane correctly and return a signed vote over its digest. Once the proposer collects `f + 1` matching votes, it will assemble a Proof of Availability (PoA), a certificate that the data is retrievable.
-- `f + 1` is sufficient because any such quorum contains at least one correct replica that held the full data when it voted, and that replica serves it until all correct replicas have it. Giga's design deliberately keeps the smaller quorum (rather than `2f + 1`) because commitment itself triggers full replication along the execution path; a larger quorum would only add certification latency.
-- The latest proposal in a lane holding a PoA is the lane's tip. Lanes are hash-chained, so certifying a tip implicitly attests the availability of every earlier proposal in that lane without re-certifying each prior entry.
+- Every validator `r` will maintain its own lane: an append-only, hash-chained sequence of transaction batches (called cars). A proposal is the tuple `Prop = ⟨pos, batch, parentRef⟩`, signed by `r`. Here, `pos` is the lane sequence number, and `parentRef` is the hash of the previous proposal in the same lane.
+- Validators that receive a proposal will verify that it extends the lane correctly and return a signed vote over its digest. When the proposer collects `f + 1` matching votes, it will assemble a Proof of Availability (PoA), a certificate that the data is retrievable.
+- `f + 1` is enough because any such quorum contains at least one correct replica that held the full data when it voted. That replica serves the data until all correct replicas have it. Giga's design deliberately keeps the smaller quorum (instead of `2f + 1`) because commitment itself triggers full replication along the execution path. A larger quorum would only add certification latency.
+- The latest proposal in a lane that holds a PoA is the lane's tip. Lanes are hash-chained, so certifying a tip implicitly attests the availability of every earlier proposal in that lane. Earlier entries do not need to be certified again.
-All validators will disseminate batches in parallel without waiting for consensus. The design aims to move dissemination off the ordering critical path and use aggregate validator bandwidth rather than one leader's uplink. Actual bottlenecks depend on workload, network conditions, and implementation limits.
+All validators will disseminate batches in parallel without waiting for consensus. The design aims to move dissemination off the ordering critical path and use aggregate validator bandwidth instead of one leader's uplink. Actual bottlenecks depend on workload, network conditions, and implementation limits.
### Ordering: cuts of tips
Consensus will periodically fix a global order by committing a cut, a vector of every lane's current certified tip:
-1. Prepare. The slot's leader (chosen by stake-weighted selection, as in Tendermint) will bundle the latest certified tips into a cut proposal; replicas will validate the PoAs and broadcast prepare votes, forming a PrepareQC at `n - f` votes.
-2. Commit. Replicas will exchange commit votes over the PrepareQC. A CommitQC formed from `n - f` votes finalizes the cut in the whitepaper's replica-count model.
-3. Pipelining. Slots will overlap: as soon as replicas see the Prepare message for slot `s`, they can begin slot `s + 1`, and the next leader may start proposing while the previous cut is still in its commit phase. With quadratic communication and pipelining, the design targets an effective steady-state cadence of one committed cut per 1.5 network round trips, versus three full rounds in Tendermint. This cadence is not a per-transaction finality guarantee.
+1. Prepare. The slot's leader (chosen by stake-weighted selection, as in Tendermint) will bundle the latest certified tips into a cut proposal. Replicas will validate the PoAs and broadcast prepare votes. At `n - f` votes, these votes form a PrepareQC.
+2. Commit. Replicas will exchange commit votes over the PrepareQC. In the whitepaper's replica-count model, a CommitQC formed from `n - f` votes finalizes the cut.
+3. Pipelining. Slots will overlap. As soon as replicas see the Prepare message for slot `s`, they can begin slot `s + 1`. The next leader may start proposing while the previous cut is still in its commit phase. With quadratic communication and pipelining, the design targets an effective steady-state cadence of one committed cut per 1.5 network round trips. Tendermint uses three full rounds. This cadence is not a per-transaction finality guarantee.
-Committing one cut will finalize every uncommitted proposal in every lane up to the referenced tips. A single consensus decision can therefore commit many blocks' worth of data at once, which is why the whitepaper anticipates roughly 70 times higher block production than the single-proposer design (180 versus 2.5 blocks per second). Validators will vote on compact certificates only; a replica that is missing batch data will fetch it after commit, off the critical path.
+Committing one cut will finalize every uncommitted proposal in every lane up to the referenced tips. A single consensus decision can therefore commit many blocks' worth of data at once. For this reason, the whitepaper anticipates roughly 70 times higher block production than the single-proposer design (180 versus 2.5 blocks per second). Validators will vote on compact certificates only. A replica that is missing batch data will fetch it after commit, off the critical path.
### Leader failure and recovery
-If a leader fails to make progress, replicas will fall back to a standard view change: a timeout certificate will elect a new leader, and the protocol will resume. Lane dissemination is designed to continue during the view change, which isolates most of the disruption to ordering latency. The Autobahn paper calls this "seamless" recovery from blips and contrasts it with the post-asynchrony recovery cost of chained-HotStuff-style protocols.
+If a leader fails to make progress, replicas will fall back to a standard view change. A timeout certificate will elect a new leader, and the protocol will resume. Lane dissemination is designed to continue during the view change. This confines most of the disruption to ordering latency. The Autobahn paper calls this "seamless" recovery from blips and contrasts it with the post-asynchrony recovery cost of chained-HotStuff-style protocols.
Two consensus upgrades beyond launch are already specified:
-- Ambulance ([arXiv 2606.25099](https://arxiv.org/abs/2606.25099)) replaces the timeout race with a "protocol-rigged race": non-leader replicas do useful persistence work on candidate cuts built from the same certified tips in parallel, so when a leader is merely slow (I/O contention, garbage collection, routing trouble) the slot can finish from existing recovery state instead of paying a full timeout. Planned as a core part of a future upgrade.
-- Hermes, a next-generation consensus protocol on the [official roadmap](https://giga.seilabs.io); its whitepaper has not been published yet.
+- Ambulance ([arXiv 2606.25099](https://arxiv.org/abs/2606.25099)) replaces the timeout race with a "protocol-rigged race" among replicas. Non-leader replicas do useful persistence work in parallel on candidate cuts built from the same certified tips. If a leader is only slow (I/O contention, garbage collection, routing trouble), the slot can finish from existing recovery state. It does not have to wait for a full timeout. Ambulance is planned as a core part of a future upgrade.
+- Hermes is a next-generation consensus protocol on the [official roadmap](https://giga.seilabs.io). Its whitepaper has not been published yet.
## Execution
@@ -83,28 +83,28 @@ Giga will separate what consensus decides from what execution produces:
| Finality | Definition | When it holds |
| --------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------ |
-| Ordering finality | Consensus has finalized the unique total order of transactions induced by a committed cut | Sub-250 ms (measured on an internal devnet; not submission-to-receipt latency) |
+| Ordering finality | Consensus has finalized the unique total order of transactions induced by a committed cut | Sub-250 ms, measured on an internal devnet (not submission-to-receipt latency) |
| State attestation finality | A later finalized block includes a valid two-thirds voting-power attestation of the block's divergence digest | A bounded number of blocks later (lag `x` depends on execution timing) |
-Unless stated otherwise, latency claims in Giga materials refer to ordering finality. Under the protocol's stated fault and cryptographic assumptions, ordering finality fixes the transaction sequence; state attestation finality adds a BFT-signed confirmation of the results of execution.
+Unless stated otherwise, latency claims in Giga materials refer to ordering finality. Under the protocol's stated fault and cryptographic assumptions, ordering finality fixes the transaction sequence. State attestation finality adds a BFT-signed confirmation of the execution results.
-Execution occurs between these two protocol signals. A receipt becomes available only after a node executes the ordered transaction; ordering finality alone does not provide an execution result.
+Execution happens between these two protocol signals. A receipt becomes available only after a node executes the ordered transaction. Ordering finality alone does not give an execution result.
### Deterministic block transition
-For each finalized block, the protocol specifies the canonical transition `Apply(S_prev, context, block) → (S_new, receipts, gas, writeLog)`. Given the same pre-state, block context, ordered transactions, execution semantics, and serializable parallel schedule, conforming executors should derive byte-identical results without communicating. A transaction revert is itself an execution result and does not invalidate the rest of the block. This intended determinism allows execution to run off the consensus critical path.
+For each finalized block, the protocol specifies the canonical transition `Apply(S_prev, context, block) → (S_new, receipts, gas, writeLog)`. Given the same pre-state, block context, ordered transactions, execution semantics, and serializable parallel schedule, conforming executors should derive byte-identical results without communicating. A transaction revert is itself an execution result and does not invalidate the rest of the block. Because of this intended determinism, execution can run off the consensus critical path.
-The execution client is deliberately narrow: it processes transactions and nothing else, with no tracing or log search on the hot path. Incoming blocks are pre-processed in parallel (parsing, sender recovery, signature verification), while exactly one block executes at a time. Receipt generation and indexing happen after execution, so block `n + 1` can start while block `n` post-processes.
+The execution client is deliberately narrow. It processes transactions and nothing else, with no tracing or log search on the hot path. Incoming blocks are pre-processed in parallel (parsing, sender recovery, signature verification), while exactly one block executes at a time. Receipt generation and indexing happen after execution, so block `n + 1` can start while block `n` post-processes.
### Parallel execution: Block-STM-style OCC
Within a block, transactions execute concurrently under optimistic concurrency control (the [Block-STM](https://arxiv.org/abs/2203.06871) approach):
- A later transaction `t_j` depends on an earlier `t_i` when `t_i`'s write set overlaps `t_j`'s read or write set. The block's total order keeps this dependency relation acyclic.
-- All transactions start executing in parallel, each buffering its writes privately. A validation phase checks, for each transaction, whether any earlier-ordered transaction committed a write into its read or write set after it began; conflicting transactions are rolled back and re-executed.
-- The committed result is provably identical to sequential execution in block order (a "valid parallel schedule"). When contention is low, most transactions commit on their first attempt; under sustained contention the engine may fall back to sequential execution with unchanged semantics. In `sei-chain`, the scheduler retries a transaction up to 10 times before reverting to the sequential path.
+- All transactions start to execute in parallel, and each buffers its writes privately. For each transaction, a validation phase checks whether any earlier-ordered transaction committed a write into its read or write set after it began. Conflicting transactions are rolled back and re-executed.
+- The committed result is provably identical to sequential execution in block order (a "valid parallel schedule"). When contention is low, most transactions commit on their first attempt. Under sustained contention, the engine may fall back to sequential execution with unchanged semantics. In `sei-chain`, the scheduler retries a transaction up to 10 times before it falls back to the sequential path.
@@ -112,18 +112,25 @@ Sei Labs measured that [64.85% of historical Ethereum transactions could have be
### Transaction encoding
-Giga will replace nested RLP with a flat, length-prefixed encoding designed for single-pass, zero-copy decoding: fields (type, chain ID, sender, recipient, value, nonce, gas limit, signature, access list) appear in a fixed order, variable-length fields carry a one-byte length prefix, contract creation is signaled by a marker byte, and all remaining bytes are the calldata. A parser reads each transaction in one pass with no allocation-heavy tree construction, which matters when decoding hundreds of thousands of transactions per second.
+Giga will replace nested RLP with a flat, length-prefixed encoding designed for single-pass, zero-copy decoding:
+
+- Fields (type, chain ID, sender, recipient, value, nonce, gas limit, signature, access list) appear in a fixed order.
+- Variable-length fields carry a one-byte length prefix.
+- A marker byte signals contract creation.
+- All remaining bytes are the calldata.
+
+A parser reads each transaction in one pass, with no allocation-heavy tree construction. This matters at decode rates of hundreds of thousands of transactions per second.
## EVM compatibility
-Sei Giga's EVM will be mostly equivalent to mainnet Ethereum. Contracts will be written in standard Solidity or Vyper and deployed with standard tooling.
+Sei Giga's EVM will be mostly equivalent to Ethereum mainnet. You will write contracts in standard Solidity or Vyper and deploy them with standard tooling.
| Exception | What will differ on Giga |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------- |
-| EIP-4844 (blob transactions) | Will not be supported; Giga will remain an L1 and will not carry rollup blob data |
+| EIP-4844 (blob transactions) | Will not be supported. Giga will remain an L1 and will not carry rollup blob data |
| `PREVRANDAO` | Will not be supported with Ethereum semantics (no beacon-chain randomness) |
-| State root | Blocks will carry no Merkle state root; state will be attested via [divergence digests](#lattice-hash-divergence-digests) and proven via [BUDs](#block-update-digests-buds) |
-| Block gas limit | Not a fixed Ethereum-style per-block constant; throughput will be bounded by lane and consensus parameters |
+| State root | Blocks will carry no Merkle state root. State will be attested through [divergence digests](#lattice-hash-divergence-digests) and proven with [BUDs](#block-update-digests-buds) |
+| Block gas limit | Not a fixed Ethereum-style per-block constant. Lane and consensus parameters will bound throughput |
| Transaction fee mechanism | Three-part model (below) instead of Ethereum's exact EIP-1559 burn semantics |
### Fee model
@@ -132,40 +139,40 @@ Sei Giga's EVM will be mostly equivalent to mainnet Ethereum. Contracts will be
| -------------------- | ---------------------------------------------------- | ------------------------------------------------------------------ |
| Execution fee | Gas consumed by execution | EIP-1559-style dynamic base fee driven by demand |
| Ordering fee | Position in the merged order | Priority fee, strictly enforced by the [deterministic merge rule](#mev-and-fee-design) |
-| Distribution fee | Duplicate copies submitted for censorship resistance | Will price each additional lane slot a duplicate occupies; only one copy will execute, with a partial tip refund |
+| Distribution fee | Duplicate copies submitted for censorship resistance | Will price each extra lane slot that a duplicate occupies. Only one copy will execute, with a partial tip refund |
## Storage
-Giga's storage layer is designed for petabyte-per-year data production at full 5-gigagas load while keeping validator hardware practical.
+Giga's storage layer is designed for petabyte-per-year data production at full 5-gigagas load, while validator hardware stays practical.
### Flat state, RAM-first
-- Every account, storage slot, and global variable will map directly to an entry in a log-structured merge (LSM) tree. Writes will skip per-write Merkle path updates entirely, so flushes stay batched and sequential and nothing is re-hashed on the write path.
-- Frequently accessed state will be held in RAM, and reads will be served from memory in the common case. All disk writes will be asynchronous and exist for durability only, protected by an append-only write-ahead log (WAL) that is replayed on crash recovery.
-- Storage will be tiered: recent and hot data will sit on local high-performance SSDs, while historical data will move to a distributed columnar store built for analytical queries and audit workloads.
+- Every account, storage slot, and global variable will map directly to an entry in a log-structured merge (LSM) tree. Writes will skip per-write Merkle path updates entirely. Flushes will therefore stay batched and sequential, and nothing will be re-hashed on the write path.
+- Frequently accessed state will be held in RAM, and reads will be served from memory in the common case. All disk writes will be asynchronous and will exist for durability only. An append-only write-ahead log (WAL) will protect them and will be replayed on crash recovery.
+- Storage will be tiered. Recent and hot data will sit on local high-performance SSDs. Historical data will move to a distributed columnar store built for analytical queries and audit workloads.
### Lattice-hash divergence digests
-There will be no state root; Giga will instead commit to execution results with a homomorphic multiset hash (LtHash, by Lewi, Kim, Maykov, and Weis): `LH(X) = Σ h(x) mod q`. Its collision resistance rests on lattice assumptions (short integer solution style). For each block `n`:
+There will be no state root. Instead, Giga will commit to execution results with a homomorphic multiset hash (LtHash, by Lewi, Kim, Maykov, and Weis): `LH(X) = Σ h(x) mod q`. Its collision resistance rests on lattice assumptions (short integer solution style). For each block `n`:
-- The committed multiset `X_n` will contain one record per surviving write (after intra-block last-write-wins resolution), one record per transaction receipt (position-bound), and one gas-accounting record, each domain-separated by type tag and height.
-- The block digest is `d_n = LH(X_n)`; validators will attest to the compact commitment `D_n = H(enc(n, d_n))`. The full vector `d_n` will be exchanged only during disputes.
-- Disputes will resolve by bisection. The key space partitions into ranges whose chunk digests sum to the write component of `d_n` by construction, so divergent executors will compare chunk digests, narrow down, and replay only the affected range to find the first divergent write, receipt, or gas discrepancy.
+- The committed multiset `X_n` will contain one record per surviving write (after intra-block last-write-wins resolution). It will also contain one record per transaction receipt (position-bound) and one gas-accounting record. Each record will be domain-separated by type tag and height.
+- The block digest is `d_n = LH(X_n)`. Validators will attest to the compact commitment `D_n = H(enc(n, d_n))`. The full vector `d_n` will be exchanged only during disputes.
+- Disputes will resolve by bisection. The key space partitions into ranges whose chunk digests sum to the write component of `d_n` by construction. Divergent executors will therefore compare chunk digests and narrow the search. They will replay only the affected range to find the first divergent write, receipt, or gas discrepancy.
-The homomorphism is what makes this practical: digests update incrementally as writes commit, in any order, and no tree walk is involved.
+The homomorphism makes this practical. Digests update incrementally as writes commit, in any order, and no tree walk is involved.
### Block Update Digests (BUDs)
-BUDs will restore externally verifiable state proofs (the role `eth_getProof` plays on Ethereum) at a cost proportional to per-block update volume rather than total state size:
+BUDs will restore externally verifiable state proofs (the role `eth_getProof` plays on Ethereum). Their cost will be proportional to per-block update volume, not total state size:
- Every state entry will carry an 8-byte last-modified height and a 1-byte serialization version. For each block `n`, the BUD `U_n` is the Merkle root over the lexicographically sorted leaves `(key, newValue, n, prevHeight)` of that block's writes. Validators will attest `U_n` on the same delayed two-thirds voting-power schedule as the divergence digest.
-- A membership proof will be a Merkle path to an attested `U_n`, certifying that `key` held `value` immediately after block `n` and recording when it previously changed. Two proofs at heights `a < b` whose `b`-leaf records predecessor `a` will prove the key was unmodified throughout `(a, b)`.
-- SuperBUDs will aggregate BUDs over exponentially growing aligned windows (branching base `e` and maximum level `L_max`, both governance parameters), so provers will cover long ranges with logarithmically many digests. The guaranteed proof window will be `η = e^L_max` blocks; older claims can be served by archive nodes but fall outside the protocol guarantee.
-- Touch transactions will rewrite only a key's last-modified metadata, giving long-untouched keys a fresh proof anchor. Deletions will leave tombstones, garbage-collected after `η`, which anchor exclusion proofs.
-- At the activation height a one-time synthetic write log will bootstrap every existing key, and the system will reach steady state after `η` blocks. BUD trees deliberately use a classical hash: the short proof window keeps classical collision resistance sufficient, and the trees will fall under the same [post-quantum migration schedule](#post-quantum-migration) as the rest of the protocol.
+- A membership proof will be a Merkle path to an attested `U_n`. It will certify that `key` held `value` immediately after block `n`. It will also record when the key previously changed. Two proofs at heights `a < b` whose `b`-leaf records predecessor `a` will prove that the key was unmodified throughout `(a, b)`.
+- SuperBUDs will aggregate BUDs over exponentially growing aligned windows (branching base `e` and maximum level `L_max`, both governance parameters). Provers will then cover long ranges with logarithmically many digests. The guaranteed proof window will be `η = e^L_max` blocks. Archive nodes can serve older claims, but those claims fall outside the protocol guarantee.
+- Touch transactions will rewrite only a key's last-modified metadata. This will give long-untouched keys a fresh proof anchor. Deletions will leave tombstones, which anchor exclusion proofs and are garbage-collected after `η`.
+- At the activation height, a one-time synthetic write log will bootstrap every existing key. The system will reach steady state after `η` blocks. BUD trees deliberately use a classical hash, because the short proof window keeps classical collision resistance sufficient. The trees will also fall under the same [post-quantum migration schedule](#post-quantum-migration) as the rest of the protocol.
@@ -173,112 +180,118 @@ Light clients, bridges, and any external verifier will consume BUD proofs agains
## Networking and transaction ingress
-- Nodes will communicate over direct, authenticated point-to-point connections rather than network-wide gossip. Consensus messages, lane proposals, votes, and certificates will stream over dedicated channels with per-channel rate and size limits.
-- There will be no traditional public mempool. Before Sedna activates, RPC nodes will route complete signed transactions into validator lanes. After the later [Sedna](#sedna-private-dissemination) milestone activates, ingress will distribute coded symbol bundles across selected lanes. In the current implementation, EVM senders map deterministically to a validator shard, and `eth_sendRawTransaction` plus pending-nonce queries are proxied to that shard's owner.
-- Users will be able to submit the same transaction to multiple validators for censorship resistance. Admission will be rate-limited: each validator will include at most one copy of a given transaction per epoch, duplicates will be dropped deterministically at merge time, only one copy will execute, and unexecuted duplicates will earn a partial tip refund while paying the [distribution fee](#fee-model).
-- Four node roles will exist: validators (consensus and execution), full nodes (RPC plus execution for the read path), light nodes (RPC only), and data nodes that serve recent data.
+- Nodes will communicate over direct, authenticated point-to-point connections instead of network-wide gossip. Consensus messages, lane proposals, votes, and certificates will stream over dedicated channels with per-channel rate and size limits.
+- There will be no traditional public mempool. Before Sedna activates, RPC nodes will route complete signed transactions into validator lanes. After the later [Sedna](#sedna-private-dissemination) milestone activates, ingress will distribute coded symbol bundles across selected lanes. In the current implementation, EVM senders map deterministically to a validator shard. The implementation proxies `eth_sendRawTransaction` and pending-nonce queries to that shard's owner.
+- For censorship resistance, users will be able to submit the same transaction to multiple validators. Admission will be rate-limited: each validator will include at most one copy of a given transaction per epoch. Duplicates will be dropped deterministically at merge time, and only one copy will execute. Unexecuted duplicates will pay the [distribution fee](#fee-model) and earn a partial tip refund.
+- Four node roles will exist:
+ - Validators will run consensus and execution.
+ - Full nodes will run RPC plus execution for the read path.
+ - Light nodes will run RPC only.
+ - Data nodes will serve recent data.
### Sedna: private dissemination
-[Sedna](https://arxiv.org/abs/2512.17045) is planned as Giga's private dissemination layer, a later roadmap milestone after Autobahn mainnet. Senders would encode a committed transaction payload into verifiable rateless coded symbols and send addressed bundles to selected proposer lanes. Executors would reconstruct the payload after finalized symbols cross the decode threshold. The paper calls this "until-decode privacy"; its guarantees depend on the coding parameters and the number of colluding lanes. Compared with threshold-encrypted mempools, the Sedna paper argues that the design can provide similar pre-execution privacy without an extra decryption round, while reducing per-lane bandwidth. The companion incentive mechanism [PIVOT-K](https://arxiv.org/abs/2603.17614) would concentrate a sender-funded bounty on bundles that trigger decoding and ratchet away from lanes that withhold.
+[Sedna](https://arxiv.org/abs/2512.17045) is planned as Giga's private dissemination layer, a later roadmap milestone after Autobahn mainnet. Senders would encode a committed transaction payload into verifiable rateless coded symbols and send addressed bundles to selected proposer lanes. Executors would reconstruct the payload after finalized symbols cross the decode threshold. The paper calls this "until-decode privacy." Its guarantees depend on the coding parameters and the number of colluding lanes.
+
+The Sedna paper compares the design with threshold-encrypted mempools. It argues that the design can give similar pre-execution privacy without an extra decryption round, and with less per-lane bandwidth. The companion incentive mechanism [PIVOT-K](https://arxiv.org/abs/2603.17614) would concentrate a sender-funded bounty on bundles that trigger decoding and ratchet away from lanes that withhold.
## MEV and fee design
-Multi-Proposer architectures remove the single block-builder's private ordering monopoly but introduce their own MEV (maximal extractable value) channels, formalized in [MEV in Multiple Concurrent Proposer Blockchains](https://arxiv.org/abs/2511.13080): same-tick duplicate stealing (copying a visible transaction into your own lane to win the merge), proposer-to-proposer orderflow deals, and timing races around PoA latency. Giga's countermeasures will live at the protocol level.
+Multi-Proposer architectures remove the single block-builder's private ordering monopoly. However, they introduce their own MEV (maximal extractable value) channels, formalized in [MEV in Multiple Concurrent Proposer Blockchains](https://arxiv.org/abs/2511.13080). These channels are same-tick duplicate stealing, proposer-to-proposer orderflow deals, and timing races around PoA latency. Same-tick duplicate stealing means copying a visible transaction into your own lane to win the merge. Giga's countermeasures will live at the protocol level.
### Deterministic merge rule
For each committed cut, every node will derive the executable sequence with the same pure function:
1. Take each lane's newly committed transactions, meaning those not in any previous cut, in their intra-lane order.
-2. Sort lanes by the maximum priority fee among their new transactions, descending; break ties by replica index.
-3. Concatenate the lanes and deduplicate by transaction hash; only the first occurrence survives.
+2. Sort lanes in descending order of the maximum priority fee among their new transactions. Break ties by replica index.
+3. Concatenate the lanes and deduplicate by transaction hash. Only the first occurrence survives.
-The merged order is designed to depend only on finalized lane contents, not on arrival timing, wall clocks, or a node's post-consensus discretion. This is intended to reduce protocol-level post-consensus reordering opportunities.
+The merged order is designed to depend only on finalized lane contents, not on arrival timing, wall clocks, or a node's post-consensus discretion. This is intended to reduce the opportunities for post-consensus reordering at the protocol level.
### Socialised tips
-All priority fees collected in an epoch (net of duplicate refunds) will be pooled and distributed to validators pro rata by `stake × liveness`, where liveness will be the measured fraction of observable duties performed: consensus votes included in committed QCs, certified lane blocks produced, and signed state attestations, with duty weighting set by governance. Payouts will be shared with delegators in the same way as block rewards.
+All priority fees collected in an epoch (net of duplicate refunds) will be pooled. They will be distributed to validators pro rata by `stake × liveness`. Liveness will be the measured fraction of observable duties performed: consensus votes included in committed QCs, certified lane blocks produced, and signed state attestations. Governance will set the duty weighting. Payouts will be shared with delegators in the same way as block rewards.
-- Under the proposed fee design, copying a high-tip transaction into another lane would not capture its fee. This is intended to reduce the duplicate-steal channel's protocol-level revenue motive.
-- Validator revenue from the protocol would be independent of orderflow routing, reducing the protocol-level incentive to steer users to specific proposers.
+- Under the proposed fee design, copying a high-tip transaction into another lane would not capture its fee. This is intended to reduce the protocol-level revenue motive for duplicate stealing.
+- Validator revenue from the protocol would be independent of orderflow routing. This would reduce the protocol-level incentive to steer users to specific proposers.
- Withholding or lazy participation will directly reduce a validator's payout.
-The whitepaper sums it up: the priority fee will buy ordering, not a relationship with a particular proposer. Side payments for intra-lane position are out of protocol scope for now and belong to the forthcoming fee-mechanism work.
+The whitepaper summarizes the design this way: the priority fee will buy ordering, not a relationship with a particular proposer. Side payments for intra-lane position are out of protocol scope for now and belong to the forthcoming fee-mechanism work.
## Post-quantum migration
The proposed Giga architecture includes a survivability path for a sudden ECDSA break ("Q-day") that is designed to avoid a chain-wide account reset:
-- Before a governance-set cutoff height, any account will be able to register a post-quantum verification key (scheme identifier, PQ public key, migration nonce, optional activation height), signed with its current classical key.
-- During the transition window, the chain would accept classical or dual classical+PQ signatures. After the cutoff, accounts that had not registered a post-quantum key would no longer be able to authorize transactions with their existing ECDSA key. The proposed path does not include public-key recovery or new classical EOAs after that point. Onboarding would continue through pre-registration, contract wallets, or a later native PQ account format.
-- The designated short-term scheme is ML-DSA (FIPS 204). The whitepaper is explicit that this is an emergency path and not fast enough for Giga's throughput; post-quantum cryptography at Giga scale is open research.
+- Before a governance-set cutoff height, any account will be able to register a post-quantum verification key. The registration (scheme identifier, PQ public key, migration nonce, optional activation height) will be signed with the account's current classical key.
+- During the transition window, the chain would accept classical or dual classical+PQ signatures. After the cutoff, accounts that had not registered a post-quantum key could no longer authorize transactions with their existing ECDSA key. The proposed path does not include public-key recovery or new classical EOAs after that point. Onboarding would continue through pre-registration, contract wallets, or a later native PQ account format.
+- The designated short-term scheme is ML-DSA (FIPS 204). The whitepaper states explicitly that this is an emergency path and is not fast enough for Giga's throughput. Post-quantum cryptography at Giga scale is open research.
## Performance claims and targets
| Metric | Value | Context | Source (date) |
| --------------------------- | ----------------------------------- | --------------------------------------------------------- | ----------------------------------------------- |
| Sustained throughput | >5 gigagas/s | Internal devnet: 40 nodes across 20 regions | Whitepaper v2.0 (June 2026) |
-| Ordering finality | <250 ms | Same devnet (whitepaper v1: <400 ms; Feb 2025 devnet: ~700 ms, 4 regions) | Whitepaper v2.0 (June 2026) |
+| Ordering finality | <250 ms | Same devnet. Whitepaper v1: <400 ms. Feb 2025 devnet: ~700 ms, 4 regions | Whitepaper v2.0 (June 2026) |
| Consensus cadence | 1.5 round trips vs 3 | Effective steady-state cut cadence under Autobahn pipelining, not per-transaction latency | Whitepaper §1.1 and §3.4 (2026) |
| Throughput vs Tendermint | >50× | Multi-Proposer dissemination vs single leader | Whitepaper §1.1 (2026) |
| Block production | ~70× (180 blocks vs 2.5) | All-lanes-at-once commits vs sequential single blocks | Whitepaper §1.1 (2026) |
| Autobahn testnet target | 200,000 TPS at 400 ms finality | Public testnet milestone | [giga.seilabs.io](https://giga.seilabs.io) (May 2026) |
-The whitepaper publishes no fixed block gas limit, block size, or validator hardware specification for Giga; the roadmap's Autobahn testnet milestone includes the final consensus specification. Figures you may see for today's network (block times, gas limits) describe the [current architecture](/learn/twin-turbo-consensus), not the anticipated architecture under Giga.
+The whitepaper publishes no fixed block gas limit, block size, or validator hardware specification for Giga. The roadmap's Autobahn testnet milestone includes the final consensus specification. Figures you may see for today's network (block times, gas limits) describe the [current architecture](/learn/twin-turbo-consensus), not the anticipated architecture under Giga.
## Implementation snapshot (Sei v6.6 activation, August 2026)
-Giga is implemented in the open in [sei-protocol/sei-chain](https://github.com/sei-protocol/sei-chain); there is no separate Giga repository. The mandatory [v6.6 release](https://github.com/sei-protocol/sei-chain/releases/tag/v6.6.0) brought the first Ares and Eidos components to Sei Mainnet at height `224201091` on August 4, 2026. Ares became the default execution path for upgraded nodes; Eidos migration remains phased and operator-controlled. Broader work continues, and later Giga components remain inactive:
+Giga is implemented in the open in [sei-protocol/sei-chain](https://github.com/sei-protocol/sei-chain). There is no separate Giga repository. The mandatory [v6.6 release](https://github.com/sei-protocol/sei-chain/releases/tag/v6.6.0) brought the first Ares and Eidos components to Sei Mainnet at height `224201091` on August 4, 2026. Ares became the default execution path for upgraded nodes. Eidos migration remains phased and operator-controlled. Broader work continues, and later Giga components remain inactive:
| Area | Current state |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
-| Ares, first phase | Active on Sei Mainnet after v6.6; eligible transactions use the Ares path, while unsupported cases rerun individually through the v2 fallback |
-| Giga executor defaults | From v6.6, newly generated configurations and configurations that omit the fields enable the Giga executor and OCC; explicit `false` values opt out |
-| Autobahn | Implemented in `sei-tendermint/autobahn` (lanes, PoAs, prepare/commit QCs, timeout certificates); ships in the binary but disabled until network activation; committee capped at 100 validators; implementation uses a stake-weighted availability threshold corresponding to the whitepaper's `f + 1` model |
-| Operator surface | `autobahn-config-file` in `config.toml`, committee file generated with `seid tendermint gen-autobahn-config`; consensus state persisted across restarts to prevent double-signing |
-| RPC under Autobahn | `eth_sendRawTransaction` and pending-nonce queries proxy to the sender's shard validator; block and status endpoints route through Autobahn; `eth_subscribe` (newHeads) supported |
-| Eidos migration support | Shipped in v6.6; RPC-node migration remains opt-in and operator-controlled |
-| Later storage phases | FlatKV/lattice-hash state commitment and the broader archive design remain operator-gated or future work; follow the storage migration guide |
-| RPC-node storage | Dedicated EVM state-store split (`evm-ss-split`) targeting ~150k TPS reads; see the [Giga storage migration guide](/node/giga-storage-migration) |
-| Testing | Differential Giga-vs-v2 execution across the Ethereum state-test suite; mixed Giga/v2 clusters; Autobahn integration harness |
-
-Node operators should follow the [node configuration reference](/node/node-operators#giga-storage-and-giga-executor) rather than this page for exact keys and defaults.
+| Ares, first phase | Active on Sei Mainnet after v6.6. Eligible transactions use the Ares path. Unsupported cases rerun individually through the v2 fallback |
+| Giga executor defaults | From v6.6, newly generated configurations and configurations that omit the fields enable the Giga executor and OCC. Explicit `false` values opt out |
+| Autobahn | Implemented in `sei-tendermint/autobahn` (lanes, PoAs, prepare/commit QCs, timeout certificates). It ships in the binary but stays disabled until network activation. The committee is capped at 100 validators. The implementation uses a stake-weighted availability threshold that corresponds to the whitepaper's `f + 1` model |
+| Operator surface | `autobahn-config-file` in `config.toml`, with a committee file generated by `seid tendermint gen-autobahn-config`. Consensus state persists across restarts to prevent double-signing |
+| RPC under Autobahn | `eth_sendRawTransaction` and pending-nonce queries proxy to the sender's shard validator. Block and status endpoints route through Autobahn. `eth_subscribe` (newHeads) is supported |
+| Eidos migration support | Shipped in v6.6. RPC-node migration remains opt-in and operator-controlled |
+| Later storage phases | FlatKV/lattice-hash state commitment and the broader archive design remain operator-gated or future work. Follow the storage migration guide |
+| RPC-node storage | Dedicated EVM state-store split (`evm-ss-split`) that targets ~150k TPS reads. See the [Giga storage migration guide](/node/giga-storage-migration) |
+| Testing | Differential Giga-vs-v2 execution across the Ethereum state-test suite, mixed Giga/v2 clusters, and an Autobahn integration harness |
+
+For exact keys and defaults, node operators should follow the [node configuration reference](/node/node-operators#giga-storage-and-giga-executor), not this page.
## Glossary
| Term | Definition |
| ----------------------------- | --------------------------------------------------------------------------------------------------------------- |
-| **Multi-Proposer (MCP)** | Architecture in which every validator proposes transaction data concurrently (the whitepaper's "multiple concurrent proposers"); Giga is designed to be the first Multi-Proposer EVM Layer 1 |
+| **Multi-Proposer (MCP)** | Architecture in which every validator proposes transaction data concurrently (the whitepaper's "multiple concurrent proposers"). Giga is designed to be the first Multi-Proposer EVM Layer 1 |
| **Lane** | A validator's own append-only, hash-chained sequence of transaction batches |
| **Car** | One batch of transactions in a lane (a lane entry) |
| **Proposal** | Signed lane entry `⟨pos, batch, parentRef⟩` |
-| **PoA (Proof of Availability)** | Certificate proving proposal data is retrievable; whitepaper threshold is `f + 1` replicas, while the implementation is stake-weighted |
+| **PoA (Proof of Availability)** | Certificate that proves proposal data is retrievable. The whitepaper threshold is `f + 1` replicas, and the implementation threshold is stake-weighted |
| **Tip** | The most recent proposal in a lane that holds a PoA |
| **Cut** | The vector of all lanes' current tips committed by one consensus decision |
-| **Slot** | One consensus instance committing one cut; slots are pipelined |
+| **Slot** | One consensus instance that commits one cut. Slots are pipelined |
| **PrepareQC / CommitQC** | Quorum certificates from the prepare and commit voting phases |
| **Timeout certificate** | Certificate that triggers a view change when a leader stalls |
-| **Blip** | A transient network disruption; Autobahn is designed to preserve lane dissemination while ordering recovers |
+| **Blip** | A transient network disruption. Autobahn is designed to preserve lane dissemination while ordering recovers |
| **Ordering finality** | Under the protocol's stated fault and cryptographic assumptions, consensus has fixed the transaction order (the sub-250 ms signal) |
| **State attestation finality** | A two-thirds voting-power quorum has attested the block's execution results in a later block |
| **Write log** | A block's canonical key-value write set after last-write-wins resolution |
-| **Divergence digest** | Compact lattice-hash commitment over a block's write log, receipts, and gas; this is what validators attest |
-| **LtHash** | Homomorphic multiset hash used for divergence digests; updates incrementally, in any order |
-| **BUD (Block Update Digest)** | Per-block Merkle root over that block's state updates; the basis of Giga state proofs |
+| **Divergence digest** | Compact lattice-hash commitment over a block's write log, receipts, and gas. Validators attest to it |
+| **LtHash** | Homomorphic multiset hash used for divergence digests. It updates incrementally, in any order |
+| **BUD (Block Update Digest)** | Per-block Merkle root over that block's state updates, and the basis of Giga state proofs |
| **SuperBUD** | Aggregated BUD covering an exponentially sized window of blocks |
| **Touch transaction** | Transaction that refreshes a key's last-modified metadata to create a fresh proof anchor |
| **Proof window (η)** | Number of blocks over which BUD proofs are protocol-guaranteed (`η = e^L_max`, governance-set) |
| **Merge rule** | Deterministic function from a committed cut to the executable transaction sequence (tip-priority order plus deduplication) |
| **Socialised tips** | Epoch-pooled priority fees distributed by stake × liveness instead of to the carrying proposer |
-| **Distribution fee** | Fee component pricing duplicate submissions made for censorship resistance |
-| **Sedna** | Planned private dissemination milestone using rateless-coded, addressed bundles; its until-decode privacy depends on coding parameters and collusion assumptions |
+| **Distribution fee** | Fee component that prices duplicate submissions made for censorship resistance |
+| **Sedna** | Planned private dissemination milestone that uses rateless-coded, addressed bundles. Its until-decode privacy depends on coding parameters and collusion assumptions |
| **PIVOT-K** | Sedna's incentive mechanism: bounties on decode-pivotal bundles plus a sender ratchet against withholding |
-| **Ambulance** | Planned consensus upgrade replacing timeout-based leader recovery with a rigged race among replicas |
+| **Ambulance** | Planned consensus upgrade that replaces timeout-based leader recovery with a rigged race among replicas |
| **Hermes** | Next-generation consensus protocol after Autobahn (whitepaper forthcoming) |
-| **Eidos / Ares** | Storage-rebuild and execution-client upgrades whose first components shipped in v6.6; Ares became the default execution path while Eidos migration remains phased |
+| **Eidos / Ares** | Storage-rebuild and execution-client upgrades whose first components shipped in v6.6. Ares became the default execution path, and Eidos migration remains phased |
## References
diff --git a/learn/sei-giga.mdx b/learn/sei-giga.mdx
index 7403f2d..371e825 100644
--- a/learn/sei-giga.mdx
+++ b/learn/sei-giga.mdx
@@ -7,51 +7,53 @@ keywords: ['sei giga', 'multi-proposer blockchain', 'autobahn consensus', 'evm l
import { GigaProposerComparison, GigaAsyncPipeline, GigaTxJourney, GigaRoadmapTrack } from '/snippets/giga-diagrams.jsx';
-Sei Giga will be the next generation of the Sei protocol following the Giga Upgrade, designed to be the first Multi-Proposer EVM Layer 1. Every validator will propose transactions at the same time, consensus will finalize only the order of those transactions, and execution and state attestation will happen afterwards, off the critical path. On an internal devnet of 40 nodes across 20 regions, Giga sustained more than 5 gigagas per second (5 billion gas per second) with ordering finality under 250 ms. The separate public-testnet roadmap target is 200,000 TPS. Giga will ship as a series of in-place upgrades to the live Sei network rather than as a new chain.
+Sei Giga will be the next generation of the Sei protocol after the Giga Upgrade. It is designed to be the first Multi-Proposer EVM Layer 1. Every validator will propose transactions at the same time. Consensus will finalize only the order of those transactions. Execution and state attestation will happen after that, off the critical path.
+
+On an internal devnet of 40 nodes across 20 regions, Giga sustained more than 5 gigagas per second (5 billion gas per second). At that throughput, ordering finality was under 250 ms. The separate public-testnet roadmap target is 200,000 TPS. Giga will ship as a series of in-place upgrades to the live Sei network, not as a new chain.
- **Status (August 2026):** The [Giga whitepaper v2.0](https://arxiv.org/abs/2505.14914) was published in June 2026. The mandatory [Sei v6.6 release](https://github.com/sei-protocol/sei-chain/releases/tag/v6.6.0) brought the first execution (Ares) and storage (Eidos) components to Sei Mainnet on August 4. Ares became the default execution path for upgraded nodes; Eidos storage migration remains phased and operator-controlled. Broader Eidos and Ares work continues, and the Autobahn consensus testnet is the next milestone on the [official roadmap](https://giga.seilabs.io). Functionality not yet activated remains forward-looking and subject to change.
+ **Status (August 2026):** The [Giga whitepaper v2.0](https://arxiv.org/abs/2505.14914) was published in June 2026. The mandatory [Sei v6.6 release](https://github.com/sei-protocol/sei-chain/releases/tag/v6.6.0) brought the first execution (Ares) and storage (Eidos) components to Sei Mainnet on August 4. Ares became the default execution path for upgraded nodes. Eidos storage migration remains phased and operator-controlled. Broader Eidos and Ares work continues, and the Autobahn consensus testnet is the next milestone on the [official roadmap](https://giga.seilabs.io). Functionality not yet activated remains forward-looking and subject to change.
## Sei Giga at a glance
| Property | Sei Giga |
| -------------------- | -------------------------------------------------------------------------------------------------------------------- |
-| Architecture | Multi-Proposer (MCP) EVM Layer 1; every validator will propose concurrently |
+| Architecture | Multi-Proposer (MCP) EVM Layer 1: every validator will propose concurrently |
| Consensus | Autobahn BFT: per-validator data lanes with periodic cut-of-tips ordering |
-| Consensus cadence | Effective steady-state cadence of one committed cut per 1.5 network round trips under pipelining; not submission-to-finality latency |
-| Finality | Sub-250 ms ordering finality (measured on an internal devnet; whitepaper v2.0, June 2026) |
-| Throughput | More than 5 gigagas/s sustained on an internal devnet; separate roadmap target of 200,000 TPS for the Autobahn testnet |
-| Execution | Asynchronous, after ordering finality; Block-STM-style parallel EVM with optimistic concurrency control |
+| Consensus cadence | Effective steady-state cadence of one committed cut per 1.5 network round trips under pipelining, not submission-to-finality latency |
+| Finality | Sub-250 ms ordering finality, measured on an internal devnet (whitepaper v2.0, June 2026) |
+| Throughput | More than 5 gigagas/s sustained on an internal devnet, and a separate roadmap target of 200,000 TPS for the Autobahn testnet |
+| Execution | Asynchronous, after ordering finality. Block-STM-style parallel EVM with optimistic concurrency control |
| State commitment | Lattice-hash divergence digests over each block's write log (no Merkle state root on the hot path) |
-| State proofs | Block Update Digests (BUDs); proof cost scales with per-block updates rather than total state size |
-| Transaction ingress | No traditional public mempool; complete transactions route to validator lanes before Sedna, while the later [Sedna](/learn/sei-giga-specs#sedna-private-dissemination) milestone introduces coded symbol bundles |
+| State proofs | Block Update Digests (BUDs). Proof cost scales with per-block updates, not total state size |
+| Transaction ingress | No traditional public mempool. Before Sedna, complete transactions route to validator lanes. The later [Sedna](/learn/sei-giga-specs#sedna-private-dissemination) milestone introduces coded symbol bundles |
| EVM compatibility | Will be equivalent to Ethereum mainnet except EIP-4844 blobs, `PREVRANDAO`, the state root, the block gas limit, and the fee mechanism |
-| Security model | Whitepaper model: BFT with `n = 3f + 1` replicas; live implementation thresholds are stake-weighted. Under the stated assumptions, safety does not depend on network timing; liveness requires network stabilization |
-| Delivery | Phased, in-place upgrades of the live Sei network, keeping the existing chain ID |
+| Security model | Whitepaper model: BFT with `n = 3f + 1` replicas. Live implementation thresholds are stake-weighted. Under the stated assumptions, safety does not depend on network timing, and liveness requires network stabilization |
+| Delivery | Phased, in-place upgrades of the live Sei network that keep the existing chain ID |
## Why does Sei Giga exist?
-Giga's design goal is efficient, fast, and fair on-chain trading, a workload that needs very high throughput, low latency, and bounded censorship and MEV (maximal extractable value) risk. Sei Labs' [Giga announcement](https://blog.sei.io/announcements/giga/) frames the gap: Ethereum mainnet processes on the order of 100 TPS, while comparable web2 systems handle around 100,000 complex transactions per second. Closing that gap on a single decentralized EVM chain means removing three bottlenecks that all single-proposer blockchains share:
+Giga's design goal is efficient, fast, and fair on-chain trading. This workload needs high throughput, low latency, and bounded censorship and MEV (maximal extractable value) risk. Sei Labs' [Giga announcement](https://blog.sei.io/announcements/giga/) describes the gap: Ethereum mainnet processes on the order of 100 TPS. Comparable web2 systems handle around 100,000 complex transactions per second. Closing that gap on a single decentralized EVM chain means removing three bottlenecks that all single-proposer blockchains share:
1. One leader per block. In Tendermint-style consensus, a single proposer's bandwidth and connectivity cap the whole network's throughput each round. Giga will make every validator a proposer with its own data lane.
2. Consensus waits for execution. Traditional chains execute transactions and agree on the resulting state root inside the consensus loop, so heavy blocks slow finality. Giga will reach consensus on ordering only and execute asynchronously.
3. Merkle write amplification. Per-write Merkle tree updates multiply disk I/O as state grows. Giga will replace the hot-path Merkle tree with a flat key-value store and homomorphic lattice hashes.
-Sei's [current architecture](/learn/twin-turbo-consensus) already pushed the single-proposer model near its limits: ~400 ms blocks, [optimistic parallel execution](/learn/parallelization-engine), and [SeiDB](/learn/seidb). Giga will replace the model instead of tuning it further.
+Sei's [current architecture](/learn/twin-turbo-consensus) already pushed the single-proposer model near its limits: approximately 400 ms blocks, [optimistic parallel execution](/learn/parallelization-engine), and [SeiDB](/learn/seidb). Giga will replace the model instead of tuning it further.
## How will Sei Giga work?
-Giga is designed to separate the work of a blockchain into four decoupled stages: data dissemination, ordering, execution, and state attestation. Each stage is designed to run concurrently rather than blocking the next.
+Giga is designed to separate the work of a blockchain into four decoupled stages: data dissemination, ordering, execution, and state attestation. Each stage is designed to run concurrently instead of blocking the next.
### Autobahn consensus
Giga will order transactions with [Autobahn](https://arxiv.org/abs/2401.10369), a Byzantine Fault Tolerant consensus protocol that separates data dissemination from ordering:
- Each validator will continuously stream batches of transactions ("cars") into its own hash-chained lane, in parallel with every other validator.
-- In the whitepaper's replica-count model, a batch will be certified by a Proof of Availability (PoA) after `f + 1` replica votes, which guarantees at least one honest holder under the stated assumptions. The implementation applies stake-weighted thresholds.
-- Consensus will periodically commit a cut: a snapshot of the latest certified tip of every lane. Lanes are hash-chained, so committing a tip implicitly commits everything behind it, and one consensus decision can finalize many blocks of data at once.
-- Pipelined slots are designed for an effective steady-state cadence of one committed cut per 1.5 network round trips, versus three full rounds for Tendermint. This is a throughput cadence rather than a submission-to-finality guarantee. Validators will vote on compact certificates instead of downloading full blocks first.
+- In the whitepaper's replica-count model, a Proof of Availability (PoA) will certify a batch after `f + 1` replica votes. Under the stated assumptions, this guarantees at least one honest holder. The implementation applies stake-weighted thresholds.
+- Consensus will periodically commit a cut: a snapshot of the latest certified tip of every lane. Lanes are hash-chained, so committing a tip implicitly commits everything behind it. One consensus decision can therefore finalize many blocks of data at once.
+- Pipelined slots are designed for an effective steady-state cadence of one committed cut per 1.5 network round trips, versus three full rounds for Tendermint. This is a throughput cadence, not a submission-to-finality guarantee. Validators will vote on compact certificates instead of downloading full blocks first.
@@ -59,24 +61,24 @@ The whitepaper's design goal is for dissemination throughput to scale with parti
### Asynchronous execution and state attestation
-Giga will provide two distinct finality signals:
+Giga will have two distinct finality signals:
-- Ordering finality: under the protocol's stated fault and cryptographic assumptions, consensus has fixed the transaction order. This is the sub-250 ms signal, but execution follows it, so a receipt or execution result is not available at this stage.
-- State attestation finality: validators have executed the block, computed a compact divergence digest over its write log, and a two-thirds voting-power quorum has attested to that digest in a later block.
+- Ordering finality: under the protocol's stated fault and cryptographic assumptions, consensus has fixed the transaction order. This is the sub-250 ms signal. Execution follows it, so a receipt or execution result is not available at this stage.
+- State attestation finality: validators have executed the block and computed a compact divergence digest over its write log. A two-thirds voting-power quorum has also attested to that digest in a later block.
Applications can inspect the execution result after a node produces the receipt. Whether receipt-level confirmation is sufficient depends on the application's risk policy. High-value or cross-chain flows should wait for state attestation finality.
-Execution is designed to be deterministic: nodes that apply the same ordered transactions to the same starting state should compute the same result, while ordering continues as execution catches up. Divergence below one-third of voting power can be isolated; divergence beyond the Byzantine threshold is designed to pause the chain. Signing two different digests for the same block will be slashable equivocation.
+Execution is designed to be deterministic. Nodes that apply the same ordered transactions to the same starting state should compute the same result. Ordering continues while execution catches up. Divergence below one-third of voting power can be isolated. Divergence beyond the Byzantine threshold is designed to pause the chain. Signing two different digests for the same block will be slashable equivocation.
### Parallel execution
-Once ordering is final, each block will execute across all CPU cores using optimistic concurrency control:
+After ordering is final, each block will execute across all CPU cores with optimistic concurrency control:
-- All transactions in a block will start executing in parallel, buffering their writes privately.
-- A validation phase will detect conflicts (a transaction read or wrote state that an earlier-ordered transaction wrote) and re-execute only the conflicting transactions.
-- The committed result will be identical to sequential execution in block order, and under sustained contention the engine will fall back to sequential execution with unchanged semantics.
+- All transactions in a block will start to execute in parallel, and each will buffer its writes privately.
+- A validation phase will detect conflicts (a transaction read or wrote state that an earlier-ordered transaction wrote). It will then re-execute only the conflicting transactions.
+- The committed result will be identical to sequential execution in block order. Under sustained contention, the engine will fall back to sequential execution with unchanged semantics.
Sei Labs' research found that [64.85% of historical Ethereum transactions could have been parallelized](https://blog.sei.io/research-64-85-of-ethereum-transactions-can-be-parallelized/) this way. Contract-level guidance for maximizing parallelism is in the [developer guide](/learn/sei-giga-developers#writing-parallel-friendly-contracts).
@@ -84,25 +86,25 @@ Sei Labs' research found that [64.85% of historical Ethereum transactions could
Giga's storage layer is designed for a network that will produce petabytes of new data per year at full load:
-- Flat key-value store: every account and storage slot will map directly to an entry in a log-structured merge (LSM) tree, with no per-write Merkle path updates. Hot state will be served from RAM; disk writes will be asynchronous, with a write-ahead log for crash recovery.
-- Lattice-hash commitments: instead of a state root, each block's write log will be committed with a homomorphic multiset hash (LtHash). Validators will attest to this digest, and disputes will be resolved by bisecting chunked digests to pinpoint the first divergent write.
-- Block Update Digests (BUDs): Merkle proofs over per-block updates will replace global state proofs, so proof cost will scale with how much a block changed rather than how large total state is. Light clients and bridges will consume these attested digests.
-- Tiered storage: recent, hot data will live on local high-performance SSDs; historical data will move to a distributed columnar store for analytics and audit workloads.
+- Flat key-value store: every account and storage slot will map directly to an entry in a log-structured merge (LSM) tree. There will be no per-write Merkle path updates. Hot state will be served from RAM. Disk writes will be asynchronous, with a write-ahead log for crash recovery.
+- Lattice-hash commitments: instead of a state root, each block's write log will be committed with a homomorphic multiset hash (LtHash). Validators will attest to this digest. Disputes will be resolved by bisecting chunked digests to find the first divergent write.
+- Block Update Digests (BUDs): Merkle proofs over per-block updates will replace global state proofs. Proof cost will then scale with how much a block changed, not with the total size of the state. Light clients and bridges will consume these attested digests.
+- Tiered storage: recent, hot data will live on local high-performance SSDs. Historical data will move to a distributed columnar store for analytics and audit workloads.
-Sei v6.6 shipped the first [Eidos](#how-will-sei-giga-ship) support for separating EVM history into dedicated storage. Node migration remains phased and operator-controlled. The FlatKV and lattice-hash state-commitment model described above remains a later phase; its code is operator-gated and off by default. Details are in the [storage specification](/learn/sei-giga-specs#storage).
+Sei v6.6 shipped the first [Eidos](#how-will-sei-giga-ship) support for separating EVM history into dedicated storage. Node migration remains phased and operator-controlled. The FlatKV and lattice-hash state-commitment model described above remains a later phase. Its code is operator-gated and off by default. Details are in the [storage specification](/learn/sei-giga-specs#storage).
## What will change from today's Sei?
| Layer | Sei today (v2) | Sei Giga |
| ---------------- | -------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| Block proposal | One proposer per height | Every validator will propose concurrently in its own lane |
-| Consensus | [Twin Turbo](/learn/twin-turbo-consensus) (optimized Tendermint), ~400 ms | Autobahn: PoA-certified lanes with cut-of-tips ordering, effective 1.5-round-trip steady-state cadence, sub-250 ms measured ordering finality |
-| Execution | Interleaved with consensus, optimistically parallel ([OCC](/learn/parallelization-engine)) | Fully asynchronous after ordering finality; Block-STM-style OCC |
+| Consensus | [Twin Turbo Consensus](/learn/twin-turbo-consensus) (optimized Tendermint), ~400 ms | Autobahn: PoA-certified lanes with cut-of-tips ordering, effective 1.5-round-trip steady-state cadence, sub-250 ms measured ordering finality |
+| Execution | Interleaved with consensus, optimistically parallel ([OCC](/learn/parallelization-engine)) | Fully asynchronous after ordering finality, with Block-STM-style OCC |
| State commitment | Merkle app hash ([SeiDB](/learn/seidb): memiavl) | Lattice-hash divergence digests attested after execution, with no Merkle root on the hot path |
| State proofs | IAVL/Merkle proofs | Block Update Digests (BUDs) with a governance-set proof window |
-| Mempool | Gossiped mempool | No public gossiped mempool; complete transactions route to lanes before Sedna, with coded-fragment ingress added by the later [Sedna](/learn/sei-giga-specs#sedna-private-dissemination) milestone |
-| Fee model | EIP-1559-style base fee + priority fee to the proposer | Three-part fees: 1559-style execution fee, ordering fee, distribution fee; tips socialised across validators |
-| Chain surface | EVM + legacy Cosmos modules | Streamlined EVM-only stack (via [SIP-3](/learn/sip-03-migration)) |
+| Mempool | Gossiped mempool | No public gossiped mempool. Complete transactions route to lanes before Sedna. The later [Sedna](/learn/sei-giga-specs#sedna-private-dissemination) milestone adds coded-fragment ingress |
+| Fee model | EIP-1559-style base fee + priority fee to the proposer | Three-part fees (1559-style execution fee, ordering fee, distribution fee), with tips socialised across validators |
+| Chain surface | EVM + legacy Cosmos modules | EVM-only stack (through [SIP-3](/learn/sip-03-migration)) |
## What will happen to a transaction on Sei Giga?
@@ -115,25 +117,25 @@ Giga will have no traditional public mempool. The initial Autobahn flow and the
The diagram and steps below describe the initial Autobahn flow before Sedna:
-1. You will send a signed transaction to an RPC node, which will route it toward a validator. Allocation will be stake-weighted, and you will be able to submit the same transaction to several validators for censorship resistance.
+1. You will send a signed transaction to an RPC node, which will route it toward a validator. Allocation will be stake-weighted. For censorship resistance, you will be able to submit the same transaction to several validators.
2. The validator will append the transaction to its next batch and chain that batch into its lane.
-3. Once the batch reaches the availability threshold (`f + 1` replicas in the whitepaper model; stake-weighted in the implementation), it will hold a Proof of Availability and the lane tip will advance.
-4. Pipelined consensus will commit a cut of all lane tips. Your transaction's position will now be fixed. This is ordering finality; on the internal devnet it arrived in under 250 ms.
-5. Each executing validator or full node will merge the cut into one sequence using the deterministic tip-priority rule, drop duplicates by hash, and execute the result in parallel. Duplicate copies will not execute and will not pay execution costs twice.
+3. When the batch reaches the availability threshold, it will hold a Proof of Availability, and the lane tip will advance. The threshold is `f + 1` replicas in the whitepaper model and stake-weighted in the implementation.
+4. Pipelined consensus will commit a cut of all lane tips. Your transaction's position will then be fixed. This is ordering finality. On the internal devnet, it arrived in under 250 ms.
+5. Each executing validator or full node will merge the cut into one sequence with the deterministic tip-priority rule. It will drop duplicates by hash and execute the result in parallel. Duplicate copies will not execute and will not pay execution costs twice.
6. Validators will attest to the block's divergence digest in a later block. This is state attestation finality.
-Guidance on which finality signal to use for what is in the [developer guide](/learn/sei-giga-developers#finality-on-giga-which-signal-to-wait-for).
+The [developer guide](/learn/sei-giga-developers#finality-on-giga-which-signal-to-wait-for) explains which finality signal to use for each use case.
## How will Giga handle MEV and fees?
-Multi-Proposer chains eliminate the single sequencer's private block-building monopoly, but they create new MEV channels of their own: same-tick duplicate stealing, proposer-to-proposer orderflow deals, and races around PoA latency. Sei Labs formalized these in a [dedicated MEV paper](https://arxiv.org/abs/2511.13080). Giga will address them at the protocol level:
+Multi-Proposer chains remove the single sequencer's private block-building monopoly. However, they create new MEV channels of their own: same-tick duplicate stealing, proposer-to-proposer orderflow deals, and races around PoA latency. Sei Labs formalized these in a [dedicated MEV paper](https://arxiv.org/abs/2511.13080). Giga will address them at the protocol level:
-- The merge rule will be deterministic. The order of transactions within a committed cut will be a pure function of lane contents: lanes will sort by their highest included tip, intra-lane order will be preserved, and duplicates will be dropped. Arrival timing and proposer discretion will play no part.
-- Under the proposed design, priority fees from each epoch will be pooled and distributed to validators by stake and measured liveness rather than paid directly to the carrying proposer. Copying a high-tip transaction into another lane would not earn an additional protocol fee, and routing through a specific proposer would not receive a direct protocol payment. Side payments remain outside the current specification. A tip determines position under the protocol's merge rule.
-- Fees will come in three parts: an EIP-1559-style execution fee, a strictly enforced ordering fee (the priority fee), and a distribution fee that will price duplicate submissions. Duplicates will be deduplicated at merge time, and only one copy will execute; the rest will be refunded part of their tip.
+- The merge rule will be deterministic. The order of transactions within a committed cut will be a pure function of lane contents. Lanes will sort by their highest included tip, intra-lane order will be preserved, and duplicates will be dropped. Arrival timing and proposer discretion will have no effect on the order.
+- Under the proposed design, priority fees from each epoch will be pooled and distributed to validators by stake and measured liveness. They will not be paid directly to the carrying proposer. Copying a high-tip transaction into another lane would not earn an extra protocol fee. Routing through a specific proposer would not receive a direct protocol payment. Side payments remain outside the current specification. A tip determines position under the protocol's merge rule.
+- Fees will come in three parts: an EIP-1559-style execution fee, a strictly enforced ordering fee (the priority fee), and a distribution fee on duplicate submissions. Duplicates will be dropped at merge time, and only one copy will execute. The other copies will receive a partial tip refund.
- Sedna is intended to add pre-execution privacy. Transactions will travel through [Sedna](/learn/sei-giga-specs#sedna-private-dissemination) as coded symbol bundles spread across selected lanes. The privacy guarantee will depend on the coding parameters and the number of colluding lanes.
-The full mechanism is specified in [MEV and fee design](/learn/sei-giga-specs#mev-and-fee-design).
+For the full mechanism, see [MEV and fee design](/learn/sei-giga-specs#mev-and-fee-design).
## How will Sei Giga ship?
@@ -146,31 +148,31 @@ Giga will arrive as a sequence of named upgrades to the live Sei network ([Sei L
| Giga whitepaper v1 | Initial specification ([arXiv 2505.14914](https://arxiv.org/abs/2505.14914)), MEV formalization ([arXiv 2511.13080](https://arxiv.org/abs/2511.13080)) | Complete |
| Internal devnet | Geo-distributed devnet sustaining [5 gigagas/s with Autobahn](https://seiresearch.io/articles/sei-giga-achieving-5-gigagas-with-autobahn-consensus) | Complete |
| Giga whitepaper v2 | Revised spec (June 2026): sub-250 ms finality, Sedna, BUDs, fee model, post-quantum path | Complete |
-| Eidos upgrade | Storage rebuild; v6.6 shipped the first migration support, with node rollout and broader storage work continuing | In progress (first components shipped) |
-| Ares upgrade | Execution rebuild; first phase activated in v6.6 with per-transaction v2 fallback, with broader execution work continuing | In progress (first phase live) |
-| SIP-3 | Pre-Giga consolidation to a streamlined EVM-only stack; see the [migration guide](/learn/sip-03-migration) | In progress |
-| Autobahn testnet | Multi-Proposer, order-first consensus with asynchronous state on a public testnet, targeting 200,000 TPS with 400 ms finality; a final consensus whitepaper will accompany it | Coming soon |
+| Eidos upgrade | Storage rebuild. Sei v6.6 shipped the first migration support, and node rollout and broader storage work continue | In progress (first components shipped) |
+| Ares upgrade | Execution rebuild. The first phase activated in v6.6 with per-transaction v2 fallback, and broader execution work continues | In progress (first phase live) |
+| SIP-3 | Pre-Giga consolidation to an EVM-only stack (see the [migration guide](/learn/sip-03-migration)) | In progress |
+| Autobahn testnet | Multi-Proposer, order-first consensus with asynchronous state on a public testnet, with a target of 200,000 TPS and 400 ms finality. A final consensus whitepaper will accompany it | Coming soon |
| Autobahn mainnet | The live Sei network will upgrade to Autobahn consensus | Coming soon |
| Sedna upgrade | Private transaction dissemination (the "private mempool" milestone): transaction fragments will spread across lanes and be reassembled only after ordering | Coming soon |
| Hermes testnet | Next-generation consensus beyond Autobahn (whitepaper forthcoming) | Coming soon |
| Hermes mainnet | Hermes will merge into Sei Mainnet | Coming soon |
-Sei v6.6 brought the first Ares and Eidos components to Sei Mainnet at upgrade height `224201091` on August 4, 2026. Ares became the default execution path for upgraded nodes. Eidos migration remains phased and operator-controlled. Autobahn consensus, FlatKV/lattice-hash state commitment, and Sedna remain separate milestones or operator-gated work. Node operators should follow the [release-specific configuration reference](/node/node-operators#giga-storage-and-giga-executor) rather than infer settings from roadmap status.
+Sei v6.6 brought the first Ares and Eidos components to Sei Mainnet at upgrade height `224201091` on August 4, 2026. Ares became the default execution path for upgraded nodes. Eidos migration remains phased and operator-controlled. Autobahn consensus, FlatKV and lattice-hash state commitment, and Sedna remain separate milestones or operator-gated work. Node operators should follow the [release-specific configuration reference](/node/node-operators#giga-storage-and-giga-executor) and not infer settings from roadmap status.
- There is no public Giga testnet yet (as of August 2026), and therefore no separate Giga chain ID, RPC endpoint, or faucet. Anything claiming otherwise is not official. Current network endpoints remain those of [Sei Mainnet and Sei Testnet](/learn/dev-chains).
+ There is no public Giga testnet yet (as of August 2026). There is therefore no separate Giga chain ID, RPC endpoint, or faucet. Anything that claims otherwise is not official. Current network endpoints remain those of [Sei Mainnet and Sei Testnet](/learn/dev-chains).
## Performance claims and targets
-Each row carries its source and date. Devnet figures are Sei Labs' internal measurements, consensus comparisons are whitepaper claims, and testnet figures are targets rather than measurements.
+Each row gives its source and date. Devnet figures are Sei Labs' internal measurements. Consensus comparisons are whitepaper claims. Testnet figures are targets, not measurements.
| Metric | Value | Context | Source (date) |
| ----------------------------- | -------------------------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------- |
| Throughput | >5 gigagas/s sustained | Internal devnet, 40 nodes across 20 regions | [Whitepaper v2.0](https://arxiv.org/abs/2505.14914) (June 2026) |
-| Ordering finality | <250 ms | Same devnet (v1 reported <400 ms; Feb 2025 devnet ~700 ms across 4 regions) | Whitepaper v2.0 (June 2026) |
+| Ordering finality | <250 ms | Same devnet (v1 reported <400 ms, and the Feb 2025 devnet ~700 ms across 4 regions) | Whitepaper v2.0 (June 2026) |
| Consensus cadence | 1.5 round trips (vs 3 in Tendermint) | Effective steady-state cadence under Autobahn pipelining, not per-transaction latency | Whitepaper §1.1 and §3.4 (2026) |
-| Throughput vs Tendermint | >50× | Autobahn vs single-proposer Tendermint | Whitepaper §1.1 (2026); see also the [Autobahn explainer](https://blog.sei.io/autobahn-sei-gigas-multi-proposer-approach-to-blockchain-consensus) (Apr 2025) |
+| Throughput vs Tendermint | >50× | Autobahn vs single-proposer Tendermint | Whitepaper §1.1 (2026). See also the [Autobahn explainer](https://blog.sei.io/autobahn-sei-gigas-multi-proposer-approach-to-blockchain-consensus) (Apr 2025) |
| Block production | ~70× (180 blocks vs 2.5) | Multi-Proposer lanes vs single proposer | Whitepaper §1.1 (2026) |
| Parallelizable EVM workload | 64.85% | Historical Ethereum transactions | [Sei research](https://blog.sei.io/research-64-85-of-ethereum-transactions-can-be-parallelized/) (2024) |
| Autobahn testnet target | 200,000 TPS, 400 ms finality | Public testnet milestone | [giga.seilabs.io](https://giga.seilabs.io) (May 2026) |
@@ -178,23 +180,23 @@ Each row carries its source and date. Devnet figures are Sei Labs' internal meas
## Learn more
-
+
The full protocol spec: Autobahn, asynchronous execution, storage, MEV and fee design, security model, and glossary.
-
- What will change for contracts and apps: finality semantics, fees, proofs, and parallel-friendly patterns.
+
+ What will change for contracts and dApps: finality semantics, fees, proofs, and parallel-friendly patterns.
-
- The canonical specification on arXiv (Marsh, Landers, Jog, Ranchal-Pedrosa; June 2026).
+
+ The canonical specification on arXiv, by Marsh, Landers, Jog, and Ranchal-Pedrosa (June 2026).
-
+
Live milestone tracker for the Giga upgrade.
-
+
The EVM-only consolidation that clears the path to Giga.
-
- Twin Turbo consensus, the parallelization engine, and SeiDB: the system Giga will supersede.
+
+ Twin Turbo Consensus, the parallelization engine, and SeiDB: the system that Giga will replace.
diff --git a/learn/seidb.mdx b/learn/seidb.mdx
index 172ba02..23b8690 100644
--- a/learn/seidb.mdx
+++ b/learn/seidb.mdx
@@ -6,125 +6,125 @@ keywords: ['seidb', 'blockchain database', 'state storage', 'ethereum optimizati
---
## Introduction
-SeiDB is a specialized database system designed to optimize blockchain state storage for the Ethereum Virtual Machine (EVM). It addresses fundamental performance constraints in traditional blockchain storage systems through targeted optimizations for EVM's specific state access patterns. This document explains the technical design and key components of SeiDB.
+SeiDB is a specialized database system designed to optimize blockchain state storage for the Ethereum Virtual Machine (EVM). It addresses fundamental performance constraints in traditional blockchain storage systems with optimizations that target the EVM's specific state access patterns. This page explains the technical design and main components of SeiDB.
-## Core Technical Design
+## Core technical design
-Traditional blockchain databases store state in structures optimized for cryptographic verification rather than transaction execution speed. SeiDB uses a hybrid architecture that preserves cryptographic verifiability while accelerating state access operations.
+Traditional blockchain databases store state in structures optimized for cryptographic verification, not for transaction execution speed. SeiDB uses a hybrid architecture that keeps cryptographic verifiability and also speeds up state access.
-Key design goals include:
+The design goals include:
- Minimizing storage slot access latency even at peak load
- Maximizing state operation throughput for both reads and writes
- Enabling parallel execution for non-conflicting state operations
- Maintaining consistent performance under variable workloads
-## System Architecture
+## System architecture
SeiDB implements a multi-layered architecture optimized for EVM state management:
-**SeiDB Core**
+**SeiDB core**
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-Each component in this architecture addresses specific performance bottlenecks found in traditional blockchain storage systems. The integrated design enables specialized optimization at each level while maintaining a cohesive system.
+Each component in this architecture addresses specific performance bottlenecks in traditional blockchain storage systems. The integrated design supports specialized optimization at each level and keeps the system cohesive.
-### EVM-Optimized Storage Engine
+### EVM-optimized storage engine
-The storage engine forms the foundation of SeiDB and represents its most significant departure from traditional blockchain state databases. While standard Ethereum implementations use a single Merkle Patricia Trie for all storage, SeiDB employs a hybrid approach combining cryptographic verification with performance optimizations from modern database systems.
+The storage engine is the foundation of SeiDB and its biggest departure from traditional blockchain state databases. Standard Ethereum implementations use a single Merkle Patricia Trie for all storage. SeiDB instead uses a hybrid approach that combines cryptographic verification with performance optimizations from modern database systems.
-Key technical innovations include:
+The main techniques include:
-- **Enhanced Merkle Patricia Trie**: The implementation preserves cryptographic properties required for consensus validation while addressing performance bottlenecks. SeiDB's node caching dramatically reduces I/O overhead. Hot nodes remain in memory through a priority retention system that analyzes access frequency and recency patterns across multiple blocks.
+- **Enhanced Merkle Patricia Trie**: The implementation keeps the cryptographic properties that consensus validation requires and also addresses performance bottlenecks. SeiDB's node caching greatly reduces I/O overhead. A priority retention system keeps hot nodes in memory. It analyzes access frequency and recency patterns across multiple blocks.
-- **Incremental State Root Calculation**: The system employs specialized techniques that avoid recalculating entire trie branches when only leaf nodes change. This method accelerates block finalization for blocks with transactions affecting different state areas. The calculation process intelligently reuses intermediate hash values from unchanged subtrees, allowing rapid state root derivation even after thousands of storage modifications.
+- **Incremental state root calculation**: The system uses specialized techniques that avoid recalculating entire trie branches when only leaf nodes change. This method speeds up finalization for blocks whose transactions affect different state areas. The calculation reuses intermediate hash values from unchanged subtrees. The system can then derive the state root quickly, even after thousands of storage modifications.
-- **Direct Storage Slot Indexing**: SeiDB provides mapping between composite keys (address + slot) and their storage location. This technique reduces lookup complexity from O(log n) to near-constant time for most operations. The indexing system maintains consistency through a dual-update mechanism that modifies both the index and underlying trie atomically.
+- **Direct storage slot indexing**: SeiDB maps composite keys (address + slot) to their storage location. This technique reduces lookup complexity from O(log n) to near-constant time for most operations. The indexing system stays consistent through a dual-update mechanism that modifies both the index and the underlying trie atomically.
-- **Account-Level Optimizations**: The system applies different strategies to external accounts (user wallets) and contract accounts. Contract accounts receive specialized treatment with code caching and execution context preservation. The code caching mechanism exploits the immutability of contract bytecode once deployed, keeping frequently accessed contracts in memory with custom deserialization to minimize runtime overhead.
+- **Account-level optimizations**: The system applies different strategies to external accounts (user wallets) and contract accounts. Contract accounts get specialized treatment with code caching and execution context preservation. The code caching mechanism relies on contract bytecode being immutable after deployment. It keeps frequently accessed contracts in memory, with custom deserialization to minimize runtime overhead.
-- **Optimized Bloom Filters**: The storage engine accelerates negative lookups (checking for non-existent keys) during contract execution. These filters use multi-layer filtering with dynamic sizing based on the active working set to minimize false positives during typical workloads.
+- **Optimized Bloom filters**: The storage engine speeds up negative lookups (checks for non-existent keys) during contract execution. These filters use multi-layer filtering, sized dynamically to the active working set, to minimize false positives during typical workloads.
-### Multi-Level Cache Architecture
+### Multi-level cache architecture
-The caching system implements multiple specialized caches optimized for particular EVM access patterns, unlike general-purpose databases that employ uniform caching strategies.
+The caching system has multiple specialized caches, each optimized for particular EVM access patterns. General-purpose databases, by contrast, use uniform caching strategies.
The system includes:
-- **Hot Slot Cache**: This component maintains frequently used storage slots in memory using a frequency-recency hybrid eviction policy tuned for blockchain workloads. This adaptive approach achieves improved hit rates compared to static caching policies. The cache intelligently separates frequently accessed slots from burst-access slots to prevent cache thrashing during high-intensity operations.
+- **Hot slot cache**: This component keeps frequently used storage slots in memory. It uses a frequency-recency hybrid eviction policy tuned for blockchain workloads. This adaptive approach gets better hit rates than static caching policies. The cache separates frequently accessed slots from burst-access slots to prevent cache thrashing during high-intensity operations.
-- **Account State Cache**: This cache maintains complete information for recently accessed addresses, including code, balance, nonce, and metadata. It implements predictive loading based on transaction analysis for improved hit rates during smart contract interactions. The predictive engine analyzes calldata patterns and historical interaction graphs to preload likely-to-be-accessed contract accounts.
+- **Account state cache**: This cache keeps complete information for recently accessed addresses, including code, balance, nonce, and metadata. It uses predictive loading, based on transaction analysis, to improve hit rates during smart contract interactions. The predictive engine analyzes calldata patterns and historical interaction graphs to preload contract accounts that are likely to be accessed.
-- **Execution Context Cache**: This specialized cache preserves partial execution environments for frequently called contracts. When the same contract executes repeatedly with similar call patterns, this contextual caching reduces setup overhead compared to cold execution. The context includes pre-validated jump destinations, resolved address references, and warmed storage slots.
+- **Execution context cache**: This specialized cache preserves partial execution environments for frequently called contracts. When the same contract executes repeatedly with similar call patterns, this contextual caching reduces setup overhead compared to cold execution. The context includes pre-validated jump destinations, resolved address references, and warmed storage slots.
-### Concurrency Management
+### Concurrency management
-SeiDB's concurrency control system employs optimistic concurrency control (OCC) adapted specifically for EVM's state access patterns. The system incorporates semantic knowledge of common smart contract behavior to minimize conflicts.
+SeiDB's concurrency control system uses optimistic concurrency control (OCC), adapted specifically for the EVM's state access patterns. The system applies semantic knowledge of common smart contract behavior to minimize conflicts.
The transaction execution process follows these steps:
-1. Analysis of transaction targets, calldata patterns, and historical access data to create an initial dependency graph
-2. Parallel execution of transactions without overlapping state dependencies in isolated worker threads
-3. Monitoring of actual storage accesses during execution to identify conflicts against predictions
-4. Selective reexecution of minimal conflict sets in sequential order when conflicts occur
+1. The system analyzes transaction targets, calldata patterns, and historical access data to create an initial dependency graph.
+2. Transactions without overlapping state dependencies execute in parallel, in isolated worker threads.
+3. The system monitors the actual storage accesses during execution and compares them with the predictions to identify conflicts.
+4. When conflicts occur, the system re-executes only the minimal conflict sets, in sequential order.
-For common operations like token transfers, SeiDB applies specialized conflict handlers that understand operation semantics. The semantic analysis identifies token sender and recipient addresses from calldata and method signatures. This understanding reduces false conflicts for common ERC-20 token operations.
+For common operations such as token transfers, SeiDB applies specialized conflict handlers that understand operation semantics. The semantic analysis identifies token sender and recipient addresses from calldata and method signatures. This understanding reduces false conflicts for common ERC-20 token operations.
-The worker pool adjusts parallelism dynamically based on observed conflict rates. During periods with few conflicts, the system increases worker count to maximize throughput. When conflict rates rise, it reduces parallelism to avoid wasting resources on speculative execution that might require reversion. The scheduler incorporates a feedback loop that monitors aborted transactions and adjusts the parallelism factor within milliseconds of detecting changing workload patterns.
+The worker pool adjusts parallelism dynamically based on observed conflict rates. During periods with few conflicts, the system increases worker count to maximize throughput. When conflict rates rise, it reduces parallelism to avoid wasting resources on speculative execution that might need to be reverted. The scheduler has a feedback loop that monitors aborted transactions. The loop adjusts the parallelism factor within milliseconds after it detects a change in workload patterns.
-### I/O Optimization
+### I/O optimization
-SeiDB implements storage I/O optimizations designed specifically for blockchain workloads, which typically involve append-heavy state changes.
+SeiDB implements storage I/O optimizations designed specifically for blockchain workloads. These workloads typically involve append-heavy state changes.
-Key optimization techniques include:
+The main optimization techniques include:
-- **Log-Structured Storage**: The system organizes state into multiple levels, with recent changes in memory and older state in progressively larger but slower storage tiers. This architecture transforms random writes into sequential operations, improving write throughput. The storage layer maintains a memory-resident delta table that captures recent modifications and periodically flushes these changes to persistent storage in optimized batches.
+- **Log-structured storage**: The system organizes state into multiple levels. Recent changes stay in memory, and older state moves to progressively larger but slower storage tiers. This architecture turns random writes into sequential operations to improve write throughput. The storage layer keeps a memory-resident delta table that captures recent modifications. It periodically flushes these changes to persistent storage in optimized batches.
-- **Priority-Based I/O Scheduling**: The I/O subsystem prioritizes operations based on critical path status. State reads required for transaction validation receive highest priority, followed by state updates, and background operations receive lowest priority. The scheduler also employs operation batching techniques that combine multiple small I/O operations into more efficient larger operations.
+- **Priority-based I/O scheduling**: The I/O subsystem prioritizes operations based on whether they are on the critical path. State reads that transaction validation requires get the highest priority. State updates come next, and background operations get the lowest priority. The scheduler also batches operations: it combines multiple small I/O operations into larger, more efficient ones.
-- **State Versioning**: SeiDB uses multi-version concurrency control designed for blockchain's block-based execution model. Each block creates a new state version, using full state snapshots at epoch boundaries and delta encoding between intermediate blocks. The versioning system enables point-in-time queries against historical state with minimal storage overhead through a combination of differential storage and periodic compaction.
+- **State versioning**: SeiDB uses multi-version concurrency control designed for the block-based execution model of blockchains. Each block creates a new state version. Versions use full state snapshots at epoch boundaries and delta encoding for the blocks in between. The versioning system supports point-in-time queries against historical state. Differential storage and periodic compaction keep the storage overhead minimal.
-- **Configurable Persistence**: The database offers adjustable durability guarantees based on node type and network requirements, from fully synchronous writes to asynchronous persistence with periodic checkpoints. The configuration system allows operators to make explicit tradeoffs between performance and durability based on their specific node's role in the network.
+- **Configurable persistence**: The database has adjustable durability guarantees, based on node type and network requirements. The options range from fully synchronous writes to asynchronous persistence with periodic checkpoints. The configuration system lets operators make explicit tradeoffs between performance and durability, based on the role of their node in the network.
-## Performance Characteristics
+## Performance characteristics
-SeiDB is designed to deliver substantial performance improvements compared to traditional EVM state implementations. The architecture focuses on enhancing both throughput and latency across various operation types.
+SeiDB is designed for substantial performance improvements over traditional EVM state implementations. The architecture aims to improve both throughput and latency across various operation types.
-**Note:** Performance characteristics described in this section represent design targets rather than verified benchmarks. Actual performance will vary based on hardware configuration, workload patterns, and network conditions. Production deployments should conduct their own benchmarking to validate performance in their specific environment.
+The performance characteristics in this section are design targets, not verified benchmarks. Actual performance will vary with hardware configuration, workload patterns, and network conditions. Production deployments should run their own benchmarks to validate performance in their specific environment.
-### Storage Operation Throughput
+### Storage operation throughput
-SeiDB is architected to significantly improve operation throughput across all major storage operation categories, particularly for storage reads and account lookups. These improvements result from architectural innovations rather than hardware scaling, with performance gains across all operation types.
+SeiDB is designed to significantly improve throughput across all major categories of storage operations, particularly storage reads and account lookups. These improvements come from the architecture, not from hardware scaling, and the performance gains apply to all operation types.
-### Latency Profile
+### Latency profile
-The system is designed to maintain consistent low latency across different load conditions, from low to peak usage. This latency stability represents one of SeiDB's most significant advantages for applications requiring predictable performance. The system aims to maintain relatively stable response times even at high utilization levels, unlike traditional implementations that may exhibit severe latency spikes during high network activity.
+The system is designed to keep latency consistently low across different load conditions, from low to peak usage. For applications that need predictable performance, this stable latency is one of SeiDB's most significant advantages. The system aims to keep response times relatively stable even at high load. Traditional implementations, by contrast, may show severe latency spikes during high network activity.
-## Optimization Patterns
+## Optimization patterns
-Understanding certain storage access patterns allows developers to take maximum advantage of SeiDB's architecture. While existing contracts work without modification, those designed with these patterns achieve even greater performance.
+If you understand certain storage access patterns, you can take full advantage of SeiDB's architecture. Existing contracts work without modification, but contracts designed with these patterns perform even better.
-### Localized Storage Access
+### Localized storage access
-SeiDB's caching mechanisms work most effectively when related data exists in localized regions:
+SeiDB's caching mechanisms work best when related data is stored in localized regions:
```solidity
// Suboptimal: Random storage access pattern
@@ -150,11 +150,11 @@ contract OptimizedStorage {
}
```
-In the optimized version, related values cluster under common bucket keys. This organization aligns with SeiDB's caching strategy, which loads entire buckets into memory as a unit. The pattern improves performance compared to randomized access, particularly for operations processing many values in a single transaction.
+In the optimized version, related values cluster under common bucket keys. This organization matches SeiDB's caching strategy, which loads entire buckets into memory as a unit. The pattern performs better than randomized access, particularly for operations that process many values in a single transaction.
-### Contention Reduction
+### Contention reduction
-Smart contracts handling high transaction volumes benefit from storage designs that minimize contentious storage locations:
+Smart contracts that handle high transaction volumes benefit from storage designs that minimize contention on storage locations:
```solidity
// Suboptimal: High contention design
@@ -190,28 +190,28 @@ contract LowContentionContract {
}
```
-The optimized contract shards the counter across time-based buckets, dramatically reducing contention when multiple transactions execute concurrently. SeiDB's concurrency control system recognizes these sharded patterns and executes transactions affecting different shards in parallel. This approach increases throughput for high-volume contracts during peak load conditions.
+The optimized contract shards the counter across time-based buckets. This greatly reduces contention when multiple transactions execute concurrently. SeiDB's concurrency control system recognizes these sharded patterns and executes transactions that affect different shards in parallel. This approach increases throughput for high-volume contracts during peak load conditions.
-## Technical Integration
+## Technical integration
-### EVM Compatibility
+### EVM compatibility
-SeiDB maintains complete compatibility with the Ethereum protocol specifications while delivering performance enhancements:
+SeiDB keeps complete compatibility with the Ethereum protocol specifications while it improves performance:
- Full support for all EVM opcodes and precompiled contracts
- Identical state transition logic to standard Ethereum implementations
- Consistent gas cost model for all operations
- Complete compatibility with JSON-RPC API endpoints
-These compatibility guarantees ensure existing smart contracts, development tools, and infrastructure components work without modification. The system undergoes extensive compatibility testing against the official Ethereum test suites to verify identical results compared to reference implementations.
+Because of these compatibility guarantees, existing smart contracts, development tools, and infrastructure components work without modification. The system goes through extensive compatibility testing against the official Ethereum test suites. The tests verify that results are identical to the reference implementations.
-### Deployment Configurations
+### Deployment configurations
SeiDB's architecture supports various deployment configurations optimized for different node roles:
- **Validator nodes** prioritize state consistency and durability through synchronous I/O operations and redundant state verification
-- **API service nodes** optimize for query throughput and low latency responses with larger cache allocations and specialized read paths
-- **Archive nodes** employ specialized storage strategies for efficient historical state access, including custom indexing for time-based queries
+- **API service nodes** optimize for query throughput and low-latency responses with larger cache allocations and specialized read paths
+- **Archive nodes** use specialized storage strategies for efficient historical state access, including custom indexing for time-based queries
- **Light clients** benefit from optimized state proof generation with compact inclusion proofs for partial state verification
-Each configuration tunes the SeiDB components to match specific requirements while maintaining protocol compatibility. The configuration framework provides fine-grained control over cache sizes, worker pools, I/O policies, and persistence strategies to match the operational needs of different node types.
+Each configuration tunes the SeiDB components to specific requirements and keeps protocol compatibility. The configuration framework gives fine-grained control over cache sizes, worker pools, I/O policies, and persistence strategies to match the operational needs of different node types.
diff --git a/learn/sip-03-exchange-migration.mdx b/learn/sip-03-exchange-migration.mdx
index d40816f..7b50d4b 100644
--- a/learn/sip-03-exchange-migration.mdx
+++ b/learn/sip-03-exchange-migration.mdx
@@ -4,77 +4,80 @@ description: 'Practical steps and resources for users and exchanges migrating du
keywords: ['SIP-03', 'migration', 'asset transfer', 'USDC on Sei', 'Keplr', 'Leap', 'Compass', 'EVM wallet', 'exchange migration', 'FundsForwarder', 'address association']
---
-This section is for exchanges, custodians, and other service providers that currently support SEI token deposits and withdrawals using native (`sei1...`) addresses. It explains what SIP-03 changes, the options available for migrating customer holdings to EVM (`0x...`) addresses, and the timeline by which migration must be complete.
+This guide is for exchanges, custodians, and other service providers that currently support SEI token deposits and withdrawals with native (`sei1...`) addresses. It explains what SIP-03 changes, the options to migrate customer holdings to EVM (`0x...`) addresses, and the date by which the migration must be complete.
-**IBC is already disabled in both directions.** Proposals [#116](https://seistream.app/proposals/116) and [#120](https://seistream.app/proposals/120) disabled inbound IBC, and [#121](https://seistream.app/proposals/121) disabled outbound IBC on July 31, 2026. No asset can be bridged into or out of Sei over IBC, so IBC is not available as a route for moving customer funds off Sei, and IBC-bridged assets held on Sei can no longer be redeemed on their origin chain. See [IBC is disabled](/learn/sip-03-migration#ibc-is-disabled).
+**IBC is already disabled in both directions.** Proposals [#116](https://seistream.app/proposals/116) and [#120](https://seistream.app/proposals/120) disabled inbound IBC, and [#121](https://seistream.app/proposals/121) disabled outbound IBC on July 31, 2026. No asset can be bridged into or out of Sei over IBC. As a result, IBC is not available as a route to move customer funds off Sei. IBC-bridged assets held on Sei can no longer be redeemed on their origin chain. See [IBC is disabled](/learn/sip-03-migration#ibc-is-disabled).
-The migration options below move funds between the native and EVM sides of Sei. They are intra-chain and are not affected by the IBC parameters.
+The migration options below move funds between the native and EVM sides of Sei. They are intra-chain, and the IBC parameters do not affect them.
### What SIP-03 changes
-For exchanges, the practical implication of the SIP-03 migration is that any integration treating "Sei" (native) and "Sei EVM" as two separate chains needs to be reconciled into a single integration before the Cosmos shutdown. Every native address (`sei1...`) on Sei has a corresponding EVM address (`0x...`) on the same chain. This is not two distinct chains or wallets, it is one chain with two ways to interact with it.
+SIP-03 has a practical implication for exchanges. Any integration that treats "Sei" (native) and "Sei EVM" as two separate chains needs to be merged into one integration before the Cosmos shutdown. Every native address (`sei1...`) on Sei has a corresponding EVM address (`0x...`) on the same chain. Native and EVM are not two distinct chains or wallets. They are two ways to interact with one chain.
### Migration options
-There are four ways an exchange/custodian can migrate customer holdings to EVM.
+An exchange or custodian can migrate customer holdings to EVM in four ways.
#### 1) Combine native and EVM access points
-The exchange surfaces the EVM (`0x...`) address corresponding to each existing native (`sei1...`) wallet directly to the customer. Each `sei1...` address has exactly one corresponding `0x...` address, determined by the public key the addresses are derived from. They are not freely pairable, and association does not create the pairing, it only registers it onchain. Because the pairing already exists at the keypair level, no funds need to move.
+The exchange directly shows the customer the EVM (`0x...`) address that corresponds to each existing native (`sei1...`) wallet. Each `sei1...` address has exactly one corresponding `0x...` address. The public key that both addresses are derived from determines the pair. The addresses cannot be paired freely, and association does not create the pairing. It only registers the pairing on-chain. Because the pairing already exists at the keypair level, no funds need to move.
-This is the cleanest path and requires no customer action. It does require the exchange to:
+This is the cleanest path, and the customer does not need to take any action. It does require the exchange to:
- Derive or look up the EVM address for each native wallet under management.
-- Ensure the native and EVM addresses are associated on-chain (see [Address association](#address-association) below).
+- Make sure that the native and EVM addresses are associated on-chain (see [Address association](#address-association) below).
- Update internal accounting and customer-facing UI to present the EVM address as the canonical Sei address.
#### 2) Automated forwarding contract
-The exchange uses a `FundsForwarder` smart contract to programmatically move customer funds from the native side to the customer's EVM wallet on the exchange. The exchange handles deployment and triggering; the customer sees the funds arrive at the new address without taking any action themselves.
+The exchange uses a `FundsForwarder` smart contract to move customer funds programmatically from the native side to the customer's EVM wallet on the exchange. The exchange deploys and triggers the contract. The customer does not take any action and sees the funds arrive at the new address.
-This is appropriate when the exchange cannot or does not want to expose EVM addresses for existing native wallets directly, but is willing to operate the migration itself.
+This option is appropriate if both of these conditions are true:
+
+- The exchange cannot, or does not want to, expose EVM addresses for existing native wallets directly.
+- The exchange is willing to operate the migration itself.
#### 3) User-directed forwarding contract
-The exchange notifies customers of the change and directs them to the `FundsForwarder` contract address. Customers initiate the transfer themselves; this action triggers the contract to automatically forward funds to the appropriate EVM wallet on the exchange.
+The exchange notifies customers of the change and directs them to the `FundsForwarder` contract address. Customers start the transfer themselves. This action triggers the contract, which forwards the funds automatically to the appropriate EVM wallet on the exchange.
-This is functionally similar to option 2 but pushes the trigger action onto the customer. It is appropriate when the exchange cannot operate the contract directly but wants to provide an automated destination.
+This option is functionally similar to option 2, but the customer performs the trigger action. It is appropriate when the exchange cannot operate the contract directly but wants to offer an automated destination.
#### 4) Fully manual transfer
-The exchange notifies customers of the change and asks them to manually withdraw funds to a self-custodial wallet and then redeposit them to the EVM address provided by the exchange.
+The exchange notifies customers of the change and asks them to move their funds manually. Customers withdraw the funds to a self-custodial wallet and then redeposit them to the EVM address that the exchange gives them.
### Address association
-The first two options depend on the exchange's native and EVM addresses being **associated** on-chain. Association is the explicit on-chain link between a `sei1...` address and its corresponding `0x...` address. Without it, the chain cannot recognize that the two addresses belong to the same account, and funds held under the native address will not be accessible via EVM after support for CosmWasm is deprecated.
+The first two options require the exchange's native and EVM addresses to be **associated** on-chain. Association is the explicit on-chain link between a `sei1...` address and its corresponding `0x...` address. Without it, the chain cannot recognize that the two addresses belong to the same account. After support for CosmWasm is deprecated, funds held under the native address will not be accessible through EVM.
-**Address association must be completed prior to deprecation. After that point, there is no mechanism to associate addresses.**
+**Complete address association before deprecation. After that point, there is no mechanism to associate addresses.**
-For details on how to query association status and the methods for associating addresses, see [Accounts](/learn/accounts).
+For details on how to query association status and how to associate addresses, see [Accounts](/learn/accounts).
### FundsForwarder contract
-The `FundsForwarder` is a one-way smart contract that accepts deposits at a native (`sei1...`) address and forwards the full balance to a pre-configured EVM (`0x...`) destination address. It is the underlying mechanism for options 2 and 3 above.
+The `FundsForwarder` is a one-way smart contract. It accepts deposits at a native (`sei1...`) address and forwards the full balance to a pre-configured EVM (`0x...`) destination address. It is the underlying mechanism for options 2 and 3 above.
Key properties:
-- The destination address is fixed at deployment and cannot be changed. Funds can only be forwarded to that address.
-- The contract accepts deposits via native `sei1...` transfers and forwards the full balance to the configured `0x...` destination.
-- The `FundsForwarder` was audited by OtterSec.
+- The destination address is fixed at deployment and cannot be changed. Funds can be forwarded only to that address.
+- The contract accepts deposits through native `sei1...` transfers and forwards the full balance to the configured `0x...` destination.
+- OtterSec audited the `FundsForwarder`.
### Migration milestone
-IBC has already been disabled, in both directions, by Proposals [#116](https://seistream.app/proposals/116), [#120](https://seistream.app/proposals/120), and [#121](https://seistream.app/proposals/121). Address association must still be completed prior to deprecation of the remaining Cosmos and CosmWasm functionality, slated for **June 15, 2026**. After deprecation:
+Proposals [#116](https://seistream.app/proposals/116), [#120](https://seistream.app/proposals/120), and [#121](https://seistream.app/proposals/121) have already disabled IBC in both directions. Address association must still be completed before the remaining Cosmos and CosmWasm functionality is deprecated. The deprecation is scheduled for **June 15, 2026**. After deprecation:
- Exchanges and their users will not be able to access or transfer funds.
-- Cosmos-native transaction interfaces will no longer be available. Exchanges will not be able to broadcast Cosmos-format transactions, sign with Cosmos key derivations against the live chain, or interact with the chain through Cosmos RPC endpoints.
+- Cosmos-native transaction interfaces will no longer be available. Exchanges will not be able to broadcast Cosmos-format transactions or sign with Cosmos key derivations against the live chain. They also will not be able to interact with the chain through Cosmos RPC endpoints.
- Address associations can no longer be created through a Cosmos wallet.
-- The `FundsForwarder` pattern will no longer function for new deposits.
+- The `FundsForwarder` pattern will no longer work for new deposits.
### Support
-For technical questions about exchange migration, contact the Sei Labs team via the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) or [Discord](https://discord.com/invite/sei).
+For technical questions about exchange migration, contact the Sei Labs team through the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) or [Discord](https://discord.com/invite/sei).
diff --git a/learn/sip-03-migration.mdx b/learn/sip-03-migration.mdx
index 986fd1d..e0111b1 100644
--- a/learn/sip-03-migration.mdx
+++ b/learn/sip-03-migration.mdx
@@ -10,13 +10,13 @@ keywords: ['SIP-03', 'migration', 'asset transfer', 'USDC on Sei', 'Keplr', 'Lea
[Proposal #121](https://seistream.app/proposals/121) passed on July 31, 2026 and set the `ibc` module's `OutboundEnabled` parameter to `false`. Inbound IBC was already disabled by [Proposal #116](https://seistream.app/proposals/116) and [Proposal #120](https://seistream.app/proposals/120). Both directions are now closed.
-If you hold [USDC.n](https://seiscan.io/address/0x3894085Ef7Ff0f0aeDf52E2A2704928d1Ec074F1) (USDC via Noble), [USDT.kava](https://seiscan.io/address/0xb75d0b03c06a926e488e2659df1a861f860bd3d1) (Kava USDT), ATOM, WBTC, or any other IBC asset on Sei, **there is no longer a route to redeem or bridge it back to its origin chain**. The bridge-out and IBC-based migration routes that were previously available no longer function.
+If you hold any IBC asset on Sei, **there is no longer a route to redeem or bridge it back to its origin chain**. This includes [USDC.n](https://seiscan.io/address/0x3894085Ef7Ff0f0aeDf52E2A2704928d1Ec074F1) (USDC via Noble), [USDT.kava](https://seiscan.io/address/0xb75d0b03c06a926e488e2659df1a861f860bd3d1) (Kava USDT), ATOM, and WBTC. The bridge-out and IBC-based migration routes that were available before no longer work.
-These balances still exist on Sei and can still be transferred between Sei addresses, but they can no longer be redeemed for the underlying asset. See [IBC is disabled](#ibc-is-disabled) for the current state and [Affected IBC assets](#affected-ibc-assets) for the status of each one.
+These balances still exist on Sei and can still be transferred between Sei addresses. However, they can no longer be redeemed for the underlying asset. For the current state, see [IBC is disabled](#ibc-is-disabled). For the status of each asset, see [Affected IBC assets](#affected-ibc-assets).
-This page consolidates the most important, practical actions for the SIP-03 migration and links to the official resources.
+This page lists the most important practical actions for the SIP-03 migration, with links to the official resources.
@@ -24,26 +24,26 @@ For the full proposal text, see:
- The [official SIP-03](https://github.com/sei-protocol/sips/blob/main/sips/sip-3.md)
-- Governance [Proposal #99](https://seistream.app/proposals/99) — initiated the migration
+- Governance [Proposal #99](https://seistream.app/proposals/99): started the migration.
-- Governance [Proposal #115](https://seistream.app/proposals/115) — disabled CosmWasm code uploads and contract instantiations. No new CosmWasm contracts can be deployed on Sei.
+- Governance [Proposal #115](https://seistream.app/proposals/115): disabled CosmWasm code uploads and contract instantiations. No new CosmWasm contracts can be deployed on Sei.
-- Governance [Proposal #116](https://seistream.app/proposals/116) — disabled inbound IBC transfers by setting the `ibc` module's `InboundEnabled` parameter to `false`. IBC assets bridged from Cosmos chains can no longer arrive on Sei.
+- Governance [Proposal #116](https://seistream.app/proposals/116): disabled inbound IBC transfers by setting the `ibc` module's `InboundEnabled` parameter to `false`. IBC assets bridged from Cosmos chains can no longer arrive on Sei.
-- Governance [Proposal #120](https://seistream.app/proposals/120) — re-set `InboundEnabled` to `false`, leaving outbound IBC unchanged at the time. Follows up on Proposal #116.
+- Governance [Proposal #120](https://seistream.app/proposals/120): set `InboundEnabled` to `false` again, as a follow-up to Proposal #116. Outbound IBC was unchanged at the time.
-- Governance [Proposal #121](https://seistream.app/proposals/121) — disabled outbound IBC transfers by setting the `ibc` module's `OutboundEnabled` parameter to `false`. IBC assets can no longer leave Sei. Passed July 31, 2026.
+- Governance [Proposal #121](https://seistream.app/proposals/121): disabled outbound IBC transfers by setting the `ibc` module's `OutboundEnabled` parameter to `false`. IBC assets can no longer leave Sei. It passed on July 31, 2026.
## What most users need to do
-- If you use Keplr or Leap (Cosmos-style wallets) and hold assets on the native address (sei1...), you should move assets to an EVM-compatible address (0x...). Use the Asset Transfer tool linked below.
-- If you use Compass or another EVM wallet already, you’re good — continue as normal.
+- If you use Keplr or Leap (Cosmos-style wallets), move any assets on the native address (sei1...) to an EVM-compatible address (0x...). Use the Asset Transfer tool linked below.
+- If you already use Compass or another EVM wallet, you do not need to do anything. Continue as normal.
## IBC is disabled
-IBC (Inter-Blockchain Communication) is the Cosmos protocol that moved tokens between Sei and other Cosmos-SDK chains such as Noble, Kava, and Cosmos Hub. Assets that arrived this way exist on Sei as vouchers: an `ibc/...` denom in the bank module, backed by the real asset escrowed on the origin chain, redeemable only by sending the voucher back over the same channel it came in on.
+IBC (Inter-Blockchain Communication) is the Cosmos protocol that moved tokens between Sei and other Cosmos-SDK chains such as Noble, Kava, and Cosmos Hub. Assets that arrived this way exist on Sei as vouchers. A voucher is an `ibc/...` denom in the bank module, backed by the real asset escrowed on the origin chain. The only way to redeem a voucher is to send it back over the same channel that it came in on.
Both directions are now closed. Two parameters on Sei's `ibc` module control this, and both are `false`:
@@ -52,7 +52,7 @@ Both directions are now closed. Two parameters on Sei's `ibc` module control thi
| `InboundEnabled` | IBC transfers arriving on Sei | `false` |
| `OutboundEnabled` | IBC transfers leaving Sei | `false` |
-Each was set by a governance parameter change, which takes effect when the proposal executes. There is no separate upgrade or activation step. Inbound was closed first, by Proposals #116 and #120; outbound closed on July 31, 2026 with Proposal #121.
+Each parameter was set by a governance parameter change, which takes effect when the proposal executes. There is no separate upgrade or activation step. Inbound IBC was closed first, by Proposals #116 and #120. Outbound IBC closed on July 31, 2026, with Proposal #121.
| Proposal | Change | Effect |
| :---- | :---- | :---- |
@@ -68,17 +68,17 @@ Each was set by a governance parameter change, which takes effect when the propo
- Bridging any asset onto Sei over IBC.
- Bridging any asset off Sei over IBC, including sending a voucher back to its origin chain to redeem the underlying asset.
- IBC-based migration routes, such as sending USDC.n back to Noble to convert it to native USDC, or routing ATOM and WBTC out through Skip:Go.
-- The **IBC precompile** at `0x0000000000000000000000000000000000001009`. Its transfer methods cannot succeed and there is no replacement. Do not build against it.
+- The **IBC precompile** at `0x0000000000000000000000000000000000001009`. Its transfer methods cannot succeed, and there is no replacement. Do not build against it.
**Unaffected:**
- Native SEI transfers, staking, delegations, and rewards.
- The Sei EVM, ERC-20 tokens, and native and CW pointer contracts.
- Existing `ibc/...` balances in the bank module. They remain queryable and transferable between Sei addresses, including through their ERC-20 pointers. Only the redemption path off Sei is gone.
-- Already-deployed CosmWasm contracts, which can still be executed and queried. [Proposal #115](https://seistream.app/proposals/115) blocked only uploads and instantiations and is a separate change from the IBC parameters.
+- Already-deployed CosmWasm contracts, which can still be executed and queried. [Proposal #115](https://seistream.app/proposals/115) blocked only uploads and instantiations. It is a separate change from the IBC parameters.
-If you have an IBC transfer that was submitted but never completed, contact [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) or [Discord](https://discord.com/invite/sei). Do not assume a pending transfer will settle or refund on its own now that both directions are closed.
+If you have an IBC transfer that was submitted but never completed, contact [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) or [Discord](https://discord.com/invite/sei). Both directions are closed, so do not assume that a pending transfer will settle or refund on its own.
## Affected IBC assets
@@ -103,24 +103,24 @@ The Wormhole-bridged assets are not IBC vouchers and were not affected by Propos
- **Transfer within Sei.** These balances move normally between Sei addresses and through their ERC-20 pointer contracts.
- **Swap on a Sei DEX.** Swaps do not use IBC and still execute. These tokens can no longer be redeemed for the underlying asset, so the liquidity available for them is limited and may decline further. Check the quote before you trade.
-- **Contact support.** For anything else, including incomplete transfers and assets not listed above, reach out via [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) or [Discord](https://discord.com/invite/sei).
+- **Contact support.** For anything else, including incomplete transfers and assets not listed above, ask for help in [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) or [Discord](https://discord.com/invite/sei).
-The mention of third-party platforms does not constitute an endorsement. Users should do their own research before using any third-party service.
+The mention of third-party platforms does not constitute an endorsement. You should do your own research before you use any third-party service.
## Key tools and resources
-### 1) Asset Transfer (Native ↔ EVM)
+### 1) Asset Transfer (native ↔ EVM)
-- Use the official Sei Dashboard to move assets between native (Keplr/Leap/Fin) and EVM (MetaMask/Compass etc.) addresses: [Sei Dashboard Transfer](https://dashboard.sei.io/evm-upgrade) or the Bridge tab at [Sei Dashboard Bridge](https://dashboard.sei.io/bridge).
+- Use the official Sei Dashboard to move assets between native addresses (Keplr, Leap, Fin) and EVM addresses (MetaMask, Compass, and others). Go to [Sei Dashboard Transfer](https://dashboard.sei.io/evm-upgrade) or to the **Bridge** tab at [Sei Dashboard Bridge](https://dashboard.sei.io/bridge).
When to use this:
-- You used Keplr or Leap before and want assets available via an EVM wallet going forward.
-- You need to access tokens on apps that now expect an EVM (0x) address.
+- You used Keplr or Leap before, and you want your assets to be available in an EVM wallet from now on.
+- You need to access tokens in dApps that now expect an EVM (0x) address.
### 2) USDC on Sei
-Native USDC and Circle's CCTP V2 are now supported on Sei. USDC from Noble (USDC.n) is deprecated.
+Sei now supports native USDC and Circle's CCTP V2. USDC from Noble (USDC.n) is deprecated.
- QuickStart: [USDC on Sei](/evm/usdc-on-sei)
- Background: [USDC & CCTP v2 announcement](https://www.circle.com/blog/native-usdc-and-cctp-v2-are-coming-to-sei)
@@ -128,72 +128,72 @@ Native USDC and Circle's CCTP V2 are now supported on Sei. USDC from Noble (USDC
#### If you still hold USDC.n
-The route that sent USDC.n back to Noble to be reissued as native USDC required outbound IBC and **no longer works** as of [Proposal #121](https://seistream.app/proposals/121). USDC.n can no longer be redeemed through Noble or through Circle's CCTP.
+The route that sent USDC.n back to Noble to be reissued as native USDC required outbound IBC. As of [Proposal #121](https://seistream.app/proposals/121), this route **no longer works**. USDC.n can no longer be redeemed through Noble or through Circle's CCTP.
The only remaining option on Sei is an on-chain swap, which does not use IBC:
- [DragonSwap](https://dragonswap.app/) or [Symphony](https://symph.ag/?tokenIn=0x3894085ef7ff0f0aedf52e2a2704928d1ec074f1&tokenOut=0xe15fc38f6d8c56af07bbcbe3baf5708a2bf42392). Slippage depends on whatever liquidity remains for USDC.n.
-**For DeFi suppliers of USDC.n (Yei, Takara Lend, etc.):**
+**For DeFi suppliers of USDC.n (Yei, Takara Lend, and other protocols):**
-- Wind down and withdraw your positions if you have not already. Supplied USDC.n cannot be redeemed off Sei.
+- If you have not already done so, wind down and withdraw your positions. Supplied USDC.n cannot be redeemed off Sei.
-If you are holding a balance you cannot resolve this way, contact [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) or [Discord](https://discord.com/invite/sei).
+If you hold a balance that you cannot resolve this way, contact [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) or [Discord](https://discord.com/invite/sei).
-### 3) Address Association (Seistream)
+### 3) Address association (Seistream)
-[Seistream's SIP-03 migration page](https://seistream.app/migrate-sip03) links your EVM (`0x...`) and Cosmos (`sei1...`) addresses for the **native SEI token** in three guided steps. It is a community-built tool that streamlines the standard association flow.
+[Seistream's SIP-03 migration page](https://seistream.app/migrate-sip03) links your EVM (`0x...`) and Cosmos (`sei1...`) addresses for the **native SEI token** in three guided steps. It is a community-built tool that simplifies the standard association flow.
-Address association is the one-time, on-chain step that links your `0x...` and `sei1...` addresses so a single key controls both. It must be completed **before** the SIP-03 upgrade — afterward, Cosmos (`sei1...`) interfaces stop working and addresses can no longer be associated. See [Account Linking](/learn/accounts) for how association works under the hood.
+Address association is the one-time, on-chain step that links your `0x...` and `sei1...` addresses, so that a single key controls both. You must complete it **before** the SIP-03 upgrade. After the upgrade, Cosmos (`sei1...`) interfaces stop working, and addresses can no longer be associated. To learn how association works, see [Account Linking](/learn/accounts).
What the tool does:
-1. **Connect wallet** — connect any EVM wallet with an injected provider (MetaMask, Keplr, Rabby, Compass, Tangem, Trust Wallet, OKX, and most others).
-2. **Gas + association** — cover the small amount of SEI needed for gas (Seistream provides a mainnet faucet to help), then submit the transaction that associates your `0x...` and `sei1...` addresses on-chain. Any outgoing EVM transaction registers the link automatically.
-3. **Transfer from Cosmos** — send your existing native SEI from the old Cosmos wallet to the linked `sei1...` address, where it becomes spendable from your EVM wallet.
+1. **Connect wallet**: Connect any EVM wallet with an injected provider (MetaMask, Keplr, Rabby, Compass, Tangem, Trust Wallet, OKX, and most others).
+2. **Gas + association**: Cover the small amount of SEI needed for gas. Seistream has a faucet for Sei Mainnet to help with this. Then submit the transaction that associates your `0x...` and `sei1...` addresses on-chain. Any outgoing EVM transaction registers the link automatically.
+3. **Transfer from Cosmos**: Send your existing native SEI from the old Cosmos wallet to the linked `sei1...` address. The SEI then becomes spendable from your EVM wallet.
-This is a streamlined alternative to the manual association flow in [Migrating a hardware or mnemonic-only wallet](#migrating-a-hardware-or-mnemonic-only-wallet).
+This tool is a simpler alternative to the manual association flow in [Migrating a hardware or mnemonic-only wallet](#migrating-a-hardware-or-mnemonic-only-wallet).
-Seistream handles association for the **native SEI token only**. It does nothing for USDC.n, USDT.kava, ATOM, WBTC, or other IBC-bridged assets. See [Affected IBC assets](#affected-ibc-assets) for their status. Seistream is a third-party tool; its inclusion here is not an endorsement, and you should do your own research before connecting a wallet.
+Seistream handles association for the **native SEI token only**. It does nothing for USDC.n, USDT.kava, ATOM, WBTC, or other IBC-bridged assets. For their status, see [Affected IBC assets](#affected-ibc-assets). Seistream is a third-party tool, and its inclusion here is not an endorsement. You should do your own research before you connect a wallet.
## Migrating a hardware or mnemonic-only wallet
-If your wallet can export a raw private key, the simplest path is to import that key into an EVM wallet. A private key is independent of coin type, so it reproduces the same `0x...` and `sei1...` addresses in any wallet, and no funds need to move.
+If your wallet can export a raw private key, the simplest path is to import that key into an EVM wallet. A private key does not depend on the coin type. It gives the same `0x...` and `sei1...` addresses in any wallet, so you do not need to move any funds.
-If your wallet cannot export a private key, you can still migrate by moving your funds to a new EVM-native account, as described below.
+If your wallet cannot export a private key, you can still migrate: move your funds to a new EVM-native account, as described below.
### When private-key export isn't an option
-A raw private key always works, but two common setups do not provide one:
+A raw private key always works, but two common setups do not give you one:
-- **Mnemonic-only wallets.** Some wallets back up only a recovery phrase, not a raw private key. Sei's Cosmos (`sei1...`) accounts use coin type 118 (`m/44'/118'/0'/0/0`). Importing the same phrase into an EVM wallet such as MetaMask derives it on coin type 60 (`m/44'/60'/0'/0/0`), producing a different account with no access to the original funds. The underlying private key would import correctly if the wallet exposed it, but a mnemonic-only wallet does not.
-- **Hardware wallets (such as Ledger).** A Ledger does not export the private key or seed under any circumstances. It only allows switching between the Cosmos app (coin type 118) and the Ethereum app (coin type 60), which control separate accounts with different addresses. The Cosmos-app account cannot be used from an EVM wallet.
+- **Mnemonic-only wallets.** Some wallets back up only a recovery phrase, not a raw private key. Sei's Cosmos (`sei1...`) accounts use coin type 118 (`m/44'/118'/0'/0/0`). If you import the same phrase into an EVM wallet such as MetaMask, the wallet derives it on coin type 60 (`m/44'/60'/0'/0/0`). The result is a different account with no access to the original funds. The underlying private key would import correctly if the wallet exposed it, but a mnemonic-only wallet does not.
+- **Hardware wallets (such as Ledger).** A Ledger does not export the private key or seed under any circumstances. It only lets you switch between the Cosmos app (coin type 118) and the Ethereum app (coin type 60). These apps control separate accounts with different addresses. The Cosmos-app account cannot be used from an EVM wallet.
-For background, see [HD Paths and Coin Types](/learn/accounts#hd-paths-and-coin-types).
+For background, see [HD paths and coin types](/learn/accounts#hd-paths-and-coin-types).
### Migration steps
-This works because every account has exactly one EVM (`0x...`) address and one Cosmos (`sei1...`) address, both derived from the same key. Funds sent to the new account's `sei1...` address are therefore spendable from the EVM wallet that holds its `0x...` address.
+This procedure works because every account has exactly one EVM (`0x...`) address and one Cosmos (`sei1...`) address, both derived from the same key. Funds sent to the new account's `sei1...` address are therefore spendable from the EVM wallet that holds its `0x...` address.
-Prefer a guided flow? [Seistream's SIP-03 migration tool](https://seistream.app/migrate-sip03) walks through these same steps — connect an EVM wallet, cover gas, associate addresses, then transfer native SEI from the Cosmos side. See [Address Association (Seistream)](#3-address-association-seistream). It covers native SEI only; the manual steps below work for any wallet you control.
+If you prefer a guided flow, use [Seistream's SIP-03 migration tool](https://seistream.app/migrate-sip03). It walks through the same steps: connect an EVM wallet, cover gas, associate addresses, and then transfer native SEI from the Cosmos side. See [Address association (Seistream)](#3-address-association-seistream). The tool covers native SEI only. The manual steps below work for any wallet that you control.
-Use MetaMask, Compass, Rabby, or a Ledger running its Ethereum app. This produces a new `0x...` address.
+Use MetaMask, Compass, Rabby, or a Ledger with its Ethereum app. This creates a new `0x...` address.
-Roughly 0.1 SEI is sufficient. Association is an on-chain transaction, so the account requires SEI for gas. Fund it from an exchange withdrawal or from any EVM wallet that already holds SEI.
+Approximately 0.1 SEI is enough. Association is an on-chain transaction, so the account needs SEI for gas. Fund the address from an exchange withdrawal or from any EVM wallet that already holds SEI.
-Connect the new EVM account to the [Sei Dashboard](https://dashboard.sei.io) and complete address association. This records the public key on-chain and links the `0x...` address to its `sei1...` counterpart. The dashboard then displays the linked `sei1...` address, which is the destination for the next step. See [Account Linking](/learn/accounts) for details on association.
+Connect the new EVM account to the [Sei Dashboard](https://dashboard.sei.io). Then complete address association. This records the public key on-chain and links the `0x...` address to its `sei1...` counterpart. The dashboard then shows the linked `sei1...` address, which is the destination for the next step. For details on association, see [Account Linking](/learn/accounts).
@@ -201,68 +201,77 @@ From the original Cosmos wallet (Keplr, Leap, the Ledger Cosmos app, and so on),
-Because the addresses are associated, the test amount should appear under the new account on the dashboard and as a spendable balance in the EVM wallet.
+Because the addresses are associated, the test amount should appear under the new account on the dashboard. It should also appear as a spendable balance in the EVM wallet.
-Once the test transfer is confirmed, send the rest of the funds the same way. The assets are then held by an account whose key you control from an EVM wallet.
+After you confirm the test transfer, send the rest of the funds the same way. The assets are then held by an account whose key you control from an EVM wallet.
-Send the 1 SEI test transfer and confirm receipt before moving the full balance. Verify that the destination matches the exact `sei1...` address shown after association in step 3.
+Send the 1 SEI test transfer and confirm receipt before you move the full balance. Verify that the destination matches the exact `sei1...` address shown after association in step 3.
### Notes and limitations
-- **Complete this before the SIP-03 upgrade.** After the Cosmos interface is deprecated, addresses can no longer be associated and `sei1...` transfers can no longer be broadcast. Steps 3 and 4 must be completed beforehand.
+- **Complete this before the SIP-03 upgrade.** After the Cosmos interface is deprecated, addresses can no longer be associated, and `sei1...` transfers can no longer be broadcast. You must complete steps 3 and 4 before then.
- **This procedure moves liquid balances only.** Staked SEI must be unbonded first, and the unbonding period is 21 days. See the staking question in the [FAQ](#faq).
-- **Associate before sending.** Associating the new account before transferring ensures the funds arrive at the correct, immediately spendable address rather than a temporary holding address.
-- **Optional verification.** To confirm the paired `sei1...` address independently, call `getSeiAddr(0x...)` on the `addr` precompile. See [Query Linked Addresses](/learn/accounts#query-linked-addresses).
+- **Associate before sending.** If you associate the new account before you transfer, the funds arrive at the correct, immediately spendable address instead of a temporary holding address.
+- **Optional verification.** To confirm the paired `sei1...` address independently, call `getSeiAddr(0x...)` on the `addr` precompile. See [Query linked addresses](/learn/accounts#query-linked-addresses).
## FAQ
### I am a Keplr / Leap wallet user; do I need to do anything?
-Yes. Use the Asset Transfer tool to ensure your assets are available via an EVM wallet. See Asset Transfer above.
+Yes. Use the Asset Transfer tool to make your assets available in an EVM wallet. See the Asset Transfer section above.
### I use Compass wallet; do I need to do anything?
-No action needed. Compass ensures your assets are available via EVM. Continue connecting to Sei like any EVM chain.
+No, you do not need to do anything. Compass makes sure that your assets are available through EVM. Continue to connect to Sei as you would to any EVM chain.
### My wallet only shows a recovery phrase, or I use a Ledger — how do I migrate?
-If you can export a raw private key, import it into an EVM wallet. This always works, because the key reproduces the same addresses in any wallet. If you cannot (a wallet that exports only a recovery phrase, or a Ledger that only switches between apps), create a new account in an EVM wallet you control, fund it with a small amount of SEI, associate it to reveal its paired `sei1...` address, and send your existing Cosmos funds to that address. Send a 1 SEI test transfer first. See [Migrating a hardware or mnemonic-only wallet](#migrating-a-hardware-or-mnemonic-only-wallet) for the full procedure.
+If you can export a raw private key, import it into an EVM wallet. This always works, because the key gives the same addresses in any wallet.
+
+Some setups cannot export a private key, such as a wallet that exports only a recovery phrase, or a Ledger that only switches between apps. In that case, follow these steps:
+
+1. Create a new account in an EVM wallet that you control.
+2. Fund the new account with a small amount of SEI.
+3. Associate the new account to reveal its paired `sei1...` address.
+4. Send a 1 SEI test transfer to that address. Then send your existing Cosmos funds to the same address.
+
+For the full procedure, see [Migrating a hardware or mnemonic-only wallet](#migrating-a-hardware-or-mnemonic-only-wallet).
### I stake SEI — do I need to do anything?
-It depends on whether your Cosmos (`sei1...`) and EVM (`0x...`) addresses are **associated (linked)**. Staking on Sei is handled by the Cosmos staking module. After SIP-03, Cosmos-native transaction interfaces will no longer be available — but the underlying staking state is preserved and accessible via EVM for associated addresses.
+It depends on whether your Cosmos (`sei1...`) and EVM (`0x...`) addresses are **associated (linked)**. The Cosmos staking module handles staking on Sei. After SIP-03, Cosmos-native transaction interfaces will no longer be available. However, the underlying staking state is preserved, and associated addresses can access it through EVM.
-**If your addresses are associated:** No action is needed. After the upgrade, your existing delegations, rewards, and unbonding state will be fully accessible via EVM. You can continue managing your stake through an EVM wallet using the [Staking Precompile](/evm/precompiles/staking) or the [Sei Dashboard](https://dashboard.sei.io/stake).
+**If your addresses are associated:** You do not need to do anything. After the upgrade, your existing delegations, rewards, and unbonding state will be fully accessible through EVM. You can continue to manage your stake from an EVM wallet with the [Staking Precompile](/evm/precompiles/staking) or the [Sei Dashboard](https://dashboard.sei.io/stake).
**If your addresses are NOT associated:** You must act before the upgrade. After SIP-03, you will not be able to associate addresses or manage delegations through a Cosmos wallet.
Your options:
-1. **Associate your addresses** before the upgrade. You can do this by connecting your Cosmos wallet on the [Sei Dashboard](https://dashboard.sei.io) or by using any of the methods described in [Accounts](/learn/accounts). Once associated, your staking state becomes accessible via EVM — no need to unbond.
-2. **Unbond your stake** and migrate assets to an EVM wallet using the [Asset Transfer tool](https://dashboard.sei.io/evm-upgrade). **The unbonding period is 21 days**, so you must begin this process at least 21 days before the Cosmos shutdown to ensure your tokens are liquid in time.
+1. **Associate your addresses** before the upgrade. To do this, connect your Cosmos wallet on the [Sei Dashboard](https://dashboard.sei.io), or use any of the methods described in [Accounts](/learn/accounts). After association, your staking state is accessible through EVM, and you do not need to unbond.
+2. **Unbond your stake**, and then migrate the assets to an EVM wallet with the [Asset Transfer tool](https://dashboard.sei.io/evm-upgrade). **The unbonding period is 21 days.** For your tokens to be liquid in time, you must start this process at least 21 days before the Cosmos shutdown.
-To check whether your addresses are linked, see [Query Linked Addresses](/learn/accounts#query-linked-addresses).
+To check whether your addresses are linked, see [Query linked addresses](/learn/accounts#query-linked-addresses).
-**Do not confuse address linking with staking migration.** Even though `sei1...` and `0x...` addresses point to the same underlying account once associated, the chain can only recognize this link after explicit association. Without association, your staked SEI will not be accessible via EVM after the upgrade, and you will have no way to unbond or claim rewards.
+**Do not confuse address linking with staking migration.** The `sei1...` and `0x...` addresses point to the same underlying account only after explicit association. Before that, the chain cannot recognize the link. Without association, your staked SEI will not be accessible through EVM after the upgrade. You will also have no way to unbond or claim rewards.
### Can I still bridge assets into or out of Sei over IBC?
-No. Inbound IBC was disabled by [Proposal #116](https://seistream.app/proposals/116) and [Proposal #120](https://seistream.app/proposals/120), and outbound IBC was disabled by [Proposal #121](https://seistream.app/proposals/121) on July 31, 2026. Both the `InboundEnabled` and `OutboundEnabled` parameters on the `ibc` module are now `false`, so no IBC transfer in either direction will be accepted. See [IBC is disabled](#ibc-is-disabled).
+No. [Proposal #116](https://seistream.app/proposals/116) and [Proposal #120](https://seistream.app/proposals/120) disabled inbound IBC. [Proposal #121](https://seistream.app/proposals/121) disabled outbound IBC on July 31, 2026. The `InboundEnabled` and `OutboundEnabled` parameters on the `ibc` module are now both `false`, so the chain does not accept IBC transfers in either direction. See [IBC is disabled](#ibc-is-disabled).
### I hold an IBC asset on Sei — is it gone?
-The balance is not gone. It still exists in the bank module, is still visible in explorers and wallets, and can still be transferred between Sei addresses and through its ERC-20 pointer. What is gone is the ability to send it back over IBC to redeem the underlying asset on its origin chain. See [What you can still do](#what-you-can-still-do).
+The balance is not gone. It still exists in the bank module, and it is still visible in explorers and wallets. You can still transfer it between Sei addresses and through its ERC-20 pointer. However, you can no longer send it back over IBC to redeem the underlying asset on its origin chain. See [What you can still do](#what-you-can-still-do).
### I hold USDC.n (USDC via Noble) — what should I do?
-USDC.n can no longer be redeemed. The migration route (sending it back to Noble over IBC and reissuing native USDC through Circle's CCTP) required outbound IBC, which [Proposal #121](https://seistream.app/proposals/121) disabled on July 31, 2026.
+USDC.n can no longer be redeemed. The migration route sent USDC.n back to Noble over IBC and reissued it as native USDC through Circle's CCTP. That route required outbound IBC, which [Proposal #121](https://seistream.app/proposals/121) disabled on July 31, 2026.
-An on-chain swap to native USDC on a Sei DEX does not use IBC and still executes, subject to whatever liquidity remains. See [If you still hold USDC.n](#if-you-still-hold-usdc-n) above, or read the original announcement for background: [Holders of USDC.n Need to Swap or Migrate](https://blog.sei.io/announcements/holders-of-usdcn-need-to-swap-or-migrate/).
+An on-chain swap to native USDC on a Sei DEX does not use IBC and still executes, subject to whatever liquidity remains. See [If you still hold USDC.n](#if-you-still-hold-usdc-n) above. For background, read the original announcement: [Holders of USDC.n Need to Swap or Migrate](https://blog.sei.io/announcements/holders-of-usdcn-need-to-swap-or-migrate/).
diff --git a/learn/sips.mdx b/learn/sips.mdx
index b11e7f9..06fca4b 100644
--- a/learn/sips.mdx
+++ b/learn/sips.mdx
@@ -7,13 +7,13 @@ keywords: ['SIP', 'Sei Improvement Proposal', 'sei governance', 'protocol propos
import { SipIndex } from '/snippets/sip-index.jsx';
-A Sei Improvement Proposal (SIP) is a design document for a change to Sei. It might cover a new protocol feature, a change to how the project runs, or a convention for the wider ecosystem. Writing one is how you put an idea in front of the community, and how the reasoning behind a decision gets recorded.
+A Sei Improvement Proposal (SIP) is a design document for a change to Sei. It might cover a new protocol feature, a change to how the project runs, or a convention for the wider ecosystem. Writing one is how you put an idea in front of the community, and how the reasoning behind a decision is recorded.
-Every SIP lives in the [sei-protocol/sips](https://github.com/sei-protocol/sips) repository, and the list below reads from it directly. Titles, statuses, authors, and section outlines come from the source files rather than a copy that can fall behind.
+Every SIP lives in the [sei-protocol/sips](https://github.com/sei-protocol/sips) repository, and the list below reads from it directly. Titles, statuses, authors, and section outlines come from the source files, not from a copy that can become outdated.
-A SIP is not the same as an on-chain governance proposal. The SIP holds the design and the reasoning; the on-chain proposal is the vote that enacts it. One SIP can take several governance proposals to carry out, as SIP-3 did. For the on-chain process, see [Governance](/learn/general-governance) and [Proposals](/learn/proposals).
+A SIP is not the same as an on-chain governance proposal. The SIP holds the design and the reasoning. The on-chain proposal is the vote that enacts it. One SIP can take several governance proposals to carry out, as SIP-3 did. For the on-chain process, see [Governance](/learn/general-governance) and [Proposals](/learn/proposals).
@@ -27,7 +27,7 @@ Every SIP declares a type, and the type decides how much community consensus it
| Type | Scope | Needs consensus |
| --- | --- | --- |
-| [Standard](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#standard) | Changes that affect most implementations of Sei, such as consensus, networking, RPC, EVM and CosmWasm behavior, and contract standards. Must also declare a category. | Yes |
+| [Standard](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#standard) | Changes that affect most implementations of Sei, such as consensus, networking, RPC, EVM and CosmWasm behavior, and contract standards. It must also declare a category. | Yes |
| [Process](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#process) | Changes around Sei rather than inside it, such as developer tooling, node and validator procedures, and the SIP process itself. | Yes |
| [Informational](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#informational) | Guidelines or information for the community, with no change to the protocol or development environment. | No |
@@ -51,11 +51,11 @@ A successful SIP usually moves through Draft, Review, Last Call, Final, Implemen
| --- | --- |
| [Idea](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#idea) | Written, but not yet admitted to the process and not yet numbered. |
| [Draft](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#draft) | An editor has accepted the formatting and assigned a number. The author now gathers community feedback. |
-| [Review](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#review) | The author has worked through early feedback. Assigned reviewers now give a formal review, and it takes at least three of them. |
-| [Fast Track](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#fast-track) | For proposals that already reached consensus outside the SIP process. Runs the same way as Review. |
+| [Review](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#review) | The author has worked through early feedback. At least three assigned reviewers now give a formal review. |
+| [Fast Track](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#fast-track) | For proposals that already reached consensus outside the SIP process. It runs the same way as Review. |
| [Last Call](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#last-call) | A final window for objections, usually at least one week. |
| [Final](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#final) | Accepted, and the specification is now frozen. |
-| [Implemented](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#implemented) | Development is complete, but the feature is not yet live on mainnet. |
+| [Implemented](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#implemented) | Development is complete, but the feature is not yet live on Sei Mainnet. |
| [Activated](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#activated) | Live on Sei Mainnet. |
| [Stagnant](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#stagnant) | Inactive for four weeks while in Draft, Review, or Last Call. |
| [Withdrawn](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#withdrawn) | The author has withdrawn the proposal. |
@@ -63,7 +63,7 @@ A successful SIP usually moves through Draft, Review, Last Call, Final, Implemen
-Once a SIP reaches Final, nobody can withdraw or edit it. To change an accepted specification, submit a new SIP that extends or replaces the original.
+After a SIP reaches Final, nobody can withdraw or edit it. To change an accepted specification, submit a new SIP that extends or replaces the original.
@@ -76,7 +76,7 @@ SIP-3 and SIP-4 both affect how you use and build on Sei. These pages cover what
What SIP-3 changes for asset holders, and how to move off Cosmos-native addresses.
- Integration changes for exchanges and custodians supporting Sei deposits and withdrawals.
+ Integration changes for exchanges and custodians that support Sei deposits and withdrawals.
How Sei's EIP-1559 implementation works, including the parameters SIP-4 revises.
@@ -88,7 +88,7 @@ SIP-3 and SIP-4 both affect how you use and build on Sei. These pages cover what
## Submit a proposal
-Anyone can author a SIP. Talk the idea over with the community before you write it, so you can gauge whether the proposal is needed at all.
+Anyone can author a SIP. Before you write one, discuss the idea with the community to find out whether the proposal is needed at all.
@@ -101,11 +101,11 @@ Open a thread in [GitHub Discussions](https://github.com/sei-protocol/sips/discu
-Fork [sei-protocol/sips](https://github.com/sei-protocol/sips) and create your proposal at `sips/sip-temporary_title.md`. Put any images in `assets/sip-temporary_title/`.
+Fork [sei-protocol/sips](https://github.com/sei-protocol/sips). In your fork, create your proposal at `sips/sip-temporary_title.md`. Put any images in `assets/sip-temporary_title/`.
-Start the file with the two-column header table and follow the section structure described in [SIP format](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#sip-format). Keep the title under 64 characters and don't end it with a period.
+Start the file with the two-column header table. Follow the section structure described in [SIP format](https://github.com/sei-protocol/sips/blob/main/sips/sip-1.md#sip-format). Keep the title under 64 characters. Do not end the title with a period.
@@ -116,6 +116,6 @@ Submit the pull request from your fork. A [SIP editor](https://github.com/sei-pr
-From Draft onward, keeping the proposal moving is your job. An editor will help you find the right people to talk to, but won't chase the process for you.
+From Draft onward, you are responsible for keeping the proposal moving. An editor helps you find the right people to talk to, but does not push the process forward for you.
diff --git a/learn/twin-turbo-consensus.mdx b/learn/twin-turbo-consensus.mdx
index 6490542..4bb090d 100644
--- a/learn/twin-turbo-consensus.mdx
+++ b/learn/twin-turbo-consensus.mdx
@@ -6,56 +6,58 @@ keywords: ['twin turbo consensus', 'high-speed blockchain', 'transaction through
---
## Introduction
-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.
+Sei's consensus mechanism, often called Twin Turbo Consensus, is a set of optimizations designed for low block finality times. The target is approximately 400 milliseconds. Sei does not use a new consensus algorithm to reach this finality. Instead, Sei significantly enhances the underlying Tendermint Byzantine Fault Tolerant (BFT) consensus engine and tunes its configuration aggressively. The consensus engine also integrates tightly with Sei's parallel execution layer and the SeiDB storage system. The goal is near-instant transaction confirmation, which supports a new class of high-performance dApps, particularly dApps built for the EVM.
-## Core Concept: Pipelined & Parallelized Consensus
+## 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.
+Sei reaches sub-second finality by aggressively optimizing and parallelizing the standard BFT consensus flow. Traditional Tendermint proceeds through distinct rounds of propose, prevote, precommit, and commit, somewhat sequentially, for each block height. In contrast, Sei heavily pipelines these operations and integrates them closely with parallel transaction execution.
-This optimized flow involves several key enhancements:
+The optimized flow includes these enhancements:
-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.
-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`).
- - Transaction execution proceeds _optimistically and concurrently_ using multiple worker goroutines, managed via mechanisms like `CacheMultiStore` for state buffering.
- - Simultaneously, the validator participates in the standard BFT prevote and precommit voting rounds for the proposed block `H`.
-4. **Rapid Finalization and Commit:** Because transaction execution overlaps significantly with the consensus voting process, the time delta between achieving 2/3+ precommits for block `H` and having the resulting state changes ready for commitment is drastically reduced. Once consensus is reached, the validated state changes buffered during parallel execution are efficiently committed to the underlying SeiDB storage layer, leveraging its high I/O capabilities.
+1. **Aggressive timeout configuration:** Sei uses heavily tuned Tendermint consensus parameters. Configuration settings (for example, `UnsafeProposeTimeoutOverride` and `UnsafeCommitTimeoutOverride`) can enforce much shorter durations for block proposal, voting, and commit rounds than standard Tendermint configurations. This contributes directly to the sub-second target block time. Faster gossip propagation for consensus messages further reduces communication latency between validators.
-**Optimized & Pipelined Consensus**
+ The `unsafe-overrides-enabled` flag in the `[consensus]` section of the node config gates these `Unsafe*TimeoutOverride` fields. This flag defaults to `false`. With the default, the node ignores the overrides and uses the on-chain timeout consensus parameters instead. The node applies the overrides only when `unsafe-overrides-enabled` is set to `true`. During the transition period, it also applies them while the on-chain timeout parameters still match the legacy values. In practice, the on-chain consensus parameters should govern timeout tuning, not these unsafe per-node overrides.
+2. **Mempool management & transaction preparation:** Even before the block proposal for height `H` formally begins, validators can start to process transactions intended for that block. This work includes 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 when the actual proposal for height `H` arrives.
+3. **Optimized BFT rounds with parallel execution integration:** The main optimization is the close integration with Sei's parallelization engine. When a validator receives a block proposal for height `H`, it can start execution before the prevote and precommit rounds complete:
+ - The validator dispatches the block's transactions to the parallel execution engine (`ProcessTXsWithOCC`, `DeliverTxBatch`).
+ - Transactions execute _optimistically and concurrently_ on multiple worker goroutines. Mechanisms such as `CacheMultiStore` buffer the state changes.
+ - At the same time, the validator takes part in the standard BFT prevote and precommit voting rounds for the proposed block `H`.
+4. **Rapid finalization and commit:** Transaction execution overlaps significantly with the consensus voting process. This greatly reduces the time between reaching 2/3+ precommits for block `H` and having the resulting state changes ready to commit. When consensus is reached, the validated state changes that were buffered during parallel execution are committed efficiently to the underlying SeiDB storage layer. This commit uses the high I/O capabilities of SeiDB.
+
+**Optimized & pipelined consensus**
-
- - Transaction Collection & Analysis
- - State Prefetching (SeiDB)
+
+ - Transaction collection & analysis
+ - State prefetching (SeiDB)
-
- - Block Proposal Reception & Initial Validation
- - BFT Voting (Prevote/Precommit)
- - Parallel TX Execution (Optimistic)
+
+ - Block proposal reception & initial validation
+ - BFT voting (prevote/precommit)
+ - Parallel TX execution (optimistic)
-_(Consensus Reached)_ → **Finalize State & Commit to SeiDB**
+_(Consensus reached)_ → **Finalize state & commit to SeiDB**
-This diagram illustrates the conceptual overlap. Transaction preparation feeds into a process where BFT voting happens _alongside_ parallel transaction execution. The final commit to SeiDB occurs rapidly after consensus is achieved, enabled by the preceding concurrent work.
+This diagram shows the conceptual overlap. Transaction preparation feeds into a process where BFT voting happens _alongside_ parallel transaction execution. The preceding concurrent work lets the final commit to SeiDB happen quickly after consensus.
-## Performance Impact for EVM Developers
+## Performance impact for EVM developers
-This highly optimized consensus flow translates directly into tangible benefits:
+This optimized consensus flow has these benefits:
-- **Near-Instant Finality:** Sei has instant, deterministic finality — a transaction is final as soon as its block is committed, within the ~400ms target block time. There is no probabilistic confirmation window or multi-block wait. This eliminates the long confirmation waits common on other chains.
-- **Responsive Applications:** The low latency transforms the user experience. Interactions feel instantaneous, bridging the gap between decentralized applications and traditional web services.
-- **Advanced Use Cases:** The speed enables applications previously impractical on-chain, such as high-frequency trading components, real-time price oracles critical for stable DeFi, and responsive on-chain games.
-- **Efficient Multi-Step Operations:** Complex DeFi workflows (e.g., approve-swap-stake) that involve multiple transactions can execute in sequence within roughly a second, boosting capital efficiency and simplifying user interactions.
+- Sei has instant, deterministic finality. A transaction is final as soon as its block is committed, within the target block time of approximately 400 ms. There is no probabilistic confirmation window or multi-block wait. This removes the long confirmation waits that are common on other chains.
+- The low latency improves the user experience. Interactions feel instantaneous, which brings dApps closer to traditional web services.
+- The speed makes previously impractical on-chain applications possible, for example high-frequency trading components, real-time price oracles (critical for stable DeFi), and responsive on-chain games.
+- Complex DeFi workflows that involve multiple transactions (for example, approve-swap-stake) can execute in sequence within roughly a second. This improves capital efficiency and simplifies user interactions.
-These performance gains are delivered while preserving core EVM compatibility, including standard gas models and support for Solidity/Vyper and common Ethereum development tools.
+Sei keeps core EVM compatibility alongside these performance gains. This includes standard gas models and support for Solidity, Vyper, and common Ethereum development tools.
-### Leveraging Fast Finality in Solidity
+### Leveraging fast finality in Solidity
-The rapid block times enable and encourage specific development patterns:
+The rapid block times enable and encourage these development patterns:
-**1. Minimal Confirmation Waits:** Off-chain applications and scripts should rely on just one block confirmation (`txResponse.wait(1)`) for probabilistic finality, significantly speeding up application logic that depends on transaction inclusion.
+**1. Minimal confirmation waits:** Off-chain applications and scripts should rely on one block confirmation (`txResponse.wait(1)`) for probabilistic finality. This significantly speeds up application logic that depends on transaction inclusion.
```javascript
// Fast transaction submission leveraging ~400ms finality
@@ -72,7 +74,7 @@ async function sendTransaction(tx) {
}
```
-**2. Practical Multi-Step Interactions:** Complex sequences involving multiple dependent transactions become efficient and user-friendly.
+**2. Practical multi-step interactions:** Complex sequences of multiple dependent transactions become efficient and user-friendly.
```javascript
// Example: Multi-step DeFi operation (Approve + Swap + Deposit)
@@ -94,10 +96,10 @@ async function executeDeFiStrategy(tokenAddress, amount) {
}
```
-**3. Time-Sensitive Contract Logic:** Smart contracts can implement logic sensitive to short time intervals, measured reliably in blocks.
+**3. Time-sensitive contract logic:** Smart contracts can implement logic that is sensitive to short time intervals, measured reliably in blocks.
-- **Short-Duration Auctions/Votes:** Contracts can define processes that resolve within seconds or minutes, using `block.number` for precise timing based on the ~400ms block interval.
-- **High-Frequency Oracles:** Oracles can push updates much more frequently (e.g., every few seconds, corresponding to a small number of blocks), providing fresher data to DeFi protocols.
+- **Short-duration auctions and votes:** Contracts can define processes that resolve within seconds or minutes. They can use `block.number` for precise timing, based on the block interval of approximately 400 ms.
+- **High-frequency oracles:** Oracles can push updates much more frequently, for example every few seconds (a small number of blocks). This gives DeFi protocols fresher data.
```solidity
// Example: High-Frequency Oracle Update Constraint
@@ -121,8 +123,12 @@ contract HighFrequencyOracle {
}
```
-### Compatibility and Future Directions
+### Compatibility and future directions
+
+Sei's consensus optimizations keep full compatibility with the EVM standard. Existing smart contracts, dApps, and developer tools work normally.
-Sei's consensus optimizations are implemented while maintaining full compatibility with the EVM standard. Existing smart contracts, dApps, and developer tools function smoothly.
+Ongoing and future work focuses on further optimizing the pipeline. It includes:
-Ongoing and future work focuses on further optimizing the pipeline, including advanced state management techniques (predictive loading, EVM-specific caching integrated with SeiDB), potential bytecode optimizations or JIT compilation for the EVM execution layer, and building cross-chain communication protocols that leverage Sei's fast finality.
+- Advanced state management techniques, such as predictive loading and EVM-specific caching integrated with SeiDB
+- Potential bytecode optimizations or JIT compilation for the EVM execution layer
+- Building cross-chain communication protocols that use Sei's fast finality
diff --git a/learn/user-quickstart.mdx b/learn/user-quickstart.mdx
index 788f4ef..08b867d 100644
--- a/learn/user-quickstart.mdx
+++ b/learn/user-quickstart.mdx
@@ -5,31 +5,31 @@ description: "Comprehensive guide to Getting Started with Sei Network: User Quic
keywords: ["sei network guide", "blockchain beginner", "wallet setup", "sei tokens", "address association"]
---
-This getting started guide will help you set up your wallet and start using Sei, even if you're new to blockchain. By the end, you'll be ready to explore the most performant blockchain ever.
+This guide helps you set up your wallet and start using Sei, even if you are new to blockchain.
-## 1. Get a Wallet
+## 1. Get a wallet
-Download a compatible wallet such as [MetaMask](https://metamask.io/), [Rabby](https://rabby.io/), [Binance Wallet](https://www.binance.com/en/web3wallet), or any other [supported wallet](/learn/wallets).
+Download a compatible wallet, such as [MetaMask](https://metamask.io/), [Rabby](https://rabby.io/), [Binance Wallet](https://www.binance.com/en/web3wallet), or any other [supported wallet](/learn/wallets).
-## 2. Set Up and "Associate" Your Wallet
+## 2. Set up and "associate" your wallet
-Making a transaction will broadcast your public key to the chain, allowing full cross-environment functionality. If your wallet is not "associated" it means that the network is not aware that your key exists, and therefore it cannot be determined which two addresses are actually the same wallet due to the cryptographic algorithm by which the EVM wallet address is derived from the key(s).
+Any transaction that you make broadcasts your public key to the chain. This gives your wallet full cross-environment functionality. If your wallet is not "associated", the network does not know that your key exists. A cryptographic algorithm derives the EVM wallet address from the key. Without the key, the network cannot tell which two addresses belong to the same wallet.
Learn more about [how accounts work](/learn/accounts) on Sei.
-## 3. Get Tokens
+## 3. Get tokens
- [Bridge from another network](https://welcome.symph.ag)
- [Transfer from another account](https://dashboard.sei.io/transfer)
-- [Use the faucet](/learn/faucet) (testnet only)
-- Transfer from CEX by copying your wallet address
+- [Use the faucet](/learn/faucet) (Sei Testnet only)
+- Transfer from a centralized exchange (CEX) to your wallet address
- Typically, no memo is required for withdrawals from CEXs, but depositing back may require a memo. Check your CEX's guidelines to ensure smooth transfers.
+ Check your CEX's guidelines to make sure that your transfers go smoothly. Withdrawals from a CEX typically do not need a memo, but deposits back to a CEX may need one.
## 4. Explore the ecosystem
-Sei has a diverse ecosystem of applications, ranging from DeFi to Games and beyond. Explore the [Sei Ecosystem Hub](https://www.sei.io/ecosystem) to discover the latest projects and innovations or follow [@SeiNetwork](https://x.com/SeiNetwork) on X.
\ No newline at end of file
+Sei has a diverse ecosystem of dApps, including DeFi and games. To find the latest projects, explore the [Sei Ecosystem Hub](https://www.sei.io/ecosystem) or follow [@SeiNetwork](https://x.com/SeiNetwork) on X.
\ No newline at end of file
diff --git a/learn/wallets.mdx b/learn/wallets.mdx
index 7c1de2f..143ab30 100644
--- a/learn/wallets.mdx
+++ b/learn/wallets.mdx
@@ -12,30 +12,28 @@ keywords:
import { EcosystemAppGrid } from '/snippets/ecosystem-app-grid.jsx';
-Wallets are essential for managing assets and interacting with the Sei
-blockchain. There are various types of wallets available, each offering
-different features and levels of security.
+You need a wallet to manage assets and interact with Sei. There are several
+types of wallets, and each type has different features and levels of security.
-Manually importing your wallet using a mnemonic from an EVM-only wallet app to a Cosmos-based wallet app, or vice versa, is not recommended. This may generate unexpected wallet addresses due to differing [Coin Types](https://en.bitcoin.it/wiki/BIP_0044#Coin_type).
+Avoid importing a wallet mnemonic manually from an EVM-only wallet app into a Cosmos-based wallet app, or the reverse. Because the [coin types](https://en.bitcoin.it/wiki/BIP_0044#Coin_type) differ, the import may generate unexpected wallet addresses.
-## Types of Wallets
+## Types of wallets
-1. **Software Wallets**: These are applications or browser extensions that
+1. **Software wallets**: These are applications or browser extensions that
manage private keys and interact with the blockchain. They are easy to use
- and accessible on both desktop and mobile devices.
-2. **Hardware Wallets**: These are physical devices that securely store private
- keys offline. They provide enhanced security but are less convenient for
- frequent transactions.
-3. **Passkey-based Wallets**: These wallets use passkeys for authentication
- instead of traditional seed phrases, offering an additional layer of
- security.
+ and available on both desktop and mobile devices.
+2. **Hardware wallets**: These are physical devices that store private keys
+ securely offline. They are more secure, but less convenient for frequent
+ transactions.
+3. **Passkey-based wallets**: These wallets use passkeys for authentication
+ instead of traditional seed phrases. This adds another layer of security.
-## Recommended Wallets
+## Recommended wallets
| Wallet | EVM | Auth Method | Coin Type | Type | Mobile | Link |
| --- | --- | --- | --- | --- | --- | --- |
-| MetaMask 🦊 | ✅ | Mnemonic / Privkey | 60 | Software | ✅ | [MetaMask](https://metamask.io/) |
-| Backpack 🎒 | ✅ | Mnemonic / Privkey | 60 | Software | ✅ | [Backpack](https://backpack.app/) |
+| MetaMask | ✅ | Mnemonic / Privkey | 60 | Software | ✅ | [MetaMask](https://metamask.io/) |
+| Backpack | ✅ | Mnemonic / Privkey | 60 | Software | ✅ | [Backpack](https://backpack.app/) |
| Binance Wallet | ✅ | MPC / Keyless | 60 | Software | ✅ | [Binance Wallet](https://www.binance.com/en/web3wallet) |
| Dynamic | ✅ | Any | All | Embedded | ✅ | [Dynamic Wallet](https://dynamic.xyz) |
| Privy | ✅ | Email / Social / Passkey / Wallet | 60 | Embedded | ✅ | [Privy](https://privy.io) |
@@ -43,24 +41,23 @@ different features and levels of security.
| OKX | ✅ | Mnemonic / Privkey | 118 / 60 | Software | ✅ | [OKX Wallet](https://web3.okx.com/wallet/sei-evm) |
| Gem Wallet | ✅ | Mnemonic / Privkey | 118 / 60 | Software | ✅ | [Gem Wallet](https://gemwallet.com/sei-wallet/) |
-Wallets with coin type 118 use the Cosmos HD derivation path; the same key still maps to a unique EVM `0x...` address via Sei's address-association system.
+Wallets with coin type 118 use the Cosmos hierarchical deterministic (HD) derivation path. Sei's address-association system still maps the same key to a unique EVM `0x...` address.
-For more information on coin types and hierarchical deterministic (HD) paths as
-well as deriving wallet addresses properly, please refer to the
-[Advanced Concepts on HD Path Coin Types](/learn/accounts#hd-paths-and-coin-types).
+For more on coin types, HD paths, and how to derive wallet addresses correctly,
+see [HD paths and coin types](/learn/accounts#hd-paths-and-coin-types).
-## Hardware Wallets
+## Hardware wallets
| Wallet | EVM | Cosmos | Coin Type | Type | Mobile | Link |
| --- | --- | --- | --- | --- | --- | --- |
| Ledger | ✅ | ✅ | 118 / 60 | Hardware | ❌ | [Ledger](https://www.ledger.com/) |
| Arculus | ✅ | ✅ | 118 / 60 | Hardware | ✅ | [Arculus](https://www.getarculus.com/) |
-## Integration Guides
+## Integration guides
- [Pimlico Wallet](/evm/wallet-integrations/pimlico)
- [Particle Wallet](/evm/wallet-integrations/particle)
-## All Wallets
+## All wallets
diff --git a/node/advanced-config-monitoring.mdx b/node/advanced-config-monitoring.mdx
index 58245f5..d9c80c2 100644
--- a/node/advanced-config-monitoring.mdx
+++ b/node/advanced-config-monitoring.mdx
@@ -5,16 +5,17 @@ description: "Optimize your Sei node's performance with advanced system configur
keywords: ['sei node', 'node monitoring', 'prometheus', 'grafana', 'performance optimization', 'system tuning', 'infrastructure alerts']
---
-## Optimizing System Configuration
+## Optimizing system configuration
-There are a virtually unlimited number of unique individual setups that cannot be covered in this document. As well, even similar builds and configurations can behave differently due to external factors, so your results may vary.
+The number of possible setups is virtually unlimited, so this document cannot cover them all. Even similar builds and configurations can behave differently because of external factors. Your results may vary.
-Here are some general guidelines to use as a starting point. Be cautious, make incremental changes, testing and observing before moving forward.
-Always focus on only one specific area at a time - avoid making changes to memory, storage, and CPU configs all at once. Diagnosing potential problems becomes nearly impossible otherwise.
+Use these general guidelines as a starting point. Be cautious and make incremental changes. Test and observe each change before you move forward.
-### Memory Management
+Always focus on only one specific area at a time. Do not change the memory, storage, and CPU configurations all at once. Otherwise, it becomes nearly impossible to diagnose problems.
-The following settings in `/etc/sysctl.conf` can optimize memory usage and disk I/O patterns:
+### Memory management
+
+These settings in `/etc/sysctl.conf` can optimize memory usage and disk I/O patterns:
```bash
# Minimize swapping
@@ -27,11 +28,11 @@ vm.dirty_expire_centisecs = 300
vm.dirty_writeback_centisecs = 100
```
-Apply changes: `sudo sysctl -p`
+To apply the changes, run `sudo sysctl -p`.
-### Network Stack
+### Network stack
-The following settings in `/etc/sysctl.conf` may improve network performance:
+These settings in `/etc/sysctl.conf` may improve network performance:
```bash
# Increase connection handling capacity
@@ -46,11 +47,11 @@ net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
```
-### Storage Configuration
+### Storage configuration
For NVMe drives, optimize I/O scheduling:
-Storage Optimization Commands
+Storage optimization commands
```bash
# Set IO scheduler
@@ -72,11 +73,11 @@ sudo tee -a /etc/fstab << EOF
EOF
```
-## Infrastructure Monitoring
+## Infrastructure monitoring
-Monitoring is one of the most critical components of network infrastructure. performance tuning, and alerting configuration for Cosmos-SDK/Tendermint nodes.
+Monitoring is one of the most critical components of network infrastructure. This page covers monitoring, performance tuning, and alerting configuration for Cosmos SDK and Tendermint nodes.
-### Prometheus Setup
+### Prometheus setup
First, install Prometheus:
@@ -85,7 +86,7 @@ wget https://github.com/prometheus/prometheus/releases/download/v2.42.0/promethe
tar xvf prometheus-2.42.0.linux-amd64.tar.gz
```
-Example Prometheus configuration:
+This is an example Prometheus configuration:
```yaml
global:
@@ -102,7 +103,7 @@ scrape_configs:
- targets: ['node2_ip:port']
```
-### Grafana Integration
+### Grafana integration
Install and configure Grafana:
@@ -112,7 +113,7 @@ sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt update && sudo apt-get install grafana
```
-
+
```json
{
@@ -250,7 +251,7 @@ sudo apt update && sudo apt-get install grafana
-### Alert Management
+### Alert management
Install Alertmanager:
@@ -259,7 +260,7 @@ wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertm
tar xvf alertmanager-0.25.0.linux-amd64.tar.gz
```
-
+
```yaml
groups:
@@ -305,18 +306,18 @@ groups:
-## Log Management
+## Log management
-### Loki Setup
+### Loki setup
-Using Loki for log aggregation:
+Use Loki for log aggregation:
```bash
wget https://github.com/grafana/loki/releases/download/v2.8.0/loki-linux-amd64.zip
unzip loki-linux-amd64.zip
```
-
+
```yaml
server:
@@ -340,7 +341,7 @@ scrape_configs:
-### Log Rotation
+### Log rotation
Configure logrotate to manage log files:
@@ -361,11 +362,11 @@ sudo tee /etc/logrotate.d/sei << EOF
EOF
```
-## Security Configuration
+## Security configuration
-### Network Security
+### Network security
-UFW firewall configuration:
+Configure the UFW firewall:
```bash
sudo ufw default deny incoming
@@ -376,9 +377,9 @@ sudo ufw allow 9090/tcp comment 'Sei gRPC'
sudo ufw enable
```
-### Rate Limiting
+### Rate limiting
-
+
```nginx
http {
@@ -396,23 +397,23 @@ http {
-## Validator-Specific Monitoring
+## Validator-specific monitoring
-### Status Query
+### Status query
-Query validator status through SDK:
+Query the validator status through the SDK:
```bash
seid query staking validator $(seid keys show --bech val -a )
```
-Query through REST API:
+Query the status through the REST API:
```sh
curl -s "http://localhost:1317/cosmos/staking/v1beta1/validators/"
```
-
+
```sh
#!/bin/bash
@@ -435,7 +436,7 @@ echo "$VALIDATOR_DATA" | jq '.'
-### Critical Metrics
+### Critical metrics
Monitor these validator-specific metrics:
@@ -447,9 +448,9 @@ seid query slashing signing-info $(seid tendermint show-validator)
seid query staking delegations-to $(seid keys show -a $VALIDATOR_KEY)
```
-## Backup Management
+## Backup management
-
+
```bash
#!/bin/bash
@@ -484,9 +485,9 @@ echo "Backup completed successfully on $(date)" >> $BACKUP_DIR/backup.log
-## Host System Monitoring
+## Host system monitoring
-### Resource Usage Tracking
+### Resource usage tracking
Install and configure node_exporter:
@@ -495,7 +496,7 @@ wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_e
tar xvf node_exporter-1.5.0.linux-amd64.tar.gz
```
-Add to Prometheus configuration:
+Add node_exporter to the Prometheus configuration:
```yaml
scrape_configs:
@@ -504,32 +505,32 @@ scrape_configs:
- targets: ['localhost:9100']
```
-## EVM RPC OpenTelemetry Metrics
+## EVM RPC OpenTelemetry metrics
-The EVM RPC layer emits OpenTelemetry metrics through the process-wide `MeterProvider` (for example, a Prometheus exporter). These are emitted in parallel with the legacy `sei_*` metrics so you can migrate dashboards incrementally.
+The EVM RPC layer emits OpenTelemetry metrics through the process-wide `MeterProvider` (for example, a Prometheus exporter). It emits these metrics in parallel with the legacy `sei_*` metrics, so you can migrate dashboards incrementally.
-### Available EVM RPC Metrics
+### Available EVM RPC metrics
| Metric | Type | Description |
| --- | --- | --- |
| `evmrpc_request_latency_seconds` | Histogram | EVM RPC request latency in seconds. |
-| `evmrpc_websocket_connects_total` | Counter | Number of new websocket connections. |
+| `evmrpc_websocket_connects_total` | Counter | Number of new WebSocket connections. |
| `evmrpc_redirected_requests_total` | Counter | Number of EVM RPC requests forwarded to another validator. Labeled by `endpoint` and `connection`. |
-| `evmrpc_historical_debug_trace_attempts_total` | Counter | Number of `debug_trace*` requests targeting historical blocks beyond the configured max block lookback. Labeled by `endpoint` and `connection`. |
+| `evmrpc_historical_debug_trace_attempts_total` | Counter | Number of `debug_trace*` requests that target historical blocks beyond the configured max block lookback. Labeled by `endpoint` and `connection`. |
-The `evmrpc_request_latency_seconds` histogram carries the following labels:
+The `evmrpc_request_latency_seconds` histogram carries these labels:
| Label | Description |
| --- | --- |
-| `endpoint` | The RPC method being served (for example, `eth_getBalance`). |
-| `connection` | The connection type serving the request (for example, `http` or `websocket`). |
-| `success` | Boolean indicating whether the request succeeded. |
-| `error_class` | A low-cardinality classification of the failure. An empty string denotes success. Possible values include `panic`, `execution_reverted`, `evm_not_supported`, `sei_legacy_disabled`, `association_missing`, `jsonrpc_error`, and `unknown`. |
-| `jsonrpc_code` | A low-cardinality bucket for the JSON-RPC error code: `spec` (predefined range `-32700..-32600`), `server` (server-defined range `-32099..-32000`), or `other`. An empty string denotes no code (success or an untyped error). |
+| `endpoint` | The RPC method that the node serves (for example, `eth_getBalance`). |
+| `connection` | The connection type that serves the request (for example, `http` or `websocket`). |
+| `success` | Boolean that indicates whether the request succeeded. |
+| `error_class` | A low-cardinality classification of the failure. An empty string means success. Possible values include `panic`, `execution_reverted`, `evm_not_supported`, `sei_legacy_disabled`, `association_missing`, `jsonrpc_error`, and `unknown`. |
+| `jsonrpc_code` | A low-cardinality bucket for the JSON-RPC error code: `spec` (predefined range `-32700..-32600`), `server` (server-defined range `-32099..-32000`), or `other`. An empty string means no code (success or an untyped error). |
-### Migrating from Legacy EVM RPC Metrics
+### Migrating from legacy EVM RPC metrics
-The following legacy `sei_*` metrics remain available today but are deprecated and scheduled for removal once dashboards migrate to the `evmrpc_*` OpenTelemetry metrics:
+These legacy `sei_*` metrics remain available today but are deprecated. They are scheduled for removal after dashboards migrate to the `evmrpc_*` OpenTelemetry metrics:
| Legacy metric | Replacement |
| --- | --- |
@@ -537,13 +538,13 @@ The following legacy `sei_*` metrics remain available today but are deprecated a
| `sei_websocket_connect` | `evmrpc_websocket_connects_total` |
| `sei_rpc_request_counter` | `evmrpc_request_latency_seconds` (use the histogram count with the `success` and `error_class` labels) |
-Update your Prometheus and Grafana dashboards to consume the `evmrpc_*` metrics before the legacy metrics are removed. Note that latency changed units from milliseconds (`sei_rpc_request_latency_ms`) to seconds (`evmrpc_request_latency_seconds`), so adjust any thresholds and panel formatting accordingly.
+Before the legacy metrics are removed, update your Prometheus and Grafana dashboards to use the `evmrpc_*` metrics. The latency unit changed from milliseconds (`sei_rpc_request_latency_ms`) to seconds (`evmrpc_request_latency_seconds`). Adjust any thresholds and panel formatting to match.
-## FlatKV OpenTelemetry Metrics
+## FlatKV OpenTelemetry metrics
-The FlatKV state store emits OpenTelemetry metrics through the process-wide `MeterProvider` (for example, a Prometheus exporter). These metrics let node operators observe commit throughput, catchup progress, snapshotting, rollbacks, and snapshot imports.
+The FlatKV state store emits OpenTelemetry metrics through the process-wide `MeterProvider` (for example, a Prometheus exporter). With these metrics, you can observe commit throughput, catchup progress, snapshotting, rollbacks, and snapshot imports.
-### Available FlatKV Metrics
+### Available FlatKV metrics
| Metric | Type | Description |
| --- | --- | --- |
@@ -561,7 +562,7 @@ The FlatKV state store emits OpenTelemetry metrics through the process-wide `Met
| `flatkv_snapshot_prune_latency` | Histogram | Time taken to prune FlatKV snapshots (seconds). |
| `flatkv_snapshot_prune_attempts` | Counter | Total number of FlatKV snapshot prune attempts. |
| `flatkv_current_snapshot_height` | Gauge | Current FlatKV snapshot height. |
-| `flatkv_rollback_latency` | Histogram | Time taken to rollback FlatKV state (seconds). |
+| `flatkv_rollback_latency` | Histogram | Time taken to roll back FlatKV state (seconds). |
| `flatkv_import_latency` | Histogram | Time taken to import FlatKV snapshot data (seconds). |
| `flatkv_import_kv_pairs` | Counter | Number of key-value pairs imported into FlatKV. |
| `flatkv_import_worker_flush_latency` | Histogram | Time taken to flush a FlatKV import worker batch (seconds). |
@@ -569,29 +570,29 @@ The FlatKV state store emits OpenTelemetry metrics through the process-wide `Met
### Labels
-FlatKV metrics carry the following labels where applicable:
+FlatKV metrics carry these labels where applicable:
| Label | Description |
| --- | --- |
-| `db` | The data DB the measurement applies to (for example, `account`, `storage`, `code`, or `legacy`). Present on per-DB metrics such as `flatkv_commit_batch_latency`, `flatkv_flush_latency`, `flatkv_num_kv_pairs`, `flatkv_pending_writes`, `flatkv_import_kv_pairs`, and `flatkv_import_worker_flush_latency`. |
-| `success` | Boolean indicating whether the operation succeeded. Present on latency and attempt metrics that can fail. |
-| `read_only` | Boolean present on `flatkv_open_latency` indicating whether the store was opened read-only. |
+| `db` | The data DB that the measurement applies to (for example, `account`, `storage`, `code`, or `legacy`). Present on per-DB metrics such as `flatkv_commit_batch_latency`, `flatkv_flush_latency`, `flatkv_num_kv_pairs`, `flatkv_pending_writes`, `flatkv_import_kv_pairs`, and `flatkv_import_worker_flush_latency`. |
+| `success` | Boolean that indicates whether the operation succeeded. Present on latency and attempt metrics that can fail. |
+| `read_only` | Boolean, present on `flatkv_open_latency`, that indicates whether the store was opened read-only. |
-### Enabling Pebble Internal Metrics
+### Enabling Pebble internal metrics
-Pebble's internal (per-DB) metrics are governed by a single FlatKV-level knob: `enable-pebble-metrics` under `[state-commit.flatkv]` in `app.toml` (default `true`). The key is honored when present but is not part of the `app.toml` that `seid init` generates, so add it manually to change the default. Its value is propagated to every data DB (account, code, storage, legacy, and metadata) during initialization and overrides any per-DB `EnableMetrics` settings, so configure Pebble metrics through this knob rather than the individual per-DB settings.
+A single FlatKV-level knob controls Pebble's internal (per-DB) metrics: `enable-pebble-metrics` under `[state-commit.flatkv]` in `app.toml` (default `true`). The node honors this key when it is present, but the `app.toml` that `seid init` generates does not include it. To change the default, add the key manually. The value propagates to every data DB (account, code, storage, legacy, and metadata) during initialization. It overrides any per-DB `EnableMetrics` settings. Configure Pebble metrics through this knob, not through the individual per-DB settings.
-## LittDB OpenTelemetry Metrics
+## LittDB OpenTelemetry metrics
-LittDB now emits its metrics through the process-wide OpenTelemetry `MeterProvider` instead of a private Prometheus client. When `MetricsEnabled` is set, LittDB configures a Prometheus exporter on the global provider and serves `/metrics` on `MetricsPort` (default `9101`). The previous `MetricsNamespace` and `MetricsRegistry` config fields have been removed; all metric names now use a fixed `litt_` prefix.
+LittDB emits its metrics through the process-wide OpenTelemetry `MeterProvider` instead of a private Prometheus client. When `MetricsEnabled` is set, LittDB configures a Prometheus exporter on the global provider and serves `/metrics` on `MetricsPort` (default `9101`). The `MetricsNamespace` and `MetricsRegistry` config fields were removed, and all metric names use a fixed `litt_` prefix.
-### Available LittDB Metrics
+### Available LittDB metrics
| Metric | Type | Unit | Description |
| --- | --- | --- | --- |
| `litt_table_size_bytes` | Gauge | bytes | The size of individual tables in the database. |
| `litt_table_key_count` | Gauge | count | The number of keys in individual tables in the database. |
-| `litt_open_iterator_count` | Gauge | count | The number of currently-open iterators for individual tables in the database. A persistently nonzero value indicates a leaked iterator, which suspends garbage collection for the table. |
+| `litt_open_iterator_count` | Gauge | count | The number of currently open iterators for individual tables in the database. A persistently nonzero value indicates a leaked iterator, which suspends garbage collection for the table. |
| `litt_bytes_read` | Counter | bytes | The number of bytes read from disk since startup. |
| `litt_keys_read` | Counter | count | The number of keys read from disk since startup. |
| `litt_cache_hits` | Counter | count | The number of cache hits since startup. |
@@ -603,8 +604,8 @@ LittDB now emits its metrics through the process-wide OpenTelemetry `MeterProvid
| `litt_write_latency_seconds` | Histogram | seconds | Write latency of the database. |
| `litt_flush_count` | Counter | count | The number of times a flush operation has been performed. |
| `litt_flush_latency_seconds` | Histogram | seconds | Latency of a flush operation. |
-| `litt_segment_flush_latency_seconds` | Histogram | seconds | Segment flush latency; a subset of the time spent during a flush operation. |
-| `litt_keymap_flush_latency_seconds` | Histogram | seconds | Keymap flush latency; a subset of the time spent during a flush operation. |
+| `litt_segment_flush_latency_seconds` | Histogram | seconds | Segment flush latency, a subset of the time spent during a flush operation. |
+| `litt_keymap_flush_latency_seconds` | Histogram | seconds | Keymap flush latency, a subset of the time spent during a flush operation. |
| `litt_garbage_collection_latency_seconds` | Histogram | seconds | Latency of garbage collection operations. |
| `litt_chunk_cache_key_count` | Gauge | count | The number of keys in the chunk cache. |
| `litt_chunk_cache_weight_bytes` | Gauge | bytes | The weight of the chunk cache in bytes. |
@@ -616,21 +617,21 @@ LittDB now emits its metrics through the process-wide OpenTelemetry `MeterProvid
| Attribute | Description |
| --- | --- |
-| `table` | The table the observation applies to. Present on per-table metrics such as `litt_bytes_read`, `litt_read_latency_seconds`, `litt_table_size_bytes`, and the flush/GC latency histograms. |
-| `cache` | The cache instance the observation applies to (`chunk_read` or `chunk_write`). Present on the `litt_chunk_cache_*` metrics, which distinguish read and write caches by this attribute rather than by separate metric names. |
+| `table` | The table that the observation applies to. Present on per-table metrics such as `litt_bytes_read`, `litt_read_latency_seconds`, `litt_table_size_bytes`, and the flush/GC latency histograms. |
+| `cache` | The cache instance that the observation applies to (`chunk_read` or `chunk_write`). Present on the `litt_chunk_cache_*` metrics, which distinguish read and write caches by this attribute instead of by separate metric names. |
-### Migrating from Legacy LittDB Metrics
+### Migrating from legacy LittDB metrics
-Metric names, units, and shape changed with the OpenTelemetry migration, so existing Prometheus and Grafana dashboards must be updated:
+The OpenTelemetry migration changed the metric names, units, and shape. You must update your existing Prometheus and Grafana dashboards:
-- Latency metrics moved from millisecond summaries (for example `{namespace}_read_latency_ms`) to second histograms (`litt_read_latency_seconds`). Adjust thresholds and panel formatting from milliseconds to seconds accordingly.
-- Counters and gauges gained a fixed `litt_` prefix and explicit units, for example `bytes_read` became `litt_bytes_read` and the cache weight gauge became `litt_chunk_cache_weight_bytes`.
-- The per-cache series that were previously separate metric names (for example `chunk_read_cache_*` and `chunk_write_cache_*`) are now the shared `litt_chunk_cache_*` metrics distinguished by the `cache` attribute.
-- The `MetricsNamespace` and `MetricsRegistry` config fields no longer exist. Metric names are fixed, and metrics are always backed by the global OTel provider; supply the scrape port via `MetricsPort`.
+- Latency metrics moved from millisecond summaries (for example, `{namespace}_read_latency_ms`) to second histograms (`litt_read_latency_seconds`). Change thresholds and panel formatting from milliseconds to seconds.
+- Counters and gauges gained a fixed `litt_` prefix and explicit units. For example, `bytes_read` became `litt_bytes_read`, and the cache weight gauge became `litt_chunk_cache_weight_bytes`.
+- The per-cache series that previously had separate metric names (for example, `chunk_read_cache_*` and `chunk_write_cache_*`) are now the shared `litt_chunk_cache_*` metrics. The `cache` attribute distinguishes them.
+- The `MetricsNamespace` and `MetricsRegistry` config fields no longer exist. Metric names are fixed, and the global OTel provider always backs the metrics. Set the scrape port with `MetricsPort`.
-## Performance Testing
+## Performance testing
-
+
```js
import { ethers } from 'ethers';
@@ -785,6 +786,6 @@ testEthGetLogs();
-For specific customizations or additional metrics, consult the Sei
-technical communities in [Telegram](https://t.me/+ZN-NcvOWStQwMzk0) or
+For specific customizations or other metrics, ask the Sei
+technical communities on [Telegram](https://t.me/+ZN-NcvOWStQwMzk0) or
[Discord](https://discord.gg/sei).
diff --git a/node/giga-storage-migration.mdx b/node/giga-storage-migration.mdx
index 5c4b495..3ee7f6a 100644
--- a/node/giga-storage-migration.mdx
+++ b/node/giga-storage-migration.mdx
@@ -5,58 +5,57 @@ description: 'Migrate a Sei RPC node to Giga SS Store: split EVM state into a de
keywords: ['sei node', 'giga storage', 'seidb', 'state sync', 'evm ss', 'flatkv', 'rpc node', 'pebbledb', 'rocksdb']
---
-Giga SS Store is the next step in Sei's storage evolution on top of [SeiDB](/node/node-operators#architecture).
-It splits the hot EVM state into its own dedicated state-store (SS) database
-so the node can scale toward the **~150k TPS** target throughput, and so
-non-EVM modules stop paying write amplification for EVM state.
+Giga SS Store is the next step in Sei's storage evolution, built on [SeiDB](/node/node-operators#architecture).
+It splits the hot EVM state into a dedicated state-store (SS) database.
+The node can then scale toward the target throughput of approximately 150k TPS,
+and non-EVM modules stop paying write amplification for EVM state.
-After migration the SS layer is repartitioned into two cooperating stores:
+After the migration, the SS layer is repartitioned into two cooperating stores:
| Layer | Cosmos backend | EVM backend |
|---|---|---|
| **SC** (State Commit, app hash) | `memiavl` | FlatKV |
| **SS** (State Store, historical queries) | single PebbleDB MVCC database | dedicated EVM SS MVCC databases in the configured EVM SS directory |
-Only the **SS** layer changes for this migration. SC layer config is untouched
-and `memiavl` remains the authoritative source for the app hash, so this is
+This migration changes only the **SS** layer. The SC layer config stays the same,
+and `memiavl` remains the authoritative source for the app hash, so the change is
invisible to the network.
-This guide tracks the canonical procedure in [`docs/migration/giga_store_migration.md`](https://github.com/sei-protocol/sei-chain/blob/main/docs/migration/giga_store_migration.md) inside `sei-chain`. Open an issue there if anything here drifts.
+This guide follows the canonical procedure in the `sei-chain` repository: [`docs/migration/giga_store_migration.md`](https://github.com/sei-protocol/sei-chain/blob/main/docs/migration/giga_store_migration.md). If anything here drifts, open an issue there.
## Prerequisites
-This migration is supported on **RPC nodes only**. Validator nodes and archive nodes are not supported by this flow yet — do not run it against either.
+Run this migration on **RPC nodes only**. This flow does not support validator nodes or archive nodes yet, so do not run it against either.
-- A `seid` build with the `evm-ss-split` flag wired in (Sei v6.5 or later). Older
- releases used per-key `evm-ss-write-mode` / `evm-ss-read-mode` toggles; if your
- `app.toml` still has those keys, upgrade `seid` before continuing.
+- A `seid` build that supports the `evm-ss-split` flag (Sei v6.5 or later). Older
+ releases used the per-key `evm-ss-write-mode` and `evm-ss-read-mode` toggles. If your
+ `app.toml` still has those keys, upgrade `seid` before you continue.
- `sc-enable = true` and `ss-enable = true` in `app.toml`. Both must stay enabled.
-- A trusted RPC endpoint to state-sync from (chain ID and trust-height source).
+- A trusted RPC endpoint for state sync (the chain ID and trust-height source).
- Disk headroom for two SS databases. The EVM split does not duplicate data, but
- during migration both the old and the new layouts may briefly coexist on disk.
+ the old and new layouts may briefly coexist on disk during the migration.
The migration **requires a full state sync**. There is no in-place migration
-path and no live "dual-write then split" workflow — the state sync wipes the
+path and no live "dual-write then split" workflow. The state sync wipes the
local data directory and imports a fresh snapshot into the new layout.
## Benefits
-- EVM reads are served exclusively from a dedicated EVM SS database.
+- The node serves EVM reads only from a dedicated EVM SS database.
- Non-EVM modules no longer pay write amplification for EVM state.
## What's different about EVM SS
-EVM SS is **point-query only by design** (`Get` / `Has`). Iteration is
-explicitly disabled on the EVM backend for performance: the hot EVM read path
-is tuned for direct key lookups, and cross-bucket scans would defeat the
-per-type sub-DB layout. Any EVM read that needs iteration must stay on the
-Cosmos SS side.
+EVM SS is **point-query only by design** (`Get` and `Has`). For performance,
+iteration is explicitly disabled on the EVM backend. The hot EVM read path is
+tuned for direct key lookups, and cross-bucket scans would defeat the per-type
+sub-DB layout. Any EVM read that needs iteration must stay on the Cosmos SS side.
-## Migration Steps
+## Migration steps
### Step 1: Update `app.toml`
-Apply the following settings in `~/.sei/config/app.toml`:
+Apply these settings in `~/.sei/config/app.toml`:
```toml copy
[state-commit]
@@ -84,16 +83,16 @@ Giga SS Store is fully compatible with the existing state-snapshot format. On
import, the composite state store routes each snapshot node based on the
importing node's `evm-ss-split`:
-- With `evm-ss-split = true`, EVM snapshot nodes go only into EVM SS and
+- With `evm-ss-split = true`, EVM snapshot nodes go only into EVM SS, and
non-EVM nodes go only into Cosmos SS.
-- The import path normalizes legacy `evm_flatkv` snapshot nodes to `evm`, so
- snapshots produced by either the old or new FlatKV module are accepted.
+- The import path normalizes legacy `evm_flatkv` snapshot nodes to `evm`, so it
+ accepts snapshots from either the old or the new FlatKV module.
-Both stores end up fully populated at the snapshot height, so the node can
-start serving reads immediately.
+Both stores are then fully populated at the snapshot height, so the node can
+serve reads immediately.
-The full state-sync flow is documented in the
-[Statesync guide](/node/statesync). The minimal shape for this migration:
+The [state sync guide](/node/statesync) documents the full flow. The minimal
+flow for this migration is:
```bash copy
export TRUST_HEIGHT_DELTA=10000
@@ -130,12 +129,12 @@ cp /tmp/genesis.json $SEID_HOME/config/genesis.json
sudo systemctl restart seid
```
-Make sure `priv_validator_key.json` is in safe storage before deleting it from the config directory. Loss of this key is unrecoverable for a validator and is not relevant to RPC-only nodes — but if you're following this from the wrong checklist you'll find out the hard way.
+Make sure `priv_validator_key.json` is in safe storage before you delete it from the config directory. The loss of this key is unrecoverable for a validator but does not matter for RPC-only nodes. If you follow these steps from the wrong checklist, you can lose a validator key permanently.
### Step 3: Verify the new layout
-Once the state sync completes and the node starts producing blocks, confirm
-Giga SS Store is active in two places.
+After the state sync completes and the node starts producing blocks, confirm
+that Giga SS Store is active in two places.
**Startup logs.** All three lines should appear:
@@ -145,8 +144,8 @@ Giga SS Store is active in two places.
"EVM state store enabled" # with `dir` and `separateDBs` labels
```
-**EVM RPC.** `debug_traceBlockByNumber` is the cleanest end-to-end check —
-it forces the node to read EVM state out of the new EVM SS backend:
+**EVM RPC.** `debug_traceBlockByNumber` is the cleanest end-to-end check.
+It forces the node to read EVM state from the new EVM SS backend:
```bash copy
curl -s -X POST http://127.0.0.1:8545 \
@@ -154,32 +153,32 @@ curl -s -X POST http://127.0.0.1:8545 \
--data '{"jsonrpc":"2.0","method":"debug_traceBlockByNumber","params":["latest",{}],"id":1}'
```
-The response should contain a `"result"` field rather than an RPC error.
+The response should contain a `"result"` field, not an RPC error.
## Safety checks
-`seid` runs three DB-state checks at startup and refuses to launch if the EVM
-SS and Cosmos SS DBs are inconsistent. They specifically catch the footgun of
-flipping `evm-ss-split` from `false` to `true` without state syncing.
-
-1. **EVM SS directory missing or empty** (before the EVM SS is opened). When
- `evm-ss-split = true`, the composite state store refuses to proceed if
- Cosmos SS already has committed history but the configured EVM SS directory
- does not exist or is empty. Failing before the sub-DBs are opened means a
- rejected config does not leave a confusing empty directory behind.
-2. **EVM SS DB empty post-open, pre-recovery.** Belt-and-suspenders for (1)
- when the directory exists but its DBs are empty. The WAL only covers the
- last `KeepRecent` blocks, so replay cannot rebuild a fresh EVM SS from
- scratch.
+`seid` runs three DB-state checks at startup and refuses to start if the EVM SS
+and Cosmos SS DBs are inconsistent. They specifically catch the mistake of
+flipping `evm-ss-split` from `false` to `true` without a state sync.
+
+1. **EVM SS directory missing or empty** (before the EVM SS is opened). This
+ check applies when `evm-ss-split = true`. If Cosmos SS already has committed
+ history but the configured EVM SS directory is missing or empty, the
+ composite state store refuses to proceed. The check fails before the sub-DBs
+ are opened, so a rejected config does not leave a confusing empty directory
+ behind.
+2. **EVM SS DB empty post-open, pre-recovery.** This second safeguard for check 1
+ covers the case where the directory exists but its DBs are empty. The WAL
+ covers only the last `KeepRecent` blocks, so replay cannot rebuild a fresh
+ EVM SS from scratch.
3. **Mismatched earliest versions, post-recovery.** If the two DBs were
populated from different snapshots (or pruned independently), historical
reads would be inconsistent. A non-zero earliest-version divergence
aborts startup.
-If any check fires, the correct fix is either (a) complete the state sync
-described above, or (b) set `evm-ss-split = false` and restart. If
-the configured EVM SS directory is stale from a failed attempt, remove it
-before state syncing.
+If any check fails, the correct fix is to either (a) complete the state sync
+described above or (b) set `evm-ss-split = false` and restart. If the configured
+EVM SS directory is stale from a failed attempt, remove it before the state sync.
## Rollback
@@ -189,80 +188,84 @@ To roll back:
2. Restart the node. The EVM SS DB is no longer opened but stays on disk until
you remove it.
-To fully reclaim the disk used by EVM SS, stop the node and delete
-the configured EVM SS directory after reverting the setting.
+To fully reclaim the disk used by EVM SS, revert the setting first. Then stop
+the node and delete the configured EVM SS directory.
-Cleanly rolling back to `evm-ss-split = false` requires another state sync. Under `evm-ss-split = true`, EVM writes go only to the EVM SS DB, so Cosmos SS will not have those writes. Restarting with `evm-ss-split = false` stops opening the EVM SS DB, but EVM-state queries will miss anything written after the Giga state sync until you re-state-sync without the split.
+To roll back cleanly to `evm-ss-split = false`, run another state sync. Under `evm-ss-split = true`, EVM writes go only to the EVM SS DB, so Cosmos SS does not have those writes. If you restart with `evm-ss-split = false`, the node stops opening the EVM SS DB. However, EVM-state queries miss anything written after the Giga state sync until you run state sync again without the split.
## FlatKV EVM SC migration flow
Everything above concerns the **SS** (State Store) layer. The **SC** (State
-Commit) layer has its own, separate migration path that moves the hot `evm/`
-data out of `memiavl` and into FlatKV in place, without a state sync. It is
-driven entirely by `app.toml`'s `sc-write-mode` and is coordinated across a
-quorum by stopping the nodes, editing config, and restarting.
+Commit) layer has a separate migration path. It moves the hot `evm/` data out
+of `memiavl` and into FlatKV in place, without a state sync. The `sc-write-mode`
+setting in `app.toml` drives this path entirely. You coordinate it across a
+quorum by stopping the nodes, editing the config, and restarting them.
Unlike the SS split, the SC-side migration **does change how `evm/` data
-contributes to the app hash** (memiavl IAVL root before the migration; FlatKV
-lattice hash after). Because of that, every validator in a quorum must flip at
-the same coordinated stop — a node flipped while its peers are still on the old
-mode will produce a different AppHash on the very next block and consensus will
-halt. The safe sequence is always: stop everyone, rewrite `app.toml`
-everywhere, restart everyone.
+contributes to the app hash**. The contribution moves from the memiavl IAVL root
+to the FlatKV lattice hash. Because of this, every validator in a quorum must
+flip at the same coordinated stop. If a node flips while its peers are still on
+the old mode, it produces a different AppHash on the next block, and consensus
+halts. The safe sequence is always: stop every node, rewrite `app.toml`
+everywhere, and restart every node.
-This SC-side FlatKV EVM migration flow is exercised by the cluster/devnet integration harness. Do not run it against testnet/mainnet nodes unless the release notes for your version explicitly call it out as supported.
+Do not run this SC-side flow against Sei Testnet or Sei Mainnet nodes unless your version's release notes explicitly list it as supported. The cluster and devnet integration harness tests this FlatKV EVM migration flow.
### Write modes
-The migration is a transition from the `memiavl_only` write mode (v0, where
-memiavl is the sole SC backend and FlatKV is not allocated) to `migrate_evm`
-(the in-flight mode that drains `evm/` keys from memiavl into FlatKV). Once the
-migration completes, operators flip `sc-write-mode` again to `evm_migrated` so
-subsequent restarts don't spin up the migration manager.
-
-`evm_migrated` is not the last stop. Three further modes sit between it and
-the terminal mode: `migrate_all_but_bank` (drains every remaining module
-except `bank/` from memiavl into FlatKV), `all_migrated_but_bank` (the steady
-state once that drain completes), and `migrate_bank` (drains the final
-`bank/` module).
-
-`flatkv_only` is the fully-supported **terminal** steady-state write mode:
-FlatKV is the sole SC backend and `memiavl` is not allocated at all. In this
-mode every module's SC state is served from FlatKV, and state-sync snapshot
-export/restore plus app-hash parity work correctly, so a node can boot directly
-into the post-migration shape without ever running the migration manager.
-`flatkv_only` is only valid for a node whose modules have all been drained out
-of memiavl — it is not a flip target for an `evm_migrated` node, which still
+The migration is a transition from the `memiavl_only` write mode to
+`migrate_evm`. In `memiavl_only` (v0), memiavl is the sole SC backend and FlatKV
+is not allocated. The in-flight mode, `migrate_evm`, drains `evm/` keys from
+memiavl into FlatKV. After the migration completes, flip `sc-write-mode`
+again to `evm_migrated`, so that later restarts do not start the migration
+manager.
+
+`evm_migrated` is not the last mode. Three more modes sit between it and the
+terminal mode:
+
+- `migrate_all_but_bank` drains every remaining module except `bank/` from
+ memiavl into FlatKV.
+- `all_migrated_but_bank` is the steady state after that drain completes.
+- `migrate_bank` drains the final `bank/` module.
+
+`flatkv_only` is the fully supported **terminal** steady-state write mode.
+FlatKV is the sole SC backend, and `memiavl` is not allocated at all. FlatKV
+serves the SC state of every module. State-sync snapshot export and restore
+work correctly in this mode, and so does app-hash parity. A node can therefore
+boot or state sync directly into the post-migration shape, without ever running
+the migration manager. Such a node uses `flatkv_only`.
+
+`flatkv_only` is valid only for a node whose modules have all been drained out
+of memiavl. It is not a flip target for an `evm_migrated` node, which still
holds `bank/` and every other non-EVM module in memiavl. It becomes the valid
-flip target once `migrate_bank` reports complete on the node (migration
-version 3, all modules in FlatKV): restart with `sc-write-mode = "flatkv_only"`
-to reach the terminal steady state. It is also the mode for a node that boots
-or state-syncs directly into the post-migration shape without ever running the
-migration manager.
-
-A correctness bug in the WAL replay path — where empty (zero-length)
-values written with no delete flag were dropped on replay (catchup, read-only
-clone, snapshot export, and state-sync restore), diverging the FlatKV state and
-the consensus AppHash from the live chain — is fixed. Empty-value writes are now
-preserved across a WAL round-trip and state-sync, which is what makes
-`flatkv_only` state-sync reliable.
-
-While in a migration mode:
-
-- Caller reads of not-yet-migrated keys fall back to FlatKV for brand-new keys
- written after the migration started, and to memiavl otherwise.
-- Iteration is served by a merging iterator over both backends (memiavl
- queried first, FlatKV winning on ties), so range scans see the complete key
- set during a migration.
+flip target after `migrate_bank` reports complete on the node (migration
+version 3, all modules in FlatKV). Then restart with
+`sc-write-mode = "flatkv_only"` to reach the terminal steady state.
+
+A correctness bug in the WAL replay path is fixed. On replay (catchup,
+read-only clone, snapshot export, and state-sync restore), the bug dropped empty
+(zero-length) values written with no delete flag. This made the FlatKV state and
+the consensus AppHash diverge from the live chain. Empty-value writes are now
+preserved across a WAL round-trip and a state sync, which makes `flatkv_only`
+state sync reliable.
+
+While a node is in a migration mode:
+
+- Caller reads of not-yet-migrated keys fall back to FlatKV for new keys written
+ after the migration started, and to memiavl otherwise.
+- A merging iterator over both backends serves iteration. It queries memiavl
+ first, and FlatKV wins on ties, so range scans see the complete key set during
+ a migration.
- The migration boundary advances at most once per block.
### Operator-facing knobs
**`sc-keys-to-migrate-per-block`** (`app.toml`, `[state-commit]` section)
controls how many EVM keys the in-flight migration drains from memiavl into
-FlatKV per block. It defaults to `1024`, which is appropriate for production
-drains. Lowering it spreads the migration across more blocks. It must be `> 0`,
-and it is ignored entirely when `sc-write-mode` is not a migration mode.
+FlatKV per block. The default is `1024`, which is appropriate for production
+drains. A lower value spreads the migration across more blocks. The value must
+be `> 0`. The node ignores it entirely when `sc-write-mode` is not a migration
+mode.
```toml copy
[state-commit]
@@ -270,11 +273,11 @@ sc-write-mode = "migrate_evm"
sc-keys-to-migrate-per-block = 1024
```
-**`GIGA_MIGRATE_FROM_MEMIAVL`** is a cluster/docker environment variable used by
-the local devnet setup. When set to `true` it boots every node in
-`memiavl_only` mode — the v0 starting point for the FlatKV EVM migrate flow. It
-is mutually exclusive with `GIGA_STORAGE`; if both are set,
-`GIGA_MIGRATE_FROM_MEMIAVL` takes precedence.
+**`GIGA_MIGRATE_FROM_MEMIAVL`** is a Docker cluster environment variable for the
+local devnet setup. When set to `true`, it boots every node in `memiavl_only`
+mode, the v0 starting point for the FlatKV EVM migrate flow. It is mutually
+exclusive with `GIGA_STORAGE`. If both are set, `GIGA_MIGRATE_FROM_MEMIAVL`
+takes precedence.
```bash copy
GIGA_MIGRATE_FROM_MEMIAVL=true make docker-cluster-start
@@ -284,30 +287,30 @@ GIGA_MIGRATE_FROM_MEMIAVL=true make docker-cluster-start
The `seidb migrate-evm-status` subcommand reports the on-disk FlatKV EVM
migrate state of a FlatKV directory as JSON. It clones the latest snapshot and
-WAL into a temp dir before reading, so it can be run against a live node's data
-directory without contending for the FlatKV writer lock.
+WAL into a temporary directory before it reads. You can therefore run it against
+a live node's data directory without contending for the FlatKV writer lock.
```bash copy
seidb migrate-evm-status --db-dir [--height ]
# Full flag and JSON-field reference: /node/technical-reference (seidb Tooling Commands)
```
-`--db-dir` (short `-d`) points at the FlatKV data directory; `--height` selects
-a target version (`0`, the default, selects the latest available version). The
-emitted JSON includes `migrate_evm_complete` (true once the migration finishes),
+`--db-dir` (short `-d`) points at the FlatKV data directory. `--height` selects
+a target version. The default, `0`, selects the latest available version. The
+emitted JSON includes `migrate_evm_complete` (true after the migration finishes),
`migration_version`, `version_at`, and whether an in-flight boundary is still
-present. Poll it until `migrate_evm_complete` reports `true` on every validator
-before flipping `sc-write-mode` to `evm_migrated`.
+present. Before you flip `sc-write-mode` to `evm_migrated`, poll the command
+until `migrate_evm_complete` reports `true` on every validator.
When the migration finishes, each node also emits a `migration complete` summary
-log line and a set of `seidb_migration_*` OpenTelemetry counters covering keys
-and bytes migrated.
+log line and `seidb_migration_*` OpenTelemetry counters for the migrated keys
+and bytes.
-### Importing EVM State from memIAVL into FlatKV
+### Importing EVM state from memIAVL into FlatKV
-The `seidb import-flatkv-from-memiavl` command populates a FlatKV store from an existing memIAVL tree, for nodes moving to the FlatKV EVM commit store without a state sync. Two safety properties matter:
+The `seidb import-flatkv-from-memiavl` command populates a FlatKV store from an existing memIAVL tree. It is for nodes that move to the FlatKV EVM commit store without a state sync. Two safety properties matter:
-- The import height must equal the memIAVL latest version. The command refuses to import at a lower height (the composite store's version reconciliation would silently roll memIAVL back and truncate blocks) and refuses a higher one. Check the current version first with `seidb memiavl-latest-version`, and roll memIAVL back to the target height before importing if needed.
+- The import height must equal the latest memIAVL version. The command refuses a lower height, because the composite store's version reconciliation would silently roll memIAVL back and truncate blocks. It also refuses a higher height. First, check the current version with `seidb memiavl-latest-version`. If needed, roll memIAVL back to the target height before you import.
- Overwriting existing committed FlatKV data requires the explicit `--force` flag.
## FAQ
@@ -318,12 +321,12 @@ The `seidb import-flatkv-from-memiavl` command populates a FlatKV store from an
`data/state_store/cosmos/pebbledb/` in the current layout.
- EVM SS data uses `data/evm_ss/` in the legacy layout and
`data/state_store/evm/pebbledb/` in the current layout.
-- Nodes created before the layout change keep their legacy paths automatically
- (a legacy directory takes precedence when present); new nodes use the
+- Nodes created before the layout change keep their legacy paths automatically.
+ A legacy directory takes precedence when it is present. New nodes use the
current layout.
- A non-empty `ss-db-directory` or `evm-ss-db-directory` overrides the
corresponding default path.
-- SC data (`memiavl` + FlatKV) is untouched by this migration.
+- This migration does not change SC data (`memiavl` and FlatKV).
### Does Giga SS Store change the app hash or consensus?
@@ -341,31 +344,31 @@ Not yet. Archive-node migration is out of scope for this guide.
### Can I toggle back to `evm-ss-split = false` after enabling it?
-Yes, but cleanly rolling back requires another state sync — see the
+Yes, but a clean rollback requires another state sync. See the
[Rollback](#rollback) section above.
### Why can't I just flip `evm-ss-split = true` on a running node?
-Because `evm-ss-split = true` requires the EVM SS DB to already contain the
-full history that Cosmos SS has. A live flip would leave the EVM SS DB empty
-while the composite store refuses to fall back to Cosmos SS, which would
-translate into missing EVM state at query time. The safety checks above
-block this scenario at startup.
+The `evm-ss-split = true` setting requires the EVM SS DB to already contain the
+full history that Cosmos SS has. A live flip would leave the EVM SS DB empty,
+and the composite store refuses to fall back to Cosmos SS. The result would be
+missing EVM state at query time. The safety checks above block this scenario at
+startup.
### Does Giga SS Store support historical proofs?
-No, same as SeiDB. SS stores raw KVs and does not reconstruct IAVL-style
-proofs.
+No, and neither does SeiDB. SS stores raw KVs and does not reconstruct
+IAVL-style proofs.
### Does enabling Giga Storage change the receipt backend?
In the `localnode` and `rpcnode` configuration scripts, setting
`GIGA_STORAGE=true` defaults `RECEIPT_BACKEND` to `pebble` unless you set
-`RECEIPT_BACKEND` explicitly. To use a different value while running with Giga
-Storage, provide an explicit `RECEIPT_BACKEND` env var, which takes precedence
-over the default.
+`RECEIPT_BACKEND` explicitly. To use a different value with Giga Storage, set the
+`RECEIPT_BACKEND` environment variable explicitly. The explicit value takes
+precedence over the default.
-`pebbledb` (aka `pebble`) is now the only supported receipt-store backend. The
-former `parquet` option has been removed: setting `RECEIPT_BACKEND=parquet` (or
-`rs-backend = "parquet"` in `app.toml`) is rejected with an error
+`pebbledb` (also called `pebble`) is now the only supported receipt-store
+backend. The former `parquet` option was removed. A `RECEIPT_BACKEND=parquet`
+setting (or `rs-backend = "parquet"` in `app.toml`) is rejected with an error
(`unsupported receipt-store backend "parquet"; supported: pebbledb`).
diff --git a/node/index.mdx b/node/index.mdx
index f4c25b6..39a382e 100644
--- a/node/index.mdx
+++ b/node/index.mdx
@@ -8,24 +8,24 @@ keywords: ["sei node", "node operations", "validator", "RPC node", "sei blockcha
import { VersionTable } from '/snippets/version-table.jsx';
import { RandomPeers } from '/snippets/random-peers.jsx';
-**Power the Sei Network Infrastructure**
+**Power the Sei network infrastructure**
-Comprehensive guides for running, maintaining, and optimizing Sei network nodes. Whether you're setting up a validator, an RPC node, or an archive node, you'll find detailed instructions and best practices to ensure optimal performance and security.
+These guides show how to run, maintain, and optimize Sei network nodes. Whether you set up a validator, an RPC node, or an archive node, they give detailed instructions and best practices for performance and security.
-
-
-
-
+
+
+
+
-## Network Versions
+## Network versions
-_Live binary versions, genesis, and seed peers — see the [technical reference](/node/technical-reference)._
+_For live binary versions, genesis, and seed peers, see the [technical reference](/node/technical-reference)._
-## Hardware Requirements
+## Hardware requirements
| Component | Required |
| --------- | ------------------------------------------------------ |
@@ -34,26 +34,26 @@ _Live binary versions, genesis, and seed peers — see the [technical reference]
| Storage | 2 TB NVMe SSD (high IOPS required) |
| Network | 2 Gbps with low latency |
-## Installation & Setup Steps
+## Installation & setup steps
-
-##### System Preparation
+
+##### System preparation
-###### 1. Update and Upgrade System
+###### 1. Update and upgrade system
```bash
sudo apt update && sudo apt upgrade -y
```
-###### 2. Install Essential Packages
+###### 2. Install essential packages
```bash
sudo apt install make gcc git jq chrony curl lz4 wget tar build-essential -y
```
-###### 3. Synchronize System Time
+###### 3. Synchronize system time
```bash
sudo timedatectl set-timezone UTC
@@ -66,12 +66,11 @@ timedatectl
You need Go only if you build `seid` from source. The prebuilt binary and Docker
install paths in the next step do not require it.
-Current `seid` releases require Go 1.25.6 or later. Check the `go.mod` at the release tag
-you check out
-(e.g. [`v6.6.1`](https://github.com/sei-protocol/sei-chain/blob/v6.6.1/go.mod)) for its
-exact requirement.
+Current `seid` releases require Go 1.25.6 or later. For the exact requirement, check the
+`go.mod` at the release tag that you check out (for example,
+[`v6.6.1`](https://github.com/sei-protocol/sei-chain/blob/v6.6.1/go.mod)).
-###### Installation Steps
+###### Installation steps
```bash
# Check for existing Go installations — more than one entry means another copy
@@ -101,25 +100,25 @@ go version
```
- `sudo rm -rf /usr/local/go` is the replacement step [Go's install
- docs](https://go.dev/doc/install) prescribe, but it only clears a tarball install. A
+ `sudo rm -rf /usr/local/go` is the replacement step that [Go's install
+ docs](https://go.dev/doc/install) prescribe. It clears only a tarball install. A
package-manager Go (`/usr/lib/go-*`, Homebrew) survives it and can still shadow
- `/usr/local/go/bin/go` — if the final `go version` reports the old release,
+ `/usr/local/go/bin/go`. If the final `go version` reports the old release,
`which -a go` lists every copy on your `PATH`. If the extraction itself fails, the
- verified tarball is still in your working directory: re-run the `sudo tar` command
- rather than starting over.
+ verified tarball is still in your working directory. Re-run the `sudo tar` command
+ instead of starting over.
##### Install the `seid` binary
-See the Network Versions table above for the current recommended version.
+For the current recommended version, see the Network Versions table above.
Each release attaches a statically linked `seid` build for `linux/amd64` with no
- runtime dependencies: no Go toolchain and no shared libraries to install.
+ runtime dependencies. You do not need to install a Go toolchain or shared libraries.
```bash
VERSION= # e.g. v6.6.1 — see the Network Versions table above
@@ -139,20 +138,20 @@ See the Network Versions table above for the current recommended version.
Prebuilt binaries are attached from `v6.6.1` onward. For earlier versions,
- build from source or use Docker. They are `linux/amd64` only and omit hardware
- Ledger support. On other architectures, or if you sign with a Ledger device,
- build from source or use Docker.
+ build from source or use Docker. Prebuilt binaries are `linux/amd64` only and do not
+ include hardware Ledger support. On other architectures, or if you sign with a Ledger
+ device, build from source or use Docker.
- Switching from a previous `make install` build? Remove the old copy
- (`rm -f "$(go env GOPATH)/bin/seid"`) or make sure your service unit points at
- `/usr/local/bin/seid` — `which -a seid` lists every copy on your `PATH`.
+ If you are switching from a previous `make install` build, remove the old copy
+ (`rm -f "$(go env GOPATH)/bin/seid"`). Alternatively, make sure that your service unit
+ points at `/usr/local/bin/seid`. The `which -a seid` command lists every copy on your `PATH`.
- Requires Go and a C toolchain (see the Environment Setup step above).
+ This method requires Go and a C toolchain (see the Environment Setup step above).
```bash
# Clone repository and install
@@ -166,9 +165,9 @@ See the Network Versions table above for the current recommended version.
```
- If you encounter an error like `command not found: seid`, you may need to set your GOPATH environment variable.
+ If you get an error like `command not found: seid`, you may need to set your GOPATH environment variable.
- Add the following to your `~/.bashrc` or `~/.zshrc`:
+ Add these lines to your `~/.bashrc` or `~/.zshrc`:
```bash
export GOPATH=$(go env GOPATH)
@@ -177,12 +176,12 @@ See the Network Versions table above for the current recommended version.
Then reload your shell with `source ~/.bashrc` or `source ~/.zshrc`.
- For more information see [here](https://pkg.go.dev/cmd/go#hdr-GOPATH_environment_variable).
+ For more information, see the [Go documentation for GOPATH](https://pkg.go.dev/cmd/go#hdr-GOPATH_environment_variable).
- Official Docker images are available at GitHub Container Registry.
+ Official Docker images are available in the GitHub Container Registry.
```bash
# Pull the latest version
@@ -195,28 +194,28 @@ See the Network Versions table above for the current recommended version.
Available architectures: linux/amd64 and linux/arm64.
- Sei's continuous integration (CI) pipelines publish testing-only image variants to an internal registry — they are not available on `ghcr.io`. These must **never** be used in production and are compiled with special Go build tags:
+ **Never** use the testing-only image variants in production. Sei's continuous integration (CI) pipelines publish these variants to an internal registry. They are not available on `ghcr.io`. The variants are compiled with special Go build tags:
- - `mock-*` — built with the `mock_balances` build tag; mocks account balances.
- - `mock_block_validation-*` — bypasses `AppHash` and `DataHash` block validation.
- - `mock_chain_validation-*` — swallows most halting consensus validation failures (every swallow-eligible check except `ErrLastCommitVerify`), computing each check authentically but continuing instead of halting. Built with both the `mock_balances` and `mock_chain_validation` Go build tags. Nodes running these non-default consensus policies emit a `sei_unsafe_validation_skipped_total` counter (attribute `validation_error`) each time a failure is swallowed; on production policies it never increments.
+ - `mock-*`: built with the `mock_balances` build tag. It mocks account balances.
+ - `mock_block_validation-*`: bypasses `AppHash` and `DataHash` block validation.
+ - `mock_chain_validation-*`: swallows most halting consensus validation failures (every swallow-eligible check except `ErrLastCommitVerify`). It computes each check authentically but continues instead of halting. It is built with both the `mock_balances` and `mock_chain_validation` Go build tags. Nodes that run these non-default consensus policies emit a `sei_unsafe_validation_skipped_total` counter (attribute `validation_error`) each time a failure is swallowed. On production policies, the counter never increments.
- Production images are built with full validation enabled. The `mock_block_validation` and `mock_chain_validation` variants are intended solely for testing environments where relaxing validation checks is required; running either on a production network is unsafe.
+ Production images are built with full validation enabled. The `mock_block_validation` and `mock_chain_validation` variants are intended only for testing environments that require relaxed validation checks. Running either variant on a production network is unsafe.
-##### Initialize Chain Files
+##### Initialize chain files
-Default init mode is **full** (RPC/P2P bind to all interfaces). For **validator** or **seed** nodes, use `--mode validator` or `--mode seed` so RPC and P2P bind to localhost only. See the [Validator Operations Guide](/node/validators) for the full validator init example.
+The default init mode is **full**, in which RPC and P2P bind to all interfaces. For **validator** or **seed** nodes, use `--mode validator` or `--mode seed`. In these modes, RPC and P2P bind to localhost only. For the full validator init example, see the [Validator Operations Guide](/node/validators).
-Peers can be found here -
+You can find peers here:
-- mainnet (pacific-1):
+- Sei Mainnet (pacific-1):
-- testnet (atlantic-2):
+- Sei Testnet (atlantic-2):
@@ -241,7 +240,7 @@ PEERS=""
sed -i 's/persistent-peers = .*/persistent-peers = "'$PEERS'"/' ~/.sei/config/config.toml
```
-##### Configure App Settings
+##### Configure app settings
```bash
# Set minimum gas price (recommended; helps prevent spam transactions)
@@ -262,20 +261,20 @@ sed -i -e "s/^occ-enabled *=.*/occ-enabled = true/" $HOME/.sei/config/app.toml
```
- In case of running an Archive Node, make sure to set your state-store settings to `ss-keep-recent = 0` with
+ If you run an archive node, use this command to set `ss-keep-recent = 0` in your state-store settings:
```bash
sed -i 's/^ss-keep-recent = [0-9]*/ss-keep-recent = 0/' ~/.sei/config/app.toml
```
-
+
-#### Archive Node Setup
+#### Archive node setup
-An archive node maintains the complete historical record of the chain. This requires disabling state sync and starting with a pre-existing database using a "snapshot".
+An archive node keeps the complete historical record of the chain. To run one, you must disable state sync and start from a pre-existing database (a snapshot).
-**1. Disable State Sync** — In $HOME/.sei/config/config.toml , modify the [statesync] section:
+**1. Disable state sync**: In `$HOME/.sei/config/config.toml`, modify the `[statesync]` section:
```toml
# State sync configuration
@@ -283,14 +282,14 @@ An archive node maintains the complete historical record of the chain. This requ
enable = false
```
-**2. Configure Archive Node Peers** — To sync from the height your snapshot was created at, you need peers retaining a large amount of historical blocks. The node will require specific peers during initial sync, which can be changed at a later time.
+**2. Configure archive node peers**: To sync from the height at which your snapshot was created, you need peers that keep many historical blocks. During the initial sync, the node needs these specific peers. You can change them later.
-#### Mempool Configuration
+#### Mempool configuration
-For optimal transaction handling and resource management, it is recommended to update the mempool settings in your `config.toml` file.
+For optimal transaction handling and resource management, update the mempool settings in your `config.toml` file.
- Adjust these parameters if you encounter performance or resource issues on your specific hardware.
+ If you have performance or resource issues on your hardware, adjust these parameters.
```toml
@@ -342,18 +341,18 @@ pending-ttl-num-blocks = 0
```
- `pending-ttl-duration` and `pending-ttl-num-blocks` are deprecated and now have no effect. They are ignored regardless of the value you set.
+ `pending-ttl-duration` and `pending-ttl-num-blocks` are deprecated and have no effect. They are ignored, whatever value you set.
-
-##### Setting Up a systemd Service
+
+##### Setting up a systemd service
-If you see an error such as `panic: recovered: runtime error: integer divide by zero` it means you can’t start nodes straight from the genesis file. Instead, sync to the block tip via [state sync](/node/statesync) or using a [snapshot](/node/snapshot).
+If you see an error such as `panic: recovered: runtime error: integer divide by zero`, it means that you cannot start nodes directly from the genesis file. Instead, sync to the block tip with [state sync](/node/statesync) or a [snapshot](/node/snapshot).
-For production deployments, configure a systemd service to ensure your node restarts automatically:
+For production deployments, configure a systemd service so that your node restarts automatically:
```bash
# Create the systemd service file
@@ -379,7 +378,7 @@ sudo systemctl enable seid
sudo systemctl start seid
```
-##### Monitoring & Troubleshooting
+##### Monitoring & troubleshooting
Check your node's status with these commands:
@@ -394,16 +393,16 @@ journalctl -u seid -f -o cat
seid query staking validator $(seid keys show --bech val -a)
```
-**Common Issues & Solutions**
+**Common issues & solutions**
-
- - Verify sufficient disk space
- - Ensure stable network connectivity
- - Confirm system time is synchronized
- - Consider using state sync for initial setup
+
+ - Verify that you have enough disk space
+ - Make sure that the network connection is stable
+ - Confirm that the system time is synchronized
+ - Consider using state sync for the initial setup
-
+
- Monitor system resources (CPU, RAM, I/O)
- Evaluate disk performance and network bandwidth
- Adjust mempool and peer settings if needed
@@ -413,34 +412,34 @@ seid query staking validator $(seid keys show --bech val -a)
-[View Complete Node Setup Guide](/node/node-operators)
+[View the complete node setup guide](/node/node-operators)
-## Node Resources
+## Node resources
-### Node Setup
+### Node setup
-
- Complete guide to setting up and running a Sei node with hardware requirements and configuration steps.
+
+ Complete guide to setting up and running a Sei node, with hardware requirements and configuration steps.
-
+
Specialized instructions for validators, including staking, commission settings, and security best practices.
-
- Full reference for `app.toml`, `config.toml`, and `client.toml` shipped by the latest `seid` release.
+
+ Full reference for the `app.toml`, `config.toml`, and `client.toml` files from the latest `seid` release.
-### Advanced Operations
+### Advanced operations
-
+
Optimize your node's performance with advanced settings and monitoring tools.
-
+
Move EVM historical state into dedicated state-store databases on supported RPC nodes.
-
+
Detailed technical specifications, API endpoints, and commands for node operators.
diff --git a/node/node-operators.mdx b/node/node-operators.mdx
index fcfc06c..f9ea999 100644
--- a/node/node-operators.mdx
+++ b/node/node-operators.mdx
@@ -5,13 +5,13 @@ description: 'Detailed guide for running and maintaining Sei nodes. Learn about
keywords: ['sei node', 'blockchain node', 'node configuration', 'seidb', 'node maintenance', 'system operations', 'rocksdb']
---
-This guide covers the detailed operational aspects of running a Sei node,
-including configuration management, maintenance procedures, and best practices
-for stable and performant operations.
+This guide covers the details of running a Sei node, including configuration
+management, maintenance procedures, and best practices for stable,
+high-performance operation.
-## Configuration Management
+## Configuration management
-### Directory Structure
+### Directory structure
The Sei node configuration is stored in `$HOME/.sei/config/`:
@@ -34,15 +34,15 @@ The state-store databases live outside the config directory:
- Non-empty `ss-db-directory` and `evm-ss-db-directory` settings override
those locations.
-The snippets below are opinionated tuning recommendations layered on top of
-the defaults. For the *full* unmodified `app.toml`, `config.toml`, and
-`client.toml` shipped by the latest tagged `seid` release, jump to
-[Default Configurations](#default-configurations) at the bottom of this
+The snippets below are opinionated tuning recommendations on top of the
+defaults. For the *full* unmodified `app.toml`, `config.toml`, and
+`client.toml` files from the latest tagged `seid` release, see
+[Default configurations](#default-configurations) at the bottom of this
section.
-### Essential Configuration Parameters
+### Essential configuration parameters
-#### Network Settings (config.toml)
+#### Network settings (config.toml)
```toml
[p2p]
@@ -68,7 +68,7 @@ max-open-connections = 900
timeout-broadcast-tx-commit = "10s"
```
-#### Application Settings (app.toml)
+#### Application settings (app.toml)
```toml
# Minimum gas prices to prevent spam transactions
@@ -112,26 +112,28 @@ rs-backend = "pebbledb"
```
-`pebbledb` (aka `pebble`) is the only supported receipt-store backend. Setting
-`rs-backend = "parquet"` (or `RECEIPT_BACKEND=parquet`) is rejected with the
-error `unsupported receipt-store backend "parquet"; supported: pebbledb`. Enabling Giga
-Storage (`GIGA_STORAGE=true`) in the localnode and rpcnode configuration scripts
-defaults the receipt backend to `pebble` when `RECEIPT_BACKEND` is not set. The
-former `receipt-store.tx-index-backend` config field has been removed.
+`pebbledb` (also called `pebble`) is the only supported receipt-store backend.
+The setting `rs-backend = "parquet"` (or `RECEIPT_BACKEND=parquet`) is rejected
+with the error `unsupported receipt-store backend "parquet"; supported: pebbledb`.
+In the localnode and rpcnode configuration scripts, if you enable Giga Storage
+(`GIGA_STORAGE=true`) and `RECEIPT_BACKEND` is not set, the receipt backend
+defaults to `pebble`. The former `receipt-store.tx-index-backend` config field
+has been removed.
-### Default Configurations
+### Default configurations
-The full unmodified `app.toml`, `config.toml`, and `client.toml` produced by
-`seid init` against the latest tagged `seid` release. Use these as the
-canonical reference for every available knob and its default value.
+This section shows the full unmodified `app.toml`, `config.toml`, and
+`client.toml` files that `seid init` produces with the latest tagged `seid`
+release. Use them as the canonical reference for every available setting and
+its default value.
-The generated `app.toml` below mirrors the latest tagged release and may still list RocksDB as a state-store option. Do not use RocksDB for new or resynced nodes. RocksDB support for the SeiDB state store will be removed. No target release has been published.
+Do not use RocksDB for new or resynced nodes. The generated `app.toml` below mirrors the latest tagged release and may still list RocksDB as a state-store option. RocksDB support for the SeiDB state store will be removed. No target release has been published.
-Application-layer configuration: gas, API, gRPC, pruning, SeiDB, EVM, etc.
+Application-layer configuration: gas, API, gRPC, pruning, SeiDB, EVM, and other settings.
{/* AUTO-GENERATED:APP_TOML:START */}
@@ -768,11 +770,11 @@ supply_enabled = true
{/* AUTO-GENERATED:APP_TOML:END */}
-Two behaviors are not spelled out in the generated comments above.
-`min-retain-blocks` also drives receipt store retention: the receipt store's
+The generated comments above do not describe two behaviors. First,
+`min-retain-blocks` also controls receipt store retention. The receipt store's
`KeepRecent` is derived from `min-retain-blocks`, and `0` means keep
-everything. When `evm-ss-db-directory` is unset, nodes with an existing
-`/data/evm_ss` directory keep using that legacy path; new nodes default
+everything. Second, when `evm-ss-db-directory` is unset, nodes with an existing
+`/data/evm_ss` directory keep using that legacy path. New nodes default
to `/data/state_store/evm/{backend}`.
@@ -780,8 +782,8 @@ to `/data/state_store/evm/{backend}`.
-Tendermint / consensus-layer configuration: P2P, RPC, mempool, consensus,
-state-sync, etc.
+Tendermint and consensus-layer configuration: P2P, RPC, mempool, consensus,
+state sync, and other settings.
{/* AUTO-GENERATED:CONFIG_TOML:START */}
@@ -1362,51 +1364,52 @@ autobahn-config-file = ""
Out-of-process Application Blockchain Interface (ABCI) support has been
-removed: the node runs only with Tendermint in-process, so the legacy
+removed. The node runs only with Tendermint in-process. As a result, the legacy
`proxy-app` and `abci` base config fields no longer appear in the generated
-file and have no effect. When upgrading, remove any `proxy-app` and `abci`
+file and have no effect. When you upgrade, remove any `proxy-app` and `abci`
lines from your existing `config.toml`.
The `[p2p]` section also accepts `max-outbound-connections`, which `seid init`
-does not emit. Inbound and outbound connections are managed in separate pools:
-this field caps the outbound pool, and the inbound pool is derived as
+does not emit. Inbound and outbound connections are managed in separate pools.
+This field caps the outbound pool, and the inbound pool is derived as
`max-connections - max-outbound-connections`. Persistent and unconditional
-peers bypass both limits. When left unset, it defaults to 20, or to half of
-`max-connections` (rounded up) when `max-connections` is below 40. When set
-explicitly, the effective value is
+peers bypass both limits. If the field is unset, it defaults to 20, or to half
+of `max-connections` (rounded up) when `max-connections` is below 40. If you
+set it explicitly, the effective value is
`min(max-connections, max-outbound-connections)`.
-The Tendermint mempool was substantially rewritten. Transaction admission,
-ordering, eviction, and gossip are now driven by a unified transaction store
-with inclusion-ordering, soft/hard size limits, and cache-based deduplication,
-so node operators may observe different ordering, eviction, and gossip
-behavior after upgrading. A zero `ttl-duration` or `ttl-num-blocks` disables
-that form of TTL purging entirely. Expired PENDING transactions are always
-pruned; expired READY transactions are pruned when
-`remove-expired-txs-from-queue` is `true` (the default). The
-`pending-ttl-duration` and `pending-ttl-num-blocks` fields are deprecated and
-have no effect — pending transactions are no longer purged based on their own
-TTL.
+The Tendermint mempool was substantially rewritten. A unified transaction store
+drives transaction admission, ordering, eviction, and gossip. The store uses
+inclusion ordering, soft and hard size limits, and cache-based deduplication.
+As a result, node operators may observe different ordering, eviction, and
+gossip behavior after they upgrade.
+
+A zero `ttl-duration` or `ttl-num-blocks` disables that form of TTL purging
+entirely. Expired PENDING transactions are always pruned. Expired READY
+transactions are pruned when `remove-expired-txs-from-queue` is `true` (the
+default). The `pending-ttl-duration` and `pending-ttl-num-blocks` fields are
+deprecated and have no effect. Pending transactions are no longer purged based
+on their own TTL.
The `[consensus]` section also accepts `unsafe-overrides-enabled` (default
`false`), which `seid init` does not emit. The `unsafe-*-override` timeout
-fields take effect only when `unsafe-overrides-enabled` is `true`, or when the
-onchain timeout params still equal the legacy pacific-1 values (a
-backward-compatibility carve-out during migration). Otherwise the overrides
-are ignored and the onchain (or default) timeout params are used.
+fields take effect only when `unsafe-overrides-enabled` is `true` or when the
+onchain timeout params still equal the legacy pacific-1 values. The second case
+is a backward-compatibility carve-out during migration. Otherwise, the
+overrides are ignored, and the onchain (or default) timeout params are used.
-CLI and client defaults used by `seid` itself (chain id, keyring backend,
+CLI and client defaults that `seid` itself uses (chain ID, keyring backend,
output format, node endpoint).
{/* AUTO-GENERATED:CLIENT_TOML:START */}
@@ -1436,35 +1439,36 @@ broadcast-mode = "sync"
-## Database Management
+## Database management
### Architecture
-Sei stores chain data through **SeiDB**, a two-layer design that replaces the
-legacy single-database IAVL store with separate hot- and historical-data tiers:
+Sei uses **SeiDB** to store chain data. SeiDB is a two-layer design that
+replaces the legacy single-database IAVL store with separate tiers for hot and
+historical data:
-1. **State Commit (SC)** — the active chain state used for transaction
+1. **State Commit (SC)**: the active chain state. It is used for transaction
execution and to compute the per-block app hash. Cosmos modules sit on a
memory-mapped Merkle tree (`memiavl`) ported from Cronos. EVM state can
- additionally be routed through **FlatKV**, an EVM-tuned PebbleDB store
+ also be routed through **FlatKV**, an EVM-tuned PebbleDB store
with per-type sub-databases (`account`, `code`, `storage`, `legacy`,
- `metadata`). Routing is controlled by `sc-write-mode` and defaults to
- `memiavl_only` — FlatKV is only used when `sc-write-mode` is set to a
- migration mode or `flatkv_only`.
-2. **State Store (SS)** — versioned raw key/value pairs used for historical
- queries. Required for any node that serves RPC. The default backend is
+ `metadata`). The `sc-write-mode` setting controls the routing, and its
+ default is `memiavl_only`. FlatKV is used only when `sc-write-mode` is set
+ to a migration mode or `flatkv_only`.
+2. **State Store (SS)**: versioned raw key-value pairs for historical
+ queries. It is required for any node that serves RPC. The default backend is
**PebbleDB**. Do not use RocksDB for new nodes. If you already use RocksDB,
follow [Move off RocksDB](#move-off-rocksdb) before support is removed.
-The legacy IAVL backend has been fully removed. Setting `sc-enable = false`
-makes the node panic at startup with `SeiDB state-commit (SC) must be
-enabled; IAVL backend has been fully deprecated` — every node runs on SeiDB.
+The legacy IAVL backend has been fully removed, and every node runs on SeiDB.
+If you set `sc-enable = false`, the node panics at startup with `SeiDB state-commit (SC) must be
+enabled; IAVL backend has been fully deprecated`.
-### SeiDB Configuration
+### SeiDB configuration
-The full set of knobs is in the auto-generated
-[Default Configurations](#default-configurations) above. The block below
-covers the values most node operators tune in practice.
+The full set of settings is in the auto-generated
+[Default configurations](#default-configurations) above. The block below
+covers the values that most node operators tune in practice.
```toml
[state-commit]
@@ -1537,13 +1541,13 @@ async-write-buffer = 100
prune-interval-seconds = 600
```
-Setting small (more frequent) pruning intervals may collide with
-snapshot creation. Too-large (less frequent) intervals mean pruning takes
-longer overall, which can cause missed blocks and excessive resync time.
+Small (more frequent) pruning intervals may collide with snapshot creation.
+Intervals that are too large (less frequent) make pruning take longer overall.
+This can cause missed blocks and excessive resync time.
#### PebbleDB version encoding
-Fresh PebbleDB state stores use descending-version MVCC encoding. Sei includes
+New PebbleDB state stores use descending-version MVCC encoding. Sei includes
the version in each key and sorts newer versions first. This lets
latest-version reads reach the newest visible value without scanning older
versions. The store records this format with the `s/_mvcc_descending` sentinel
@@ -1551,58 +1555,57 @@ key, which `seid` detects automatically when it opens the database.
PebbleDB state stores created by older builds use ascending-version encoding.
`seid` detects these stores and opens them in compatibility mode without an
-error. They remain on the slower ascending read path. Rebuild the state store
-through [state sync](/node/statesync) with a current `seid` release to adopt
-descending encoding. A filesystem snapshot preserves the source store's
+error. They remain on the slower ascending read path. To adopt descending
+encoding, rebuild the state store through [state sync](/node/statesync) with a
+current `seid` release. A filesystem snapshot preserves the source store's
encoding, so confirm its encoding with the snapshot provider.
### Move off RocksDB
-RocksDB support for the SeiDB state store will be removed. No target release has been published. Check the [Sei release notes](https://github.com/sei-protocol/sei-chain/releases) before every upgrade.
+Check the [Sei release notes](https://github.com/sei-protocol/sei-chain/releases) before every upgrade. RocksDB support for the SeiDB state store will be removed. No target release has been published.
RocksDB and PebbleDB use different on-disk formats. Changing
-`ss-backend = "rocksdb"` to `ss-backend = "pebbledb"` against the same data
+`ss-backend = "rocksdb"` to `ss-backend = "pebbledb"` on the same data
does not convert the store. Rebuild the state store instead.
For a non-archive node:
-1. Stop `seid` and back up the validator key, validator state, node key,
+1. Stop `seid`. Then back up the validator key, validator state, node key,
configuration, and genesis file that you need to preserve.
2. Check `ss-db-directory` and `evm-ss-db-directory` in `app.toml`. An empty
value uses a path under `$HOME/.sei/data`. If either setting points
- elsewhere, move the old RocksDB data out of the active path and keep it
- with the backup. Clearing `$HOME/.sei/data` does not clear a custom
- directory.
-3. Set `ss-backend = "pebbledb"`, then rebuild through
+ elsewhere, move the old RocksDB data out of the active path. Keep it with
+ the backup. Clearing `$HOME/.sei/data` does not clear a custom directory.
+3. Set `ss-backend = "pebbledb"`. Then rebuild through
[state sync](/node/statesync) or a provider-confirmed
[PebbleDB snapshot](/node/snapshot).
-4. Confirm the startup log reports `"SeiDB SS is enabled"` with the PebbleDB
- backend. Test the RPC methods your node serves before you delete the old
- RocksDB backup.
+4. Confirm that the startup log reports `"SeiDB SS is enabled"` with the
+ PebbleDB backend. Before you delete the old RocksDB backup, test the RPC
+ methods that your node serves.
Do not use state sync or a pruned snapshot to migrate an archive node. Both start from a recent height and discard the earlier state-store versions that an archive node must retain.
There is no documented in-place migration for a RocksDB archive node. Build a
separate replacement from a trusted full-history PebbleDB source. Keep the
RocksDB node on a compatible `seid` release until the replacement has caught
-up and you have tested historical queries at old heights. If you cannot obtain
+up and you have tested historical queries at old heights. If you cannot get
a full-history PebbleDB source, do not wipe the existing archive data. Contact
the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) before you upgrade.
PebbleDB can be slower for iteration-heavy historical queries, including
`debug_trace*` requests. Descending-version encoding improves recent reads,
-but it does not remove the cost of long-history iteration. Benchmark the
-replacement under your trace workload before you cut over.
+but it does not remove the cost of long-history iteration. Before you cut over,
+benchmark the replacement under your trace workload.
### Giga Storage and Giga Executor
These are two **separate** features that ship in newer `seid` releases.
-**Giga Storage** repartitions SeiDB so EVM state lives in its own
-databases at both the SC and SS layers, freeing non-EVM modules from EVM
+**Giga Storage** repartitions SeiDB so that EVM state lives in its own
+databases at both the SC and SS layers. This frees non-EVM modules from EVM
write amplification.
-For step-by-step instructions — including the full state-sync flow, startup verification, safety checks, and rollback — see the [Giga SS Store Migration Guide](/node/giga-storage-migration). The snippet below is just the resulting `app.toml` shape.
+For step-by-step instructions, see the [Giga SS Store Migration Guide](/node/giga-storage-migration). The guide includes the full state sync flow, startup verification, safety checks, and rollback. The snippet below shows only the resulting `app.toml` shape.
```toml
@@ -1612,24 +1615,24 @@ evm-ss-split = true
```
The SC layer has its own, separate migration path (`sc-write-mode` and the
-FlatKV drain), with different coordination requirements and its own warnings —
-do not combine the two flips in one restart. See the
-[FlatKV EVM SC migration flow](/node/giga-storage-migration#flatkv-evm-sc-migration-flow)
-before touching `sc-write-mode`.
-
-Enabling Giga Storage requires a fresh state sync — flipping `evm-ss-split`
-on a node with existing data fails the startup safety checks because
-the new EVM SS DB starts empty while Cosmos SS already has history. The
-full procedure is in the
-[Giga SS Store Migration Guide](/node/giga-storage-migration) and is
-currently supported on **RPC nodes only**; validators and archive nodes are
+FlatKV drain). It has different coordination requirements and its own
+warnings. Do not combine the two flips in one restart. Before you change
+`sc-write-mode`, see the
+[FlatKV EVM SC migration flow](/node/giga-storage-migration#flatkv-evm-sc-migration-flow).
+
+Enabling Giga Storage requires a fresh state sync. If you flip `evm-ss-split`
+on a node with existing data, the node fails the startup safety checks. This
+is because the new EVM SS DB starts empty while Cosmos SS already has history.
+The full procedure is in the
+[Giga SS Store Migration Guide](/node/giga-storage-migration). The procedure
+is currently supported on **RPC nodes only**. Validators and archive nodes are
not yet covered.
**Giga Executor** is independent of Giga Storage. From the v6.6 release line,
newly generated configurations and configurations that omit these fields
-default to the Giga execution path with OCC enabled. Set both fields explicitly
-to `false` to opt out. Follow the release-specific operator instructions before
-changing either setting:
+default to the Giga execution path with OCC enabled. To opt out, set both
+fields explicitly to `false`. Before you change either setting, follow the
+release-specific operator instructions:
```toml
[giga_executor]
@@ -1641,10 +1644,10 @@ enabled = true
occ_enabled = true
```
-### Database Maintenance
+### Database maintenance
-The database is typically stable and can be left alone, although some attention
-may be required:
+The database is typically stable and can be left alone. However, it may need
+some attention:
```bash
# Check database size
@@ -1666,11 +1669,11 @@ cp -r $HOME/.sei/data/ $HOME/sei-backup-$(date +%Y%m%d)/
find $HOME/.sei/data/ -mindepth 1 ! -name 'priv_validator_state.json' -delete && rm -rf $HOME/.sei/wasm
```
-The wipe command above deletes the entire local database (everything except `priv_validator_state.json`) and the `wasm` folder. It does not compact data in place — after running it, the node must be re-synced from a [snapshot](/node/snapshot) or via [state sync](/node/statesync) before it can serve traffic again.
+After you run the wipe command above, resync the node from a [snapshot](/node/snapshot) or through [state sync](/node/statesync). Until then, the node cannot serve traffic. The command deletes the entire local database (everything except `priv_validator_state.json`) and the `wasm` folder. It does not compact data in place.
-## Service Management
+## Service management
-### Systemd Commands
+### Systemd commands
```bash
# Check service status
@@ -1689,9 +1692,9 @@ systemctl restart seid
journalctl -fu seid -o cat
```
-### Log Management
+### Log management
-Prevent logs from consuming excessive disk space by enabling rotation:
+To stop logs from using too much disk space, enable log rotation:
```bash
sudo tee /etc/logrotate.d/sei > /dev/null << EOF
@@ -1710,19 +1713,19 @@ sudo tee /etc/logrotate.d/sei > /dev/null << EOF
EOF
```
-## Update Procedures
+## Update procedures
- Upgrade with the same method you originally installed with: `make install`
- writes `seid` to `$(go env GOPATH)/bin`, while the prebuilt-binary flow
- installs to `/usr/local/bin`. Mixing the two leaves separate binaries on your
- `PATH`, and your service unit may keep running the old version —
- `which -a seid` lists every copy.
+ Upgrade with the same method that you used for the original install. The
+ `make install` command writes `seid` to `$(go env GOPATH)/bin`, but the
+ prebuilt-binary flow installs to `/usr/local/bin`. If you mix the two,
+ separate binaries stay on your `PATH`, and your service unit may keep running
+ the old version. The `which -a seid` command lists every copy.
-### Minor Updates
+### Minor updates
-For minor updates that are non-consensus-breaking:
+For minor updates that do not break consensus:
@@ -1762,14 +1765,14 @@ For minor updates that are non-consensus-breaking:
-### Major Updates
+### Major updates
For major upgrades that introduce state-breaking changes:
-1. Wait for the designated upgrade block height [this can be seen in the upgrade
- proposal under 'plan']
-2. The node will halt automatically.
-3. Update/replace the binary
+1. Wait for the designated upgrade block height. You can find it in the upgrade
+ proposal under 'plan'.
+2. The node halts automatically.
+3. Update or replace the binary.
4. Restart the node.
@@ -1802,23 +1805,23 @@ For major upgrades that introduce state-breaking changes:
- Download the release archive (or build the new binary) ahead of the
- halt-height so the swap takes seconds at upgrade time.
+ Download the release archive (or build the new binary) before the halt
+ height. The swap then takes only seconds at upgrade time.
-## Performance Optimization
+## Performance optimization
-Performance optimizations can yield different results depending on your system's
-hardware, workload, and network conditions. Before implementing any changes,
-research and test them in a controlled environment to ensure they align with
-your specific configuration and requirements. Always back up important data
-before making modifications.
+The results of performance optimizations can vary with your system's hardware,
+workload, and network conditions. Before you make any changes, research them
+and test them in a controlled environment. Make sure that they fit your
+specific configuration and requirements. Always back up important data before
+you make changes.
-### Memory Management (sysctl tuning)
+### Memory management (sysctl tuning)
-Optimizing memory management settings can help improve performance and
-stability, particularly for high-load nodes. These settings control swap usage
-and the handling of dirty (unwritten) pages in RAM.
+Tuning memory management settings can help improve performance and stability,
+particularly for high-load nodes. These settings control swap usage and the
+handling of dirty (unwritten) pages in RAM.
```bash
vm.swappiness = 1 # Reduce swapping to disk, ensuring RAM is used efficiently before relying on slower swap space
@@ -1828,10 +1831,10 @@ vm.dirty_expire_centisecs = 300 # Time (in hundredths of a second) before dirty
vm.dirty_writeback_centisecs = 100 # Frequency (in hundredths of a second) at which the system writes "dirty" pages to disk
```
-### Network Stack Optimization
+### Network stack optimization
-Tuning the network stack can enhance packet processing efficiency and
-throughput, particularly for nodes handling a large number of peers and high
+Tuning the network stack can improve packet processing efficiency and
+throughput, particularly for nodes that handle many peers and high
transaction volume.
```bash
@@ -1842,19 +1845,19 @@ net.core.rmem_max = 16777216 # receive buffer size for network sockets
net.core.wmem_max = 16777216 # send buffer size for network sockets
```
-### Storage Optimization
+### Storage optimization
-Optimizing storage settings can significantly reduce write latency and improve
-database performance, especially for nodes using NVMe SSDs.
+Tuning storage settings can significantly reduce write latency and improve
+database performance, especially for nodes that use NVMe SSDs.
```bash
echo "none" > /sys/block/nvme0n1/queue/scheduler # disable I/O scheduler to reduce latency
blockdev --setra 4096 /dev/nvme0n1 # readahead value to optimize sequential reads
```
-## Backup and Recovery
+## Backup and recovery
-### Regular Backups
+### Regular backups
Automate backups to avoid data loss:
@@ -1873,9 +1876,9 @@ tar czf $BACKUP_DIR/sei-backup-$DATE.tar.gz $HOME/.sei/
systemctl start seid
```
-### Recovery Procedure
+### Recovery procedure
-Restoring from backup in case of corruption or accidental deletion:
+If data is corrupted or accidentally deleted, restore it from a backup:
```bash
# Stop node
@@ -1891,13 +1894,13 @@ tar xzf sei-backup-[date].tar.gz -C /
systemctl start seid
```
-## Security Considerations
+## Security considerations
-- Use firewalls and rate-limiting to prevent attacks
+- Use firewalls and rate limiting to prevent attacks
- Keep your system and node software updated
- Secure SSH access with key-based authentication
- Protect validator keys with offline storage or hardware security modules
(HSMs)
-For more in-depth system and configuration guidelines, refer to the [Advanced
+For more detailed system and configuration guidelines, see the [Advanced
Configuration and Monitoring Guide](/node/advanced-config-monitoring).
diff --git a/node/node-types.mdx b/node/node-types.mdx
index a8d6b2d..f306190 100644
--- a/node/node-types.mdx
+++ b/node/node-types.mdx
@@ -3,31 +3,31 @@ title: 'Node Types'
description: 'Learn about different types of Sei nodes, their purposes, commonly used ports, and systemd configuration.'
keywords: ['sei node', 'blockchain node', 'node types', 'RPC', 'archive node', 'validator node', 'state sync', 'ports', 'systemd', 'P2P']
---
-There are a few node types that can be run on Sei network which serve a variety of purposes. These include:
+You can run a few types of nodes on the Sei network. Each type has a different purpose:
-- RPC / full nodes: these nodes are generally used for querying data or interacting with the chain. They maintain some state but not since genesis. The default settings will run RPC / full nodes.
+- RPC / full nodes: these nodes are generally used to query data or to interact with the chain. They keep some state, but not all state since genesis. The default settings run an RPC / full node.
-- Archive / full Nodes: maintain full state of the blockchain from genesis. Generally requires large disks (10 TB+ minimum). To enable this type of node, set `min-retain-blocks=0` and `pruning="nothing"` in your `app.toml`, and set `ss-keep-recent = 0` under `[state-store]` so the SeiDB state store keeps every version.
+- Archive / full nodes: these nodes keep the full state of the chain from genesis. They generally need large disks (at least 10 TB). To enable this type of node, set `min-retain-blocks=0` and `pruning="nothing"` in your `app.toml`. Also set `ss-keep-recent = 0` under `[state-store]` so that the SeiDB state store keeps every version.
-- State Sync Nodes: provide snapshot data for other nodes to use to bootstrap onto the chain. To enable this type of node, set a non-zero `snapshot-interval` under `[state-sync]` in `app.toml`. The `enable=true` setting under `[statesync]` in `config.toml` does the opposite: it makes a node bootstrap from other nodes' snapshots.
+- State sync nodes: these nodes serve snapshot data that other nodes use to bootstrap onto the chain. To enable this type of node, set a non-zero `snapshot-interval` under `[state-sync]` in `app.toml`. The `enable=true` setting under `[statesync]` in `config.toml` does the opposite: it makes a node bootstrap from the snapshots of other nodes.
-- Validator Nodes provide security to the chain by proposing and signing blocks. To enable this type of node, set `mode=validator` in `config.toml`. Note that because Sei is proof-of-stake, you must have enough delegation to join the active set.
+- Validator nodes: these nodes propose and sign blocks to secure the chain. To enable this type of node, set `mode=validator` in `config.toml`. Because Sei uses proof of stake, you must have enough delegation to join the active set.
-## Commonly Used Ports
+## Commonly used ports
-Seid uses the following TCP ports. Toggle their settings to match your environment.
+The `seid` binary uses these TCP ports. Change their settings to match your environment.
-- `26656`: The default port for the P2P communication. This port is used to communicate with other nodes and must be open to join a network.
-- `26657`: The default port for the RPC interface. Because this port is used for querying and sending transactions, it must be open for serving queries from `seid`.
-- `1317`: The default port for interacting with the Seid API server for HTTP RESTful requests. This allows applications and services to interact with the `seid` instance through RPC.
-- `9090`: The default port for gRPC communication. This is used for high-performance communication with the node.
-- `8545`: The default port for EVM HTTP RPC. This port is used for Ethereum JSON-RPC calls and must be open if you want to interact with EVM-compatible applications. The [`frozen-rpc-router`](/node/technical-reference#frozen-rpc-router) binary also listens on `127.0.0.1:8545` by default, so when you run the router on the same host as a live node, move one of them to a different port. The linked example keeps the router on `8545` and moves the two co-located nodes to `9545` and `9546`.
-- `8546`: The default port for EVM WebSocket RPC. This port provides real-time communication for EVM applications that require WebSocket connections.
-- `26660`: The default port for interacting with the Prometheus database, which can be used to monitor the environment. In the default configuration, this port is not open.
+- `26656`: The default port for P2P communication. This port is used to communicate with other nodes. It must be open for the node to join a network.
+- `26657`: The default port for the RPC interface. This port is used to send queries and transactions, so it must be open to serve queries from `seid`.
+- `1317`: The default port for HTTP RESTful requests to the `seid` API server. Applications and services can use it to interact with the `seid` instance through RPC.
+- `9090`: The default port for gRPC communication. This port is used for high-performance communication with the node.
+- `8545`: The default port for EVM HTTP RPC. This port is used for Ethereum JSON-RPC calls. It must be open if you want to interact with EVM-compatible applications. The [`frozen-rpc-router`](/node/technical-reference#frozen-rpc-router) binary also listens on `127.0.0.1:8545` by default. If you run the router on the same host as a live node, move one of them to a different port. The linked example keeps the router on `8545` and moves the two co-located nodes to `9545` and `9546`.
+- `8546`: The default port for EVM WebSocket RPC. EVM applications that need WebSocket connections use this port for real-time communication.
+- `26660`: The default port for the Prometheus database, which you can use to monitor the environment. In the default configuration, this port is not open.
-These ports are all customizable in `$HOME/.sei/config/config.toml` and `$HOME/.sei/config/app.toml`.
+You can change all of these ports in `$HOME/.sei/config/config.toml` and `$HOME/.sei/config/app.toml`.
-## Systemd File Template
+## Systemd file template
```toml
[Unit]
diff --git a/node/seictl.mdx b/node/seictl.mdx
index 62435ad..f887ae2 100644
--- a/node/seictl.mdx
+++ b/node/seictl.mdx
@@ -4,28 +4,28 @@ sidebarTitle: 'Seictl Setup Helper'
description: 'Install and use the seictl CLI to patch Sei node configuration and genesis files safely with merge-patch workflows.'
keywords: ['sei node', 'cli', 'seictl', 'app.toml', 'config.toml', 'genesis']
---
-`seictl` is a purpose-built CLI that helps Sei node patch configuration TOML files (`app.toml`, `client.toml`, `config.toml`) and JSON genesis files.
+`seictl` is a purpose-built CLI that helps you patch the configuration files of a Sei node. It handles TOML configuration files (`app.toml`, `client.toml`, `config.toml`) and JSON genesis files.
-You can find the `seictl` GitHub repository [here](https://github.com/sei-protocol/seictl)
+See the [`seictl` GitHub repository](https://github.com/sei-protocol/seictl).
## Features
-- **Configuration Management**: Patch Sei daemon configuration files (`app.toml`, `client.toml`, `config.toml`)
-- **Genesis Management**: Apply merge patches to genesis JSON files
-- **Universal Patching**: Apply merge patches to any TOML or JSON file
-- **Smart Target Detection**: Automatically detects which configuration file to modify based on patch content
-- **Flexible Output**: Write to stdout, a specific file, or modify files in-place
-- **Atomic Writes**: Safe file modifications using atomic write operations
-- **Merge Patch Algorithm**: Intelligently merges patches with existing configurations
+- **Configuration management**: Patch Sei daemon configuration files (`app.toml`, `client.toml`, `config.toml`)
+- **Genesis management**: Apply merge patches to genesis JSON files
+- **Universal patching**: Apply merge patches to any TOML or JSON file
+- **Automatic target detection**: Detects which configuration file to modify from the patch content
+- **Output options**: Write to stdout or to a specific file, or modify files in place
+- **Atomic writes**: Modifies files safely with atomic write operations
+- **Merge patch algorithm**: Merges patches into existing configurations
## Installation
-### Pre-built Binaries (Recommended)
+### 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).
-#### Quick Install
+#### Quick install
```bash
@@ -81,15 +81,15 @@ sudo mv seictl /usr/local/bin/
-#### Verify Installation
+#### Verify installation
```bash
seictl --version
```
-#### Verify Download (Optional)
+#### Verify download (optional)
-All releases include a `checksums.txt` file for verification, e.g.:
+All releases include a `checksums.txt` file for verification. For example:
```bash
# Download checksums
@@ -99,20 +99,20 @@ curl -LO https://github.com/sei-protocol/seictl/releases/latest/download/checksu
sha256sum -c checksums.txt 2>&1 | grep seictl_Linux_x86_64.tar.gz
```
-### Build from Source
+### Build from source
-If you prefer to build from source or need a specific configuration:
+Build from source if you prefer this method or need a specific configuration.
#### Prerequisites
-- [Go 1.26.0 or later](https://go.dev/doc/install). The commands below build `main`, whose requirement is set in [`go.mod`](https://github.com/sei-protocol/seictl/blob/main/go.mod).
+- [Go 1.26.0 or later](https://go.dev/doc/install). The commands below build `main`. Its Go requirement is set in [`go.mod`](https://github.com/sei-protocol/seictl/blob/main/go.mod).
- This is newer than the Go version needed to build `seid` (1.25.6), so the toolchain from
- the [node setup guide](/node) is a minor version behind. Under the default
- `GOTOOLCHAIN=auto` that still builds: the go command downloads the toolchain `go.mod`
- asks for. If you've set `GOTOOLCHAIN=local` or build without network access, install Go
- 1.26.0 or later, or use a prebuilt binary above.
+ This is newer than the Go version needed to build `seid` (1.25.6). The toolchain from
+ the [node setup guide](/node) is therefore a minor version behind. With the default
+ `GOTOOLCHAIN=auto`, the build still works: the go command downloads the toolchain that
+ `go.mod` asks for. If you have set `GOTOOLCHAIN=local` or build without network access,
+ install Go 1.26.0 or later, or use a prebuilt binary above.
#### Build
@@ -135,18 +135,18 @@ go install github.com/sei-protocol/seictl@latest
seictl [global options] command [command options] [arguments...]
```
-### Global Options
+### Global options
-- `--home `: Sei home directory (default: `~/.sei`, can be set via `SEI_HOME` environment variable)
+- `--home `: The Sei home directory (default: `~/.sei`). You can also set it with the `SEI_HOME` environment variable.
## Commands
-### Patch Command
+### Patch command
#### `patch`
-Apply a merge-patch to any TOML or JSON file. This is a universal patching command that works with any file format, not
-just Sei-specific configurations.
+Apply a merge patch to any TOML or JSON file. This universal patching command works with any file format. It is not
+limited to Sei-specific configurations.
```bash
seictl patch --target [patch-file]
@@ -155,8 +155,8 @@ seictl patch --target [patch-file]
**Options:**
- `--target `: Path to the TOML or JSON file to patch (required)
-- `-o, --output `: Write output to specified file
-- `-i, --in-place-rewrite`: Modify the target file in-place
+- `-o, --output `: Write the output to the specified file
+- `-i, --in-place-rewrite`: Modify the target file in place
**Examples:**
@@ -174,13 +174,13 @@ seictl patch --target myconfig.toml patch.toml -o modified.toml
seictl patch --target settings.json patch.json -i
```
-**Note:** The file extension (`.toml` or `.json`) is used to determine the format automatically.
+**Note:** The format is detected automatically from the file extension (`.toml` or `.json`).
-### Genesis Commands
+### Genesis commands
#### `genesis patch`
-Apply a merge-patch to the Sei genesis JSON file.
+Apply a merge patch to the Sei genesis JSON file.
```bash
seictl genesis patch [patch-file]
@@ -188,8 +188,8 @@ seictl genesis patch [patch-file]
**Options:**
-- `-o, --output `: Write output to specified file
-- `-i, --in-place-rewrite`: Modify the genesis file in-place
+- `-o, --output `: Write the output to the specified file
+- `-i, --in-place-rewrite`: Modify the genesis file in place
**Examples:**
@@ -207,11 +207,11 @@ seictl genesis patch patch.json -o genesis-modified.json
seictl genesis patch patch.json -i
```
-### Config Commands
+### Config commands
#### `config patch`
-Apply a merge-patch to a Sei configuration TOML file.
+Apply a merge patch to a Sei configuration file in TOML format.
```bash
seictl config [--target ] patch [patch-file]
@@ -220,9 +220,9 @@ seictl config [--target ] patch [patch-file]
**Options:**
- `--target `: Specify which configuration file to patch (`app`, `client`, or `config`)
- - If not specified, the target is automatically detected based on the patch content
-- `-o, --output `: Write output to specified file
-- `-i, --in-place-rewrite`: Modify the configuration file in-place
+ - If you do not specify a target, it is detected automatically from the patch content
+- `-o, --output `: Write the output to the specified file
+- `-i, --in-place-rewrite`: Modify the configuration file in place
**Examples:**
@@ -243,13 +243,13 @@ seictl config --target app patch patch.toml -i
seictl config patch patch.toml -o /path/to/output.toml
```
-## Configuration Targets
+## Configuration targets
-The `config` command can work with three different configuration files:
+The `config` command can work with three configuration files:
### `app.toml`
-Application-level configuration including:
+Application-level configuration, including:
- Gas prices and block settings
- State management (state-sync, state-commit, state-store)
@@ -260,7 +260,7 @@ Application-level configuration including:
### `client.toml`
-Client-level configuration including:
+Client-level configuration, including:
- Chain ID
- Keyring backend
@@ -270,7 +270,7 @@ Client-level configuration including:
### `config.toml`
-Node-level configuration including:
+Node-level configuration, including:
- Database settings
- Logging configuration
@@ -279,9 +279,9 @@ Node-level configuration including:
- State sync and block sync
- Transaction indexing
-## Merge Patch Behavior
+## Merge patch behavior
-The merge patch algorithm works as follows:
+The merge patch algorithm uses these rules:
1. **Nested merging**: Patches are merged recursively into nested structures
2. **Null deletion**: Setting a value to `null` removes that key from the configuration
@@ -317,14 +317,14 @@ swagger = true
## Examples
-
+
```bash
echo 'minimum-gas-prices = "0.02usei"' | seictl config patch -i
```
-
+
```bash
cat > patch.toml << EOF
[api]
@@ -337,14 +337,14 @@ seictl config --target app patch patch.toml -i
-
+
```bash
echo '{"chain_id": "pacific-1"}' | seictl genesis patch -i
```
-
+
```bash
cat > patch.toml << EOF
minimum-gas-prices = "0.02usei"
@@ -363,7 +363,7 @@ seictl config patch patch.toml -i
-
+
```bash
# Patch any TOML file outside the Sei directory structure
cat > custom-patch.toml << EOF
@@ -377,7 +377,7 @@ seictl patch --target /etc/myapp/config.toml custom-patch.toml -i
-
+
```bash
# Modify any JSON file
echo '{"version": "2.0", "debug": true}' | seictl patch --target /path/to/settings.json -i
@@ -385,7 +385,7 @@ echo '{"version": "2.0", "debug": true}' | seictl patch --target /path/to/settin
-
+
```bash
# Via environment variable
export SEI_HOME=/custom/path/.sei
@@ -397,31 +397,31 @@ seictl --home /custom/path/.sei config patch patch.toml
-## Command Comparison
+## Command comparison
-### When to Use Each Command
+### When to use each command
-- **`patch`**: Use for patching any arbitrary TOML or JSON file on your system. Requires explicit `--target` path.
-- **`genesis patch`**: Use specifically for Sei genesis files. Automatically uses `$HOME/.sei/config/genesis.json`.
-- **`config patch`**: Use specifically for Sei configuration files with automatic target detection. Automatically uses
+- **`patch`**: Use it to patch any TOML or JSON file on your system. It requires an explicit `--target` path.
+- **`genesis patch`**: Use it specifically for Sei genesis files. It automatically uses `$HOME/.sei/config/genesis.json`.
+- **`config patch`**: Use it specifically for Sei configuration files, with automatic target detection. It automatically uses
files in `$HOME/.sei/config/`.
-## File Locations
+## File locations
-By default, `seictl` looks for configuration files in the following locations:
+By default, `seictl` looks for configuration files in these locations:
- Genesis: `$HOME/.sei/config/genesis.json`
- App config: `$HOME/.sei/config/app.toml`
- Client config: `$HOME/.sei/config/client.toml`
- Node config: `$HOME/.sei/config/config.toml`
-Where `$HOME` is the value of the `--home` flag or the `SEI_HOME` environment variable.
+Here, `$HOME` is the value of the `--home` flag or the `SEI_HOME` environment variable.
-## Safety Features
+## Safety features
-- **Atomic Writes**: All file modifications use atomic write operations (write to temp file, then rename)
-- **Permission Preservation**: In-place modifications preserve original file permissions
-- **Format Validation**: Validates file extensions before processing (must be `.toml` or `.json`)
-- **Target Validation**: Prevents accidental modification of wrong configuration files
-- **Auto-detection Safety**: Refuses to proceed if patch could apply to multiple targets
-- **Early Validation**: Checks file format and existence before reading patch data
+- **Atomic writes**: All file modifications use atomic write operations (write to a temporary file, then rename it)
+- **Permission preservation**: In-place modifications keep the original file permissions
+- **Format validation**: Validates file extensions before processing (must be `.toml` or `.json`)
+- **Target validation**: Prevents accidental changes to the wrong configuration files
+- **Auto-detection safety**: Stops if the patch could apply to more than one target
+- **Early validation**: Checks the file format and that the file exists before it reads the patch data
diff --git a/node/snapshot.mdx b/node/snapshot.mdx
index 2fcb826..129722a 100644
--- a/node/snapshot.mdx
+++ b/node/snapshot.mdx
@@ -4,40 +4,40 @@ sidebarTitle: 'Snapshot Sync'
description: 'Detailed guide for using snapshots to join the network'
keywords: ['sei node', 'blockchain node', 'node configuration', 'seidb', 'node maintenance', 'system operations']
---
-Before you resync a node using snapshots, make sure that in case of a successful resync that you _under no circumstance_ double sign blocks at previous heights with your validator. Failure to do so will cause tombstoning of your validator.
+Before you resync a node from a snapshot, make sure that your validator cannot double sign. After a successful resync, your validator must _under no circumstance_ double sign blocks at previous heights. If it does, the validator is tombstoned.
-Follow this guide to join an existing network through **snapshot sync**. To quickly spin up a fresh full node and join the network, it's recommended to restore from a snapshot instead of replaying all historical blocks.
+Use snapshot sync to start a new full node and join an existing network quickly. Snapshot sync restores the node from a snapshot instead of replaying all historical blocks.
-## Snapshot Sync
+## Snapshot sync
-Snapshot sync allows a new node to join a network by downloading a recent, compressed copy of the entire application state and extracting it directly into the data directory. This reduces the initial sync time from days to minutes.
+Snapshot sync lets a new node join a network with a recent, compressed copy of the entire application state. The node downloads the copy and extracts it directly into the data directory. This reduces the initial sync time from days to minutes.
-RocksDB support for the SeiDB state store will be removed. No target release has been published. For new or resynced nodes, use a snapshot only after its provider confirms that the state store uses PebbleDB. Keep `ss-backend = "pebbledb"` in `app.toml`. See [Move off RocksDB](/node/node-operators#move-off-rocksdb) if you are replacing an existing RocksDB node.
+For new or resynced nodes, use a snapshot only after its provider confirms that the state store uses PebbleDB. Keep `ss-backend = "pebbledb"` in `app.toml`. RocksDB support for the SeiDB state store will be removed. No target release has been published. If you are replacing an existing RocksDB node, see [Move off RocksDB](/node/node-operators#move-off-rocksdb).Do not restore a pruned snapshot onto an archive node. It does not contain the earlier state-store versions that the archive node must retain. Use only a provider-confirmed full-history PebbleDB archive snapshot, or follow the archive-node guidance in [Move off RocksDB](/node/node-operators#move-off-rocksdb).
-## Snapshot Providers
+## Snapshot providers
-You can select from various providers for downloading snapshots:
+You can download snapshots from these providers:
-- Polkachu: [Mainnet Snapshots](https://www.polkachu.com/tendermint_snapshots/sei) | [Testnet Snapshots](https://www.polkachu.com/testnets/sei/snapshots)
+- Polkachu: [Sei Mainnet snapshots](https://www.polkachu.com/tendermint_snapshots/sei) | [Sei Testnet snapshots](https://www.polkachu.com/testnets/sei/snapshots)
- Imperator.co
- Stakeme
- kjnodes
-Snapshot providers do not consistently label the state-store backend. Ask the
-provider to confirm that the snapshot uses PebbleDB before you restore it. The
+Snapshot providers do not consistently label the state-store backend. Before you
+restore a snapshot, ask the provider to confirm that it uses PebbleDB. The
post-extraction check below is a second guard against archives that contain an
obvious RocksDB path. It does not replace provider confirmation because some
legacy and custom directory names do not identify their backend.
-## Clean Up & Preparation
+## Clean up & preparation
-If you are **not** starting a node from fresh, perform the following backups and clean‑ups first.
+If the node is **not** new, back up and clean up the existing node first.
-Note: This step is not needed for fresh nodes.
+Skip this step on a new node.
1. **Stop the service**
@@ -45,15 +45,15 @@ If you are **not** starting a node from fresh, perform the following backups and
sudo systemctl stop seid
```
-2. **Backup Validator State** (Critical for Validators)
- Assuming your sei home directory is `$HOME/.sei`, back up `priv_validator_key.json` and `priv_validator_state.json`:
+2. **Back up validator state** (critical for validators)
+ If your Sei home directory is `$HOME/.sei`, back up `priv_validator_key.json` and `priv_validator_state.json`:
```bash
cp $HOME/.sei/data/priv_validator_state.json $HOME/priv_validator_state.json
cp $HOME/.sei/config/priv_validator_key.json $HOME/priv_validator_key.json
```
-3. **Reset the State**
+3. **Reset the state**
```bash
seid tendermint unsafe-reset-all --home $HOME/.sei
@@ -67,11 +67,11 @@ If you are **not** starting a node from fresh, perform the following backups and
```
If `ss-db-directory` or `evm-ss-db-directory` is not empty, the state store
- may live outside `$HOME/.sei/data`. Back up anything you need, then move or
+ may live outside `$HOME/.sei/data`. Back up what you need. Then move or
remove the old state-store data before you restore the snapshot. The generic
- commands below expect both settings to be empty so the snapshot's default
- paths are used. Follow your provider's placement instructions if you keep
- custom paths. Do not reuse a RocksDB directory with
+ commands below expect both settings to be empty so that the snapshot's
+ default paths are used. If you keep custom paths, follow your provider's
+ placement instructions. Do not reuse a RocksDB directory with
`ss-backend = "pebbledb"`.
5. **Remove data and Wasm**
@@ -80,24 +80,24 @@ If you are **not** starting a node from fresh, perform the following backups and
rm -rf $HOME/.sei/wasm
```
-All snapshots also include the `wasm` folder. Make sure to copy over the `wasm` folder as well, the node cannot successfully sync without it.
+Copy the `wasm` folder too. All snapshots include the `wasm` folder, and the node cannot sync successfully without it.
-## Download & Restore
+## Download & restore
-The following commands are generic examples. Please verify the `SNAPSHOT_URL` and extraction command from your chosen provider above.
+These commands are generic examples. Verify the `SNAPSHOT_URL` and the extraction command with the provider that you chose above.
### Prerequisites
-Ensure you have the necessary tools installed (e.g., `lz4`, `aria2`, `pv`, `wget`).
+Make sure that you have the necessary tools installed (for example, `lz4`, `aria2`, `pv`, and `wget`).
```bash
sudo apt update
sudo apt install curl lz4 wget aria2 pv -y
```
-### Download and Extract
+### Download and extract
-1. **Set the Snapshot URL**
+1. **Set the snapshot URL**
Replace `` with the link from your chosen provider.
```bash
@@ -129,7 +129,7 @@ sudo apt install curl lz4 wget aria2 pv -y
pv "$SNAPSHOT_FILE" | lz4 -c -d | tar -x -C "$HOME/.sei"
```
- The `-x 16` flag sets the maximum connections per server, and `-s 16` splits the file into 16 segments for parallel downloading. You can adjust these values based on your network conditions.
+ The `-x 16` flag sets the maximum connections per server. The `-s 16` flag splits the file into 16 segments for parallel download. You can adjust these values to match your network conditions.
If extraction fails, remove the partially extracted `data` and `wasm`
directories before you retry. Do not continue to verification.
@@ -196,7 +196,7 @@ sudo apt install curl lz4 wget aria2 pv -y
The function returns a nonzero status for `FAIL` and `UNVERIFIED`. Continue
only if the provider confirmed PebbleDB and the command prints `PASS`. A
legacy EVM store at `data/evm_ss/` does not identify its backend in the
- directory name, which is why provider confirmation is still required. If
+ directory name. This is why provider confirmation is still required. If
you used `aria2c`, remove the downloaded archive after this check passes:
```bash
@@ -210,7 +210,7 @@ sudo apt install curl lz4 wget aria2 pv -y
```
5. **Enable SeiDB and configure PebbleDB**
- Make sure SeiDB is enabled and the state-store backend is PebbleDB:
+ Make sure that SeiDB is enabled and that the state-store backend is PebbleDB:
```bash
sed -i.bak -E "/^\[state-commit\]/,/^\[.*\]/ s|^[#[:space:]]*(sc-enable[[:space:]]*=[[:space:]]*).*$|\1true| ; /^\[state-store\]/,/^\[.*\]/ s|^[#[:space:]]*(ss-enable[[:space:]]*=[[:space:]]*).*$|\1true| ; /^\[state-store\]/,/^\[.*\]/ s|^[#[:space:]]*(ss-backend[[:space:]]*=[[:space:]]*).*$|\1\"pebbledb\"|" $HOME/.sei/config/app.toml
@@ -219,7 +219,7 @@ sudo apt install curl lz4 wget aria2 pv -y
```
Confirm that the output includes `ss-backend = "pebbledb"`. If the key is
- absent, add it directly below `[state-store]` before you restart the node.
+ missing, add it directly below `[state-store]` before you restart the node.
6. **Restart the node**
@@ -234,11 +234,11 @@ sudo apt install curl lz4 wget aria2 pv -y
## Troubleshooting
-**Q: I can't download a snapshot.**
-A: Try another time later as these snapshots are refreshed regularly and inform us in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk).
+**Q: I cannot download a snapshot.**
+A: Try again later, because providers refresh these snapshots regularly. Also report the problem in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk).
-**Q: The snapshot finishes, but I immediately get `AppHash` errors upon regular block syncing.**
-A: Make sure that you use the latest version of the node software. This usually means the snapshot version doesn't match your node version, or the snapshot is corrupted. Ensure you are using the correct binary version for the block height of the snapshot.
+**Q: The snapshot finishes, but I get `AppHash` errors as soon as regular block sync starts.**
+A: Make sure that you use the latest version of the node software. These errors usually mean that the snapshot version does not match your node version, or that the snapshot is corrupted. Make sure that you use the correct binary version for the block height of the snapshot.
**Q: "No space left on device"**
-A: Snapshots require significant disk space to download and extract. Ensure you have enough free space (check with `df -h`).
+A: Snapshots require significant disk space to download and extract. Make sure that you have enough free space (check with `df -h`).
diff --git a/node/statesync.mdx b/node/statesync.mdx
index 044a6ce..3bbef65 100644
--- a/node/statesync.mdx
+++ b/node/statesync.mdx
@@ -4,23 +4,23 @@ sidebarTitle: 'Statesync'
description: 'Detailed guide for using statesync to join the network'
keywords: ['sei node', 'blockchain node', 'node configuration', 'seidb', 'node maintenance', 'system operations']
---
-Follow this guide to join an existing network through statesync. To quickly spin up a fresh full node and join in the network, it's recommended to sync through state sync.
+Use state sync to start a new full node and join an existing network quickly.
-## State Sync
+## State sync
-State sync allows a new node to join a network by fetching a snapshot of the application state at a recent height instead of fetching and replaying all historical blocks. This can reduce the time needed to sync with the network from days to minutes.
+State sync lets a new node join a network without fetching and replaying all historical blocks. Instead, the node fetches a snapshot of the application state at a recent height. This can reduce the time to sync with the network from days to minutes.
-RocksDB support for the SeiDB state store will be removed. No target release has been published. Set `ss-backend = "pebbledb"` before you start state sync, especially when rebuilding a node that previously used RocksDB. See [Move off RocksDB](/node/node-operators#move-off-rocksdb) for the full migration checklist.
+Set `ss-backend = "pebbledb"` before you start state sync. This is especially important if you rebuild a node that previously used RocksDB. RocksDB support for the SeiDB state store will be removed, and there is no published target release for the removal. For the full migration checklist, see [Move off RocksDB](/node/node-operators#move-off-rocksdb).Do not use state sync to migrate an archive node. State sync starts from a recent height and does not preserve the earlier state-store versions. Follow the archive-node guidance in [Move off RocksDB](/node/node-operators#move-off-rocksdb).
-## Clean Up
+## Clean up
-If you are not starting a node from fresh, then you need to do some backups and clean ups.
+If the node is not new, back up and clean up the existing node first.
-Note: This step is not needed for fresh nodes.
+Skip this step on a new node.
-Assuming your sei home directory is `$HOME/.sei`, back up `priv_validator_key.json` and `priv_validator_state.json`:
+If your Sei home directory is `$HOME/.sei`, back up `priv_validator_key.json` and `priv_validator_state.json`:
```bash
cp $HOME/.sei/data/priv_validator_state.json $HOME/priv_validator_state.json
@@ -33,18 +33,16 @@ Reset the state:
seid tendermint unsafe-reset-all --home $HOME/.sei
```
-Finally, remove the existing data and wasm folders and restore the `priv_validator_state.json`:
-
-First, print the state-store section from `app.toml`:
+Finally, remove the existing data and wasm folders and restore `priv_validator_state.json`. Before you remove them, print the state-store section from `app.toml`:
```bash
sed -n '/^\[state-store\]/,/^\[.*\]/p' $HOME/.sei/config/app.toml
```
If `ss-db-directory` or `evm-ss-db-directory` points outside
-`$HOME/.sei/data`, back up anything you need and clear the old state-store
-data there as well. The commands below do not remove custom directories. A
-PebbleDB state sync must not reuse RocksDB data.
+`$HOME/.sei/data`, back up what you need from that directory. Then clear the
+old state-store data there too. The commands below do not remove custom
+directories. A PebbleDB state sync must not reuse RocksDB data.
```bash
rm -rf $HOME/.sei/data/*
@@ -54,30 +52,30 @@ cp $HOME/priv_validator_state.json $HOME/.sei/data/priv_validator_state.json
## Statesync script
-Set up the RPC servers for primary and secondary endpoints. You can use one of these RPC endpoints for Statesyning
+Set up the RPC servers for the primary and secondary endpoints. You can use one of these RPC endpoints for state sync.
-For `STATE_SYNC_RPC`, pick:
+For `STATE_SYNC_RPC`, use one of these endpoints:
-- mainnet (pacific-1): `https://sei-rpc.polkachu.com:443` or `https://rpc.sei-apis.com:443`
-- testnet (atlantic-2): `https://sei-testnet-rpc.polkachu.com:443` or `https://rpc-testnet.sei-apis.com:443`
+- Sei Mainnet (pacific-1): `https://sei-rpc.polkachu.com:443` or `https://rpc.sei-apis.com:443`
+- Sei Testnet (atlantic-2): `https://sei-testnet-rpc.polkachu.com:443` or `https://rpc-testnet.sei-apis.com:443`
-For `STATE_SYNC_PEER`, pick the below as `persistent-peers`:
+For `STATE_SYNC_PEER`, use these values as `persistent-peers`:
-- mainnet (pacific-1):
+- Sei Mainnet (pacific-1):
```bash
3be6b24cf86a5938cce7d48f44fb6598465a9924@p2p.state-sync-0.pacific-1.seinetwork.io:26656,b21279d7092fde2e41770832a1cacc7d0051e9dc@p2p.state-sync-1.pacific-1.seinetwork.io:26656,616c05e9ba24acc89c0de630b5e3adbedaebb478@p2p.state-sync-2.pacific-1.seinetwork.io:26656
```
-- testnet (atlantic-2):
+- Sei Testnet (atlantic-2):
```bash
b2664ccaa84a04b67683093fefb802b172ead6d1@sei-a2-rpc.p2p.brocha.in:30612,babc3f3f7804933265ec9c40ad94f4da8e9e0017@testnet-seed.rhinostake.com:11956
```
-The script sets up `trust_height` and `trust_hash` automatically. Each statesync snapshot is created at a certain block height. The script uses the best practice here and sets the trust height to be earlier than the latest snapshot block height to avoid backward verifications.
+The script sets `trust_height` and `trust_hash` automatically. Each state sync snapshot is taken at a specific block height. The script follows best practice and sets the trust height earlier than the latest snapshot block height. This avoids backward verification.
-Script that you can use:
+Use this script:
```bash title="state_sync.sh"
#!/bin/bash
@@ -137,9 +135,9 @@ sed -n '/^\[state-store\]/,/^\[.*\]/p' $HOME/.sei/config/app.toml
```
Confirm that the script output includes `ss-backend = "pebbledb"`. If the key
-is absent, add it directly below `[state-store]` before you start `seid`.
+is missing, add it directly below `[state-store]` before you start `seid`.
-Finally start the daemon:
+Finally, start the daemon:
```bash
sudo systemctl start seid
@@ -147,14 +145,14 @@ sudo systemctl start seid
## Troubleshooting statesync
-**Q:** I can't connect to the state sync url.
+**Q:** I cannot connect to the state sync URL.
-**A:** Try another statesync url in that case and inform us in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk).
+**A:** Try a different state sync URL, and report the problem in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk).
-**Q:** The statesync finishes, but immediately get `AppHash` errors upon regular block syncing:
+**Q:** State sync finishes, but I get `AppHash` errors as soon as regular block sync starts.
-**A:** Make sure that you use the latest version of the chain node when you state-sync.
+**A:** Make sure that you use the latest version of the chain node when you run state sync.
-**Q:** The statesync randomly stops.
+**Q:** State sync stops at random.
-**A:** State-sync can be flaky at times, just try again. Please give it around 4-5 tries. Join our [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk) for help if you have any issues.
+**A:** State sync is sometimes unreliable. If it stops, start it again. It can take approximately 4 to 5 attempts. If you still have problems, ask for help in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk).
diff --git a/node/swagger.mdx b/node/swagger.mdx
index 9a7d798..68b0d8c 100644
--- a/node/swagger.mdx
+++ b/node/swagger.mdx
@@ -5,9 +5,9 @@ description: 'Learn how to enable and access Swagger API documentation for your
keywords: ['swagger', 'api documentation', 'sei node api', 'swagger endpoint', 'api docs', 'node configuration']
---
-## Swagger Docs Endpoint
+## Swagger docs endpoint
-To enable the Swagger docs endpoint, you need to update api.swagger value to true in the `app.toml` file:
+To enable the Swagger docs endpoint, set `api.swagger` to true in the `app.toml` file:
```toml
@@ -18,6 +18,6 @@ To enable the Swagger docs endpoint, you need to update api.swagger value to tru
swagger = true
```
-Once the node is restarted, the Swagger docs will be available at `http://:/swagger/` (e.g. `http://localhost:1317/swagger/`).
+After you restart the node, the Swagger docs are available at `http://:/swagger/` (for example, `http://localhost:1317/swagger/`).
-The default API port is `1317`. Ensure the API server is enabled in your `app.toml` under the `[api]` section by setting `enable = true`.
+The default API port is `1317`. Make sure that the API server is enabled: set `enable = true` in the `[api]` section of your `app.toml`.
diff --git a/node/technical-reference.mdx b/node/technical-reference.mdx
index c797627..0b42f0b 100644
--- a/node/technical-reference.mdx
+++ b/node/technical-reference.mdx
@@ -4,23 +4,22 @@ sidebarTitle: 'Technical Reference'
description: 'Access detailed command syntax, configuration parameters, and troubleshooting procedures for node operators and validators running Sei network infrastructure.'
keywords: ['sei', 'technical', 'reference', 'node commands', 'configuration', 'troubleshooting']
---
-This guide serves as a comprehensive reference for Sei node operators and
-validators, providing detailed command syntax, configuration parameters, and
-troubleshooting procedures. For API documentation, please refer to our API
-Documentation section.
+This guide is a reference for Sei node operators and validators. It gives
+detailed command syntax, configuration parameters, and troubleshooting
+procedures. For API documentation, see the API Documentation section.
-## Command Line Interface Reference
+## Command line interface reference
-The `seid` binary provides extensive functionality for managing your Sei node.
+The `seid` binary has extensive functionality to manage your Sei node.
Understanding these commands is essential for effective node operation and
troubleshooting.
-### Node Management Commands
+### Node management commands
-These commands help you control and monitor your node's operation:
+These commands help you control and monitor your node:
- If you see an error such as `panic: recovered: runtime error: integer divide by zero` it means you can’t start nodes straight from the genesis file. Instead, sync to the block tip via [state sync](/node/statesync) or using a [snapshot](/node/snapshot).
+ If you see an error such as `panic: recovered: runtime error: integer divide by zero`, it means that you cannot start nodes directly from the genesis file. Instead, sync to the block tip with [state sync](/node/statesync) or a [snapshot](/node/snapshot).
```bash
@@ -39,22 +38,24 @@ seid query node info
#### Freeze mode (`--freeze-height`)
-As of v6.6.3, the `--freeze-height` start flag (and the corresponding `freeze-height` field in `app.toml`) puts a full node into read-only freeze mode at a specified block height. Freeze mode exists for historical RPC nodes. A node frozen at an upgrade height keeps running the pre-upgrade binary and keeps serving the state that binary produced, instead of shutting down at the boundary or executing the upgrade block with code that no longer matches that state. Query RPC remains available so the node can continue serving reads, but write and network paths are disabled from startup:
+As of v6.6.3, you can put a full node into read-only freeze mode at a specified block height. Use the `--freeze-height` start flag or the corresponding `freeze-height` field in `app.toml`. Freeze mode exists for historical RPC nodes. A node frozen at an upgrade height keeps running the pre-upgrade binary and keeps serving the state that binary produced. It does not shut down at the boundary or execute the upgrade block with code that no longer matches that state.
+
+Query RPC remains available, so the node can continue to serve reads, but write and network paths are disabled from startup:
- Transaction and evidence submission is rejected. The `BroadcastTx`, `BroadcastTxAsync`, `BroadcastTxSync`, `BroadcastTxCommit`, and `BroadcastEvidence` RPC calls all return `ErrReadOnly` (`RPC writes are disabled in freeze mode`). The EVM endpoint submits transactions through the same path, so `eth_sendRawTransaction` fails with the same error.
-- Mempool gossip is disabled — the mempool reactor is not started and the mempool p2p channel is not advertised to peers.
+- Mempool gossip is disabled. The mempool reactor does not start, and the node does not advertise the mempool p2p channel to peers.
- State sync is disabled. If it is enabled in `config.toml`, the node logs a notice and falls back to block sync.
-Block sync and consensus stop before executing the configured height and will not advance beyond it.
+Block sync and consensus stop before they execute the configured height and do not advance beyond it.
-The node must not have reached the freeze height yet. If the application, block store, or state store height is already at or above `freeze-height`, startup fails with ` height has already reached freeze height `. To build a frozen node, start from a data directory that is below the freeze height (a fresh sync from genesis, or a [snapshot](/node/snapshot) taken below that height) and let block sync stop at the boundary.
+The node must not have reached the freeze height yet. If the application, block store, or state store height is already at or above `freeze-height`, startup fails with ` height has already reached freeze height `. To build a frozen node, start from a data directory that is below the freeze height. This can be a fresh sync from genesis or a [snapshot](/node/snapshot) taken below that height. Then let block sync stop at the boundary.
```bash
# Start a full node in read-only freeze mode at a given block height
seid start --freeze-height
```
-The same behavior can be configured persistently via the `freeze-height` field. `freeze-height` is the first block height a full node must not execute; a value of `0` disables freeze mode. The key is a top-level entry in `app.toml`, in the base configuration next to `halt-height`, and does not belong under any `[section]` header. See the generated [default `app.toml`](/node/node-operators#default-configurations) for the field in context.
+You can configure the same behavior persistently with the `freeze-height` field. Its value is the first block height that a full node must not execute. A value of `0` disables freeze mode. The key is a top-level entry in `app.toml`, in the base configuration next to `halt-height`, not under any `[section]` header. The generated [default `app.toml`](/node/node-operators#default-configurations) shows the field in context.
```toml
# app.toml — top-level key in the base configuration (next to halt-height), not under any [section]
@@ -62,16 +63,16 @@ freeze-height = 0
```
- Freeze mode is only supported for full nodes. Setting a non-zero `freeze-height` in validator or seed mode is rejected at startup with an error (`freeze height is not supported in mode`). `freeze-height` also cannot be combined with `halt-height`, `halt-time`, or the `--grpc-only` start flag; each combination is rejected at startup.
+ Freeze mode is supported only for full nodes. In validator or seed mode, the node rejects a non-zero `freeze-height` at startup with an error (`freeze height is not supported in mode`). You also cannot combine `freeze-height` with `halt-height`, `halt-time`, or the `--grpc-only` start flag. The node rejects each combination at startup.
### Frozen RPC router
-The `frozen-rpc-router` binary, available as of v6.6.3, is a companion to freeze mode. It exposes a single HTTP EVM JSON-RPC endpoint that transparently proxies requests to a live node and one or more freeze-height-frozen nodes, routing each request to the correct backend based on the block height it references. This lets a set of archival nodes — each frozen at a different upgrade height and running the binary that was live for its interval — collectively serve historical state through one endpoint.
+The `frozen-rpc-router` binary, available as of v6.6.3, is a companion to freeze mode. It exposes a single HTTP EVM JSON-RPC endpoint that transparently proxies requests to a live node and one or more freeze-height-frozen nodes. It routes each request to the correct backend based on the block height that the request references. With the router, a set of archival nodes can collectively serve historical state through one endpoint. Each node is frozen at a different upgrade height and runs the binary that was live for its interval.
-Because a freeze height is an exclusive boundary, a node started with `--freeze-height 100` serves blocks through height 99. The router therefore sends height 99 to that node and height 100 to the next configured interval (or to the live node when no frozen interval covers it).
+Because a freeze height is an exclusive boundary, a node started with `--freeze-height 100` serves blocks through height 99. The router therefore sends height 99 to that node. It sends height 100 to the next configured interval, or to the live node when no frozen interval covers it.
-The router is a standalone binary in the `sei-chain` repository. It is not part of `seid` and is not installed by `make install`, so build it from a source checkout with the `build-frozen-rpc-router` target, which writes the binary to `./build/frozen-rpc-router`:
+The router is a standalone binary in the `sei-chain` repository. It is not part of `seid`, and `make install` does not install it. Build it from a source checkout with the `build-frozen-rpc-router` target, which writes the binary to `./build/frozen-rpc-router`:
```bash
git clone https://github.com/sei-protocol/sei-chain.git
@@ -93,42 +94,42 @@ make build-frozen-rpc-router
```
- The router has no authentication of its own: anyone who can reach its listen address can query every backend behind it. The example binds to `127.0.0.1` so that only local clients can connect. If you bind to a public interface (for example `--listen-address 0.0.0.0:8545`), put the router behind a firewall or reverse proxy, as you would for a node's own EVM RPC port.
+ If you bind the router to a public interface (for example, `--listen-address 0.0.0.0:8545`), put it behind a firewall or reverse proxy. Protect it as you would a node's own EVM RPC port. The router has no authentication of its own, so anyone who can reach its listen address can query every backend behind it. The example binds to `127.0.0.1` so that only local clients can connect.
-The binary accepts the following flags:
+The binary accepts these flags:
-- `--listen-address` — address on which the router listens (default `127.0.0.1:8545`).
-- `--live-node` — HTTP RPC address of the live node (required).
-- `--frozen-node` — a `freeze-height=ip:port` pair; repeat once per frozen node. Bare `host:port` addresses and `http://` or `https://` URLs are all accepted. Frozen nodes may be listed in any order, but each freeze height must be positive and unique.
-- `--max-request-body-bytes` — maximum JSON-RPC request body size in bytes (default `5242880`, which is 5 MiB). Must be positive. Larger requests are rejected with HTTP `413`.
-- `--max-block-reference-depth` — maximum nested block reference depth (default `16`); bounds how deeply nested `blockNumber` object references are parsed when resolving a request's block parameter. Must be positive.
-- `--batch-request-limit` — maximum number of calls in a JSON-RPC batch (default `1000`). Must be positive. A batch exceeding this limit is rejected with JSON-RPC error `-32600` (`batch too large`).
-- `--write-timeout` — maximum duration for writing an HTTP response (default `30s`). Must be positive.
-- `--shutdown-timeout` — graceful shutdown timeout (default `10s`). Must be positive.
+- `--listen-address`: The address on which the router listens (default `127.0.0.1:8545`).
+- `--live-node`: The HTTP RPC address of the live node (required).
+- `--frozen-node`: A `freeze-height=ip:port` pair. Repeat it once for each frozen node. The router accepts bare `host:port` addresses and `http://` or `https://` URLs. You may list frozen nodes in any order, but each freeze height must be positive and unique.
+- `--max-request-body-bytes`: The maximum JSON-RPC request body size in bytes (default `5242880`, which is 5 MiB). It must be positive. The router rejects larger requests with HTTP `413`.
+- `--max-block-reference-depth`: The maximum nested block reference depth (default `16`). It limits how deeply nested `blockNumber` object references are parsed when the router resolves a request's block parameter. It must be positive.
+- `--batch-request-limit`: The maximum number of calls in a JSON-RPC batch (default `1000`). It must be positive. The router rejects a batch over this limit with JSON-RPC error `-32600` (`batch too large`).
+- `--write-timeout`: The maximum duration to write an HTTP response (default `30s`). It must be positive.
+- `--shutdown-timeout`: The graceful shutdown timeout (default `10s`). It must be positive.
#### Routing rules
-Only JSON-RPC `POST` requests are inspected and routed. Every other request, including WebSocket upgrade requests, is passed straight through to the `--live-node` address without inspection. Because that address is the live node's HTTP RPC endpoint, which does not accept WebSocket upgrades, clients that need subscriptions should connect directly to the live node's WebSocket port (`8546` by default) rather than through the router.
+The router inspects and routes only JSON-RPC `POST` requests. It passes every other request, including WebSocket upgrade requests, straight through to the `--live-node` address without inspection. That address is the live node's HTTP RPC endpoint, which does not accept WebSocket upgrades. Clients that need subscriptions should therefore connect directly to the live node's WebSocket port (`8546` by default), not through the router.
-- `eth_*` and `debug_*` methods that take an explicit block number or the `earliest` tag (for example `eth_getBlockByNumber`, `eth_getBalance`, `eth_call`, `eth_getStorageAt`, `debug_traceBlockByNumber`) are routed to the interval that contains that height. `earliest` resolves to height 0.
-- `eth_getLogs` and `eth_feeHistory` are routed only when their entire block range falls within a single interval. The range is explicit for `eth_getLogs`; for `eth_feeHistory` it is derived from `blockCount` and `newestBlock` (`newestBlock - blockCount + 1` through `newestBlock`, clamped at `0`). A range that crosses an interval boundary is rejected with JSON-RPC error `-32000` (`block ranges spanning multiple frozen-node intervals are not supported`).
-- An `eth_getLogs` filter that sets `fromBlock` but omits `toBlock` is treated as ending at `latest`, so it is rejected with the same `-32000` error whenever `fromBlock` is inside a frozen interval. Set `toBlock` explicitly to stay within one interval. The reverse works: a filter that sets only `toBlock` is routed to the interval that contains `toBlock`.
-- Latest-style block tags (`latest`, `pending`, `safe`, `finalized`), requests referencing a block by hash, methods without a block parameter, and stateful filter methods are all forwarded to the live node.
-- Batch requests are split so each call reaches its correct backend, then reassembled into a single response.
+- `eth_*` and `debug_*` methods that take an explicit block number or the `earliest` tag are routed to the interval that contains that height. Examples include `eth_getBlockByNumber`, `eth_getBalance`, `eth_call`, `eth_getStorageAt`, and `debug_traceBlockByNumber`. `earliest` resolves to height 0.
+- `eth_getLogs` and `eth_feeHistory` are routed only when their entire block range falls within a single interval. The range is explicit for `eth_getLogs`. For `eth_feeHistory`, the router derives it from `blockCount` and `newestBlock` (`newestBlock - blockCount + 1` through `newestBlock`, clamped at `0`). The router rejects a range that crosses an interval boundary with JSON-RPC error `-32000` (`block ranges spanning multiple frozen-node intervals are not supported`).
+- An `eth_getLogs` filter that sets `fromBlock` but omits `toBlock` is treated as ending at `latest`. As a result, the router rejects it with the same `-32000` error whenever `fromBlock` is inside a frozen interval. To stay within one interval, set `toBlock` explicitly. The reverse works: a filter that sets only `toBlock` is routed to the interval that contains `toBlock`.
+- Requests with latest-style block tags (`latest`, `pending`, `safe`, `finalized`) are forwarded to the live node. So are requests that reference a block by hash, methods without a block parameter, and stateful filter methods.
+- Batch requests are split so that each call reaches its correct backend, then reassembled into a single response.
- Calls whose backend cannot be reached return JSON-RPC error `-32001` (`upstream request failed`).
#### Route header
-Responses proxied to a single backend carry a `Sei-RPC-Route` header identifying which backend served them: `frozen:` for the frozen node at that freeze height, or `live` for the live node. A batch split across multiple backends returns `mixed`. Errors generated by the router itself (oversized or malformed requests, batches over the limit, block ranges spanning intervals, unreachable backends) and non-`POST` traffic passed through to the live node do not carry the header.
+Responses proxied to a single backend carry a `Sei-RPC-Route` header. The header identifies which backend served the response: `frozen:` for the frozen node at that freeze height, or `live` for the live node. A batch split across multiple backends returns `mixed`. Router-generated errors (oversized or malformed requests, batches over the limit, block ranges that span intervals, and unreachable backends) do not carry the header. Neither does non-`POST` traffic that passes through to the live node.
-### seidb Tooling Commands
+### seidb tooling commands
-The `seidb` binary provides low-level tooling for inspecting and maintaining a node's on-disk state.
+The `seidb` binary has low-level tools to inspect and maintain a node's on-disk state.
-#### Reporting FlatKV EVM Migration Status
+#### Reporting FlatKV EVM migration status
-The `migrate-evm-status` subcommand reads the on-disk FlatKV EVM migration state from a FlatKV data directory and prints a JSON summary. It is primarily intended for integration and operator tooling that polls each validator to determine whether the FlatKV EVM migration has completed, without needing a custom RPC handler or having to grep through node logs.
+The `migrate-evm-status` subcommand reads the on-disk FlatKV EVM migration state from a FlatKV data directory and prints a JSON summary. It is intended mainly for integration and operator tooling that polls each validator to check whether the FlatKV EVM migration has completed. The tooling then needs no custom RPC handler and does not have to grep through node logs.
```bash
# Report FlatKV EVM migration status at the latest available version
@@ -141,20 +142,22 @@ seidb migrate-evm-status -d $HOME/.sei/data/state_commit/flatkv
seidb migrate-evm-status --db-dir --height
```
-The command opens FlatKV read-only — it hardlink-clones the latest snapshot and copies the WAL into a temporary directory before opening — so it can be run safely against a directory that a live node is still writing to.
+The command opens FlatKV read-only. It first hardlink-clones the latest snapshot and copies the WAL into a temporary directory. You can therefore run it safely against a directory that a live node is still writing to.
+
+The emitted JSON contains these fields:
-The emitted JSON contains the following fields:
+- `version_at`: The FlatKV version that was read.
+- `migration_version`: The on-disk migration version (`0` means that the FlatKV EVM migration has not completed yet).
+- `migrate_evm_complete`: `true` after the migration version reaches the FlatKV EVM (v1) target.
+- `boundary_present`: `true` while the migration is in flight (the in-progress resume cursor is still present).
+- `boundary_hex`: The hex-encoded migration boundary cursor. It appears only when a boundary is present.
+- `version_raw_hex`: The hex-encoded raw migration-version bytes. It appears only when a migration version is present.
-- `version_at` — the FlatKV version that was read.
-- `migration_version` — the on-disk migration version (`0` means the FlatKV EVM migration has not yet completed).
-- `migrate_evm_complete` — `true` once the migration version has reached the FlatKV EVM (v1) target.
-- `boundary_present` — `true` while the migration is in flight (the in-progress resume cursor is still present).
-- `boundary_hex` — hex-encoded migration boundary cursor, included only when a boundary is present.
-- `version_raw_hex` — hex-encoded raw migration-version bytes, included only when a migration version is present.
+#### Comparing EVM state across backends
-#### Comparing EVM State Across Backends
+The `evm-logical-digest` subcommand computes a backend-independent digest of the EVM logical state (the account, code, and storage buckets). With this digest, you can compare a memIAVL node and a FlatKV node at the same chain height.
-The `evm-logical-digest` subcommand computes a backend-independent digest of the EVM logical state (the account, code, and storage buckets) so that a memIAVL node and a FlatKV node can be compared at the same chain height. Because a freshly migrated FlatKV node stamps a per-key `blockHeight` into each value that differs from the memIAVL leaf versions, a raw byte-for-byte digest would diverge even when the underlying EVM state is identical. This command strips the serialization-version and `blockHeight` header on both sides and digests only the height-independent logical payload (storage word, bytecode, or balance+nonce+codehash), producing a comparable `FINAL_DIGEST` per backend.
+A freshly migrated FlatKV node stamps a per-key `blockHeight` into each value, and this stamp differs from the memIAVL leaf versions. As a result, a raw byte-for-byte digest would diverge even when the underlying EVM state is identical. This command strips the serialization-version and `blockHeight` header on both sides. It then digests only the height-independent logical payload (storage word, bytecode, or balance+nonce+codehash) and produces a comparable `FINAL_DIGEST` for each backend.
```bash
# FlatKV digest at a height (WAL-replays to it). Prints per-bucket
@@ -175,26 +178,26 @@ seidb evm-logical-digest --backend memiavl \
--memiavl-normalization translator
```
-Two backends match when the FlatKV `FINAL_DIGEST` equals the memIAVL `FINAL_DIGEST`. FlatKV also writes an internal migration-version marker row that a memiavl-only node never owns, so the command omits that row from the final comparison automatically.
+Two backends match when the FlatKV `FINAL_DIGEST` equals the memIAVL `FINAL_DIGEST`. FlatKV also writes an internal migration-version marker row, which a memiavl-only node never owns. The command automatically omits that row from the final comparison.
-The command accepts the following flags:
+The command accepts these flags:
-- `--backend` — backend to read: `flatkv` or `memiavl`.
-- `--db-dir` (`-d`) — for FlatKV, the FlatKV data directory; for memIAVL, the memIAVL root directory containing `current/` and `snapshot-*`.
-- `--height` — target version. FlatKV WAL-replays to it; memIAVL resolves `snapshot-/evm` (`0` selects the `current` symlink).
-- `--memiavl-normalization` — memIAVL normalization mode: `semantic`/`independent` (raw EVM key/value decoder, the default `semantic`) or `translator` (current migration mapping).
-- `--inspect-bucket` — inspect one normalized bucket (`account`, `code`, `storage`, or `legacy`) instead of printing the global digest.
-- `--key-offset` — inspect mode: byte offset into the physical key before applying `--key-prefix` or sharding.
-- `--key-prefix` — inspect mode: hex prefix, relative to `--key-offset`, used to filter physical keys.
-- `--shard-next-bytes` — inspect mode: group matching keys by this many bytes after `--key-prefix`.
-- `--list` — inspect mode: list matching key/logical-value pairs instead of shard `bucket_digest` values.
-- `--list-limit` — inspect mode: maximum pairs to print with `--list` (default `1000`; a value `<= 0` means unlimited).
-- `--details` — inspect list mode: include backend-specific version metadata.
-- `--find-hash` — optional 32-byte hex per-entry hash to hunt for. When two `bucket_digest` values differ by exactly one entry, their XOR is that entry's hash; this prints every matching entry so a single diverging row can be located.
+- `--backend`: The backend to read (`flatkv` or `memiavl`).
+- `--db-dir` (`-d`): For FlatKV, the FlatKV data directory. For memIAVL, the memIAVL root directory that contains `current/` and `snapshot-*`.
+- `--height`: The target version. FlatKV WAL-replays to it, and memIAVL resolves `snapshot-/evm` (`0` selects the `current` symlink).
+- `--memiavl-normalization`: The memIAVL normalization mode. Use `semantic` or `independent` for the raw EVM key-value decoder, or `translator` for the current migration mapping. The default is `semantic`.
+- `--inspect-bucket`: Inspect one normalized bucket (`account`, `code`, `storage`, or `legacy`) instead of printing the global digest.
+- `--key-offset` (inspect mode): The byte offset into the physical key, applied before `--key-prefix` or sharding.
+- `--key-prefix` (inspect mode): A hex prefix, relative to `--key-offset`, that filters physical keys.
+- `--shard-next-bytes` (inspect mode): Group matching keys by this many bytes after `--key-prefix`.
+- `--list` (inspect mode): List pairs of matching keys and logical values instead of shard `bucket_digest` values.
+- `--list-limit` (inspect mode): The maximum number of pairs to print with `--list` (default `1000`). A value `<= 0` means unlimited.
+- `--details` (inspect list mode): Include backend-specific version metadata.
+- `--find-hash`: An optional 32-byte hex per-entry hash to search for. When two `bucket_digest` values differ by exactly one entry, their XOR is the hash of that entry. This flag prints every matching entry, so you can locate a single diverging row.
-### Autobahn (GigaRouter) Config Generation
+### Autobahn (GigaRouter) config generation
-When running with the Autobahn (GigaRouter) networking layer, you can generate the Autobahn JSON config from a set of node directories. Each directory must contain `validator_pubkey.txt`, `node_pubkey.txt`, `autobahn_address.txt`, and `evmrpc_url.txt`. Unlike the key files, `evmrpc_url.txt` is not written automatically — operators must create it by hand with the node's EVM RPC URL, and the command fails with an error if it is missing. The `mempool_size` field is no longer part of `autobahn.json`; remove it from existing config files.
+When you use the Autobahn (GigaRouter) networking layer, you can generate the Autobahn JSON config from a set of node directories. Each directory must contain `validator_pubkey.txt`, `node_pubkey.txt`, `autobahn_address.txt`, and `evmrpc_url.txt`. Unlike the key files, `evmrpc_url.txt` is not written automatically, so you must create it by hand with the node's EVM RPC URL. If the file is missing, the command fails with an error. The `mempool_size` field is no longer part of `autobahn.json`. Remove it from existing config files.
```bash
# Generate an autobahn JSON config from one or more node directories
@@ -210,60 +213,60 @@ seid tendermint gen-autobahn-config ./node0 ./node1 --output autobahn.json --per
seid tendermint gen-autobahn-config ./node0 ./node1 --output autobahn.json --persistent-state-dir=
```
-The `--persistent-state-dir` flag controls where autobahn persists its consensus and data write-ahead logs (WALs) across restarts. It defaults to `data/autobahn`, so persistence is enabled by default without any operator action; the consensus and data layers write to distinct subdirectories under this shared on-disk root. A relative path is resolved against the node's `--home` directory at config load time, while absolute paths are used as-is. Passing an empty value (`--persistent-state-dir=`) disables persistence entirely, running both the consensus and data layers in-memory only. When set, the flag populates the `PersistentStateDir` field in the generated config.
+The `--persistent-state-dir` flag controls where Autobahn persists its consensus and data write-ahead logs (WALs) across restarts. The default is `data/autobahn`, so persistence is enabled by default without any operator action. The consensus and data layers write to distinct subdirectories under this shared on-disk root. At config load time, a relative path is resolved against the node's `--home` directory, and an absolute path is used as is. An empty value (`--persistent-state-dir=`) disables persistence entirely, and both the consensus and data layers run in memory only. When set, the flag populates the `PersistentStateDir` field in the generated config.
-The command reads the following files from each node directory:
+The command reads these files from each node directory:
-- `validator_pubkey.txt` — the validator public key in `validator:` format.
-- `node_pubkey.txt` — the p2p node public key in `node:ed25519:public:` format.
-- `autobahn_address.txt` — the network address (`host:port`) the node advertises to peers.
-- `evmrpc_url.txt` — the node's EVM RPC URL, written into the validator's `evmrpc` field for cross-shard transaction proxying.
+- `validator_pubkey.txt`: The validator public key in `validator:` format.
+- `node_pubkey.txt`: The p2p node public key in `node:ed25519:public:` format.
+- `autobahn_address.txt`: The network address (`host:port`) that the node advertises to peers.
+- `evmrpc_url.txt`: The node's EVM RPC URL. It is written into the validator's `evmrpc` field for cross-shard transaction proxying.
-The `validator_pubkey.txt` and `node_pubkey.txt` files are written automatically alongside `priv_validator_key.json` and `node_key.json` whenever those keys are saved, so they are typically already present in each node's config directory.
+The `validator_pubkey.txt` and `node_pubkey.txt` files are written automatically next to `priv_validator_key.json` and `node_key.json` whenever those keys are saved. They are therefore usually already present in each node's config directory.
-The generated `autobahn.json` file describes the validator set along with transaction limits, block interval, view timeout, and dial interval; gas limits are not part of this file and come from the genesis block parameters instead. To have a node consume it, reference the file from `config.toml` using the `autobahn-config-file` key.
+The generated `autobahn.json` file describes the validator set, transaction limits, block interval, view timeout, and dial interval. Gas limits are not part of this file and come from the genesis block parameters instead. To make a node use the file, reference it from `config.toml` with the `autobahn-config-file` key.
-#### Giga Mode Behavior and Per-Block Limits
+#### Giga mode behavior and per-block limits
-When a node is started in Giga mode — that is, when `autobahn-config-file` is set in `config.toml` — the block production and networking behavior differs significantly from standard Tendermint consensus:
+A node starts in Giga mode when `autobahn-config-file` is set in `config.toml`. In Giga mode, the block production and networking behavior differs significantly from standard Tendermint consensus:
-- **The CometBFT `TxMempool` is not used.** Under Giga the standard mempool (and its gossip reactor) is disabled entirely. Transactions instead route through the Autobahn producer-backed mempool.
-- **Consensus reactor, state sync, and block sync are disabled.** In Giga mode the consensus and state-sync reactors are skipped entirely, while the block-sync reactor still runs without a syncer; both state sync and block sync are forced off regardless of other configuration.
-- **Transactions are admitted through the producer mempool.** The RPC broadcast endpoints call the producer's `InsertTx`/`TryInsertTx` rather than the CometBFT mempool's `CheckTx`. `BroadcastTx` uses `InsertTx`, which blocks while the mempool is full; the async path calls `TryInsertTx` in the background and returns immediately, so when the mempool is full the transaction is silently dropped — the `mempool is full` error from `TryInsertTx` is never surfaced to async callers.
+- **The CometBFT `TxMempool` is not used.** Under Giga, the standard mempool and its gossip reactor are disabled entirely. Transactions route through the Autobahn producer-backed mempool instead.
+- **Consensus reactor, state sync, and block sync are disabled.** In Giga mode, the node skips the consensus and state-sync reactors entirely. The block-sync reactor still runs without a syncer. State sync and block sync are both forced off, regardless of other configuration.
+- **Transactions are admitted through the producer mempool.** The RPC broadcast endpoints call the producer's `InsertTx` or `TryInsertTx`, not the CometBFT mempool's `CheckTx`. `BroadcastTx` uses `InsertTx`, which blocks while the mempool is full. The async path calls `TryInsertTx` in the background and returns immediately. As a result, when the mempool is full, the transaction is silently dropped. The `mempool is full` error from `TryInsertTx` never reaches async callers.
- **Sequential EVM nonce ordering is enforced.** For EVM transactions, the producer mempool admits transactions strictly in nonce order per sender. A transaction whose nonce does not match the next expected nonce is rejected with a `bad nonce` error. Because admission is sequential, the mempool can track pending nonces (`EvmNextPendingNonce`) as callers submit them.
-Each Autobahn block payload is bounded by the following limits, enforced by the producer as it fills a block:
+The producer enforces these limits on each Autobahn block payload as it fills a block:
-- **Maximum transactions per block:** the lower of the configured `max_txs_per_block` and the built-in maximum of 2,000 (see the transaction payload caps below).
-- **Maximum total transaction bytes per block:** a fixed per-block byte cap; a single transaction larger than this cap is rejected with a `transaction too large` error.
-- **Wanted gas per block (`MaxGasWantedPerBlock`):** derived from the genesis `MaxGasWanted` block param. A transaction whose `GasWanted` exceeds this per-block limit is rejected as too large.
-- **Estimated gas per block (`MaxGasEstimatedPerBlock`):** derived from the genesis `MaxGas` block param. A transaction whose (normalized) estimated gas exceeds this per-block limit is rejected as too large.
+- **Maximum transactions per block:** The lower of the configured `max_txs_per_block` and the built-in maximum of 2,000 (see the transaction payload caps below).
+- **Maximum total transaction bytes per block:** A fixed per-block byte cap. A single transaction larger than this cap is rejected with a `transaction too large` error.
+- **Wanted gas per block (`MaxGasWantedPerBlock`):** Derived from the genesis `MaxGasWanted` block param. A transaction whose `GasWanted` exceeds this per-block limit is rejected as too large.
+- **Estimated gas per block (`MaxGasEstimatedPerBlock`):** Derived from the genesis `MaxGas` block param. A transaction whose (normalized) estimated gas exceeds this per-block limit is rejected as too large.
-When filling a block the producer seals the current block and starts a new one as soon as adding the next transaction would exceed any of the transaction-count, byte, wanted-gas, or estimated-gas limits.
+The producer seals the current block and starts a new one as soon as the next transaction would exceed a limit. This rule covers the transaction-count, byte, wanted-gas, and estimated-gas limits.
-#### Autobahn Committee and Network Message Limits
+#### Autobahn committee and network message limits
Beyond the per-block payload limits, Giga mode enforces structural limits on the validator committee and on incoming consensus network messages:
-- **Maximum validators per committee:** the Autobahn committee is capped at a hard limit of 100 validators (`MaxValidators`). Committee creation rejects any validator set exceeding this limit — building a committee from more than 100 validators fails with a `too many validators` error rather than being silently truncated.
-- **Bounded consensus network messages.** Autobahn consensus protobuf messages carry declared size and count constraints that are checked against the raw wire bytes before the message is decoded. Payloads that violate these constraints are rejected during decoding, before any allocation, which protects nodes from oversized or malformed inputs that could otherwise decode into much larger in-memory structures.
+- **Maximum validators per committee:** The Autobahn committee has a hard limit of 100 validators (`MaxValidators`). Committee creation rejects any validator set over this limit with a `too many validators` error. It does not silently truncate the set.
+- **Bounded consensus network messages.** Autobahn consensus protobuf messages carry declared size and count constraints. These constraints are checked against the raw wire bytes before the message is decoded. Payloads that violate them are rejected during decoding, before any allocation. This protects nodes from oversized or malformed inputs that could otherwise decode into much larger in-memory structures.
The enforced message constraints include:
- **Per-field maximum sizes** on fixed-width fields such as hashes, signatures, and public keys.
-- **Maximum repeated-field counts** on validator-related lists — signature and quorum-certificate lists are capped at 100 entries (matching the 100-validator committee cap).
-- **Transaction payload caps:** a block payload may carry at most 2,000 transactions, with a combined transaction byte budget of exactly 2,048,000 bytes (2,000 × 1,024) that may be split arbitrarily across the transactions in the payload — these are the built-in maxima referenced by the per-block limits above.
+- **Maximum repeated-field counts** on validator-related lists. Signature and quorum-certificate lists are capped at 100 entries, which matches the 100-validator committee cap.
+- **Transaction payload caps:** A block payload may carry at most 2,000 transactions. The combined transaction byte budget is exactly 2,048,000 bytes (2,000 × 1,024), and it may be split arbitrarily across the transactions in the payload. These are the built-in maxima that the per-block limits above refer to.
Any message whose fields exceed these limits is rejected at decode time, so an oversized network payload never reaches the consensus logic.
- Because Giga replaces the CometBFT mempool, the `unsafe_flush_mempool` RPC endpoint is not supported under Giga and returns `unsafe_flush_mempool is not supported with autobahn mempool`.
+ Giga replaces the CometBFT mempool, so Giga does not support the `unsafe_flush_mempool` RPC endpoint. The endpoint returns `unsafe_flush_mempool is not supported with autobahn mempool`.
-### Key Management
+### Key management
-Proper key management is crucial for security. These commands help you manage
-your keys effectively:
+Proper key management is critical for security. Use these commands to manage
+your keys:
```bash
# Create new key
@@ -285,9 +288,9 @@ seid keys import
seid keys show -a
```
-### Transaction Commands
+### Transaction commands
-These commands allow you to interact with the blockchain:
+These commands let you interact with Sei:
```bash
# Send tokens
@@ -303,16 +306,16 @@ seid tx distribution withdraw-rewards --from
seid tx staking edit-validator [flags] --from
```
-## Configuration Parameters
+## Configuration parameters
-Understanding configuration parameters is essential for optimizing your node's
+Understanding configuration parameters is essential to optimize your node's
performance and security.
-### App.toml Parameters
+### App.toml parameters
-The app.toml file controls application-specific settings:
+The `app.toml` file controls application-specific settings:
-
+
```toml
# Minimum gas prices for transaction acceptance
minimum-gas-prices = "0.02usei"
@@ -343,11 +346,11 @@ ss-prune-interval = 600
-### Config.toml Parameters
+### Config.toml parameters
-The config.toml file controls the core consensus engine and networking:
+The `config.toml` file controls the core consensus engine and networking:
-
+
```toml
# P2P Configuration
[p2p]
@@ -413,22 +416,22 @@ double-sign-check-height = 0
- The `[consensus]` section may still parse a `stateless-leader-election` field, but it is **deprecated and ignored**. Stateless (seed-based) leader election is now always enabled regardless of the value set, so this field no longer has any effect. It is retained only for config-parsing compatibility and can be safely omitted.
+ The `[consensus]` section may still parse a `stateless-leader-election` field, but the field is **deprecated and ignored**. Stateless (seed-based) leader election is always enabled, regardless of the value, so the field has no effect. It remains only for config-parsing compatibility, and you can safely omit it.
- Out-of-process ABCI support has been removed. The full node now runs only with Tendermint in-process; external stand-alone ABCI processes (socket or gRPC) are no longer supported. As a result:
+ Out-of-process ABCI support was removed. The full node now runs only with Tendermint in-process. External standalone ABCI processes (socket or gRPC) are no longer supported. As a result:
- The `seid start` flags `--address` and `--transport` are **deprecated and ignored**.
- The Tendermint node flags `--proxy-app` and `--abci` are **deprecated and ignored**.
- - The `proxy-app` and `abci` fields in `config.toml` are **deprecated and ignored**, and are no longer written to newly generated `config.toml` files. Node operators upgrading should delete these lines from their `config.toml` if present.
+ - The `proxy-app` and `abci` fields in `config.toml` are **deprecated and ignored**. Newly generated `config.toml` files no longer include them. If you upgrade a node and these lines are in your `config.toml`, delete them.
-## Network Parameters
+## Network parameters
Understanding network parameters helps you operate your node effectively.
-### Chain Parameters
+### Chain parameters
These parameters define the network's behavior:
@@ -453,10 +456,10 @@ Oracle Parameters:
```
- These values reflect the current on-chain parameters. Query them directly with `seid query staking params` and `seid query slashing params` for the source of truth. Per-validator settings (e.g. commission rate, commission max change rate) are configured per validator and are not chain-level parameters.
+ These values reflect the current on-chain parameters. For the source of truth, query them directly with `seid query staking params` and `seid query slashing params`. Per-validator settings (for example, commission rate and commission max change rate) are configured per validator and are not chain-level parameters.
-## File Locations
+## File locations
Understanding the purpose and location of important files helps with maintenance
and troubleshooting:
@@ -485,9 +488,9 @@ $HOME/.sei/
```
- New nodes place the Tendermint consensus databases (blockstore, state, tx_index, evidence, peerstore, and cs.wal) under `data/tendermint/`. Existing nodes that already have these databases in the legacy flat layout directly under `data/` (e.g. `data/blockstore.db`, `data/cs.wal/`) continue using those legacy paths automatically — the legacy location takes precedence when present, so no migration is required.
+ New nodes place the Tendermint consensus databases (blockstore, state, tx_index, evidence, peerstore, and cs.wal) under `data/tendermint/`. Existing nodes with the legacy flat layout keep these databases directly under `data/` (for example, `data/blockstore.db` and `data/cs.wal/`). These nodes continue to use the legacy paths automatically. The legacy location takes precedence when it is present, so no migration is required.
-This reference guide provides essential technical information for operating Sei
+This reference guide gives essential technical information for operating Sei
nodes and validators. For API documentation and other detailed specifications,
-please refer to the respective sections in our documentation set.
+see the relevant sections of this documentation.
diff --git a/node/troubleshooting.mdx b/node/troubleshooting.mdx
index 2d4bd23..7135cff 100644
--- a/node/troubleshooting.mdx
+++ b/node/troubleshooting.mdx
@@ -6,16 +6,15 @@ keywords: ['sei node', 'blockchain node', 'node configuration', 'bug', 'troubles
import { RandomPeers } from '/snippets/random-peers.jsx';
-Understanding common errors and their solutions helps maintain a healthy node
-operation.
+Knowing common errors and their solutions helps keep your node healthy.
-## Common Error Codes
+## Common error codes
-Here are the most frequent errors you might encounter and their solutions:
+These are the most frequent errors and their solutions:
-### Consensus Errors
+### Consensus errors
-When you encounter consensus errors, quick and appropriate action is essential:
+If you get a consensus error, act quickly and appropriately:
```text
Error: "Consensus failure - height halted"
@@ -35,7 +34,7 @@ Solution: IMMEDIATELY STOP NODE - potential double signing risk
Action: Check validator operation on other machines
```
-### Network Errors
+### Network errors
Network errors can prevent your node from participating in consensus:
@@ -55,7 +54,7 @@ Commands:
- curl localhost:26657/net_info
```
-### Database Errors
+### Database errors
Database corruption can require immediate attention:
@@ -67,9 +66,9 @@ Commands:
- cp -r backup/data $HOME/.sei/
```
-### Diagnostic Commands
+### Diagnostic commands
-These commands help you investigate issues and monitor your node:
+These commands help you investigate problems and monitor your node:
```bash
# Check node synchronization
@@ -85,9 +84,9 @@ journalctl -fu seid -o cat
top -p $(pgrep seid)
```
-## AppHash Mismatch Errors
+## AppHash mismatch errors
-If you encounter an AppHash mismatch, you'll need to capture the state for comparison with a known good version:
+If you get an AppHash mismatch, capture the state to compare it with a known-good version:
```bash
# For SeiDB (all supported nodes):
@@ -99,9 +98,9 @@ seidb dump-iavl -d $HOME/.sei/data/committer.db -o /home/ubuntu/iavl-dump
systemctl restart seid
```
-As with FlatKV, the memIAVL store has two possible locations: nodes created before the layout change keep the legacy `$HOME/.sei/data/committer.db` shown above (it takes precedence when present), while new nodes use `$HOME/.sei/data/state_commit/memiavl`. Point `-d` at whichever exists on your node.
+As with FlatKV, the memIAVL store has two possible locations. Nodes created before the layout change keep the legacy `$HOME/.sei/data/committer.db` path shown above (it takes precedence when present). New nodes use `$HOME/.sei/data/state_commit/memiavl`. Point `-d` at whichever path exists on your node.
-On Giga Storage nodes, EVM state lives in a FlatKV store rather than in the memIAVL trees, so an AppHash comparison there requires dumping the FlatKV state as well. Use the `dump-flatkv` command to iterate and dump the physical `(key, value)` pairs into per-bucket files (formatted to match `dump-iavl` so the same diff tooling works on both):
+On Giga Storage nodes, EVM state lives in a FlatKV store instead of the memIAVL trees. An AppHash comparison there also requires a FlatKV state dump. Use the `dump-flatkv` command to iterate and dump the physical `(key, value)` pairs into per-bucket files. The files match the `dump-iavl` format, so the same diff tooling works on both:
```bash
# For FlatKV (Giga Storage nodes hold EVM state in FlatKV):
@@ -112,12 +111,12 @@ systemctl restart seid
Nodes created before the storage layout change keep the FlatKV store at the legacy path `$HOME/.sei/data/flatkv` instead of `$HOME/.sei/data/state_commit/flatkv`. Pass whichever directory exists on your node to `--db-dir`.
-The `dump-flatkv` command accepts the following flags:
+The `dump-flatkv` command accepts these flags:
-- `--db-dir` / `-d`: FlatKV database directory.
-- `--output-dir` / `-o`: output directory; one file is written per bucket.
-- `--height`: FlatKV target version; `0` (the default) selects the latest available version.
-- `--bucket` / `-b`: restrict the dump to a single bucket (`account`, `code`, `storage`, or `legacy`). Defaults to all buckets.
+- `--db-dir` (`-d`): The FlatKV database directory.
+- `--output-dir` (`-o`): The output directory, with one file for each bucket.
+- `--height`: The FlatKV target version. The default, `0`, selects the latest available version.
+- `--bucket` (`-b`): Restrict the dump to a single bucket (`account`, `code`, `storage`, or `legacy`). The default is all buckets.
For example, to dump only the `storage` bucket at a specific version:
@@ -125,11 +124,11 @@ For example, to dump only the `storage` bucket at a specific version:
seidb dump-flatkv --db-dir $HOME/.sei/data/state_commit/flatkv --output-dir /home/ubuntu/flatkv-dump --height 12345678 --bucket storage
```
-### Comparing EVM State Between memIAVL and FlatKV
+### Comparing EVM state between memIAVL and FlatKV
-When debugging an AppHash mismatch that involves EVM state, a byte-for-byte physical dump can diverge between backends even when the underlying state is identical. This is because every FlatKV value embeds a per-key block-height stamp (the height the key was last written or migrated), which differs from the memIAVL leaf versions on a freshly migrated node.
+When you debug an AppHash mismatch that involves EVM state, a byte-for-byte physical dump can diverge between backends, even when the underlying state is identical. This happens because every FlatKV value embeds a per-key block-height stamp (the height at which the key was last written or migrated). On a freshly migrated node, this stamp differs from the memIAVL leaf versions.
-The `evm-logical-digest` command works around this by computing a backend-independent digest of the EVM *logical* state — it strips the serialization-version and block-height header on both sides and digests only the logical payload (account balance/nonce/code hash, bytecode, and storage words). This lets a memIAVL node and a FlatKV node be compared at the same chain height:
+The `evm-logical-digest` command works around this with a backend-independent digest of the EVM *logical* state. On both sides, it strips the serialization-version and block-height header. Then it digests only the logical payload: account balance, nonce, and code hash, plus bytecode and storage words. With this digest, you can compare a memIAVL node and a FlatKV node at the same chain height:
```bash
# FlatKV digest at a height (WAL-replays to it):
@@ -141,9 +140,9 @@ seidb evm-logical-digest --backend memiavl \
--db-dir $HOME/.sei/data/state_commit/memiavl --height 213200000
```
-Each run prints per-bucket `bucket_digest` values and a single `FINAL_DIGEST` line covering the `account`, `code`, `storage`, and `legacy` buckets. Compare the `FINAL_DIGEST` lines from both backends at the same height — they should match. Because FlatKV can contain a FlatKV-only migration-version marker that a memIAVL-only node never owns, that row is automatically omitted from the FlatKV final result so the comparison is apples-to-apples.
+Each run prints per-bucket `bucket_digest` values and a single `FINAL_DIGEST` line that covers the `account`, `code`, `storage`, and `legacy` buckets. Compare the `FINAL_DIGEST` lines from both backends at the same height. They should match. FlatKV can contain a FlatKV-only migration-version marker that a memIAVL-only node never owns. The command automatically omits that row from the FlatKV final result, so both results cover the same data.
-For targeted debugging, the command also supports inspecting a single normalized bucket instead of printing the global digest. The full flag reference (inspect mode, sharding, `--find-hash`) lives in the [seidb tooling section of the technical reference](/node/technical-reference#comparing-evm-state-across-backends). For example, to list the first 50 `account` rows with version metadata, or to shard the `storage` bucket under a key prefix by the next 2 bytes:
+For targeted debugging, the command can also inspect a single normalized bucket instead of printing the global digest. The [seidb tooling section of the technical reference](/node/technical-reference#comparing-evm-state-across-backends) has the full flag reference, including inspect mode, sharding, and `--find-hash`. These examples list the first 50 `account` rows with version metadata, and shard the `storage` bucket under a key prefix by the next 2 bytes:
```bash
seidb evm-logical-digest --backend flatkv -d $HOME/.sei/data/state_commit/flatkv --height 213200000 \
@@ -154,50 +153,50 @@ seidb evm-logical-digest --backend flatkv -d $HOME/.sei/data/state_commit/flatkv
```
-**The legacy IAVL backend has been fully removed and SeiDB State Commit (SC) is now mandatory.** SC must be enabled via `sc-enable = true` in the `[state-commit]` section of `app.toml`. If SC is not enabled, the node no longer falls back to IAVL — it panics at startup with:
+**Enable SeiDB State Commit (SC).** Set `sc-enable = true` in the `[state-commit]` section of `app.toml`. The legacy IAVL backend was fully removed, and SC is now mandatory. If SC is not enabled, the node no longer falls back to IAVL. It panics at startup with this error:
```text
SeiDB state-commit (SC) must be enabled; IAVL backend has been fully deprecated
```
-The `seid debug dump-iavl` command has also been removed along with the IAVL backend. To inspect state, use the `seidb dump-iavl` tool shown above.
+The `seid debug dump-iavl` command was also removed with the IAVL backend. To inspect state, use the `seidb dump-iavl` tool shown above.
-Always include the app hash, commit hash, and block height from your logs when reporting issues.
+When you report a problem, always include the app hash, commit hash, and block height from your logs.
-### Identifying AppHash Errors
+### Identifying AppHash errors
-AppHash errors typically appear in logs as:
+In logs, AppHash errors usually look like this:
```text
ERR wrong Block.Header.AppHash. Expected [EXPECTED_HASH], got [ACTUAL_HASH]
block_id={"hash":"...","parts":{"hash":"...","total":1}} height=[HEIGHT]
```
-**Common Causes:**
+**Common causes:**
-- Using incorrect node version during sync (ensure you're on the latest version)
+- Using an incorrect node version during sync (make sure that you run the latest version)
- Corrupted or incorrectly applied snapshots
- Database inconsistencies from improper shutdowns
- Syncing with outdated or incompatible peers
-**Resolution Steps:**
+**Resolution steps:**
1. **Stop the node immediately.**
-2. **Try a node rollback first:**, see [here](/node/troubleshooting#node-rollback)
-3. **If rollback fails, restore from a fresh snapshot:**
+2. **Try a node rollback first.** See [Node rollback](/node/troubleshooting#node-rollback).
+3. **If the rollback fails, restore from a fresh snapshot:**
- Download a recent snapshot from trusted providers (Polkachu, PublicNode)
- - Ensure you're using the correct node version
- - Verify peer configurations are up to date
+ - Make sure that you use the correct node version
+ - Verify that peer configurations are up to date
-4. **Restart the node and monitor logs for continued errors**
+4. **Restart the node and monitor the logs for continued errors.**
-### Peer Connection Issues as AppHash Red Herrings
+### Peer connection issues as AppHash red herrings
-**Important Note:** Peer connection failures are often symptoms of underlying AppHash errors, not the root cause.
+**Important:** Peer connection failures are often symptoms of underlying AppHash errors, not the root cause.
-When you see extensive peer connection errors like:
+If you see many peer connection errors like these:
```text
ERR failed to handshake with peer
@@ -205,33 +204,33 @@ ERR failed to send request for peers
ERR peer handshake failed endpoint={} err=EOF
```
-**Don't focus solely on fixing peer connections first.** Instead:
+**Do not focus only on fixing peer connections first.** Instead:
1. **Scan your logs carefully** for AppHash errors that may appear intermittently
2. **Look for the actual error pattern:**
```text
ERR wrong Block.Header.AppHash. Expected [HASH], got [HASH]
```
-3. **Check if your node is stuck** at a specific height despite peer connection attempts
+3. **Check whether your node is stuck** at a specific height despite peer connection attempts
-**Why This Happens:**
+**Why this happens:**
- AppHash mismatches prevent proper block validation
-- Node cannot advance to new blocks due to state inconsistency
+- The node cannot advance to new blocks because of a state inconsistency
- Peers may reject connections from nodes with corrupted state
-- Network appears to be the problem when it's actually a local state issue
+- The network appears to be the problem, but the cause is a local state issue
-**Debugging Approach:**
+**Debugging approach:**
1. **First, check for AppHash errors** in your logs (search for "wrong Block.Header.AppHash")
-2. **If AppHash errors are found**, treat this as the primary issue
-3. **Only focus on peer connection fixes** if no AppHash errors exist
+2. **If you find AppHash errors**, treat them as the primary issue
+3. **Focus on peer connection fixes** only if no AppHash errors exist
-This approach can save hours of debugging time by addressing the root cause rather than symptoms.
+This approach targets the root cause, not the symptoms, and can save hours of debugging time.
-### Peer Connection and Handshake Issues
+### Peer connection and handshake issues
-**Identifying Peer Issues:**
+**Identifying peer issues:**
Look for these error patterns in your logs:
@@ -241,14 +240,14 @@ ERR failed to send request for peers err="no available peers to send a PEX reque
ERR peer handshake failed endpoint={} err=EOF module=p2p
```
-**Common Causes:**
+**Common causes:**
- Outdated peer configurations with mismatched node IDs
-- Network infrastructure changes on peer side
-- Firewall blocking connections on port 26656
+- Network infrastructure changes on the peer side
+- A firewall that blocks connections on port 26656
- DNS resolution issues
-**Resolution Steps:**
+**Resolution steps:**
1. **Update peer configurations** with current node IDs:
@@ -264,15 +263,15 @@ ERR peer handshake failed endpoint={} err=EOF module=p2p
netstat -tulpn | grep :26656
```
-3. **Check current peer status:**
+3. **Check the current peer status:**
```bash
curl http://localhost:26657/net_info | jq '.result.peers | length'
curl http://localhost:26657/lag_status | jq .
```
-### Sync Performance Issues
+### Sync performance issues
-**Identifying Sync Problems:**
+**Identifying sync problems:**
Monitor these indicators:
@@ -284,16 +283,16 @@ curl http://localhost:26657/lag_status | jq .
curl http://localhost:26657/status | jq '.result.sync_info'
```
-**Common Solutions:**
+**Common solutions:**
-1. **Increase packet payload size** for large block processing:
+1. **Increase the packet payload size** for large block processing:
```toml
# In config.toml [p2p] section
max-packet-msg-payload-size = 1024000 # Increase from default 102400
```
-2. **Optimize mempool settings** in `config.toml`:
+2. **Optimize the mempool settings** in `config.toml`:
```toml
# In [mempool] section
@@ -302,27 +301,26 @@ curl http://localhost:26657/status | jq '.result.sync_info'
ttl-num-blocks = 5
```
-3. **If node gets stuck at specific height:**
+3. **If the node gets stuck at a specific height:**
- Try restarting the node
- - If restart doesn't help, perform rollback
+ - If that does not help, perform a rollback
- Consider taking a fresh snapshot
-**Warning Signs to Watch For:**
+**Warning signs to watch for:**
-- Current height not increasing over time
-- Increasing lag between current height and max peer height
-- Repeated timeout errors in logs
-- Mempool size consistently reaching limits
+- The current height does not increase over time
+- Increasing lag between the current height and the max peer height
+- Repeated timeout errors in the logs
+- Mempool size that consistently reaches its limits
-## Crash and Panic Debugging
+## Crash and panic debugging
For crashes, panics, or nil pointer exceptions:
-- Capture at least 1,000 lines of logs leading up to the crash
-- Or collect 15 minutes of log data, whichever provides more context
-- Include the full stack trace if available
+- Capture at least 1,000 lines of logs before the crash or 15 minutes of log data, whichever gives more context
+- Include the full stack trace, if it is available
-### Logging Configuration
+### Logging configuration
Proper logging configuration is essential for debugging and monitoring:
@@ -335,7 +333,7 @@ log_level = "debug" # Use "trace" for maximum detail
log_format = "json" # Use "plain" for human-readable logs
```
-Configure log rotation to manage storage effectively:
+Configure log rotation to manage storage:
```bash
# Example logrotate configuration
@@ -365,49 +363,54 @@ ulimit -c unlimited
echo "/tmp/core.%e.%p" > /proc/sys/kernel/core_pattern
```
-## Other common Issues and Fixes
+## Other common issues and fixes
-1. **Sync Problems**
+1. **Sync problems**
- Check available disk space (`df -h`)
- - Ensure proper peer connections (`curl http://localhost:26657/net_info`)
- - Verify firewall settings (port 26656 open)
+ - Make sure that peer connections work (`curl http://localhost:26657/net_info`)
+ - Check that the firewall allows port 26656
-2. **Performance Issues**
+2. **Performance issues**
- Monitor system resources (`htop` or `iotop`)
- Check disk I/O performance (`iostat`)
- Analyze network traffic (`iftop`)
-3. **Database Issues**
+3. **Database issues**
- - Run database integrity checks using:
+ - Run database integrity checks:
```bash
seid debug dump-db | grep -i error
```
- If errors are detected, consider restoring from a recent backup.
+ If you find errors, consider restoring from a recent backup.
- - Consider pruning excessive historical data by adjusting `ss-keep-recent` in
- `app.toml` or running:
+ - To keep less historical data, lower `ss-keep-recent` in `app.toml`.
+
+ - To rebuild the node with a smaller database, reset it. Then resync from a
+ [snapshot](/node/snapshot) or with [state sync](/node/statesync). The
+ reset deletes all chain data, so it is not a pruning tool. Before you
+ reset, back up `priv_validator_key.json` and `priv_validator_state.json`,
+ as described in [Clean up](/node/statesync#clean-up):
```bash
seid tendermint unsafe-reset-all --home $HOME/.sei --keep-addr-book
```
- Alternatively, manually remove old state snapshots to free up space:
+ Alternatively, remove old state snapshots manually to free disk space:
```bash
rm -rf $HOME/.sei/data/snapshots/*
```
-## Node Rollback
+## Node rollback
-To rollback a node from an AppHashed state, you need to stop the node first.
-Do this in your preferred way.
+To roll back a node from an AppHash mismatch, first stop the node in your
+preferred way.
-Next, do a rollback with:
+Next, roll back the node:
```bash
seid rollback
@@ -415,12 +418,12 @@ seid rollback
Then, restart the node.
-In case you see the following error while trying to rollback:
+If you see this error when you try to roll back:
```bash
failed to initialize database: resource temporarily unavailable
```
-This means that you did not shutdown the node properly. Try to shutdown or kill the `seid` process directly in that case. If this doesn't help, restart your machine.
+This means that you did not shut down the node properly. In that case, try to shut down or kill the `seid` process directly. If this does not help, restart your machine.
Then try the rollback steps again.
diff --git a/node/validators.mdx b/node/validators.mdx
index 8482e0f..8472bb9 100644
--- a/node/validators.mdx
+++ b/node/validators.mdx
@@ -4,38 +4,38 @@ sidebarTitle: 'Validator Operations Guide'
description: 'Learn how to set up and maintain a validator node on Sei Network, including hardware security configuration, key management, monitoring practices, and governance participation requirements.'
keywords: ['sei validator', 'validator node', 'blockchain validator', 'staking', 'sei network', 'consensus participation']
---
-This document covers the complete lifecycle of a validator node, from initial setup through ongoing operations and maintenance. Understanding these concepts is crucial for maintaining a reliable and secure validator operation.
+This document covers the complete lifecycle of a validator node, from initial setup through ongoing operations and maintenance. To run a reliable and secure validator, you need to understand these concepts.
-## Understanding Validator Responsibilities
+## Understanding validator responsibilities
-A validator in the Sei network serves several critical functions. As a validator, you are responsible for:
+A validator on the Sei network has several critical functions. As a validator, you are responsible for:
- Participating in consensus by proposing and validating blocks
- Maintaining high uptime and performance to avoid slashing
- Managing delegator relationships and maintaining transparent operations
- Participating in governance and network upgrades
-## Initial Setup
+## Initial setup
### Initialize node
-Before key management and registration, initialize your node with validator mode so that RPC and P2P bind to localhost (recommended for validator security):
+Before key management and registration, initialize your node in validator mode. In this mode, RPC and P2P bind to localhost, which is recommended for validator security:
```bash
seid init --chain-id --mode validator
```
-The default init mode is **full**, which binds RPC and P2P to all interfaces (`0.0.0.0`). For validator (and seed) nodes, use `--mode validator` or `--mode seed` so that RPC and P2P listen on localhost only. Genesis is written automatically for known networks; no separate download is required.
+The default init mode is **full**, which binds RPC and P2P to all interfaces (`0.0.0.0`). For validator (and seed) nodes, use `--mode validator` or `--mode seed`. RPC and P2P then listen on localhost only. Genesis is written automatically for known networks. You do not need to download it separately.
-`--chain-id` is required — pass a value such as `pacific-1` or `atlantic-2`.
+`--chain-id` is required. Pass a value such as `pacific-1` or `atlantic-2`.
-For recognized public networks (`pacific-1`, `atlantic-2`), `seid init` automatically writes the Sei Labs seed nodes into the `bootstrap-peers` field of `config.toml`, so a freshly initialized node bootstraps peer discovery with no additional configuration. Devnets (`arctic-1`) and unknown or private chains receive no seeds, and any pre-existing `bootstrap-peers` value is never overwritten.
+For recognized public networks (`pacific-1`, `atlantic-2`), `seid init` automatically writes the Sei Labs seed nodes into the `bootstrap-peers` field of `config.toml`. As a result, a newly initialized node bootstraps peer discovery with no other configuration. Devnets (`arctic-1`) and unknown or private chains receive no seeds. An existing `bootstrap-peers` value is never overwritten.
-### Key Management
+### Key management
-The security of your validator begins with proper key management. Your validator requires several distinct keys:
+Validator security starts with correct key management. Your validator needs several separate keys:
```bash
# Validator consensus key - Used for signing blocks
@@ -45,13 +45,13 @@ seid tendermint show-validator
seid keys add operator
```
-These keys serve different purposes and should be managed with appropriate security measures. The consensus key, stored in `priv_validator_key.json`, is particularly critical as it's used to sign blocks and could result in slashing if compromised or mishandled.
+These keys have different purposes, and you should manage them with appropriate security measures. The consensus key is stored in `priv_validator_key.json`. It is particularly critical because the validator uses it to sign blocks. A compromised or mishandled consensus key could result in slashing.
-### Hardware Security Module (HSM) Integration
+### Hardware security module (HSM) integration
-For production validators, using an HSM is strongly recommended to protect your consensus key. Here's how to configure an HSM with your validator:
+For production validators, an HSM is strongly recommended to protect your consensus key. To configure an HSM for your validator, use these steps:
-
+
```bash
# Install required libraries
sudo apt-get install opensc pkcs11-utils
@@ -76,11 +76,11 @@ EOF
-### Validator Registration
+### Validator registration
-Before registering your validator, ensure your node is fully synced with the network. The creation of a validator is a crucial step that requires careful consideration of commission parameters.
+Before you register your validator, make sure that your node is fully synced with the network. Validator creation is a crucial step that needs careful thought about the commission parameters.
-The examples below use `pacific-1` (mainnet); use `atlantic-2` for testnet.
+The examples below use `pacific-1` (Sei Mainnet). For Sei Testnet, use `atlantic-2`.
```bash
seid tx staking create-validator \
@@ -98,21 +98,21 @@ seid tx staking create-validator \
--from=operator
```
-The commission parameters require strategic consideration:
+Plan the commission parameters carefully:
-- `commission-rate`: Your initial commission rate, which should be competitive while ensuring operational sustainability
-- `commission-max-rate`: An upper limit that can never be exceeded, setting a permanent cap on your commission
-- `commission-max-change-rate`: Maximum daily commission change, limiting how quickly you can adjust rates
+- `commission-rate`: Your initial commission rate. It should be competitive and still keep your operation sustainable.
+- `commission-max-rate`: An upper limit that can never be exceeded. It sets a permanent cap on your commission.
+- `commission-max-change-rate`: The maximum daily commission change. It limits how quickly you can adjust rates.
-## Monitoring and Alerting
+## Monitoring and alerting
-**Please refer to the [Advanced Operations](/node/advanced-config-monitoring) section for details around monitoring + alerting for your validator, price feeder and other nodes.**
+For details about monitoring and alerting for your validator, price feeder, and other nodes, see the [Advanced Operations](/node/advanced-config-monitoring) section.
-## Security Practices
+## Security practices
-### Network Security
+### Network security
-Validators may choose to implement a sentry node architecture to protect the block signing node (the validator). This setup helps prevent DDoS attacks on your validator node by creating a layer of defensive proxies:
+Validators may use a sentry node architecture to protect the block-signing node (the validator). This setup adds a layer of defensive proxies, which helps prevent DDoS attacks on your validator node:
```bash
# Validator node config.toml
@@ -130,15 +130,15 @@ private-peer-ids = "validator_node_id"
unconditional-peer-ids = "validator_node_id"
```
-### Key Management Practices
+### Key management practices
-Implement secure key backup procedures. Remember to choose the storage media carefully! Mechanical / flash based storage can fail unexpectedly, and cloud storage should **never** be used.
+Set up secure procedures to back up your keys. Choose the storage media carefully. Mechanical or flash-based storage can fail unexpectedly. **Never** use cloud storage.
-By default, the wallet key files are stored in your `/.sei` directory root, and the signer/consensus key in `/.sei/config`. Not only the `priv_validator_key.json`, but the wallet `.info` and `.address` file should also be saved.
+The consensus (signer) key is stored in `$HOME/.sei/config/priv_validator_key.json`. With the `file` keyring backend, the wallet key files (`.info` and `.address`) are stored in `$HOME/.sei/keyring-file`. Back up both locations.
-Example script to encrypt backups of key files:
+This example script encrypts backups of the key files:
-
+
```bash
#!/bin/bash
# Create encrypted backup of validator keys
@@ -161,21 +161,21 @@ sha256sum $BACKUP_DIR/*.gpg > $BACKUP_DIR/checksums_$DATE.txt
-## Maintenance Procedures
+## Maintenance procedures
-### Planned Maintenance
+### Planned maintenance
-When performing planned maintenance, to minimize potential impact:
+To minimize the potential impact of planned maintenance:
-- Notify delegators (recommended at least 24h in advance)
+- Notify delegators, preferably at least 24 hours in advance
Consider posting to:
-- Shared development team/validators comms channels
+- Shared communication channels for the development team and validators
- Social media channels
- Validator website
-Don't forget to stop the service!
+Make sure that you stop the service:
```bash
# Gracefully stop the node
@@ -187,20 +187,20 @@ sudo systemctl stop seid
sudo systemctl start seid
```
-### Emergency Procedures
+### Emergency procedures
-Create and maintain an emergency response plan for various scenarios:
+Create and maintain an emergency response plan for different scenarios:
#### Consult with your fellow validators or a member of the Sei Labs or Foundation team directly for advice
-## Governance Participation
+## Governance participation
-As a validator, active participation in governance is required. Governance is the primary tool with which adjustments to various chain parameters are made.
-Another critical role for validators is to review, and ultimately approve or reject proposed software upgrades to the network.
+As a validator, you must participate actively in governance. Governance is the primary tool to adjust various chain parameters.
+Another critical role for validators is to review proposed software upgrades to the network, and finally approve or reject them.
-Governance proposals may be submitted by anyone willing to provide the mandatory (refundable) deposit, and can be voted on by any network user. Only votes by accounts delegating $SEI at the end of the voting period for a given proposal will be given weight.
+Anyone who pays the mandatory (refundable) deposit may submit a governance proposal. Any network user can vote on a proposal. Only votes from accounts that delegate $SEI at the end of a proposal's voting period are given weight.
-Proposals currently on chain can be queried at any given time:
+You can query the proposals that are currently on chain at any time:
```bash
# List active proposals
@@ -214,27 +214,27 @@ seid tx gov vote 1 yes \
--gas-prices 0.02usei
```
-## Recovery Procedures
+## Recovery procedures
-### Critical Warning: Double-Signing Prevention
+### Critical warning: Double-signing prevention
Double-signing is a severe violation that results in permanent validator tombstoning (irreversible jailing).
-Never run your validator keys on more than one machine simultaneously. If your primary validator goes offline:
+Never run your validator keys on more than one machine at the same time. If your primary validator goes offline:
1. DO NOT start another validator with the same keys
-2. Either recover the original machine or properly migrate keys with absolute certainty the original is offline
-3. If unsure about the state of your original validator, seek support before proceeding
+2. Either recover the original machine, or migrate the keys properly. Migrate them only when you are absolutely certain that the original is offline
+3. If you are unsure about the state of your original validator, get support before you continue
The safe approach to recovery is:
1. Diagnose why the original validator is offline
-2. If the original validator cannot be recovered, verify it is offline and powered down
-3. Only then proceed with key migration to a new machine
+2. If the original validator cannot be recovered, verify that it is offline and powered down
+3. Only then migrate the keys to a new machine
-### Validator Recovery
+### Validator recovery
-When you need to recover your validator on a new machine, follow these steps carefully:
+To recover your validator on a new machine, follow these steps carefully:
```bash
# 1. Set up new machine with Sei node
@@ -256,4 +256,4 @@ seid status
seid query slashing signing-info $(seid tendermint show-validator)
```
-This guide provides a foundation for operating a Sei validator. Remember that validator operation requires constant attention to security, performance, and network participation. Stay engaged with the Sei community and keep updated with network developments.
+Validator operation requires constant attention to security, performance, and network participation. Stay engaged with the Sei community, and keep up to date with network developments.
diff --git a/scripts/generate-llms.mjs b/scripts/generate-llms.mjs
index e3e661e..164858e 100644
--- a/scripts/generate-llms.mjs
+++ b/scripts/generate-llms.mjs
@@ -26,16 +26,16 @@ const CONCURRENCY = Number.parseInt(process.env.CONCURRENCY || '10', 10);
const SEI_LLMS_CONFIG = {
projectName: 'Sei Documentation',
blockquote:
- 'Technical documentation for Sei — a parallelized EVM Layer 1 with sub-second finality, full Ethereum tooling compatibility, and a roadmap toward Sei Giga. Sei Giga is designed to be the first Multi-Proposer EVM Layer 1. An internal devnet measured more than 5 gigagas/s; the Autobahn public-testnet target is 200K TPS.',
+ 'Technical documentation for Sei, a parallelized EVM Layer 1 with sub-second finality, full Ethereum tooling compatibility, and a roadmap toward Sei Giga. Sei Giga is designed to be the first Multi-Proposer EVM Layer 1. An internal devnet measured more than 5 gigagas/s. The Autobahn public-testnet target is 200K TPS.',
intro:
- 'Sei is a parallelized EVM Layer 1 blockchain with 400ms finality, ~100 MGas/s throughput today, and full Ethereum tooling compatibility. Deploy standard Solidity contracts with no modifications. Chain ID: mainnet 1329, testnet 1328. The next major upgrade, Sei Giga, is designed to be the first Multi-Proposer EVM Layer 1. On an internal devnet it sustained more than 5 gigagas/s. The Autobahn public-testnet target is 200K TPS.',
+ 'Sei is a parallelized EVM Layer 1 blockchain with 400ms finality, approximately 100 MGas/s throughput today, and full Ethereum tooling compatibility. Deploy standard Solidity contracts with no modifications. EVM chain IDs: Sei Mainnet 1329, Sei Testnet 1328. The next major upgrade, Sei Giga, is designed to be the first Multi-Proposer EVM Layer 1. On an internal devnet it sustained more than 5 gigagas/s. The Autobahn public-testnet target is 200K TPS.',
constraints: [
'Prerequisites: Node.js ≥ 18, a wallet (Compass, Rabby, MetaMask, or any EVM-compatible wallet), and SEI tokens for gas.',
- 'Authentication: No API key is required for public RPC endpoints. Rate limits apply — use a dedicated provider (Ankr, DRPC, Nirvana) for production workloads.',
- 'Version compatibility: Solidity ≥ 0.8.x recommended. Sei EVM tracks the Pectra EVM (without blob transactions).',
- 'Network requirements: Sei Mainnet EVM chain ID 1329 (Cosmos chain ID pacific-1); Sei Testnet EVM chain ID 1328 (Cosmos chain ID atlantic-2). Gas is paid in SEI (18 decimals).',
- 'Important notes: Sei has 400ms block times — set lower polling intervals than on Ethereum. Transactions touching independent state are parallelized automatically; shared-state writes are serialized.',
- 'IBC disabled: Per SIP-03, IBC is disabled on Sei in both directions. Proposals 116 and 120 set the ibc module InboundEnabled parameter to false, and Proposal 121 set OutboundEnabled to false on 2026-07-31. No asset can be bridged into or out of Sei over IBC, and IBC assets already on Sei (USDC.n, USDT.kava, ATOM, WBTC) can no longer be redeemed on their origin chain. The IBC precompile at 0x0000000000000000000000000000000000001009 is non-functional. See /learn/sip-03-migration.',
+ 'Authentication: Public RPC endpoints do not require an API key. Rate limits apply. For production workloads, use a dedicated provider (Ankr, DRPC, Nirvana).',
+ 'Version compatibility: Use Solidity ≥ 0.8.x. Sei EVM tracks the Pectra EVM (without blob transactions).',
+ 'Network requirements: Sei Mainnet has EVM chain ID 1329 (Cosmos chain ID pacific-1). Sei Testnet has EVM chain ID 1328 (Cosmos chain ID atlantic-2). Gas is paid in SEI (18 decimals).',
+ 'Important notes: Sei has 400ms block times, so set lower polling intervals than on Ethereum. Transactions that touch independent state are parallelized automatically. Shared-state writes are serialized.',
+ 'IBC disabled: Per SIP-03, IBC is disabled on Sei in both directions. Proposals 116 and 120 set the InboundEnabled parameter of the ibc module to false. Proposal 121 set OutboundEnabled to false on 2026-07-31. No asset can be bridged into or out of Sei over IBC. IBC assets already on Sei (USDC.n, USDT.kava, ATOM, WBTC) can no longer be redeemed on their origin chain. The IBC precompile at 0x0000000000000000000000000000000000001009 is non-functional. See /learn/sip-03-migration.',
'Tokenfactory unsupported: Do not recommend tokenfactory commands, APIs, Wasm bindings, native-denom pointer workflows, or other instructions for creating, minting, burning, administering, or integrating tokenfactory denoms. Legacy module surfaces may remain available for compatibility. Use ERC-20 for new fungible tokens. See /cosmos-sdk#tokenfactory-is-not-supported.'
].join('\n'),
quickReference: [
@@ -47,8 +47,8 @@ const SEI_LLMS_CONFIG = {
'USDC (mainnet): 0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392 (6 decimals)',
'USDC (testnet): 0x4fCF1784B31630811181f670Aea7A7bEF803eaED (6 decimals)',
'Block time: 400ms finality',
- 'Throughput: ~100 MGas/s today; Sei Giga internal-devnet measurement of more than 5 gigagas/s; Autobahn public-testnet target of 200K TPS',
- 'EVM compatibility: Full — standard Solidity, Hardhat, Foundry, wagmi, ethers.js, viem work unmodified'
+ 'Throughput: approximately 100 MGas/s today. An internal Sei Giga devnet measured more than 5 gigagas/s. The Autobahn public-testnet target is 200K TPS.',
+ 'EVM compatibility: Full. Standard Solidity contracts, Hardhat, Foundry, wagmi, ethers.js, and viem work unmodified.'
].join('\n'),
examples: [
{
@@ -102,7 +102,7 @@ const SEI_LLMS_CONFIG = {
{
title: 'GitHub',
url: 'https://github.com/sei-protocol',
- description: 'Open source repositories including sei-chain, sei-js, and MCP server'
+ description: 'Open-source repositories, including sei-chain, sei-js, and the MCP server'
},
{
title: 'Ecosystem',
@@ -134,35 +134,35 @@ const LLMS_SECTION_ORDER = [
name: 'Learn',
match: (p) => p.startsWith('/learn'),
overview: [
- "Sei is a parallelized EVM Layer 1 blockchain. Performance comes from Twin Turbo Consensus (optimistic block processing), parallel EVM execution (concurrent transactions on independent state), and SeiDB (high-throughput storage). Full Ethereum tooling compatibility — deploy standard Solidity contracts with no modifications.",
- "Sei Giga, the next major upgrade, is designed to be the first Multi-Proposer EVM Layer 1, using Autobahn consensus and a custom EVM execution engine. An internal devnet sustained more than 5 gigagas/s. The separate Autobahn public-testnet roadmap target is 200K TPS. For developers, Sei Giga's parallel engine will reward contracts with user-scoped state (mapping per address) over shared global state.",
+ "Sei is a parallelized EVM Layer 1 blockchain. Performance comes from Twin Turbo Consensus (optimistic block processing), parallel EVM execution (concurrent transactions on independent state), and SeiDB (high-throughput storage). Sei has full Ethereum tooling compatibility. Deploy standard Solidity contracts with no modifications.",
+ "Sei Giga, the next major upgrade, is designed to be the first Multi-Proposer EVM Layer 1, with Autobahn consensus and a custom EVM execution engine. An internal devnet sustained more than 5 gigagas/s. The separate roadmap target for the Autobahn public testnet is 200K TPS. For developers, Sei Giga's parallel engine will reward contracts with user-scoped state (mapping per address) over shared global state.",
'Sei Mainnet: EVM chain ID 1329. Sei Testnet: EVM chain ID 1328.',
- 'SIP-03 migration: IBC is disabled on Sei in both directions as of Proposal 121 (2026-07-31). IBC assets already on Sei can no longer be bridged out or redeemed on their origin chain, though the balances remain transferable within Sei.'
+ 'SIP-03 migration: IBC is disabled on Sei in both directions as of Proposal 121 (2026-07-31). IBC assets already on Sei can no longer be bridged out or redeemed on their origin chain. The balances remain transferable within Sei.'
].join('\n\n')
},
{
name: 'AI Tooling & Micropayments',
match: (p) => p === '/ai' || p.startsWith('/ai/'),
overview: [
- 'The Sei MCP Server (@sei-js/mcp-server) connects AI assistants to Sei. Requires Node.js 20+. Install: `npx -y @sei-js/mcp-server`. The server starts in read-only mode. Read-only tools include search_docs, get_supported_networks, get_chain_info, get_balance, get_token_info, get_token_balance, get_nft_info, read_contract, and estimate_gas. Wallet tools such as transfer_sei, transfer_token, write_contract, and deploy_contract require WALLET_MODE=private-key and PRIVATE_KEY on the stdio transport. Backward-compatible aliases: get_erc20_balance and get_token_balance_erc20 for get_token_balance, transfer_erc20 for transfer_token. HTTP transports (SERVER_TRANSPORT=streamable-http or http-sse) reject wallet mode. Network selectors: sei, sei-testnet, 1329, 1328, 0x531, 0x530.',
+ 'The Sei MCP Server (@sei-js/mcp-server) connects AI assistants to Sei. It requires Node.js 20+. Install: `npx -y @sei-js/mcp-server`. The server starts in read-only mode. Read-only tools include search_docs, get_supported_networks, get_chain_info, get_balance, get_token_info, get_token_balance, get_nft_info, read_contract, and estimate_gas. Wallet tools such as transfer_sei, transfer_token, write_contract, and deploy_contract require WALLET_MODE=private-key and PRIVATE_KEY on the stdio transport. Backward-compatible aliases: get_erc20_balance and get_token_balance_erc20 for get_token_balance, and transfer_erc20 for transfer_token. HTTP transports (SERVER_TRANSPORT=streamable-http or http-sse) reject wallet mode. Network selectors: sei, sei-testnet, 1329, 1328, 0x531, 0x530.',
'The Cambrian Agent Kit enables autonomous AI agents on Sei with DeFi protocol integrations (Takara lending, Silo lending, Citrex perpetuals, Symphony aggregation, DragonSwap liquidity).',
- 'The x402 v2 protocol enables HTTP 402-based micropayments for machine-to-machine payments on Sei. Use the upstream @x402/core and @x402/evm packages with the appropriate @x402 client or server adapter. The @sei-js/x402, @sei-js/x402-fetch, @sei-js/x402-axios, @sei-js/x402-express, @sei-js/x402-hono, and @sei-js/x402-next packages implement v1, are deprecated, and must not be recommended.'
+ 'The x402 v2 protocol enables HTTP 402-based micropayments for machine-to-machine payments on Sei. Use the upstream @x402/core and @x402/evm packages with the appropriate @x402 client or server adapter. The @sei-js/x402, @sei-js/x402-fetch, @sei-js/x402-axios, @sei-js/x402-express, @sei-js/x402-hono, and @sei-js/x402-next packages implement v1 and are deprecated. Do not recommend them.'
].join('\n\n')
},
{
name: 'EVM Development',
match: (p) => p.startsWith('/evm'),
overview: [
- "Sei's EVM is fully compatible with Ethereum. Standard Solidity contracts deploy without modification. All Ethereum tooling (Hardhat, Foundry, wagmi, ethers.js, viem, RainbowKit) works as-is. Transactions touching independent state execute concurrently.",
- 'Precompiled contracts at fixed addresses expose native Sei functionality such as staking, governance, distribution, JSON parsing, P256 verification, and Solo migration claims to EVM. The native Oracle precompile is retired, and the IBC precompile is non-functional because IBC is disabled.',
- 'Native USDC: mainnet 0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392, testnet 0x4fCF1784B31630811181f670Aea7A7bEF803eaED (6 decimals).'
+ "Sei EVM is fully compatible with Ethereum. Standard Solidity contracts deploy without modification. All Ethereum tooling (Hardhat, Foundry, wagmi, ethers.js, viem, RainbowKit) works as-is. Transactions that touch independent state execute concurrently.",
+ 'Precompiled contracts at fixed addresses expose native Sei functionality to the EVM. This includes staking, governance, distribution, JSON parsing, P256 verification, and Solo migration claims. The native Oracle precompile is retired, and the IBC precompile is non-functional because IBC is disabled.',
+ 'Native USDC: Sei Mainnet 0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392, Sei Testnet 0x4fCF1784B31630811181f670Aea7A7bEF803eaED (6 decimals).'
].join('\n\n')
},
{
name: 'Node Operations',
match: (p) => p.startsWith('/node'),
overview:
- 'Sei supports full nodes (recent state, consensus relay), archive nodes (complete historical state), and validator nodes (block production and consensus). StateSync enables fast bootstrap — new nodes fetch a recent state snapshot instead of replaying all historical blocks. The Sei Giga storage migration moves nodes to a new format optimized for the upcoming throughput targets.'
+ 'Sei supports full nodes (recent state, consensus relay), archive nodes (complete historical state), and validator nodes (block production and consensus). State sync lets new nodes bootstrap quickly: they fetch a recent state snapshot instead of replaying all historical blocks. The Sei Giga storage migration moves nodes to a new format optimized for the upcoming throughput targets.'
}
];
diff --git a/skill.md b/skill.md
index d2bd3e1..8dbd3d8 100644
--- a/skill.md
+++ b/skill.md
@@ -21,9 +21,9 @@ metadata:
parent: https://github.com/sei-protocol/sei-skill
---
-# Sei Developer Documentation
+# Sei developer documentation
-Full technical reference for building on Sei. This is the docs.sei.io-resident skill — for the offline AI coding-assistant skill (a Claude Code skill loaded directly into your editor), see **[github.com/sei-protocol/sei-skill](https://github.com/sei-protocol/sei-skill)**.
+This skill is the full technical reference for building on Sei. It is hosted on docs.sei.io. For the offline AI coding-assistant skill (a Claude Code skill loaded directly into your editor), see **[github.com/sei-protocol/sei-skill](https://github.com/sei-protocol/sei-skill)**.
```bash
# Install the full sei skill for AI assistants
@@ -37,18 +37,18 @@ npx skills add sei-ecosystem # apps / integrations only
## Critical facts — apply to every answer
-1. **400ms block time, instant finality** — use `tx.wait(1)`, never `tx.wait(12)`
-2. **SSTORE gas is 72,000 on Sei** — the same on both Sei Mainnet and Sei Testnet; it does not vary by network. Set via governance (mainnet Proposal #109, "Update EVM SSTORE set gas to 72000", which set the `evm` param `KeySeiSstoreSetGasEIP2200` to `72000`), so it is adjustable and can change — confirm the live value at https://docs.sei.io/evm/differences-with-ethereum#sstore-gas-cost
-3. **Use legacy `gasPrice`** — Sei has no base fee burn; prefer `gasPrice` over EIP-1559 `maxFeePerGas` / `maxPriorityFeePerGas`
+1. **400ms block time, instant finality**: Use `tx.wait(1)`, never `tx.wait(12)`.
+2. **SSTORE gas is 72,000 on Sei**: It is the same on both Sei Mainnet and Sei Testnet and does not vary by network. Governance set this value in Sei Mainnet Proposal #109 ("Update EVM SSTORE set gas to 72000"). The proposal set the `evm` param `KeySeiSstoreSetGasEIP2200` to `72000`. Because governance controls the value, it is adjustable and can change. Confirm the live value at https://docs.sei.io/evm/differences-with-ethereum#sstore-gas-cost
+3. **Use legacy `gasPrice`**: Sei has no base fee burn. Prefer `gasPrice` over EIP-1559 `maxFeePerGas` and `maxPriorityFeePerGas`.
4. **Minimum gas price: 50 gwei**
5. **Block gas limit: 12.5M per block**
-6. **PREVRANDAO is NOT random** — use Pyth VRF or Chainlink VRF
-7. **COINBASE = global fee collector** — not the block proposer
-8. **No base fee burn** — all fees go to validators
-9. **Dual address system** — every account has `sei1...` (Cosmos) + `0x...` (EVM) from the same key; cross-VM transfers require **association**
-10. **CosmWasm deprecated** per SIP-3 (proposal 99) — use EVM for new development
-11. **Chain IDs:** Sei Mainnet — EVM `1329`, Cosmos `pacific-1`; Sei Testnet — EVM `1328`, Cosmos `atlantic-2`
-12. **No `safe` or `finalized` block tags** — use `latest`
+6. **PREVRANDAO is NOT random**: Use Pyth VRF or Chainlink VRF.
+7. **COINBASE = global fee collector** (not the block proposer).
+8. **No base fee burn**: All fees go to validators.
+9. **Dual address system**: Every account has a `sei1...` (Cosmos) address and a `0x...` (EVM) address from the same key. Cross-VM transfers require **association**.
+10. **CosmWasm is deprecated** per SIP-3 (proposal 99): Use EVM for new development.
+11. **Chain IDs:** Sei Mainnet (EVM `1329`, Cosmos `pacific-1`) and Sei Testnet (EVM `1328`, Cosmos `atlantic-2`).
+12. **`safe` and `finalized` resolve to `latest`**: Sei has instant finality, so all three tags return the same block. Use `latest`.
## Networks
@@ -57,21 +57,21 @@ npx skills add sei-ecosystem # apps / integrations only
| Sei Mainnet | 1329 | pacific-1 | https://evm-rpc.sei-apis.com | https://rpc.sei-apis.com |
| Sei Testnet | 1328 | atlantic-2 | https://evm-rpc-testnet.sei-apis.com | https://rpc-testnet.sei-apis.com |
-Testnet faucet: https://docs.sei.io/learn/faucet
+Sei Testnet faucet: https://docs.sei.io/learn/faucet
-For the full list of community + paid RPC providers and failover patterns, see [docs.sei.io/learn/rpc-providers](https://docs.sei.io/learn/rpc-providers).
+For the full list of community and paid RPC providers, and for failover patterns, see [docs.sei.io/learn/rpc-providers](https://docs.sei.io/learn/rpc-providers).
## Default stack (opinionated)
| Layer | Recommendation |
|---|---|
| Smart contracts | **Foundry** (preferred) or Hardhat |
-| Frontend | **Wagmi + Viem** (React) or Ethers.js v6 |
-| Wallet | **Sei Global Wallet** (`@sei-js/sei-global-wallet`, ESM-only; add [consumer overrides](https://github.com/sei-protocol/sei-js/tree/main/packages/sei-global-wallet#required-consumer-overrides)) + MetaMask fallback |
+| Frontend | **wagmi + viem** (React) or ethers.js v6 |
+| Wallet | **Sei Global Wallet** (`@sei-js/sei-global-wallet`, ESM-only) + MetaMask fallback. For Sei Global Wallet, add [consumer overrides](https://github.com/sei-protocol/sei-js/tree/main/packages/sei-global-wallet#required-consumer-overrides). |
| Chain config | `viem/chains`: `sei`, `seiTestnet`. `@sei-js/precompiles` re-exports both and adds `seiLocal`. |
-| Sei precompiles | `@sei-js/precompiles`: addresses, raw `*_PRECOMPILE_ABI` constants, and `@sei-js/precompiles/ethers` factories. ESM-only; Viem `^2.55.16`. |
-| Verification | Seiscan via Sourcify (`forge verify-contract --verifier sourcify`) |
-| Testing | Foundry unit + fork tests against testnet |
+| Sei precompiles | `@sei-js/precompiles`: addresses, raw `*_PRECOMPILE_ABI` constants, and `@sei-js/precompiles/ethers` factories. ESM-only, viem `^2.55.16`. |
+| Verification | Seiscan through Sourcify (`forge verify-contract --verifier sourcify`) |
+| Testing | Foundry unit and fork tests against Sei Testnet |
## Sei MCP server (live blockchain access for AI)
@@ -92,7 +92,7 @@ claude mcp add sei-mcp-server npx @sei-js/mcp-server
}
```
-Once connected: address lookup, balance checks, transaction status, contract reads, and block data. The server starts in read-only mode. Wallet tools need `WALLET_MODE=private-key` and `PRIVATE_KEY` on the stdio transport. HTTP transports reject wallet mode.
+After you connect, these tools are available: address lookup, balance checks, transaction status, contract reads, and block data. The server starts in read-only mode. Wallet tools need `WALLET_MODE=private-key` and `PRIVATE_KEY` on the stdio transport. HTTP transports reject wallet mode.
## Precompile addresses
@@ -112,9 +112,9 @@ Once connected: address lookup, balance checks, transaction status, contract rea
**The Oracle precompile (`0x...1008`) is retired. Do not use or recommend it.** Every native Oracle query reverts. Use an active third-party oracle provider instead. See [Oracle Precompile (Retired)](https://docs.sei.io/evm/precompiles/oracle).
-**The IBC precompile (`0x...1009`) is dead. Do not use or recommend it.** IBC is disabled on Sei in both directions (`ibc.InboundEnabled` and `ibc.OutboundEnabled` are both `false`, per governance Proposals 116, 120, and 121), so its `transfer` methods cannot succeed. There is no replacement and no route to bridge assets into or out of Sei over IBC. See the [SIP-03 Migration Guide](https://docs.sei.io/learn/sip-03-migration#ibc-is-disabled).
+**The IBC precompile (`0x...1009`) is dead. Do not use or recommend it.** IBC is disabled on Sei in both directions. `ibc.InboundEnabled` and `ibc.OutboundEnabled` are both `false`, per governance Proposals 116, 120, and 121. As a result, the precompile's `transfer` methods cannot succeed. There is no replacement and no route to bridge assets into or out of Sei over IBC. See the [SIP-03 Migration Guide](https://docs.sei.io/learn/sip-03-migration#ibc-is-disabled).
-**Tokenfactory is not supported. Do not use or recommend it.** Do not provide commands, APIs, Wasm bindings, native-denom pointer workflows, or other instructions for creating, minting, burning, administering, or integrating tokenfactory denoms. Legacy module surfaces may still exist for compatibility. Use ERC-20 for new fungible tokens. See [Tokenfactory is not supported](https://docs.sei.io/cosmos-sdk#tokenfactory-is-not-supported).
+**Tokenfactory is not supported. Do not use or recommend it.** Do not give commands, APIs, Wasm bindings, native-denom pointer workflows, or other instructions to create, mint, burn, administer, or integrate tokenfactory denoms. Legacy module surfaces may still exist for compatibility. Use ERC-20 for new fungible tokens. See [Tokenfactory is not supported](https://docs.sei.io/cosmos-sdk#tokenfactory-is-not-supported).
```ts
import {
@@ -170,7 +170,7 @@ sei_mainnet = "https://evm-rpc.sei-apis.com"
| Bridges (LayerZero V2) | https://docs.sei.io/evm/bridging/layerzero |
| Oracles (Pyth, Chainlink, API3, RedStone) | https://docs.sei.io/evm/oracles |
| Indexers | https://docs.sei.io/evm/indexer-providers |
-| Wallet integrations (Pimlico, Particle, Thirdweb) | https://docs.sei.io/evm/wallet-integrations |
+| Wallet integrations (Pimlico, Particle, thirdweb) | https://docs.sei.io/evm/wallet-integrations |
| AI tooling (Cambrian, MCP, x402) | https://docs.sei.io/ai |
| seid CLI | https://docs.sei.io/evm/seid-cli |
| RPC providers | https://docs.sei.io/learn/rpc-providers |
@@ -182,15 +182,15 @@ sei_mainnet = "https://evm-rpc.sei-apis.com"
## Operating procedure
-1. **Classify the task** — contract / frontend / node ops / cross-VM / migration
-2. **Apply the 12 critical facts** above for relevance
-3. **Always testnet first** — deploy to Sei Testnet, test fully, verify on Seiscan, only then promote to Sei Mainnet
-4. **Verify contracts** on Seiscan using Sourcify (`forge verify-contract --verifier sourcify`)
-5. **For cross-VM** (pointer contracts, precompiles) — verify address association before sending value
+1. **Classify the task**: contract, frontend, node ops, cross-VM, or migration.
+2. **Apply the 12 critical facts** above where they are relevant.
+3. **Always test on Sei Testnet first**: Deploy to Sei Testnet, test fully, and verify on Seiscan. Only then promote to Sei Mainnet.
+4. **Verify contracts** on Seiscan with Sourcify (`forge verify-contract --verifier sourcify`).
+5. **For cross-VM work** (pointer contracts, precompiles), verify the address association before you send value.
## RPC agent skills
-17 canonical patterns for AI agents interacting with Sei via RPC. Full reference: [`rpc-agent-skills.md`](https://github.com/sei-protocol/sei-skill/blob/main/skill/references/ecosystem/rpc-agent-skills.md).
+This section lists 17 canonical patterns for AI agents that interact with Sei through RPC. For the full reference, see [`rpc-agent-skills.md`](https://github.com/sei-protocol/sei-skill/blob/main/skill/references/ecosystem/rpc-agent-skills.md).
### Read skills (no state change; retry up to 3× with exponential backoff)
@@ -198,8 +198,8 @@ sei_mainnet = "https://evm-rpc.sei-apis.com"
|---|---|
| `get_chain_status` | Latest block height, chain ID, sync status |
| `get_account_balance` | Native SEI or ERC20 balance |
-| `get_evm_address` | `sei1...` → `0x...` via Addr precompile |
-| `get_sei_address` | `0x...` → `sei1...` via Addr precompile |
+| `get_evm_address` | `sei1...` → `0x...` through the Addr precompile |
+| `get_sei_address` | `0x...` → `sei1...` through the Addr precompile |
| `get_transaction` | Status, gas used, logs, events for a tx hash |
| `get_block` | Block hash, timestamp, tx list by height |
| `get_gas_price` | Current network gas price (min 50 gwei) |
@@ -220,9 +220,9 @@ sei_mainnet = "https://evm-rpc.sei-apis.com"
| Skill | Description |
|---|---|
| `estimate_transaction_cost` | Gas + fee estimate |
-| `simulate_contract_execution` | Preview via `eth_call` — run before every write |
+| `simulate_contract_execution` | Preview with `eth_call`. Run it before every write. |
| `get_portfolio_summary` | Aggregate token balances |
-| `monitor_transaction` | Poll until finality (1 block ≈ 400ms; timeout 30s) |
+| `monitor_transaction` | Poll until finality (1 block ≈ 400ms, timeout 30s) |
### Mandatory write-op flow
@@ -274,4 +274,4 @@ if (!receipt) { /* check before resubmitting */ }
| Protocol research | sei-labs-protocol | https://seilabs.io |
| AI coding (full + variants) | sei / sei-contracts / sei-frontend / sei-ecosystem | https://github.com/sei-protocol/sei-skill |
-> **For agents:** Always cross-check addresses, opcodes, and gas parameters against the current value at https://docs.sei.io. Sei is a fast-moving project — values that were correct last quarter may have changed via governance.
+> **For agents:** Always cross-check addresses, opcodes, and gas parameters against the current values at https://docs.sei.io. Sei is a fast-moving project. Values that were correct last quarter may have changed through governance.
diff --git a/snippets/changelog.jsx b/snippets/changelog.jsx
index a57c105..d6398c8 100644
--- a/snippets/changelog.jsx
+++ b/snippets/changelog.jsx
@@ -263,7 +263,7 @@ sei-tendermint
* [#167](https://github.com/sei-protocol/sei-tendermint/pull/167) Perf: Increase buffer size for pubsub server to boost performance
* [#164](https://github.com/sei-protocol/sei-tendermint/pull/164) Add regex support to query syntax
* [#163](https://github.com/sei-protocol/sei-tendermint/pull/163) Reduce noisy tendermint logs
-* [#162](https://github.com/sei-protocol/sei-tendermint/pull/162) Use peermanager scores for blocksync peers and don't error out on block mismatch`
+* [#162](https://github.com/sei-protocol/sei-tendermint/pull/162) Use peermanager scores for blocksync peers and do not error out on block mismatch`
},
{
version: 'v3.3.0',
@@ -281,7 +281,7 @@ sei-cosmos
sei-tendermint
* [#158](https://github.com/sei-protocol/sei-tendermint/pull/158) Add metrics for peermanager scores
* [#157](https://github.com/sei-protocol/sei-tendermint/pull/157) Fix findNewPrimary never timing out upon encountering poor witnesses
-* [#156](https://github.com/sei-protocol/sei-tendermint/pull/156) Remove bad witness and don't block on all witnesses for ConsensusParams`
+* [#156](https://github.com/sei-protocol/sei-tendermint/pull/156) Remove bad witness and do not block on all witnesses for ConsensusParams`
},
{
version: 'v3.1.1',
@@ -366,7 +366,7 @@ sei-tendermint
{
version: '3.0.1',
body: `sei-chain
-* [#797](https://github.com/sei-protocol/sei-chain/pull/797) Don't charge gas for loading contract dependencies
+* [#797](https://github.com/sei-protocol/sei-chain/pull/797) Do not charge gas for loading contract dependencies
* [#792](https://github.com/sei-protocol/sei-chain/pull/792) Reset block gas meter if concurrent processing fails
* [#791](https://github.com/sei-protocol/sei-chain/pull/791) Disable skipFastStorageUpgrade to make iavl dump faster
* [#790](https://github.com/sei-protocol/sei-chain/pull/790) Disable non-prioritized tx concurrency
@@ -462,7 +462,7 @@ sei-cosmos
sei-tendermint
* [#110](https://github.com/sei-protocol/sei-tendermint/pull/110) Add more granular buckets for block interval
-* [#111](https://github.com/sei-protocol/sei-tendermint/pull/111) Add unused prival pubKey back to node info - fix for IBC on full nodes
+* [#111](https://github.com/sei-protocol/sei-tendermint/pull/111) Add unused prival pubKey back to node info (fix for IBC on full nodes)
* [#113](https://github.com/sei-protocol/sei-tendermint/pull/113) Add metrics label for missing val power`
},
{
@@ -483,7 +483,7 @@ sei-tendermint
* [#654](https://github.com/sei-protocol/sei-chain/pull/654) Improve endblock performance and fix trace
sei-cosmos
-* improvements around monitoring for sei-cosmos, dont enforce gas limit on deliverTx, refactor slashing module
+* improvements around monitoring for sei-cosmos, do not enforce gas limit on deliverTx, refactor slashing module
sei-tendermint
* [#95](https://github.com/sei-protocol/sei-tendermint/pull/95) Patch forging empty merkle tree attack vector, set default max gas param to 6mil, log tunning for p2p`
diff --git a/snippets/ecosystem-app-grid.jsx b/snippets/ecosystem-app-grid.jsx
index 4233fc1..b5a7b59 100644
--- a/snippets/ecosystem-app-grid.jsx
+++ b/snippets/ecosystem-app-grid.jsx
@@ -277,7 +277,7 @@ export const EcosystemAppGrid = (props) => {
if (hasError) {
return (
- Couldn’t load {category} integrations right now. Please refresh to try again.
+ Could not load {category} integrations right now. Refresh the page to try again.
- This address fails its EIP-55 checksum, so a character may be wrong. Check it against your wallet. You can still request, and the faucet will reject it if the address is bad.
+ This address fails its EIP-55 checksum, so a character may be wrong. Check it against your wallet. You can still send the request. If the address is wrong, the faucet rejects it.
Consensus will keep ordering new blocks while earlier blocks execute and their divergence digests are attested. Ordering finality will be the fast signal; state attestation will follow a bounded number of blocks later.
+
Consensus will keep ordering new blocks while earlier blocks execute and their divergence digests are attested. Ordering finality will be the fast signal. State attestation will follow a bounded number of blocks later.
);
};
@@ -277,7 +277,7 @@ export const GigaLanesAndCuts = () => {
off the critical path
-
Each validator will chain batches into its own lane. The whitepaper uses f + 1 replica votes for availability; the implementation applies stake-weighted thresholds.
+
Each validator will chain batches into its own lane. The whitepaper uses f + 1 replica votes for availability. The implementation applies stake-weighted thresholds.
Slots will overlap: replicas will begin slot s+1 as soon as they see the Prepare message for slot s, targeting an effective steady-state cadence of one committed cut per 1.5 network round trips. This is not per-transaction latency.
+
Slots will overlap: replicas will begin slot s+1 as soon as they see the Prepare message for slot s. The target is an effective steady-state cadence of one committed cut per 1.5 network round trips, not per-transaction latency.
);
};
@@ -375,7 +375,7 @@ export const GigaAttestationFlow = () => {
divergence under 1/3 of voting power can be isolated; over 1/3 is designed to halt the chain
-
Execution results will be committed as a lattice-hash digest rather than a state root, and validators will attest to that digest a bounded number of blocks later.
+
Execution results will be committed as a lattice-hash digest rather than a state root. Validators will attest to that digest a bounded number of blocks later.
);
};
@@ -477,7 +477,7 @@ export const GigaStorageArchitecture = () => {
bisect, replay one range
-
In the proposed architecture, the write path avoids Merkle-tree updates. State lives in a RAM-first flat store with an append-only WAL, while commitments come from a homomorphic lattice hash over each block's write log.
+
In the proposed architecture, the write path avoids Merkle-tree updates. State lives in a RAM-first flat store with an append-only WAL. Commitments come from a homomorphic lattice hash over each block's write log.
);
};
@@ -529,7 +529,7 @@ export const GigaBudWindow = () => {
touch transactions refresh a stale key's anchor; deletions leave tombstones for exclusion proofs
-
Every block will get a Merkle root over just its own updates. SuperBUDs will aggregate those roots over exponentially sized windows so provers can cover long ranges with a handful of digests.
+
Every block will get a Merkle root over only its own updates. SuperBUDs will aggregate those roots over exponentially sized windows so provers can cover long ranges with a few digests.
The merged order will be a pure function of finalized lane contents: lanes will sort by their highest included tip, order inside each lane will not change, and the first occurrence of a hash will win.
+
The merged order will be a pure function of finalized lane contents. Lanes will sort by their highest included tip, order inside each lane will not change, and the first occurrence of a hash will win.
);
};
@@ -641,7 +641,7 @@ export const GigaFinalitySignals = () => {
ordering fixes position; execution yields the result; attestation adds a signed quorum confirmation
-
Ordering finality fixes position but has no receipt yet. After execution, applications may use the receipt according to their risk policy; high-value and cross-chain flows should wait for the attested digest.
+
Ordering finality fixes position but has no receipt yet. After execution, applications may use the receipt according to their risk policy. High-value and cross-chain flows should wait for the attested digest.
The same four transfers, two storage layouts. Per-user slots let Block-STM commit everything in one pass; a shared counter forces retries until the transactions run one by one.
+
The same four transfers, two storage layouts. Per-user slots let Block-STM commit everything in one pass. A shared counter forces retries until the transactions run one by one.
-
+
@@ -51,7 +51,7 @@ export const SequentialNonceQueue = () => {
throughput scales with wallets, and so do fragmented balances, duplicated approvals, and keys that hold funds
-
A transaction that lands and reverts consumes its nonce and blocks nothing. A transaction that never lands leaves a gap, and every later nonce waits behind it. On Sei a pending-nonce read comes from the mempool rather than aliasing latest, and it is too unreliable to rebuild an in-flight queue from. Splitting funds across hot wallets buys width at the cost of custody surface.
+
A transaction that lands and reverts consumes its nonce and blocks nothing. A transaction that never lands leaves a gap, and every later nonce waits behind it. On Sei, a pending-nonce read comes from the mempool rather than aliasing latest. It is too unreliable to rebuild an in-flight queue from. Splitting funds across hot wallets buys width at the cost of custody surface.
);
};
@@ -125,7 +125,7 @@ export const NonceLanes = () => {
strictly ordered within a lane, left to right
-
EntryPoint v0.8 stores a UserOperation nonce as a 192-bit key plus a 64-bit sequence and tracks one sequence per key. Operations on different keys never queue behind each other; operations on the same key stay sequential. The repository calls a key a lane and forbids lane 0.
+
EntryPoint v0.8 stores a UserOperation nonce as a 192-bit key plus a 64-bit sequence and tracks one sequence per key. Operations on different keys never queue behind each other. Operations on the same key stay sequential. The repository calls a key a lane and forbids lane 0.
);
};
@@ -248,7 +248,7 @@ export const NonceLanePipeline = () => {
msg.sender is the funded EOA
-
UserOperations are not transactions. Gas-only relayers wrap each bundle in an EntryPoint.handleOps transaction and pay for it. Each relayer still has one sequential EVM nonce, but a relayer key can only lose its own gas: it cannot create a valid operation without the funded account's signature.
+
UserOperations are not transactions. Gas-only relayers wrap each bundle in an EntryPoint.handleOps transaction and pay for it. Each relayer still has one sequential EVM nonce, but a relayer key can only lose its own gas. It cannot create a valid operation without the funded account's signature.
);
};
@@ -315,7 +315,7 @@ export const NonceLaneBundleLifecycle = () => {
on restart, the last exact raw transaction is rebroadcast first, then reconciled against lane sequences and the relayer's confirmed nonce
-
Write-ahead ordering is deliberate: the signed outer transaction is journaled before it reaches the network, so a crash between signing and broadcast cannot lose or duplicate work. Replacement always reuses the relayer nonce, which is why a stuck bundle cannot create a nonce gap.
+
Write-ahead ordering is deliberate. The signed outer transaction is journaled before it reaches the network, so a crash between signing and broadcast cannot lose or duplicate work. Replacement always reuses the relayer nonce, which is why a stuck bundle cannot create a nonce gap.
-
+ Execution revert: isolated to its laneone handleOps transaction, one block
@@ -404,7 +404,7 @@ export const NonceLaneThroughputComparison = () => {
return (
-
+ Landed operations per second, same venue call, Sei Testnetchain-side: landed ÷ block-timestamp span
@@ -437,7 +437,7 @@ export const NonceLaneThroughputComparison = () => {
})}
-
One measurement session on Sei Testnet, every strategy calling the same MockPerpVenue.place at about 330,000 gas per call. Block gas, not the nonce model, sets the ceiling: lanes came within 12 percent of it from one address whose EVM nonce never moved, while the single sequential queue matched the hot-wallet fleet only when every transaction left in one JSON-RPC batch. Short runs read high on the chain-side scale because Sei stamps blocks in whole seconds.
+
One measurement session on Sei Testnet. Every strategy called the same MockPerpVenue.place at about 330,000 gas per call. Block gas, not the nonce model, sets the ceiling. Lanes came within 12 percent of it from one address whose EVM nonce never moved. The single sequential queue matched the hot-wallet fleet only when every transaction left in one JSON-RPC batch. Short runs read high on the chain-side scale because Sei stamps blocks in whole seconds.
Categories are evenly spaced, not to scale. Both series climb almost linearly while the pool is the bottleneck, because each relayer's bundle cycle is about 1.5 seconds of sequential RPC round trips plus inclusion, and flatten as the in-flight work approaches what a 12,500,000-gas block can hold. Runs used 32 to 1,024 operations, so the shorter ones read higher on the chain-side scale than they would sustain. The sweep point with 4 relayers and a bundle width of 4 used 32 operations. The tutorial comparison used 24, so their rates differ despite the same bundle shape.
+
Categories are evenly spaced, not to scale. While the pool is the bottleneck, both series climb almost linearly: each relayer's bundle cycle is about 1.5 seconds of sequential RPC round trips plus inclusion. They flatten as the in-flight work approaches what a 12,500,000-gas block can hold. Runs used 32 to 1,024 operations, so the shorter ones read higher on the chain-side scale than they would sustain. The sweep point with 4 relayers and a bundle width of 4 used 32 operations. The tutorial comparison used 24, so their rates differ despite the same bundle shape.
- No peers configured for network “{network}”.
+ No peers configured for network "{network}".
);
diff --git a/snippets/rpc-methods-viewer.jsx b/snippets/rpc-methods-viewer.jsx
index 7311c71..1e1a461 100644
--- a/snippets/rpc-methods-viewer.jsx
+++ b/snippets/rpc-methods-viewer.jsx
@@ -24,18 +24,18 @@ const NETWORKS = {
};
const NAMESPACE_META = {
- eth: { label: 'eth', color: '#b05c6c', blurb: 'Standard Ethereum methods — accounts, balances, blocks, transactions, logs, calls, and filters.' },
+ eth: { label: 'eth', color: '#b05c6c', blurb: 'Standard Ethereum methods for accounts, balances, blocks, transactions, logs, calls, and filters.' },
debug: { label: 'debug', color: '#966f22', blurb: 'Transaction and block tracing.' },
txpool: { label: 'txpool', color: '#3b82f6', blurb: 'Transaction-pool inspection.' },
net: { label: 'net', color: '#0d9488', blurb: 'Network metadata.' },
web3: { label: 'web3', color: '#7c3aed', blurb: 'Client metadata.' },
sei: { label: 'sei', color: '#600014', colorDark: '#b99ba1', blurb: 'Remaining legacy Sei extensions for address resolution, cross-VM lookup, and synthetic receipts.', deprecated: true },
- admin: { label: 'admin', color: '#6b7280', blurb: 'Node administration — not exposed on Sei.', unavailable: true },
- miner: { label: 'miner', color: '#6b7280', blurb: 'Mining control — not applicable (no proof-of-work).', unavailable: true },
- clique: { label: 'clique', color: '#6b7280', blurb: 'Clique proof-of-authority — not applicable (CometBFT consensus).', unavailable: true },
- engine: { label: 'engine', color: '#6b7280', blurb: 'Consensus Engine API — not applicable (CometBFT consensus).', unavailable: true },
- les: { label: 'les', color: '#6b7280', blurb: 'Light Ethereum Subprotocol — not exposed on Sei.', unavailable: true },
- personal: { label: 'personal', color: '#6b7280', blurb: 'Hosted-key account management — not exposed on Sei.', unavailable: true },
+ admin: { label: 'admin', color: '#6b7280', blurb: 'Node administration is not exposed on Sei.', unavailable: true },
+ miner: { label: 'miner', color: '#6b7280', blurb: 'Mining control is not applicable (no proof-of-work).', unavailable: true },
+ clique: { label: 'clique', color: '#6b7280', blurb: 'Clique proof-of-authority is not applicable (CometBFT consensus).', unavailable: true },
+ engine: { label: 'engine', color: '#6b7280', blurb: 'The Consensus Engine API is not applicable (CometBFT consensus).', unavailable: true },
+ les: { label: 'les', color: '#6b7280', blurb: 'The Light Ethereum Subprotocol is not exposed on Sei.', unavailable: true },
+ personal: { label: 'personal', color: '#6b7280', blurb: 'Hosted-key account management is not exposed on Sei.', unavailable: true },
};
const NAMESPACE_ORDER = ['eth', 'debug', 'txpool', 'net', 'web3', 'sei', 'admin', 'miner', 'clique', 'engine', 'les', 'personal'];
@@ -43,7 +43,7 @@ const NAMESPACE_ORDER = ['eth', 'debug', 'txpool', 'net', 'web3', 'sei', 'admin'
const STATUS_META = {
supported: { label: 'Supported', dark: '#22c55e', light: '#16a34a', tip: 'Implemented with standard Ethereum behavior.' },
limited: { label: 'Limited', dark: '#f59e0b', light: '#b45309', tip: 'Works, but is deprecated, returns a static value, or has a Sei-specific caveat.' },
- unsupported: { label: 'Unavailable', dark: '#9ca3af', light: '#6b7280', tip: 'Not registered on Sei, explicitly errors, or not applicable to Sei’s architecture.' },
+ unsupported: { label: 'Unavailable', dark: '#9ca3af', light: '#6b7280', tip: 'Not registered on Sei, explicitly errors, or not applicable to the Sei architecture.' },
};
const LANGUAGES = [
@@ -61,93 +61,93 @@ const LANGUAGES = [
];
const SEI_RPC_METHODS = [
- {"namespace":"eth","name":"eth_blockNumber","status":"supported","description":"Returns the number of the most recent committed EVM block as a hex uint64.","seiNote":"Block height comes from CometBFT latest height; the latest committed block is already final on Sei (instant finality, so latest == safe == finalized)."},
- {"namespace":"eth","name":"eth_chainId","status":"supported","description":"Returns the EVM chain ID as a hex big int.","seiNote":"Sourced from the x/evm keeper. Sei Mainnet = 1329 (0x531); Sei Testnet = 1328 (0x530)."},
- {"namespace":"eth","name":"eth_coinbase","status":"limited","description":"Returns the block reward beneficiary (coinbase) address.","seiNote":"Sei has no miner; this returns the Cosmos fee-collector module address (GetFeeCollectorAddress), not a validator/miner address. The COINBASE opcode returns the same value."},
- {"namespace":"eth","name":"eth_accounts","status":"limited","description":"Returns the list of addresses for which the node holds hosted keys.","seiNote":"Sourced from the node's local test keyring only; production/public RPC nodes hold no hosted keys, so this returns an empty list. Sign client-side and use eth_sendRawTransaction."},
- {"namespace":"eth","name":"eth_gasPrice","status":"limited","description":"Returns a suggested gas price in wei (hex).","seiNote":"Sei-specific congestion heuristic, not a raw mempool oracle. InfoAPI.GasPrice/GasPriceHelper (info.go): when uncongested it returns baseFee * 110/100 (base fee +10%); when congested it returns medianRewardPrevBlock + baseFee (50th-percentile priority-fee reward from the previous block added to base fee). The base fee comes from the x/evm keeper (GetNextBaseFeePerGas), which is itself floored at the governance-set minimum base fee; the RPC handler applies no additional explicit lower-bound clamp. The mainnet minimum gas price (~50 gwei) is enforced for transaction acceptance at the mempool/ante-handler level, not inside eth_gasPrice."},
- {"namespace":"eth","name":"eth_maxPriorityFeePerGas","status":"limited","description":"Returns a suggested priority fee (tip) per gas in wei (hex).","seiNote":"Sei-specific: returns a hardcoded 1 gwei (defaultPriorityFeePerGas) when the chain is uncongested; only when congested does it derive the tip from the previous block's 50th-percentile reward. Sei docs advise using a single gasPrice and omitting EIP-1559 fee fields."},
- {"namespace":"eth","name":"eth_feeHistory","status":"supported","description":"Returns base fees, gas-used ratios, and reward percentile data over a range of blocks.","seiNote":"Base fees and rewards reflect Sei's x/evm fee market (GetNextBaseFee), not an Ethereum EIP-1559 mempool, and Sei does not burn the base fee. Watermark-aware: pruned/historical blocks may not be available as far back as on Ethereum archive nodes.","params":[{"name":"blockCount","type":"QUANTITY","description":"Number of blocks in the requested range.","example":"0x5"},{"name":"newestBlock","type":"BLOCKNUMBER","description":"Highest block of the range (number or tag).","example":"latest"},{"name":"rewardPercentiles","type":"array of float","description":"Monotonically increasing percentiles to sample for priority-fee rewards.","example":"[25,50,75]"}]},
- {"namespace":"eth","name":"eth_blobBaseFee","status":"unsupported","description":"EIP-4844 blob base fee. Registered but always returns an unsupported error.","seiNote":"Always returns JSON-RPC error -32000 with message 'blobs not supported on this chain'. Sei does not implement EIP-4844 blob transactions."},
- {"namespace":"eth","name":"eth_syncing","status":"unsupported","description":"Sync status. Registered but always returns an unsupported error instead of false/a sync object.","seiNote":"InfoAPI.Syncing returns a JSON-RPC error with the exact message 'eth_syncing is not supported on Sei EVM RPC' (via ErrEVMNotSupported, code -32000, not -32601). Sei does not expose Ethereum sync semantics here; query CometBFT status endpoints instead."},
- {"namespace":"eth","name":"eth_getBalance","status":"supported","description":"Returns the wei balance of an account at a given block.","seiNote":"Balance reflects the account's SEI bank balance (18-decimal wei representation) and can change from both EVM and non-EVM (Cosmos bank send / wasm) transactions. Height is resolved via the watermark manager with a state-version guard.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Account address.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag (latest/earliest/pending/safe/finalized), or hash.","example":"latest"}]},
+ {"namespace":"eth","name":"eth_blockNumber","status":"supported","description":"Returns the number of the most recent committed EVM block as a hex uint64.","seiNote":"Block height comes from the CometBFT latest height. The latest committed block is already final on Sei (instant finality, so latest == safe == finalized)."},
+ {"namespace":"eth","name":"eth_chainId","status":"supported","description":"Returns the EVM chain ID as a hex big int.","seiNote":"The chain ID comes from the x/evm keeper. Sei Mainnet = 1329 (0x531). Sei Testnet = 1328 (0x530)."},
+ {"namespace":"eth","name":"eth_coinbase","status":"limited","description":"Returns the block reward beneficiary (coinbase) address.","seiNote":"Sei has no miner. This method returns the Cosmos fee-collector module address (GetFeeCollectorAddress), not a validator or miner address. The COINBASE opcode returns the same value."},
+ {"namespace":"eth","name":"eth_accounts","status":"limited","description":"Returns the list of addresses for which the node holds hosted keys.","seiNote":"The list comes only from the node's local test keyring. Production and public RPC nodes hold no hosted keys, so this method returns an empty list. Sign client-side and use eth_sendRawTransaction."},
+ {"namespace":"eth","name":"eth_gasPrice","status":"limited","description":"Returns a suggested gas price in wei (hex).","seiNote":"The price comes from a Sei-specific congestion heuristic, not a raw mempool oracle. InfoAPI.GasPrice/GasPriceHelper (info.go) returns baseFee * 110/100 (base fee +10%) when the chain is uncongested. When the chain is congested, it returns medianRewardPrevBlock + baseFee (the 50th-percentile priority-fee reward from the previous block, added to the base fee). The base fee comes from the x/evm keeper (GetNextBaseFeePerGas), which is itself floored at the governance-set minimum base fee. The RPC handler applies no other explicit lower-bound clamp. The mainnet minimum gas price (approximately 50 gwei) is enforced for transaction acceptance at the mempool and ante-handler level, not inside eth_gasPrice."},
+ {"namespace":"eth","name":"eth_maxPriorityFeePerGas","status":"limited","description":"Returns a suggested priority fee (tip) per gas in wei (hex).","seiNote":"Returns a hardcoded 1 gwei (defaultPriorityFeePerGas) when the chain is uncongested. It derives the tip from the previous block's 50th-percentile reward only when the chain is congested. Sei docs advise using a single gasPrice and omitting EIP-1559 fee fields."},
+ {"namespace":"eth","name":"eth_feeHistory","status":"supported","description":"Returns base fees, gas-used ratios, and reward percentile data over a range of blocks.","seiNote":"Base fees and rewards reflect Sei's x/evm fee market (GetNextBaseFee), not an Ethereum EIP-1559 mempool. Sei does not burn the base fee. The method is watermark-aware, so pruned or historical blocks may not be available as far back as on Ethereum archive nodes.","params":[{"name":"blockCount","type":"QUANTITY","description":"Number of blocks in the requested range.","example":"0x5"},{"name":"newestBlock","type":"BLOCKNUMBER","description":"Highest block of the range (number or tag).","example":"latest"},{"name":"rewardPercentiles","type":"array of float","description":"Monotonically increasing percentiles to sample for priority-fee rewards.","example":"[25,50,75]"}]},
+ {"namespace":"eth","name":"eth_blobBaseFee","status":"unsupported","description":"Returns the EIP-4844 blob base fee. Sei registers this method, but it always returns an unsupported error.","seiNote":"Always returns JSON-RPC error -32000 with the message 'blobs not supported on this chain'. Sei does not implement EIP-4844 blob transactions."},
+ {"namespace":"eth","name":"eth_syncing","status":"unsupported","description":"Returns the sync status. Sei registers this method, but it always returns an unsupported error instead of false or a sync object.","seiNote":"InfoAPI.Syncing returns a JSON-RPC error with the exact message 'eth_syncing is not supported on Sei EVM RPC' (from ErrEVMNotSupported, code -32000, not -32601). Sei does not expose Ethereum sync semantics here. Query CometBFT status endpoints instead."},
+ {"namespace":"eth","name":"eth_getBalance","status":"supported","description":"Returns the wei balance of an account at a given block.","seiNote":"The balance reflects the account's SEI bank balance (18-decimal wei representation). Both EVM and non-EVM (Cosmos bank send or wasm) transactions can change it. The watermark manager resolves the height with a state-version guard.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Account address.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag (latest/earliest/pending/safe/finalized), or hash.","example":"latest"}]},
{"namespace":"eth","name":"eth_getCode","status":"supported","description":"Returns the contract bytecode at an address for a given block.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Contract address.","example":"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
{"namespace":"eth","name":"eth_getStorageAt","status":"supported","description":"Returns the value stored at a storage slot of an address at a given block.","seiNote":"Reads the EVM keeper's slot value directly rather than from an MPT trie. The slot key must decode to at most 32 bytes.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Contract address.","example":"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7"},{"name":"key","type":"DATA, 32 bytes","description":"Storage slot key (hex, up to 32 bytes).","example":"0x0"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
- {"namespace":"eth","name":"eth_getProof","status":"limited","description":"Returns a Merkle proof for an account and the requested storage slots.","seiNote":"Sei stores state in an IAVL tree, not an Ethereum Merkle-Patricia trie. The result is a Sei-specific ProofResult{address, hexValues, storageProof} where storageProof entries are CometBFT/IAVL crypto.ProofOps, NOT eth-style MPT proof nodes. There is no accountProof, balance, codeHash, nonce, or storageHash field (Sei has no per-account state root); standard eth_getProof verifiers will not work.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Account address.","example":"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7"},{"name":"storageKeys","type":"array of DATA, 32 bytes","description":"Storage slot keys to prove (bounded by MaxStorageKeysPerProof).","example":"[\"0x0\"]"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
- {"namespace":"eth","name":"eth_getNonce","status":"limited","description":"Sei-specific helper that returns the current EVM nonce for an address (latest state only).","seiNote":"Non-standard Sei extension exposed as eth_getNonce, implemented as StateAPI.GetNonce in state.go (NOT on TransactionAPI). Unlike eth_getTransactionCount it takes no block tag (latest-only via ctxProvider(LatestCtxHeight)) and returns a bare uint64 with no block-tag argument. Prefer eth_getTransactionCount for standard nonce queries.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Account address.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"}]},
- {"namespace":"eth","name":"eth_call","status":"supported","description":"Executes a read-only message call against state without creating a transaction; supports state and block overrides.","seiNote":"Gas is capped by RPCGasCap and execution time by RPCEVMTimeout; a fail-fast limiter may reject with 'eth_call rejected due to rate limit: server busy'. Canonical EVM<->Sei address resolution uses eth_call to the addr precompile at 0x0000000000000000000000000000000000001004.","params":[{"name":"args","type":"object","description":"Call object (to, from, data/input, gas, gasPrice/maxFeePerGas, value).","example":"{\"to\":\"0x0000000000000000000000000000000000001004\",\"data\":\"0x0c3c20ed000000000000000000000000Da52B9E673d1f48FcD9916b3F606A136a8eA5e55\"}"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash. Defaults to latest.","example":"latest"},{"name":"overrides","type":"object","description":"Optional per-account state overrides (balance, code, nonce, state).","example":"{}"},{"name":"blockOverrides","type":"object","description":"Optional block-context overrides (number, time, coinbase).","example":"{}"}]},
- {"namespace":"eth","name":"eth_estimateGas","status":"supported","description":"Estimates the gas needed to execute a transaction.","seiNote":"Bounded by RPCGasCap and protected by a fail-fast limiter. Block gas limit on Sei is 12.5M; parallel execution can cause estimates to vary slightly, so size gasLimit with a modest buffer.","params":[{"name":"args","type":"object","description":"Transaction call object.","example":"{\"to\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"data\":\"0x18160ddd\"}"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Optional block number, tag, or hash; defaults to latest.","example":"latest"},{"name":"overrides","type":"object","description":"Optional state overrides.","example":"{}"}]},
- {"namespace":"eth","name":"eth_estimateGasAfterCalls","status":"limited","description":"Estimates gas for a transaction after first applying a sequence of preceding calls against the same simulated state.","seiNote":"Non-standard Sei/geth extension (not part of the standard Ethereum JSON-RPC spec). Same gas-cap and fail-fast-limiter behavior as eth_estimateGas.","params":[{"name":"args","type":"object","description":"The final call to estimate gas for.","example":"{\"to\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"data\":\"0x\"}"},{"name":"calls","type":"array of object","description":"Ordered list of preceding calls applied before the estimate.","example":"[]"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Optional block number, tag, or hash; defaults to latest.","example":"latest"},{"name":"overrides","type":"object","description":"Optional state overrides.","example":"{}"}]},
- {"namespace":"eth","name":"eth_createAccessList","status":"supported","description":"Generates an EIP-2930 access list (and gas used) for a transaction.","seiNote":"Defaults to the pending block tag (matching geth). A VM error during simulation is surfaced in the result's 'error' field rather than failing the RPC.","params":[{"name":"args","type":"object","description":"Transaction call object.","example":"{\"to\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"data\":\"0x\"}"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Optional block number, tag, or hash; defaults to pending.","example":"pending"}]},
- {"namespace":"eth","name":"eth_sendRawTransaction","status":"supported","description":"Submits a signed, RLP-encoded raw EVM transaction to the network and returns its hash.","seiNote":"Decodes to an ethtypes.Transaction, wraps it in a Cosmos MsgEVMTransaction, and broadcasts via CometBFT (async BroadcastTx by default; slow mode uses BroadcastTxCommit). Non-zero CheckTx codes surface as ABCI errors, not geth mempool errors. Legacy (non-1559) txs must set gasPrice at or above the governance minimum (currently 50 gwei on mainnet); blob (EIP-4844) txs are not enabled. Supports per-sender EvmProxy forwarding.","params":[{"name":"data","type":"DATA","description":"Signed, RLP-encoded transaction bytes (0x-prefixed).","example":"0x02f8b101808459682f00..."}]},
- {"namespace":"eth","name":"eth_sendTransaction","status":"limited","description":"Signs (with a node-hosted key) and submits a transaction in one call.","seiNote":"Requires the 'from' address's private key in the node's local test keyring; production/public RPC nodes hold no hosted keys, so this returns 'from address does not have hosted key'. Always signs as LegacyTxType. Sign client-side and use eth_sendRawTransaction instead.","params":[{"name":"args","type":"object","description":"Transaction object (from, to, value, data, gas, nonce, etc.).","example":"{\"from\":\"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55\",\"to\":\"0x7507454444fa193d39f1392076bc784b77a7a8ff\",\"value\":\"0x1\"}"}]},
- {"namespace":"eth","name":"eth_signTransaction","status":"limited","description":"Signs a transaction with a node-hosted key and returns the signed payload without broadcasting.","seiNote":"Requires a node-hosted key for the from address; not usable on public RPC nodes that hold no keys. Returns both the raw RLP bytes and the decoded tx.","params":[{"name":"args","type":"object","description":"SendTxArgs transaction object to sign (from, to, gas, gasPrice, value, nonce, data).","example":"{\"from\":\"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55\",\"to\":\"0x7507454444fa193d39f1392076bc784b77a7a8ff\",\"value\":\"0x1\",\"nonce\":\"0x0\",\"gas\":\"0x5208\",\"gasPrice\":\"0x3b9aca00\"}"}]},
- {"namespace":"eth","name":"eth_sign","status":"limited","description":"Signs an EIP-191 personal message with a node-hosted key for the given address.","seiNote":"Only works for addresses in the node's local test keyring; production/public RPC nodes hold no hosted keys, so this returns 'address does not have hosted key'. Applies the EIP-191 personal-message TextHash before signing.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Address whose hosted key signs the data.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"},{"name":"data","type":"DATA","description":"Message bytes to sign.","example":"0xdeadbeef"}]},
- {"namespace":"eth","name":"eth_getBlockByNumber","status":"supported","description":"Returns block information by number or tag, with full transactions when fullTx is true.","seiNote":"Under the eth namespace only EVM transactions are indexed (synthetic/bank-transfer txs excluded). Block number 0 returns a synthetic genesis block (for The Graph compatibility); future/non-existent numeric blocks return null. Uncle/PoW header fields (sha3Uncles, nonce, mixHash, difficulty) are placeholders and the uncles array is always empty (CometBFT consensus). safe/finalized/latest are equivalent due to instant finality.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number (hex) or tag (latest/safe/finalized/pending/earliest).","example":"latest"},{"name":"fullTx","type":"boolean","description":"If true include full transaction objects, else only hashes.","example":"true"}]},
- {"namespace":"eth","name":"eth_getBlockByHash","status":"supported","description":"Returns block information by block hash, with full transactions when fullTx is true.","seiNote":"Block hashes are CometBFT block hashes (computed from the Tendermint header), so they differ from Ethereum block hashes and are not interchangeable across chains. Under the eth namespace synthetic txs and bank transfers are excluded. The genesis hash returns a synthetic genesis block; unknown/zero hash returns null. Uncles array is always empty.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"fullTx","type":"boolean","description":"If true include full transaction objects, else only hashes.","example":"false"}]},
- {"namespace":"eth","name":"eth_getBlockTransactionCountByNumber","status":"supported","description":"Returns the number of EVM transactions in a block by number, as a hex quantity.","seiNote":"Counts EVM transactions only (via getEvmTxCount); synthetic/bank-transfer txs are excluded. Genesis returns 0x0; non-existent/future blocks return null.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"}]},
- {"namespace":"eth","name":"eth_getBlockTransactionCountByHash","status":"supported","description":"Returns the number of EVM transactions in a block by hash, as a hex quantity.","seiNote":"Counts EVM transactions only; synthetic/bank-transfer txs are excluded. Genesis hash returns 0x0; unknown hash returns null.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"}]},
- {"namespace":"eth","name":"eth_getBlockReceipts","status":"supported","description":"Returns all EVM transaction receipts for a given block.","seiNote":"Under the eth namespace synthetic/shell receipts are excluded (includeShellReceipts=false). Genesis returns an empty array; zero hash returns null. transactionIndex is recomputed sequentially over the compacted receipt list.","params":[{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
- {"namespace":"eth","name":"eth_getTransactionByHash","status":"supported","description":"Returns the EVM transaction matching the given hash, or null if not found.","seiNote":"Sees EVM transactions only; if the hash resolves to a non-EVM Cosmos tx it errors. Pending lookups read from the CometBFT mempool, not a geth txpool.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
- {"namespace":"eth","name":"eth_getTransactionReceipt","status":"supported","description":"Returns the receipt of a transaction by hash, or null if not found.","seiNote":"Receipt is reconstructed from keeper.GetReceipt + CometBFT block data rather than from a native MPT receipt trie; status/logs are standard Ethereum format.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
- {"namespace":"eth","name":"eth_getTransactionByBlockNumberAndIndex","status":"supported","description":"Returns the EVM transaction at the given index within the block at the specified number.","seiNote":"Index maps over EVM transactions only; an out-of-range index yields a null result rather than an error.","params":[{"name":"blockNr","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"},{"name":"index","type":"QUANTITY","description":"Transaction index within the block.","example":"0x0"}]},
- {"namespace":"eth","name":"eth_getTransactionByBlockHashAndIndex","status":"supported","description":"Returns the EVM transaction at the given index within the block identified by hash.","seiNote":"Index maps over EVM transactions only; same null-on-overflow semantics as the block-number variant.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"index","type":"QUANTITY","description":"Transaction index within the block.","example":"0x0"}]},
- {"namespace":"eth","name":"eth_getTransactionCount","status":"supported","description":"Returns the number of transactions sent from an address (nonce) at a given block.","seiNote":"For the 'pending' tag Sei returns EvmNextPendingNonce from the CometBFT mempool (or redirects to an EvmProxy if the sender is sharded there). safe/finalized/latest are equivalent due to instant finality.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Account address.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash; 'pending' returns the next pending nonce.","example":"latest"}]},
- {"namespace":"eth","name":"eth_getVMError","status":"limited","description":"Sei extension that returns the EVM VM error string recorded in a transaction's receipt by hash.","seiNote":"Non-standard Sei extension registered under the eth namespace. Returns the receipt's VmError field and propagates a not-found error (unlike eth_getTransactionErrorByHash, which returns an empty string on not-found).","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
- {"namespace":"eth","name":"eth_getTransactionErrorByHash","status":"limited","description":"Sei extension that returns the recorded VM error string for a transaction by hash (empty string if it succeeded or is not found).","seiNote":"Non-standard Sei extension registered under the eth namespace. Unlike eth_getVMError, a not-found lookup returns an empty string and no error.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
- {"namespace":"eth","name":"eth_newFilter","status":"supported","description":"Creates a log filter for the given criteria and returns a filter ID for later polling.","seiNote":"Subject to the same range/size caps as eth_getLogs: open-ended ranges return up to 10,000 logs (DefaultMaxLogLimit); close-ended ranges are limited to 2,000 blocks (DefaultMaxBlockRange), with large-query rate limiting.","params":[{"name":"crit","type":"object","description":"Filter criteria: fromBlock, toBlock (or blockHash), address(es), and topics.","example":"{\"fromBlock\":\"latest\",\"address\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"topics\":[]}"}]},
+ {"namespace":"eth","name":"eth_getProof","status":"limited","description":"Returns a Merkle proof for an account and the requested storage slots.","seiNote":"Sei stores state in an IAVL tree, not an Ethereum Merkle-Patricia trie. The result is a Sei-specific ProofResult{address, hexValues, storageProof}. Its storageProof entries are CometBFT/IAVL crypto.ProofOps, NOT eth-style MPT proof nodes. There is no accountProof, balance, codeHash, nonce, or storageHash field (Sei has no per-account state root). Standard eth_getProof verifiers do not work.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Account address.","example":"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7"},{"name":"storageKeys","type":"array of DATA, 32 bytes","description":"Storage slot keys to prove (bounded by MaxStorageKeysPerProof).","example":"[\"0x0\"]"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
+ {"namespace":"eth","name":"eth_getNonce","status":"limited","description":"Sei-specific helper that returns the current EVM nonce for an address (latest state only).","seiNote":"This non-standard Sei extension is exposed as eth_getNonce and implemented as StateAPI.GetNonce in state.go (NOT on TransactionAPI). Unlike eth_getTransactionCount, it takes no block tag (latest only, through ctxProvider(LatestCtxHeight)) and returns a bare uint64. Prefer eth_getTransactionCount for standard nonce queries.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Account address.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"}]},
+ {"namespace":"eth","name":"eth_call","status":"supported","description":"Executes a read-only message call against state without creating a transaction. Supports state and block overrides.","seiNote":"RPCGasCap caps gas, and RPCEVMTimeout caps execution time. A fail-fast limiter may reject the call with 'eth_call rejected due to rate limit: server busy'. Canonical EVM<->Sei address resolution uses eth_call to the addr precompile at 0x0000000000000000000000000000000000001004.","params":[{"name":"args","type":"object","description":"Call object (to, from, data/input, gas, gasPrice/maxFeePerGas, value).","example":"{\"to\":\"0x0000000000000000000000000000000000001004\",\"data\":\"0x0c3c20ed000000000000000000000000Da52B9E673d1f48FcD9916b3F606A136a8eA5e55\"}"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash. Defaults to latest.","example":"latest"},{"name":"overrides","type":"object","description":"Optional per-account state overrides (balance, code, nonce, state).","example":"{}"},{"name":"blockOverrides","type":"object","description":"Optional block-context overrides (number, time, coinbase).","example":"{}"}]},
+ {"namespace":"eth","name":"eth_estimateGas","status":"supported","description":"Estimates the gas needed to execute a transaction.","seiNote":"RPCGasCap bounds this method, and a fail-fast limiter protects it. The block gas limit on Sei is 12.5M. Parallel execution can cause estimates to vary slightly, so size gasLimit with a modest buffer.","params":[{"name":"args","type":"object","description":"Transaction call object.","example":"{\"to\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"data\":\"0x18160ddd\"}"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Optional block number, tag, or hash. Defaults to latest.","example":"latest"},{"name":"overrides","type":"object","description":"Optional state overrides.","example":"{}"}]},
+ {"namespace":"eth","name":"eth_estimateGasAfterCalls","status":"limited","description":"Estimates gas for a transaction after first applying a sequence of preceding calls against the same simulated state.","seiNote":"This is a non-standard Sei/geth extension (not part of the standard Ethereum JSON-RPC spec). It has the same gas-cap and fail-fast-limiter behavior as eth_estimateGas.","params":[{"name":"args","type":"object","description":"The final call to estimate gas for.","example":"{\"to\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"data\":\"0x\"}"},{"name":"calls","type":"array of object","description":"Ordered list of preceding calls applied before the estimate.","example":"[]"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Optional block number, tag, or hash. Defaults to latest.","example":"latest"},{"name":"overrides","type":"object","description":"Optional state overrides.","example":"{}"}]},
+ {"namespace":"eth","name":"eth_createAccessList","status":"supported","description":"Generates an EIP-2930 access list (and gas used) for a transaction.","seiNote":"Defaults to the pending block tag (matching geth). A VM error during simulation appears in the result's 'error' field instead of failing the RPC.","params":[{"name":"args","type":"object","description":"Transaction call object.","example":"{\"to\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"data\":\"0x\"}"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Optional block number, tag, or hash. Defaults to pending.","example":"pending"}]},
+ {"namespace":"eth","name":"eth_sendRawTransaction","status":"supported","description":"Submits a signed, RLP-encoded raw EVM transaction to the network and returns its hash.","seiNote":"Decodes the bytes to an ethtypes.Transaction, wraps it in a Cosmos MsgEVMTransaction, and broadcasts it through CometBFT. By default, it uses a CheckTx-level BroadcastTx (that is, broadcast_tx_sync), and slow mode uses BroadcastTxCommit. Non-zero CheckTx codes are returned as ABCI errors, not geth mempool errors. Legacy (non-1559) transactions must set gasPrice at or above the governance minimum (currently 50 gwei on Sei Mainnet). Blob (EIP-4844) transactions are not enabled. The method supports per-sender EvmProxy forwarding.","params":[{"name":"data","type":"DATA","description":"Signed, RLP-encoded transaction bytes (0x-prefixed).","example":"0x02f8b101808459682f00..."}]},
+ {"namespace":"eth","name":"eth_sendTransaction","status":"limited","description":"Signs (with a node-hosted key) and submits a transaction in one call.","seiNote":"Requires the 'from' address's private key in the node's local test keyring. Production and public RPC nodes hold no hosted keys, so this method returns 'from address does not have hosted key'. Always signs as LegacyTxType. Sign client-side and use eth_sendRawTransaction instead.","params":[{"name":"args","type":"object","description":"Transaction object (from, to, value, data, gas, nonce, and other fields).","example":"{\"from\":\"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55\",\"to\":\"0x7507454444fa193d39f1392076bc784b77a7a8ff\",\"value\":\"0x1\"}"}]},
+ {"namespace":"eth","name":"eth_signTransaction","status":"limited","description":"Signs a transaction with a node-hosted key and returns the signed payload without broadcasting.","seiNote":"Requires a node-hosted key for the from address. It does not work on public RPC nodes that hold no keys. Returns both the raw RLP bytes and the decoded tx.","params":[{"name":"args","type":"object","description":"SendTxArgs transaction object to sign (from, to, gas, gasPrice, value, nonce, data).","example":"{\"from\":\"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55\",\"to\":\"0x7507454444fa193d39f1392076bc784b77a7a8ff\",\"value\":\"0x1\",\"nonce\":\"0x0\",\"gas\":\"0x5208\",\"gasPrice\":\"0x3b9aca00\"}"}]},
+ {"namespace":"eth","name":"eth_sign","status":"limited","description":"Signs an EIP-191 personal message with a node-hosted key for the given address.","seiNote":"Only works for addresses in the node's local test keyring. Production and public RPC nodes hold no hosted keys, so this method returns 'address does not have hosted key'. Applies the EIP-191 personal-message TextHash before signing.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Address whose hosted key signs the data.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"},{"name":"data","type":"DATA","description":"Message bytes to sign.","example":"0xdeadbeef"}]},
+ {"namespace":"eth","name":"eth_getBlockByNumber","status":"supported","description":"Returns block information by number or tag, with full transactions when fullTx is true.","seiNote":"Under the eth namespace, only EVM transactions are indexed (synthetic and bank-transfer txs are excluded). Block number 0 returns a synthetic genesis block (for The Graph compatibility). Future or non-existent numeric blocks return null. Uncle and PoW header fields (sha3Uncles, nonce, mixHash, difficulty) are placeholders, and the uncles array is always empty (CometBFT consensus). The safe, finalized, and latest tags are equivalent because of instant finality.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number (hex) or tag (latest/safe/finalized/pending/earliest).","example":"latest"},{"name":"fullTx","type":"boolean","description":"If true, the block includes full transaction objects. If false, it includes only hashes.","example":"true"}]},
+ {"namespace":"eth","name":"eth_getBlockByHash","status":"supported","description":"Returns block information by block hash, with full transactions when fullTx is true.","seiNote":"Block hashes are CometBFT block hashes (computed from the Tendermint header), so they differ from Ethereum block hashes and are not interchangeable across chains. Under the eth namespace, synthetic txs and bank transfers are excluded. The genesis hash returns a synthetic genesis block. An unknown or zero hash returns null. The uncles array is always empty.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"fullTx","type":"boolean","description":"If true, the block includes full transaction objects. If false, it includes only hashes.","example":"false"}]},
+ {"namespace":"eth","name":"eth_getBlockTransactionCountByNumber","status":"supported","description":"Returns the number of EVM transactions in a block by number, as a hex quantity.","seiNote":"Counts EVM transactions only (through getEvmTxCount). Synthetic and bank-transfer txs are excluded. Genesis returns 0x0. Non-existent or future blocks return null.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"}]},
+ {"namespace":"eth","name":"eth_getBlockTransactionCountByHash","status":"supported","description":"Returns the number of EVM transactions in a block by hash, as a hex quantity.","seiNote":"Counts EVM transactions only. Synthetic and bank-transfer txs are excluded. The genesis hash returns 0x0. An unknown hash returns null.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"}]},
+ {"namespace":"eth","name":"eth_getBlockReceipts","status":"supported","description":"Returns all EVM transaction receipts for a given block.","seiNote":"Under the eth namespace, synthetic and shell receipts are excluded (includeShellReceipts=false). Genesis returns an empty array. A zero hash returns null. transactionIndex is recomputed sequentially over the compacted receipt list.","params":[{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
+ {"namespace":"eth","name":"eth_getTransactionByHash","status":"supported","description":"Returns the EVM transaction matching the given hash, or null if not found.","seiNote":"Sees EVM transactions only. If the hash resolves to a non-EVM Cosmos tx, it returns an error. Pending lookups read from the CometBFT mempool, not a geth txpool.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
+ {"namespace":"eth","name":"eth_getTransactionReceipt","status":"supported","description":"Returns the receipt of a transaction by hash, or null if not found.","seiNote":"The receipt is reconstructed from keeper.GetReceipt and CometBFT block data, not from a native MPT receipt trie. Status and logs use the standard Ethereum format.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
+ {"namespace":"eth","name":"eth_getTransactionByBlockNumberAndIndex","status":"supported","description":"Returns the EVM transaction at the given index within the block at the specified number.","seiNote":"Index maps over EVM transactions only. An out-of-range index returns a null result, not an error.","params":[{"name":"blockNr","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"},{"name":"index","type":"QUANTITY","description":"Transaction index within the block.","example":"0x0"}]},
+ {"namespace":"eth","name":"eth_getTransactionByBlockHashAndIndex","status":"supported","description":"Returns the EVM transaction at the given index within the block identified by hash.","seiNote":"Index maps over EVM transactions only. It has the same null-on-overflow semantics as the block-number variant.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"index","type":"QUANTITY","description":"Transaction index within the block.","example":"0x0"}]},
+ {"namespace":"eth","name":"eth_getTransactionCount","status":"supported","description":"Returns the number of transactions sent from an address (nonce) at a given block.","seiNote":"For the 'pending' tag, Sei returns EvmNextPendingNonce from the CometBFT mempool (or redirects to an EvmProxy if the sender is sharded there). The safe, finalized, and latest tags are equivalent because of instant finality.","params":[{"name":"address","type":"DATA, 20 bytes","description":"Account address.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash. The 'pending' tag returns the next pending nonce.","example":"latest"}]},
+ {"namespace":"eth","name":"eth_getVMError","status":"limited","description":"Sei extension that returns the EVM VM error string recorded in a transaction's receipt by hash.","seiNote":"This non-standard Sei extension is registered under the eth namespace. Returns the receipt's VmError field and propagates a not-found error (unlike eth_getTransactionErrorByHash, which returns an empty string on not-found).","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
+ {"namespace":"eth","name":"eth_getTransactionErrorByHash","status":"limited","description":"Sei extension that returns the recorded VM error string for a transaction by hash (empty string if it succeeded or is not found).","seiNote":"This non-standard Sei extension is registered under the eth namespace. Unlike eth_getVMError, a not-found lookup returns an empty string and no error.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
+ {"namespace":"eth","name":"eth_newFilter","status":"supported","description":"Creates a log filter for the given criteria and returns a filter ID for later polling.","seiNote":"It has the same range and size caps as eth_getLogs. Open-ended ranges return up to 10,000 logs (DefaultMaxLogLimit). Close-ended ranges are limited to 2,000 blocks (DefaultMaxBlockRange), with large-query rate limiting.","params":[{"name":"crit","type":"object","description":"Filter criteria: fromBlock, toBlock (or blockHash), address(es), and topics.","example":"{\"fromBlock\":\"latest\",\"address\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"topics\":[]}"}]},
{"namespace":"eth","name":"eth_newBlockFilter","status":"supported","description":"Creates a filter that tracks newly arrived block hashes and returns its ID."},
- {"namespace":"eth","name":"eth_newPendingTransactionFilter","status":"unsupported","description":"Pending-transaction filter. Registered but always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000. Sei has no geth-style public pending mempool to filter; the corresponding newPendingTransactions subscription type is likewise unavailable."},
+ {"namespace":"eth","name":"eth_newPendingTransactionFilter","status":"unsupported","description":"Creates a pending-transaction filter. Sei registers this method, but it always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000. Sei has no geth-style public pending mempool to filter. The corresponding newPendingTransactions subscription type is also unavailable."},
{"namespace":"eth","name":"eth_getFilterChanges","status":"supported","description":"Polls a filter and returns new logs (log filters) or block hashes (block filters) since the last poll.","params":[{"name":"filterID","type":"QUANTITY/ID","description":"Filter ID from a New*Filter call.","example":"0x1"}]},
{"namespace":"eth","name":"eth_getFilterLogs","status":"supported","description":"Returns all logs matching a previously created log filter, including historical logs.","seiNote":"Bounded by the same caps as eth_getLogs (2,000-block range, 10,000-log limit) with large-query rate limiting.","params":[{"name":"filterID","type":"QUANTITY/ID","description":"Filter ID from a NewFilter call.","example":"0x1"}]},
- {"namespace":"eth","name":"eth_getLogs","status":"supported","description":"Returns logs matching the given filter criteria.","seiNote":"Returns EVM logs only. Hard limits: max 2,000 blocks per close-ended query and up to 10,000 logs per response; exceeding the range errors with 'block range too large'. Large queries are globally rate-limited.","params":[{"name":"crit","type":"object","description":"Filter criteria: fromBlock, toBlock (or blockHash), address(es), topics.","example":"{\"fromBlock\":\"0x0\",\"toBlock\":\"latest\",\"address\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"topics\":[]}"}]},
- {"namespace":"eth","name":"eth_uninstallFilter","status":"supported","description":"Removes a previously installed filter by ID; returns true if it existed and was removed.","seiNote":"Returns false if the filter did not exist rather than erroring. Filters also expire automatically when not polled.","params":[{"name":"filterID","type":"QUANTITY/ID","description":"Filter ID to remove.","example":"0x1"}]},
- {"namespace":"eth","name":"eth_subscribe","status":"limited","description":"Opens a WebSocket-only push subscription for newHeads or logs notifications.","seiNote":"WebSocket-only (SubscriptionAPI is not registered on the HTTP server; returns rpc.ErrNotificationsUnsupported over HTTP). Only 'newHeads' and 'logs' are implemented in source; there is no 'newPendingTransactions' subscription despite some client docs implying otherwise. newHeads subscriptions are capped by MaxSubscriptionsNewHead.","params":[{"name":"subscriptionType","type":"string","description":"Subscription name: 'newHeads' or 'logs'.","example":"newHeads"},{"name":"filter","type":"object","description":"Optional filter criteria (address/topics) for the 'logs' subscription.","example":"{\"address\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"topics\":[]}"}]},
- {"namespace":"eth","name":"eth_unsubscribe","status":"supported","description":"Cancels an existing WebSocket subscription by ID; returns true on success.","seiNote":"WebSocket only; has no effect over HTTP (notifications unsupported there).","params":[{"name":"subscriptionID","type":"string","description":"The subscription ID returned by a prior eth_subscribe call.","example":"0x9cef478923ff08bf67fde6c64013158d"}]},
- {"namespace":"eth","name":"eth_mining","status":"unsupported","description":"Whether the node is mining. Not registered on Sei.","seiNote":"Sei uses CometBFT proof-of-stake consensus with no PoW mining; the method is not registered and returns -32601 method not found."},
- {"namespace":"eth","name":"eth_hashrate","status":"unsupported","description":"Node mining hashrate. Not registered on Sei.","seiNote":"No PoW mining on Sei (CometBFT consensus); not registered, returns -32601 method not found."},
- {"namespace":"eth","name":"eth_getWork","status":"unsupported","description":"PoW work package (current header hash, seed, target). Not registered on Sei.","seiNote":"The proof-of-work concept does not exist under Sei's CometBFT consensus; not registered."},
- {"namespace":"eth","name":"eth_submitWork","status":"unsupported","description":"Submit a PoW solution. Not registered on Sei.","seiNote":"PoW submission is meaningless on Sei (CometBFT PoS); not registered.","params":[{"name":"nonce","type":"DATA, 8 bytes","description":"Found PoW nonce.","example":"0x0000000000000001"},{"name":"powHash","type":"DATA, 32 bytes","description":"Header pow-hash.","example":"0x0000000000000000000000000000000000000000000000000000000000000000"},{"name":"mixDigest","type":"DATA, 32 bytes","description":"Mix digest.","example":"0x0000000000000000000000000000000000000000000000000000000000000000"}]},
- {"namespace":"eth","name":"eth_submitHashrate","status":"unsupported","description":"Submit a node's mining hashrate. Not registered on Sei.","seiNote":"No PoW mining on Sei; not registered.","params":[{"name":"hashrate","type":"QUANTITY","description":"Hashrate value (hex).","example":"0x500000"},{"name":"id","type":"DATA, 32 bytes","description":"Random hex ID identifying the client.","example":"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"}]},
- {"namespace":"eth","name":"eth_protocolVersion","status":"unsupported","description":"Ethereum (devp2p) protocol version. Not registered on Sei.","seiNote":"Sei does not expose the Ethereum devp2p protocol version; not registered, returns -32601 method not found."},
- {"namespace":"eth","name":"eth_getUncleCountByBlockNumber","status":"unsupported","description":"Uncle count by block number. Not registered; Sei has no uncles.","seiNote":"Sei uses CometBFT (single canonical chain, no uncles/ommers); not registered, returns -32601.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"}]},
- {"namespace":"eth","name":"eth_getUncleCountByBlockHash","status":"unsupported","description":"Uncle count by block hash. Not registered; Sei has no uncles.","seiNote":"No uncle blocks under CometBFT consensus; not registered, returns -32601.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"}]},
- {"namespace":"eth","name":"eth_getUncleByBlockNumberAndIndex","status":"unsupported","description":"Uncle block by number and index. Not registered; Sei has no uncles.","seiNote":"No uncle blocks under CometBFT consensus; not registered, returns -32601.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"},{"name":"index","type":"QUANTITY","description":"Uncle index.","example":"0x0"}]},
- {"namespace":"eth","name":"eth_getUncleByBlockHashAndIndex","status":"unsupported","description":"Uncle block by hash and index. Not registered; Sei has no uncles.","seiNote":"No uncle blocks under CometBFT consensus; not registered, returns -32601.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"index","type":"QUANTITY","description":"Uncle index.","example":"0x0"}]},
- {"namespace":"eth","name":"eth_pendingTransactions","status":"unsupported","description":"List pending transactions in the node's transaction pool. Not registered on Sei.","seiNote":"Sei exposes no geth-style mempool through this method; pending state is surfaced only via the 'pending' tag on eth_getTransactionCount and via txpool_content. Not registered, returns -32601."},
- {"namespace":"net","name":"net_version","status":"supported","description":"Returns the network/chain ID as a decimal string.","seiNote":"Returns the EVM chain ID in decimal (alias of eth_chainId): '1329' on Sei Mainnet and '1328' on Sei Testnet."},
- {"namespace":"net","name":"net_listening","status":"unsupported","description":"Whether the node is listening for connections. Not registered on Sei.","seiNote":"Not registered on Sei's NetAPI; returns -32601 method not found (P2P is handled by CometBFT, not this RPC)."},
- {"namespace":"net","name":"net_peerCount","status":"unsupported","description":"Number of connected peers. Not registered on Sei.","seiNote":"Not registered on Sei's NetAPI; returns -32601. Query CometBFT net_info for peer data instead."},
- {"namespace":"web3","name":"web3_clientVersion","status":"supported","description":"Returns the client version string.","seiNote":"Reports a synthetic 'Geth/-/' string (Sei's EVM is backed by go-ethereum); it does NOT embed the actual sei-chain/seid version, so it is not a reliable Sei version indicator."},
- {"namespace":"web3","name":"web3_sha3","status":"unsupported","description":"Keccak-256 hash of the input. Not implemented in Sei's Web3API.","seiNote":"Unlike go-ethereum, Sei's Web3API does not implement web3_sha3; it is not registered and returns -32601 method not found.","params":[{"name":"data","type":"DATA","description":"Bytes to hash.","example":"0x68656c6c6f20776f726c64"}]},
- {"namespace":"txpool","name":"txpool_content","status":"limited","description":"Returns the transactions currently in the pool, grouped by sender address and nonce into pending and queued buckets.","seiNote":"Sei-specific simplification: every unconfirmed EVM tx from the CometBFT mempool is reported under 'pending' and 'queued' is always empty (no geth-style pending/queued nonce-gap distinction). The result set is truncated to the node's MaxTxPoolTxs config, so it may not reflect the entire mempool."},
- {"namespace":"txpool","name":"txpool_contentFrom","status":"unsupported","description":"Pending/queued transactions for a single account. Not implemented on Sei.","seiNote":"Not registered; returns -32601 method not found. The only txpool method available on Sei is txpool_content.","params":[{"name":"address","type":"DATA, 20 bytes","description":"The account address to filter by.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"}]},
- {"namespace":"txpool","name":"txpool_status","status":"unsupported","description":"Counts of pending and queued transactions. Not implemented on Sei.","seiNote":"Not registered; returns -32601 method not found."},
- {"namespace":"txpool","name":"txpool_inspect","status":"unsupported","description":"Human-readable summary of pending/queued transactions. Not implemented on Sei.","seiNote":"Not registered; returns -32601 method not found."},
- {"namespace":"debug","name":"debug_traceTransaction","status":"supported","description":"Replays a transaction by hash and returns an execution trace using the configured tracer.","seiNote":"HTTP-only (the debug namespace is not registered on the WebSocket server). Supports geth tracers (callTracer, prestateTracer, flatCallTracer, struct/opcode logger); callTracer/prestateTracer/flatCallTracer results are pre-baked/cached via TraceBaker. Requires trace-enabled/archive state for the target height.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash to trace.","example":"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"},{"name":"config","type":"object","description":"Optional tracer config (tracer name, tracerConfig, timeout, reexec, disableStorage/Stack/Memory).","example":"{\"tracer\":\"callTracer\"}"}]},
- {"namespace":"debug","name":"debug_traceBlockByNumber","status":"supported","description":"Traces all transactions in a block by number and returns per-transaction execution traces.","seiNote":"HTTP-only. safe/finalized/latest are equivalent due to instant finality.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"},{"name":"config","type":"object","description":"Optional tracer config.","example":"{\"tracer\":\"callTracer\"}"}]},
- {"namespace":"debug","name":"debug_traceBlockByHash","status":"supported","description":"Traces all transactions in a block by hash and returns per-transaction execution traces.","seiNote":"HTTP-only.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"config","type":"object","description":"Optional tracer config.","example":"{\"tracer\":\"callTracer\"}"}]},
- {"namespace":"debug","name":"debug_traceCall","status":"supported","description":"Executes and traces a call against a block's state without creating a transaction.","seiNote":"HTTP-only. Arbitrary geth tracer names pass through. Tracing on the pending block is not supported.","params":[{"name":"args","type":"object","description":"Transaction call object.","example":"{\"to\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"data\":\"0x70a08231\"}"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"},{"name":"config","type":"object","description":"Optional trace-call config (tracer name, state overrides, block overrides).","example":"{\"tracer\":\"callTracer\"}"}]},
- {"namespace":"debug","name":"debug_traceStateAccess","status":"limited","description":"Sei extension that replays a transaction and returns its app/tendermint/receipt state-access traces.","seiNote":"Sei-specific extension (not part of upstream go-ethereum's debug namespace). HTTP-only and subject to historical-debug-trace availability guards.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash whose state accesses are returned.","example":"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"}]},
- {"namespace":"debug","name":"debug_traceTransactionProfile","status":"limited","description":"Sei extension that traces a transaction and returns the trace plus a phase-by-phase timing profile of the trace execution.","seiNote":"Sei-specific extension (not part of upstream go-ethereum's debug namespace). Returns {trace, profile} where profile carries totalNanos, historicalDbLookupNanos, otherNanos, and per-phase timings. HTTP-only and subject to the max_trace_lookback_blocks historical guard.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash to trace and profile.","example":"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"},{"name":"config","type":"object","description":"Optional tracer config.","example":"{\"tracer\":\"callTracer\"}"}]},
- {"namespace":"debug","name":"debug_getRawHeader","status":"unsupported","description":"RLP-encoded block header. Registered but always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000. Sei block headers are CometBFT headers, not RLP-encoded Ethereum headers.","params":[{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
- {"namespace":"debug","name":"debug_getRawBlock","status":"unsupported","description":"RLP-encoded full block. Registered but always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000; no canonical RLP-encoded Ethereum block exists on Sei.","params":[{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
- {"namespace":"debug","name":"debug_getRawReceipts","status":"unsupported","description":"RLP-encoded receipts for a block. Registered but always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000.","params":[{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
- {"namespace":"debug","name":"debug_getRawTransaction","status":"unsupported","description":"RLP-encoded signed transaction by hash. Registered but always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"}]},
- {"namespace":"debug","name":"debug_storageRangeAt","status":"unsupported","description":"Range of storage entries for a contract at a block/tx. Not implemented on Sei.","seiNote":"Not registered; returns -32601. Sei uses IAVL state, not an Ethereum MPT, so geth's MPT-based storage-range walk is not provided.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"txIndex","type":"QUANTITY","description":"Transaction index.","example":"0x0"},{"name":"address","type":"DATA, 20 bytes","description":"Contract address.","example":"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7"},{"name":"startKey","type":"DATA","description":"Start storage key.","example":"0x00"},{"name":"maxResult","type":"QUANTITY","description":"Maximum number of entries.","example":"0x64"}]},
- {"namespace":"debug","name":"debug_traceBlock","status":"unsupported","description":"Trace a block supplied as raw RLP bytes. Not implemented on Sei.","seiNote":"Not registered; returns -32601. Sei does not accept RLP-encoded Ethereum blocks; use debug_traceBlockByNumber/ByHash instead.","params":[{"name":"blockRlp","type":"DATA","description":"RLP-encoded block bytes.","example":"0xf90211..."}]},
- {"namespace":"debug","name":"debug_intermediateRoots","status":"unsupported","description":"Intermediate state roots while executing a block. Not implemented on Sei.","seiNote":"Not registered; returns -32601. Sei uses IAVL state, not an Ethereum MPT, so per-transaction MPT intermediate roots are not produced.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"config","type":"object","description":"Optional trace config.","example":"{}"}]},
- {"namespace":"debug","name":"debug_setHead","status":"unsupported","description":"Rewind the chain head to a given block. Not implemented on Sei.","seiNote":"Not registered; returns -32601. The chain head is controlled by CometBFT consensus, not the EVM RPC layer.","params":[{"name":"number","type":"QUANTITY","description":"Block number to set as head.","example":"0x1a2b3c"}]},
- {"namespace":"sei","name":"sei_getSeiAddress","status":"limited","description":"Returns the native Sei bech32 (sei1...) address associated with a given EVM (0x) address.","seiNote":"Deprecated legacy sei_* method, but ENABLED by default in the enabled_legacy_sei_apis allowlist on seid init. New integrations should call the addr precompile at 0x0000000000000000000000000000000000001004 (getSeiAddr) via eth_call. Errors if the address is not yet associated. HTTP-only.","params":[{"name":"ethAddress","type":"DATA, 20 bytes","description":"The EVM address to resolve.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"}]},
- {"namespace":"sei","name":"sei_getEVMAddress","status":"limited","description":"Returns the EVM (0x) address associated with a given native Sei bech32 (sei1...) address.","seiNote":"Deprecated legacy sei_* method, ENABLED by default in enabled_legacy_sei_apis. Prefer the addr precompile at 0x0000000000000000000000000000000000001004 (getEvmAddr) via eth_call. Errors if the bech32 is malformed or the address is not yet associated. HTTP-only.","params":[{"name":"seiAddress","type":"string","description":"The Sei bech32 address to resolve.","example":"sei13ytysxs88z0fp9cssagg77ekpecrrlrwce9pwl"}]},
- {"namespace":"sei","name":"sei_getCosmosTx","status":"limited","description":"Returns the underlying CometBFT/Cosmos transaction hash corresponding to a given EVM transaction hash.","seiNote":"Deprecated legacy sei_* method, but ENABLED by default in enabled_legacy_sei_apis (it has no precompile equivalent yet). Returns the wrapping Cosmos transaction hash as uppercase hexadecimal without a 0x prefix. HTTP-only.","params":[{"name":"ethHash","type":"DATA, 32 bytes","description":"The EVM transaction hash to map to its underlying Cosmos tx hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
- {"namespace":"sei","name":"sei_getTransactionReceipt","status":"limited","description":"Returns a transaction receipt by hash, including synthetic receipts for Cosmos transactions.","seiNote":"Deprecated legacy sei_* method, DISABLED by default. It can retrieve logs for a synthetic transaction when its hash is already known. HTTP-only.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
- {"namespace":"admin","name":"admin_*","status":"unsupported","description":"Geth node administration namespace (admin_nodeInfo, admin_peers, admin_addPeer, admin_datadir, etc.). Not run by Sei.","seiNote":"Sei does not run go-ethereum's admin namespace; node administration is via the CometBFT/Cosmos stack. All admin_* methods return -32601 method not found."},
- {"namespace":"miner","name":"miner_*","status":"unsupported","description":"Geth miner-control namespace (miner_start, miner_stop, miner_setEtherbase, miner_setGasPrice, etc.). Not run by Sei.","seiNote":"Sei has no PoW/PoA miner (CometBFT PoS consensus); the namespace is not served. All miner_* methods return -32601."},
- {"namespace":"clique","name":"clique_*","status":"unsupported","description":"Clique proof-of-authority consensus namespace (clique_getSnapshot, clique_propose, etc.). Not run by Sei.","seiNote":"Sei uses CometBFT, not the Clique PoA engine; the namespace is not served. All clique_* methods return -32601."},
- {"namespace":"engine","name":"engine_*","status":"unsupported","description":"Ethereum Engine API namespace (engine_newPayloadV*, engine_forkchoiceUpdatedV*, engine_getPayloadV*) for consensus/execution-layer payload exchange. Not run by Sei.","seiNote":"Sei is not a post-merge Ethereum execution client; there is no CL/EL split or payload engine (consensus is CometBFT). All engine_* methods return -32601."},
- {"namespace":"les","name":"les_*","status":"unsupported","description":"Light Ethereum Subprotocol (LES) light-server namespace. Not run by Sei.","seiNote":"Sei does not implement LES light-server endpoints; the namespace is not served. All les_* methods return -32601."},
- {"namespace":"personal","name":"personal_*","status":"unsupported","description":"Geth account-management namespace (personal_newAccount, personal_unlockAccount, personal_sendTransaction, personal_sign, etc.). Not run by Sei.","seiNote":"Sei does not expose the deprecated personal namespace; hosted RPC nodes hold no user keys. Key management/signing is client-side and eth_sendRawTransaction is the supported path. All personal_* methods return -32601."}
+ {"namespace":"eth","name":"eth_getLogs","status":"supported","description":"Returns logs matching the given filter criteria.","seiNote":"Returns EVM logs only. Hard limits: a maximum of 2,000 blocks per close-ended query and up to 10,000 logs per response. A query that exceeds the range returns the error 'block range too large'. Large queries are globally rate-limited.","params":[{"name":"crit","type":"object","description":"Filter criteria: fromBlock, toBlock (or blockHash), address(es), topics.","example":"{\"fromBlock\":\"0x0\",\"toBlock\":\"latest\",\"address\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"topics\":[]}"}]},
+ {"namespace":"eth","name":"eth_uninstallFilter","status":"supported","description":"Removes a previously installed filter by ID. Returns true if the filter existed and was removed.","seiNote":"Returns false instead of an error if the filter did not exist. Filters also expire automatically when they are not polled.","params":[{"name":"filterID","type":"QUANTITY/ID","description":"Filter ID to remove.","example":"0x1"}]},
+ {"namespace":"eth","name":"eth_subscribe","status":"limited","description":"Opens a WebSocket-only push subscription for newHeads or logs notifications.","seiNote":"This method works over WebSocket only. SubscriptionAPI is not registered on the HTTP server, so calls over HTTP return rpc.ErrNotificationsUnsupported. Only 'newHeads' and 'logs' are implemented in source. There is no 'newPendingTransactions' subscription, although some client docs imply otherwise. MaxSubscriptionsNewHead caps newHeads subscriptions.","params":[{"name":"subscriptionType","type":"string","description":"Subscription name: 'newHeads' or 'logs'.","example":"newHeads"},{"name":"filter","type":"object","description":"Optional filter criteria (address and topics) for the 'logs' subscription.","example":"{\"address\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"topics\":[]}"}]},
+ {"namespace":"eth","name":"eth_unsubscribe","status":"supported","description":"Cancels an existing WebSocket subscription by ID. Returns true on success.","seiNote":"This method works over WebSocket only. It has no effect over HTTP, where notifications are not supported.","params":[{"name":"subscriptionID","type":"string","description":"The subscription ID returned by a prior eth_subscribe call.","example":"0x9cef478923ff08bf67fde6c64013158d"}]},
+ {"namespace":"eth","name":"eth_mining","status":"unsupported","description":"Returns whether the node is mining. Sei does not register this method.","seiNote":"Sei uses CometBFT proof-of-stake consensus with no PoW mining. The method is not registered and returns -32601 method not found."},
+ {"namespace":"eth","name":"eth_hashrate","status":"unsupported","description":"Returns the node mining hashrate. Sei does not register this method.","seiNote":"Sei has no PoW mining (CometBFT consensus). The method is not registered and returns -32601 method not found."},
+ {"namespace":"eth","name":"eth_getWork","status":"unsupported","description":"Returns the PoW work package (current header hash, seed, target). Sei does not register this method.","seiNote":"The proof-of-work concept does not exist under Sei's CometBFT consensus. The method is not registered."},
+ {"namespace":"eth","name":"eth_submitWork","status":"unsupported","description":"Submits a PoW solution. Sei does not register this method.","seiNote":"PoW submission is meaningless on Sei (CometBFT PoS). The method is not registered.","params":[{"name":"nonce","type":"DATA, 8 bytes","description":"Found PoW nonce.","example":"0x0000000000000001"},{"name":"powHash","type":"DATA, 32 bytes","description":"Header pow-hash.","example":"0x0000000000000000000000000000000000000000000000000000000000000000"},{"name":"mixDigest","type":"DATA, 32 bytes","description":"Mix digest.","example":"0x0000000000000000000000000000000000000000000000000000000000000000"}]},
+ {"namespace":"eth","name":"eth_submitHashrate","status":"unsupported","description":"Submits a node's mining hashrate. Sei does not register this method.","seiNote":"Sei has no PoW mining. The method is not registered.","params":[{"name":"hashrate","type":"QUANTITY","description":"Hashrate value (hex).","example":"0x500000"},{"name":"id","type":"DATA, 32 bytes","description":"Random hex ID that identifies the client.","example":"0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"}]},
+ {"namespace":"eth","name":"eth_protocolVersion","status":"unsupported","description":"Returns the Ethereum (devp2p) protocol version. Sei does not register this method.","seiNote":"Sei does not expose the Ethereum devp2p protocol version. The method is not registered and returns -32601 method not found."},
+ {"namespace":"eth","name":"eth_getUncleCountByBlockNumber","status":"unsupported","description":"Returns the uncle count by block number. Sei has no uncles and does not register this method.","seiNote":"Sei uses CometBFT (single canonical chain, no uncles or ommers). The method is not registered and returns -32601.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"}]},
+ {"namespace":"eth","name":"eth_getUncleCountByBlockHash","status":"unsupported","description":"Returns the uncle count by block hash. Sei has no uncles and does not register this method.","seiNote":"CometBFT consensus has no uncle blocks. The method is not registered and returns -32601.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"}]},
+ {"namespace":"eth","name":"eth_getUncleByBlockNumberAndIndex","status":"unsupported","description":"Returns an uncle block by number and index. Sei has no uncles and does not register this method.","seiNote":"CometBFT consensus has no uncle blocks. The method is not registered and returns -32601.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"},{"name":"index","type":"QUANTITY","description":"Uncle index.","example":"0x0"}]},
+ {"namespace":"eth","name":"eth_getUncleByBlockHashAndIndex","status":"unsupported","description":"Returns an uncle block by hash and index. Sei has no uncles and does not register this method.","seiNote":"CometBFT consensus has no uncle blocks. The method is not registered and returns -32601.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"index","type":"QUANTITY","description":"Uncle index.","example":"0x0"}]},
+ {"namespace":"eth","name":"eth_pendingTransactions","status":"unsupported","description":"Lists the pending transactions in the node's transaction pool. Sei does not register this method.","seiNote":"Sei exposes no geth-style mempool through this method. Pending state is exposed only through the 'pending' tag on eth_getTransactionCount and through txpool_content. The method is not registered and returns -32601."},
+ {"namespace":"net","name":"net_version","status":"supported","description":"Returns the network or chain ID as a decimal string.","seiNote":"Returns the EVM chain ID in decimal (alias of eth_chainId): '1329' on Sei Mainnet and '1328' on Sei Testnet."},
+ {"namespace":"net","name":"net_listening","status":"unsupported","description":"Returns whether the node is listening for connections. Sei does not register this method.","seiNote":"The method is not registered on Sei's NetAPI and returns -32601 method not found. CometBFT handles P2P, not this RPC."},
+ {"namespace":"net","name":"net_peerCount","status":"unsupported","description":"Returns the number of connected peers. Sei does not register this method.","seiNote":"The method is not registered on Sei's NetAPI and returns -32601. Query CometBFT net_info for peer data instead."},
+ {"namespace":"web3","name":"web3_clientVersion","status":"supported","description":"Returns the client version string.","seiNote":"Reports a synthetic 'Geth/-/' string (Sei's EVM is backed by go-ethereum). It does NOT embed the actual sei-chain/seid version, so it is not a reliable Sei version indicator."},
+ {"namespace":"web3","name":"web3_sha3","status":"unsupported","description":"Returns the Keccak-256 hash of the input. Sei's Web3API does not implement this method.","seiNote":"Unlike go-ethereum, Sei's Web3API does not implement web3_sha3. It is not registered and returns -32601 method not found.","params":[{"name":"data","type":"DATA","description":"Bytes to hash.","example":"0x68656c6c6f20776f726c64"}]},
+ {"namespace":"txpool","name":"txpool_content","status":"limited","description":"Returns the transactions currently in the pool, grouped by sender address and nonce into pending and queued buckets.","seiNote":"As a Sei-specific simplification, every unconfirmed EVM tx from the CometBFT mempool is reported under 'pending'. The 'queued' bucket is always empty (no geth-style nonce-gap distinction between pending and queued). The result set is truncated to the node's MaxTxPoolTxs config, so it may not reflect the entire mempool."},
+ {"namespace":"txpool","name":"txpool_contentFrom","status":"unsupported","description":"Returns the pending and queued transactions for a single account. Sei does not implement this method.","seiNote":"The method is not registered and returns -32601 method not found. The only txpool method available on Sei is txpool_content.","params":[{"name":"address","type":"DATA, 20 bytes","description":"The account address to filter by.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"}]},
+ {"namespace":"txpool","name":"txpool_status","status":"unsupported","description":"Returns the counts of pending and queued transactions. Sei does not implement this method.","seiNote":"The method is not registered and returns -32601 method not found."},
+ {"namespace":"txpool","name":"txpool_inspect","status":"unsupported","description":"Returns a human-readable summary of pending and queued transactions. Sei does not implement this method.","seiNote":"The method is not registered and returns -32601 method not found."},
+ {"namespace":"debug","name":"debug_traceTransaction","status":"supported","description":"Replays a transaction by hash and returns an execution trace using the configured tracer.","seiNote":"Works over HTTP only (the debug namespace is not registered on the WebSocket server). Supports geth tracers (callTracer, prestateTracer, flatCallTracer, struct or opcode logger). TraceBaker pre-bakes and caches callTracer, prestateTracer, and flatCallTracer results. Requires trace-enabled or archive state for the target height.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash to trace.","example":"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"},{"name":"config","type":"object","description":"Optional tracer config (tracer name, tracerConfig, timeout, reexec, disableStorage/Stack/Memory).","example":"{\"tracer\":\"callTracer\"}"}]},
+ {"namespace":"debug","name":"debug_traceBlockByNumber","status":"supported","description":"Traces all transactions in a block by number and returns per-transaction execution traces.","seiNote":"Works over HTTP only. The safe, finalized, and latest tags are equivalent because of instant finality.","params":[{"name":"number","type":"BLOCKNUMBER","description":"Block number or tag.","example":"latest"},{"name":"config","type":"object","description":"Optional tracer config.","example":"{\"tracer\":\"callTracer\"}"}]},
+ {"namespace":"debug","name":"debug_traceBlockByHash","status":"supported","description":"Traces all transactions in a block by hash and returns per-transaction execution traces.","seiNote":"Works over HTTP only.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"config","type":"object","description":"Optional tracer config.","example":"{\"tracer\":\"callTracer\"}"}]},
+ {"namespace":"debug","name":"debug_traceCall","status":"supported","description":"Executes and traces a call against a block's state without creating a transaction.","seiNote":"Works over HTTP only. Arbitrary geth tracer names pass through. Tracing on the pending block is not supported.","params":[{"name":"args","type":"object","description":"Transaction call object.","example":"{\"to\":\"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7\",\"data\":\"0x70a08231\"}"},{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"},{"name":"config","type":"object","description":"Optional trace-call config (tracer name, state overrides, block overrides).","example":"{\"tracer\":\"callTracer\"}"}]},
+ {"namespace":"debug","name":"debug_traceStateAccess","status":"limited","description":"Sei extension that replays a transaction and returns its app, tendermint, and receipt state-access traces.","seiNote":"This is a Sei-specific extension (not part of upstream go-ethereum's debug namespace). It works over HTTP only and is subject to historical-debug-trace availability guards.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash whose state accesses are returned.","example":"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"}]},
+ {"namespace":"debug","name":"debug_traceTransactionProfile","status":"limited","description":"Sei extension that traces a transaction and returns the trace plus a phase-by-phase timing profile of the trace execution.","seiNote":"This is a Sei-specific extension (not part of upstream go-ethereum's debug namespace). Returns {trace, profile}, where profile carries totalNanos, historicalDbLookupNanos, otherNanos, and per-phase timings. It works over HTTP only and is subject to the max_trace_lookback_blocks historical guard.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash to trace and profile.","example":"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"},{"name":"config","type":"object","description":"Optional tracer config.","example":"{\"tracer\":\"callTracer\"}"}]},
+ {"namespace":"debug","name":"debug_getRawHeader","status":"unsupported","description":"Returns the RLP-encoded block header. Sei registers this method, but it always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000. Sei block headers are CometBFT headers, not RLP-encoded Ethereum headers.","params":[{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
+ {"namespace":"debug","name":"debug_getRawBlock","status":"unsupported","description":"Returns the RLP-encoded full block. Sei registers this method, but it always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000. No canonical RLP-encoded Ethereum block exists on Sei.","params":[{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
+ {"namespace":"debug","name":"debug_getRawReceipts","status":"unsupported","description":"Returns the RLP-encoded receipts for a block. Sei registers this method, but it always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000.","params":[{"name":"blockNrOrHash","type":"BLOCKNUMBER or DATA","description":"Block number, tag, or hash.","example":"latest"}]},
+ {"namespace":"debug","name":"debug_getRawTransaction","status":"unsupported","description":"Returns an RLP-encoded signed transaction by hash. Sei registers this method, but it always returns an unsupported error.","seiNote":"Always returns JSON-RPC -32000.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"}]},
+ {"namespace":"debug","name":"debug_storageRangeAt","status":"unsupported","description":"Returns a range of storage entries for a contract at a block or tx. Sei does not implement this method.","seiNote":"The method is not registered and returns -32601. Sei uses IAVL state, not an Ethereum MPT, so geth's MPT-based storage-range walk is not available.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"txIndex","type":"QUANTITY","description":"Transaction index.","example":"0x0"},{"name":"address","type":"DATA, 20 bytes","description":"Contract address.","example":"0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7"},{"name":"startKey","type":"DATA","description":"Start storage key.","example":"0x00"},{"name":"maxResult","type":"QUANTITY","description":"Maximum number of entries.","example":"0x64"}]},
+ {"namespace":"debug","name":"debug_traceBlock","status":"unsupported","description":"Traces a block supplied as raw RLP bytes. Sei does not implement this method.","seiNote":"The method is not registered and returns -32601. Sei does not accept RLP-encoded Ethereum blocks. Use debug_traceBlockByNumber or debug_traceBlockByHash instead.","params":[{"name":"blockRlp","type":"DATA","description":"RLP-encoded block bytes.","example":"0xf90211..."}]},
+ {"namespace":"debug","name":"debug_intermediateRoots","status":"unsupported","description":"Returns the intermediate state roots while a block executes. Sei does not implement this method.","seiNote":"The method is not registered and returns -32601. Sei uses IAVL state, not an Ethereum MPT, so it does not produce per-transaction MPT intermediate roots.","params":[{"name":"blockHash","type":"DATA, 32 bytes","description":"Block hash.","example":"0x5620c15afd9a1d0ab19d7560043df6e038d731c6205974dca7a55900071e3864"},{"name":"config","type":"object","description":"Optional trace config.","example":"{}"}]},
+ {"namespace":"debug","name":"debug_setHead","status":"unsupported","description":"Rewinds the chain head to a given block. Sei does not implement this method.","seiNote":"The method is not registered and returns -32601. CometBFT consensus controls the chain head, not the EVM RPC layer.","params":[{"name":"number","type":"QUANTITY","description":"Block number to set as head.","example":"0x1a2b3c"}]},
+ {"namespace":"sei","name":"sei_getSeiAddress","status":"limited","description":"Returns the native Sei bech32 (sei1...) address associated with a given EVM (0x) address.","seiNote":"This legacy sei_* method is deprecated but ENABLED by default in the enabled_legacy_sei_apis allowlist on seid init. New integrations should call the addr precompile at 0x0000000000000000000000000000000000001004 (getSeiAddr) with eth_call. Returns an error if the address is not yet associated. Works over HTTP only.","params":[{"name":"ethAddress","type":"DATA, 20 bytes","description":"The EVM address to resolve.","example":"0xDa52B9E673d1f48FcD9916b3F606A136a8eA5e55"}]},
+ {"namespace":"sei","name":"sei_getEVMAddress","status":"limited","description":"Returns the EVM (0x) address associated with a given native Sei bech32 (sei1...) address.","seiNote":"This legacy sei_* method is deprecated but ENABLED by default in enabled_legacy_sei_apis. Prefer the addr precompile at 0x0000000000000000000000000000000000001004 (getEvmAddr) with eth_call. Returns an error if the bech32 is malformed or the address is not yet associated. Works over HTTP only.","params":[{"name":"seiAddress","type":"string","description":"The Sei bech32 address to resolve.","example":"sei13ytysxs88z0fp9cssagg77ekpecrrlrwce9pwl"}]},
+ {"namespace":"sei","name":"sei_getCosmosTx","status":"limited","description":"Returns the underlying CometBFT/Cosmos transaction hash corresponding to a given EVM transaction hash.","seiNote":"This legacy sei_* method is deprecated but ENABLED by default in enabled_legacy_sei_apis (it has no precompile equivalent yet). Returns the wrapping Cosmos transaction hash as uppercase hexadecimal without a 0x prefix. Works over HTTP only.","params":[{"name":"ethHash","type":"DATA, 32 bytes","description":"The EVM transaction hash to map to its underlying Cosmos tx hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
+ {"namespace":"sei","name":"sei_getTransactionReceipt","status":"limited","description":"Returns a transaction receipt by hash, including synthetic receipts for Cosmos transactions.","seiNote":"This legacy sei_* method is deprecated and DISABLED by default. It can get logs for a synthetic transaction when its hash is already known. Works over HTTP only.","params":[{"name":"hash","type":"DATA, 32 bytes","description":"Transaction hash.","example":"0x828c91592453fe7c5bf743204495a35bf02b67b579b8f59ee7eea8af031d7c14"}]},
+ {"namespace":"admin","name":"admin_*","status":"unsupported","description":"Geth node administration namespace (admin_nodeInfo, admin_peers, admin_addPeer, admin_datadir, and others). Sei does not run this namespace.","seiNote":"Sei does not run go-ethereum's admin namespace. Node administration goes through the CometBFT/Cosmos stack. All admin_* methods return -32601 method not found."},
+ {"namespace":"miner","name":"miner_*","status":"unsupported","description":"Geth miner-control namespace (miner_start, miner_stop, miner_setEtherbase, miner_setGasPrice, and others). Sei does not run this namespace.","seiNote":"Sei has no PoW or PoA miner (CometBFT PoS consensus) and does not serve the namespace. All miner_* methods return -32601."},
+ {"namespace":"clique","name":"clique_*","status":"unsupported","description":"Clique proof-of-authority consensus namespace (clique_getSnapshot, clique_propose, and others). Sei does not run this namespace.","seiNote":"Sei uses CometBFT, not the Clique PoA engine, and does not serve the namespace. All clique_* methods return -32601."},
+ {"namespace":"engine","name":"engine_*","status":"unsupported","description":"Ethereum Engine API namespace (engine_newPayloadV*, engine_forkchoiceUpdatedV*, engine_getPayloadV*) for payload exchange between the consensus and execution layers. Sei does not run this namespace.","seiNote":"Sei is not a post-merge Ethereum execution client. It has no CL/EL split or payload engine (consensus is CometBFT). All engine_* methods return -32601."},
+ {"namespace":"les","name":"les_*","status":"unsupported","description":"Light Ethereum Subprotocol (LES) light-server namespace. Sei does not run this namespace.","seiNote":"Sei does not implement LES light-server endpoints and does not serve the namespace. All les_* methods return -32601."},
+ {"namespace":"personal","name":"personal_*","status":"unsupported","description":"Geth account-management namespace (personal_newAccount, personal_unlockAccount, personal_sendTransaction, personal_sign, and others). Sei does not run this namespace.","seiNote":"Sei does not expose the deprecated personal namespace. Hosted RPC nodes hold no user keys. Key management and signing happen client-side, and eth_sendRawTransaction is the supported path. All personal_* methods return -32601."}
];
const parseValue = (raw) => {
@@ -350,7 +350,7 @@ const isMutation = (name) => name === 'eth_sendRawTransaction' || name === 'eth_
const json = await res.json();
if (runId === runIdRef.current) setRequestResult(json);
} catch (e) {
- if (runId === runIdRef.current) setRequestResult({ error: { code: -1, message: e.message + ' (the endpoint may not allow browser requests / CORS)' } });
+ if (runId === runIdRef.current) setRequestResult({ error: { code: -1, message: e.message + ' (the endpoint may not allow CORS requests from a browser)' } });
} finally {
if (runId === runIdRef.current) setIsLoading(false);
}
@@ -909,7 +909,7 @@ const isMutation = (name) => name === 'eth_sendRawTransaction' || name === 'eth_
{mMeta.deprecated && (
- Deprecated. The {m.namespace}_* surface is scheduled for removal and is gated by enabled_legacy_sei_apis in app.toml. Prefer standard eth_*/debug_* methods for new integrations.
+ Deprecated. The {m.namespace}_* namespace is scheduled for removal. The enabled_legacy_sei_apis setting in app.toml controls access to it. Prefer standard eth_* and debug_* methods for new integrations.
- This is a WebSocket subscription method. Connect to {wsEndpoint} and send the payload below — edit the parameters to customize the subscription.
- {network === 'custom' && ' This URL is derived from your HTTP endpoint as a best guess; Sei serves WebSocket on a separate host (evm-ws…) from HTTP (evm-rpc…), so replace it with your node’s actual WebSocket endpoint if they differ.'}
+ This is a WebSocket subscription method. Connect to {wsEndpoint} and send the payload below. To customize the subscription, edit the parameters.
+ {network === 'custom' && ' This URL is a best guess, derived from your HTTP endpoint. Sei serves WebSocket on a separate host (evm-ws…) from HTTP (evm-rpc…). If this URL differs from the actual WebSocket endpoint of your node, replace it.'}
- This is a state-changing / signing method. Public RPC nodes hold no keys, so it generally errors unless you supply a signed payload.
+ This is a state-changing or signing method. Public RPC nodes hold no keys, so it generally returns an error unless you supply a signed payload.
- Could not reach the SIPs repository. Browse the proposals directly at{' '}
+ This page could not reach the SIPs repository. Browse the proposals directly at{' '}
{
))}