Skip to Content
EVMMigrate from Other EVMs

How to migrate to Sei from another EVM chain

Sei offers full EVM bytecode compatibility plus near-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.

Why Migrate to Sei?

  • 400ms block times – 30× faster than Ethereum, 2-5× faster than most L2s
  • ~100 MGas/s throughput – 33× higher than Ethereum mainnet
  • Instant finality – No waiting for confirmations or safe/finalized states
  • Parallelized execution – Higher throughput without code changes
  • Full EVM compatibility – Deploy your existing Solidity contracts unchanged

Chain Comparison Overview

Before diving into migration steps, understand how Sei compares to your source chain:

FeatureSeiEthereumArbitrumBasePolygon PoSAvalanche C-Chain
Chain ID1329142161845313743114
Block Time400 ms~12 s~250 ms~2 s~2 s~2 s
FinalityInstant~15 min (finalized)~7 days (L1 settlement)~7 days (L1 settlement)~2 min (256 blocks)~1 s
Gas Limit10M~36M32M~30M~30M15M
Native TokenSEIETHETHETHPOL (MATIC)AVAX
Parallel ExecutionYesNoNoNoNoNo
Base Fee BurnNo (100% to validators)Yes (EIP-1559)YesYesYesYes
EVM VersionPectra (w/o blobs)PectraCancunCancunShanghaiDurango

Chain-Specific Migration Guides

Select your source chain to see specific migration considerations:

Migrating from Ethereum Mainnet

Key Differences:

AspectEthereumSeiMigration Impact
Block time~12 seconds400 msReduce deadline buffers in DEX swaps by 30×
Finality~15 min for finalizedInstantRemove confirmation polling logic
Gas limit~36M per block10M per blockSplit large batch deployments
Fee modelEIP-1559 with burnDynamic, no burnUpdate fee estimation UIs
Pending stateYesNoRemove pending transaction logic

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).

  2. Confirmation requirements: Remove any logic that waits for multiple confirmations or checks “safe” vs “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.

  4. Fee UI: Simplify your frontend—you can use a single gasPrice input instead of maxFeePerGas / maxPriorityFeePerGas.

// Before (Ethereum EIP-1559) const tx = await contract.method({ maxFeePerGas: ethers.parseUnits('50', 'gwei'), maxPriorityFeePerGas: ethers.parseUnits('2', 'gwei') }); // After (Sei - simplified) const tx = await contract.method({ gasPrice: ethers.parseUnits('0.1', 'gwei') // Sei has much lower fees });
  1. 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.

Step 1: Evaluate Compatibility

Revisit the Divergence from Ethereum doc and confirm every assumption your contracts/frontends make still holds.

DimensionSei EVMPractical Effect
Block time400 msFaster TX inclusion → smaller deadline buffers and quicker price oracles
FinalityInstantNo separate “safe/latest” commitment levels to poll
Gas limit10M gas + 21 MB byte limitBatch contract deployments by 10M gas blocks
Base feeDynamic but never burnedValidators receive 100% of fees
ExecutionParallelized EVMNo changes to your Solidity code are necessary
Address formatDual (0x + sei1…)Same private key derives both addresses

Features Requiring 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

Step 2: Prepare Your Development Environment

Add Sei Network Configuration

Hardhat Configuration:

