> ## Documentation Index
> Fetch the complete documentation index at: https://seilabs-docs-evm-cookbook.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Sei Blockchain Network Chains Overview

> Compare Sei's different network environments including testnet, mainnet, and local chains, with detailed chain IDs and purposes for each development stage.

export const AddSeiButton = ({network = 'mainnet', label = 'Add Sei to MetaMask'}) => {
  const SEI_MAINNET_CHAIN_PARAMS = {
    chainId: '0x531',
    chainName: 'Sei Network',
    rpcUrls: ['https://evm-rpc.sei-apis.com'],
    nativeCurrency: {
      name: 'Sei',
      symbol: 'SEI',
      decimals: 18
    },
    blockExplorerUrls: ['https://seiscan.io']
  };
  const SEI_TESTNET_CHAIN_PARAMS = {
    chainId: '0x530',
    chainName: 'Sei Testnet',
    rpcUrls: ['https://evm-rpc-testnet.sei-apis.com'],
    nativeCurrency: {
      name: 'Sei',
      symbol: 'SEI',
      decimals: 18
    },
    blockExplorerUrls: ['https://testnet.seiscan.io']
  };
  const chainParams = network === 'testnet' ? SEI_TESTNET_CHAIN_PARAMS : SEI_MAINNET_CHAIN_PARAMS;
  const [status, setStatus] = useState(null);
  const [isHovered, setIsHovered] = useState(false);
  const [isBusy, setIsBusy] = useState(false);
  const addOrSwitchSeiNetwork = async params => {
    if (typeof window === 'undefined' || !window.ethereum) {
      throw new Error('MetaMask is not installed');
    }
    const ethereum = window.ethereum;
    try {
      await ethereum.request({
        method: 'wallet_switchEthereumChain',
        params: [{
          chainId: params.chainId
        }]
      });
    } catch (switchError) {
      if (switchError && switchError.code === 4902) {
        await ethereum.request({
          method: 'wallet_addEthereumChain',
          params: [params]
        });
      } else {
        throw switchError;
      }
    }
  };
  const onClick = async e => {
    e.preventDefault();
    setIsBusy(true);
    setStatus(null);
    try {
      await addOrSwitchSeiNetwork(chainParams);
      setStatus({
        type: 'success',
        message: `${chainParams.chainName} added or switched.`
      });
    } catch (err) {
      const message = err && err.message ? err.message : 'Failed to add or switch network.';
      setStatus({
        type: 'error',
        message
      });
    } finally {
      setIsBusy(false);
    }
  };
  return <span className="inline-flex flex-col items-start gap-1">
      <button type="button" onClick={onClick} disabled={isBusy} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} className="inline-flex items-center gap-1 px-3 py-1.5 text-white transition-colors min-w-[160px]" style={{
    backgroundColor: isHovered ? 'var(--sei-maroon-200)' : 'var(--sei-maroon-100)',
    color: '#ffffff',
    fontFamily: 'var(--sei-font-mono)',
    textTransform: 'uppercase',
    letterSpacing: '0.04em',
    fontSize: '10px',
    opacity: isBusy ? 0.7 : 1,
    cursor: isBusy ? 'default' : 'pointer'
  }}>
        {isBusy ? 'Adding…' : label}
      </button>
      {status && (status.type === 'error' ? <span className="text-red-600 dark:text-red-400" style={{
    fontSize: '11px'
  }}>
            {status.message}
          </span> : <span className="text-green-700 dark:text-green-400" style={{
    fontSize: '11px'
  }}>
            {status.message}
          </span>)}
    </span>;
};

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.

<Info>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.</Info>

## Mainnet

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`
* **EVM chain ID**: `1329` or `0x531`
* **EVM RPC**: `https://evm-rpc.sei-apis.com`
* **WebSocket**: `wss://evm-ws.sei-apis.com`
* **Explorer**: `https://seiscan.io`

<AddSeiButton network="mainnet" label="Add Sei Mainnet to your wallet" />

## Testnet

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`
* **EVM chain ID**: `1328` or `0x530`
* **EVM RPC**: `https://evm-rpc-testnet.sei-apis.com`
* **WebSocket**: `wss://evm-ws-testnet.sei-apis.com`
* **Explorer**: `https://testnet.seiscan.io`

<AddSeiButton network="testnet" label="Add Sei Testnet to your wallet" />

## Local chains

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 you (default: `sei-chain`)

To learn how to set up and run a local chain, read the
[Nodes Introduction](/node) section.

<Tip>
  For more chain-specific information, RPC endpoints, and explorers, see [Sei EVM networks](/evm/networks).
</Tip>

## Chain registry

The [Sei Chain Registry](https://github.com/sei-protocol/chain-registry)
has more information about each chain.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.