hardhat.config.ts
import '@nomicfoundation/hardhat-verify'; const config = { networks: { seiMainnet: { url: process.env.SEI_MAINNET_RPC ?? 'https://evm-rpc.sei-apis.com', chainId: 1329, accounts: process.env.DEPLOYER_KEYS?.split(',') ?? [] }, seiTestnet: { url: process.env.SEI_TESTNET_RPC ?? 'https://evm-rpc-testnet.sei-apis.com', chainId: 1328, accounts: process.env.DEPLOYER_KEYS?.split(',') ?? [] } }, etherscan: { apiKey: { seiMainnet: 'dummy', // Seitrace doesn't require real API key seiTestnet: 'dummy' }, customChains: [ { network: 'seiMainnet', chainId: 1329, urls: { apiURL: 'https://seitrace.com/pacific-1/api', browserURL: 'https://seitrace.com' } }, { network: 'seiTestnet', chainId: 1328, urls: { apiURL: 'https://seitrace.com/atlantic-2/api', browserURL: 'https://seitrace.com' } } ] } }; export default config;

Foundry Configuration:

foundry.toml
[profile.default] src = "src" out = "out" libs = ["lib"] [rpc_endpoints] sei_mainnet = "https://evm-rpc.sei-apis.com" sei_testnet = "https://evm-rpc-testnet.sei-apis.com" [etherscan] sei_mainnet = { key = "dummy", url = "https://seitrace.com/pacific-1/api", chain = 1329 } sei_testnet = { key = "dummy", url = "https://seitrace.com/atlantic-2/api", chain = 1328 }

See the Hardhat tutorial and Foundry guide for complete setup instructions.

Wallet Configuration

Pre-configure MetaMask or other wallets with Sei chain params:

const seiMainnet = { chainId: '0x531', // 1329 chainName: 'Sei', nativeCurrency: { name: 'Sei', symbol: 'SEI', decimals: 18 }, rpcUrls: ['https://evm-rpc.sei-apis.com'], blockExplorerUrls: ['https://seitrace.com'] }; await window.ethereum.request({ method: 'wallet_addEthereumChain', params: [seiMainnet] });

Step 3: Bootstrap Common Infrastructure

Sei already exposes canonical helper contracts—reference them instead of redeploying:

ComponentAddressNotes
Permit20xB952578f3520EE8Ea45b7914994dcf4702cEe578Shared allowance manager for DEX and wallet flows
Multicall30xcA11bde05977b3631167028862bE2a173976CA11Enables batching and view aggregation
ImmutableCreate2Factory0x0000000000FFe8B47B3e2130213B802212439497Deterministic deployments with CREATE2
SingletonFactory0xce0042B868300000d44A59004Da54A005ffdcf9fEIP-2470 singleton factory

For third-party contracts (LayerZero, Safe, etc.), consult the full Ecosystem Contracts page.

Step 4: Port Contracts and Configuration

Parameterize Chain-Specific Constants

// Example: Chain-aware deadline calculation function getDeadline(uint256 secondsFromNow) internal view returns (uint256) { if (block.chainid == 1329) { // Sei mainnet // ~2.5 blocks per second on Sei return block.timestamp + secondsFromNow; } else if (block.chainid == 1) { // Ethereum // ~1 block per 12 seconds on Ethereum return block.timestamp + secondsFromNow; } return block.timestamp + secondsFromNow; }

Adjust Gas and Size Assumptions

  • Keep gasLimit buffers modest but ensure calldata stays under 21 MB
  • Sei’s 10M gas limit per block means large deployments may need batching

Refactor Deprecated Patterns

// Before: SELFDESTRUCT (deprecated) function destroy() external onlyOwner { selfdestruct(payable(owner)); } // After: Soft close pattern bool public closed; function close() external onlyOwner { closed = true; // Transfer remaining funds payable(owner).transfer(address(this).balance); } modifier notClosed() { require(!closed, "Contract is closed"); _; }

Step 5: Plan Bridging and Cross-Chain Connectivity

LayerZero V2

Sei’s LayerZero Endpoint ID is 30280. See the complete LayerZero integration guide.

layerzero.config.ts
import { EndpointId } from '@layerzerolabs/lz-definitions'; const seiContract = { eid: EndpointId.SEI_V2_MAINNET, // 30280 contractName: 'MyOFT' };

Other Bridge Options

  • Circle CCTP: For USDC bridging (check availability)
  • IBC: For Cosmos ecosystem assets
  • Pointer contracts: For bridging non-EVM assets—see Pointer Contracts

Step 6: Handle Assets and Oracles

Bridge Canonical Assets

Follow the Bridging guide to move core tokens to Sei.

Oracle Integration

Sei supports multiple oracle solutions:

ProviderUse CaseDocumentation
Sei Native OracleBuilt-in price feeds via precompileOracle Precompile
Pyth NetworkHigh-frequency price feedsPyth Network 
ChainlinkIndustry-standard data feedsChainlink on Sei
RedStoneModular oracle with push modelRedStone on Sei
API3First-party oracle dataAPI3 on Sei
TWAP Adjustments: Because Sei blocks arrive ~30× faster than Ethereum, shorten your TWAP observation windows to maintain comparable time-weighted calculations.

Step 7: Launch Checklist

Testnet Deployment (atlantic-2)

  • Deploy all contracts to testnet (chain ID: 1328)
  • Run full integration test suite
  • Verify contracts via Seitrace
  • Test wallet connections and transaction flows
  • Validate oracle integrations
  • Test cross-chain messaging if applicable

Mainnet Deployment (pacific-1)

  • Deploy contracts to mainnet (chain ID: 1329)
  • Re-run smoke tests
  • Verify all contracts on Seitrace
  • Update frontend configurations
  • Prepare user migration documentation
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.

Step 8: Operational Readiness

Contract Verification

Automate verification through CI using the Seitrace APIs:

# Foundry verification forge verify-contract --watch \ --compiler-version "0.8.22" \ --verifier blockscout \ --verifier-url https://seitrace.com/pacific-1/api \ --etherscan-api-key dummy \ --chain-id 1329 \ <CONTRACT_ADDRESS> \ <CONTRACT_NAME>

RPC and Indexer Health

  • 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

Monitoring Gas Parameters

Periodically query fee data to keep dashboards aligned:

// Monitor current gas prices const feeHistory = await provider.send('eth_feeHistory', ['0x5', 'latest', []]); const gasPrice = await provider.getGasPrice();

Example: Uniswap V3-Style Deployment

Here’s how to mirror a Uniswap V3 experience on Sei:

  1. Routers & 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
    • Mints new Sei LP positions
    • Include gas estimations tuned for Sei’s 10M block cap
  4. Price Oracles: Reuse TWAP/Chainlink logic but shorten observation windows for Sei’s faster blocks.

  5. Verification: Submit to Seitrace and the Ecosystem Contracts registry.

Helpful References

Last updated on