Skip to Content
EVMSei Global Wallet

Sei Global Wallet

🚫
By logging in with Sei Global Wallet, you agree to our Terms of Use

Sei Global Wallet is a cross-application embedded crypto wallet powered by Dynamic Global Wallets. 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.

Additional auth methods such as existing wallet apps (Metamask, ..) are possible through Dynamic, but 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.

Why Use Sei Global Wallet?

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

For Developers:

  • One-Line Integration: Single import enables wallet across all EIP-6963 compatible libraries
  • Zero Configuration: Pre-configured and ready to use
  • Universal Compatibility: Works with RainbowKit, ConnectKit, Web3-React, and more

How to Create a Sei Global Wallet Account

  1. Visit app.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

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.

Dynamic: The infrastructure powering Sei Global Wallet. It handles authentication, key management, and cross-app wallet persistence while keeping wallets non-custodial.

Installation

Install Sei Global Wallet Package:

npm install @sei-js/sei-global-wallet

or

yarn add @sei-js/sei-global-wallet

Import the package to register the wallet:

import '@sei-js/sei-global-wallet/eip6963';
⚠️
Important: Simply 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.

Integration Examples

Below are integration examples for different frameworks and wallet provider libraries to properly integrate the pre-configured Sei Global Wallet package.

RainbowKit Integration

Create a new Vite app:

npm create vite@latest my-sei-dapp -- --template react-ts cd my-sei-dapp

Install Dependencies:

npm install @rainbow-me/rainbowkit wagmi viem @tanstack/react-query @sei-js/sei-global-wallet

Update App.tsx:

import '@rainbow-me/rainbowkit/styles.css'; import '@sei-js/sei-global-wallet/eip6963'; import { ConnectButton, getDefaultConfig, RainbowKitProvider } from '@rainbow-me/rainbowkit'; import { WagmiProvider } from 'wagmi'; import { sei, seiTestnet } from 'wagmi/chains'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { useAccount, useBalance } from 'wagmi'; const config = getDefaultConfig({ appName: 'My Sei dApp', projectId: 'YOUR_WALLETCONNECT_PROJECT_ID', chains: [sei, seiTestnet], ssr: false }); const queryClient = new QueryClient(); function AccountInfo() { const { address, isConnected, chain } = useAccount(); const { data: balance } = useBalance({ address }); if (!isConnected) { return <p>Connect your wallet to see account details</p>; } return ( <div className="account-info"> <h3>Account Information</h3> <p> <strong>Address:</strong> {address} </p> <p> <strong>Network:</strong> {chain?.name} </p> <p> <strong>Balance:</strong> {balance?.formatted} {balance?.symbol} </p> </div> ); } export default function App() { return ( <WagmiProvider config={config}> <QueryClientProvider client={queryClient}> <RainbowKitProvider> <div className="app-container"> <h1>My Sei dApp</h1> <ConnectButton /> <AccountInfo /> </div> </RainbowKitProvider> </QueryClientProvider> </WagmiProvider> ); }

Run Your App:

npm run dev

ConnectKit Integration

Create a new Vite app:

npm create vite@latest my-sei-dapp -- --template react-ts cd my-sei-dapp

Install Dependencies:

npm install connectkit wagmi viem @tanstack/react-query @sei-js/sei-global-wallet

Update App.tsx:

import '@sei-js/sei-global-wallet/eip6963'; import { ConnectKitButton, ConnectKitProvider, getDefaultConfig } from 'connectkit'; import { WagmiProvider, createConfig, http } from 'wagmi'; import { sei, seiTestnet } from 'wagmi/chains'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { useAccount, useBalance } from 'wagmi'; const config = createConfig( getDefaultConfig({ chains: [sei, seiTestnet], transports: { [sei.id]: http(), [seiTestnet.id]: http() }, walletConnectProjectId: 'YOUR_WALLETCONNECT_PROJECT_ID', appName: 'My Sei dApp' }) ); const queryClient = new QueryClient(); function AccountInfo() { const { address, isConnected, chain } = useAccount(); const { data: balance } = useBalance({ address }); if (!isConnected) { return <p>Connect your wallet to see account details</p>; } return ( <div className="account-info"> <h3>Account Information</h3> <p> <strong>Address:</strong> {address} </p> <p> <strong>Network:</strong> {chain?.name} </p> <p> <strong>Balance:</strong> {balance?.formatted} {balance?.symbol} </p> </div> ); } export default function App() { return ( <WagmiProvider config={config}> <QueryClientProvider client={queryClient}> <ConnectKitProvider> <div className="app-container"> <h1>My Sei dApp</h1> <ConnectKitButton /> <AccountInfo /> </div> </ConnectKitProvider> </QueryClientProvider> </WagmiProvider> ); }

Run Your App:

npm run dev

Web3-React v8 Integration

Create a new Vite app:

npm create vite@latest my-sei-dapp -- --template react-ts cd my-sei-dapp

Install Dependencies:

npm install @web3-react/core @web3-react/eip1193 @web3-react/types @sei-js/sei-global-wallet

Update App.tsx:

import '@sei-js/sei-global-wallet/eip6963'; import React, { useEffect, useState } from 'react'; import { Web3ReactProvider, initializeConnector } from '@web3-react/core'; import { EIP1193 } from '@web3-react/eip1193'; interface EIP6963ProviderInfo { uuid: string; name: string; icon: string; rdns: string; } interface EIP6963ProviderDetail { info: EIP6963ProviderInfo; provider: any; } function findSeiGlobalWallet(): any { if (typeof window === 'undefined') return null; const providers = new Map<string, EIP6963ProviderDetail>(); const handleProviderAnnouncement = (event: Event) => { const customEvent = event as CustomEvent<EIP6963ProviderDetail>; providers.set(customEvent.detail.info.uuid, customEvent.detail); }; window.addEventListener('eip6963:announceProvider', handleProviderAnnouncement as EventListener); window.dispatchEvent(new Event('eip6963:requestProvider')); window.removeEventListener('eip6963:announceProvider', handleProviderAnnouncement); for (const [uuid, provider] of providers) { if (provider.info.name.toLowerCase().includes('sei') || provider.info.rdns.includes('sei')) { return provider.provider; } } } export const [eip6963Connector, eip6963Hooks] = initializeConnector<EIP1193>((actions) => { const seiProvider = findSeiGlobalWallet(); return new EIP1193({ actions, provider: seiProvider }); }); const connectors: [EIP1193, typeof eip6963Hooks][] = [[eip6963Connector, eip6963Hooks]]; function InnerApp() { const { useAccount, useChainId, useIsActive } = eip6963Hooks; const account = useAccount(); const chainId = useChainId(); const isActive = useIsActive(); const [isConnecting, setIsConnecting] = useState(false); useEffect(() => { const autoConnect = async () => { try { setIsConnecting(true); await eip6963Connector.activate(); } catch (err) { console.error('Failed to connect Sei Global Wallet', err); } finally { setIsConnecting(false); } }; autoConnect(); }, []); if (!isActive) { return ( <div> <h3>{isConnecting ? 'Connecting to Sei Global Wallet…' : 'Not Connected'}</h3> {!isConnecting && ( <button onClick={() => eip6963Connector.activate()} className="connect-button"> Connect Sei Global Wallet </button> )} </div> ); } return ( <div className="connected-info"> <h2>✅ Connected to Sei Global Wallet!</h2> <p> <strong>Account:</strong> <code>{account}</code> </p> <p> <strong>Chain ID:</strong> <code>{chainId}</code> </p> <button onClick={() => { if (eip6963Connector?.deactivate) { eip6963Connector.deactivate(); } else { eip6963Connector.resetState(); } }} className="disconnect-button"> Disconnect </button> </div> ); } export default function App() { return ( <Web3ReactProvider connectors={connectors}> <div className="app-container"> <h1>Sei Global Wallet via EIP-6963 Discovery</h1> <p>This app targets the Sei Global Wallet using EIP-6963 discovery</p> <InnerApp /> </div> </Web3ReactProvider> ); }

Run Your App:

npm run dev

Wagmi + Dynamic Integration

Create a new Vite app:

npm create vite@latest my-sei-dapp -- --template react-ts cd my-sei-dapp

Install Dependencies:

npm install @dynamic-labs/sdk-react-core \ @dynamic-labs/wagmi-connector @dynamic-labs/ethereum \ wagmi viem @tanstack/react-query @sei-js/sei-global-wallet

Update App.tsx:

import React from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { createConfig, WagmiProvider, useAccount } from 'wagmi'; import { http } from 'viem'; import { sei, seiTestnet } from 'viem/chains'; // Dynamic imports import { DynamicContextProvider, DynamicWidget } from '@dynamic-labs/sdk-react-core'; import { DynamicWagmiConnector } from '@dynamic-labs/wagmi-connector'; import { EthereumWalletConnectors } from '@dynamic-labs/ethereum'; // Import Sei Global Wallet for EIP-6963 discovery import '@sei-js/sei-global-wallet/eip6963'; const queryClient = new QueryClient(); const wagmiConfig = createConfig({ chains: [sei, seiTestnet], transports: { [sei.id]: http('https://evm-rpc.sei-apis.com'), [seiTestnet.id]: http('https://evm-rpc-testnet.sei-apis.com') } }); export default function App() { return ( <DynamicContextProvider settings={{ environmentId: 'REPLACE-WITH-YOUR-ENVIRONMENT-ID', // <- Replace walletConnectors: [EthereumWalletConnectors], overrides: { evmNetworks: (networks) => [ ...networks, { blockExplorerUrls: ['https://seitrace.com'], chainId: 1329, chainName: 'Sei Network', iconUrls: ['https://app.dynamic.xyz/assets/networks/sei.svg'], name: 'Sei', nativeCurrency: { decimals: 18, name: 'Sei', symbol: 'SEI' }, networkId: 1329, rpcUrls: ['https://evm-rpc.sei-apis.com'], vanityName: 'Sei Mainnet' }, { blockExplorerUrls: ['https://seitrace.com/?chain=testnet'], chainId: 1328, chainName: 'Sei Testnet', iconUrls: ['https://app.dynamic.xyz/assets/networks/sei.svg'], name: 'Sei Testnet', nativeCurrency: { decimals: 18, name: 'Sei', symbol: 'SEI' }, networkId: 1328, rpcUrls: ['https://evm-rpc-testnet.sei-apis.com'], vanityName: 'Sei Testnet' } ] } }}> <WagmiProvider config={wagmiConfig}> <QueryClientProvider client={queryClient}> <DynamicWagmiConnector> <div className="app-container"> <h1>Dynamic + Wagmi + Sei Global Wallet</h1> <DynamicWidget /> <AccountInfo /> </div> </DynamicWagmiConnector> </QueryClientProvider> </WagmiProvider> </DynamicContextProvider> ); } function AccountInfo() { const { address, isConnected, chain } = useAccount(); if (!isConnected) { return <p>Connect your wallet to see account info</p>; } return ( <div className="account-info"> <h3>Account Information</h3> <p> <strong>Address:</strong> {address} </p> <p> <strong>Chain:</strong> {chain?.name} (ID: {chain?.id}) </p> <p> <strong>Connected:</strong> {isConnected ? 'Yes' : 'No'} </p> </div> ); }

Run Your App:

npm run dev

Note: Replace "REPLACE-WITH-YOUR-ENVIRONMENT-ID" with your actual Dynamic environment ID from your Dynamic dashboard.

Dynamic (Next.js) Integration

Create a new Next.js app:

npx create-next-app@latest my-sei-dapp --typescript --tailwind --eslint cd my-sei-dapp

Install Dependencies:

npm install @dynamic-labs/sdk-react-core \ @dynamic-labs/wagmi-connector wagmi viem \ @tanstack/react-query @sei-js/sei-global-wallet \ @dynamic-labs/ethereum

layout.tsx:

'use client'; import './globals.css'; import { Inter } from 'next/font/google'; import Providers from './lib/providers'; const inter = Inter({ subsets: ['latin'] }); // Import the global wallet implementation import '@sei-js/sei-global-wallet/eip6963'; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="en"> <body className={inter.className}> <Providers>{children}</Providers> </body> </html> ); }

lib/providers.tsx:

'use client'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { createConfig, WagmiProvider } from 'wagmi'; import { http } from 'viem'; import { sei, seiTestnet } from 'viem/chains'; // Dynamic imports import { DynamicContextProvider, DynamicWidget } from '@dynamic-labs/sdk-react-core'; import { DynamicWagmiConnector } from '@dynamic-labs/wagmi-connector'; import { EthereumWalletConnectors } from '@dynamic-labs/ethereum'; // Import Sei Global Wallet for EIP-6963 discovery import '@sei-js/sei-global-wallet/eip6963'; const queryClient = new QueryClient(); const wagmiConfig = createConfig({ chains: [sei, seiTestnet], transports: { [sei.id]: http('https://evm-rpc.sei-apis.com'), [seiTestnet.id]: http('https://evm-rpc-testnet.sei-apis.com') } }); export default function Providers({ children }: { children: React.ReactNode }) { return ( <DynamicContextProvider settings={{ environmentId: 'REPLACE-WITH-YOUR-ENVIRONMENT-ID', // Replace with your environmentId walletConnectors: [EthereumWalletConnectors], overrides: { evmNetworks: (networks) => [ ...networks, { blockExplorerUrls: ['https://seitrace.com'], chainId: 1329, chainName: 'Sei Network', iconUrls: ['https://app.dynamic.xyz/assets/networks/sei.svg'], name: 'Sei', nativeCurrency: { decimals: 18, name: 'Sei', symbol: 'SEI' }, networkId: 1329, rpcUrls: ['https://evm-rpc.sei-apis.com'], vanityName: 'Sei Mainnet' }, { blockExplorerUrls: ['https://seitrace.com/?chain=testnet'], chainId: 1328, chainName: 'Sei Testnet', iconUrls: ['https://app.dynamic.xyz/assets/networks/sei.svg'], name: 'Sei Testnet', nativeCurrency: { decimals: 18, name: 'Sei', symbol: 'SEI' }, networkId: 1328, rpcUrls: ['https://evm-rpc-testnet.sei-apis.com'], vanityName: 'Sei Testnet' } ] } }}> <WagmiProvider config={wagmiConfig}> <QueryClientProvider client={queryClient}> <DynamicWagmiConnector>{children}</DynamicWagmiConnector> </QueryClientProvider> </WagmiProvider> </DynamicContextProvider> ); }

Note: Replace "REPLACE-WITH-YOUR-ENVIRONMENT-ID" with your actual Dynamic environment ID from your Dynamic dashboard.

page.tsx

'use client'; import { DynamicWidget } from '@dynamic-labs/sdk-react-core'; import { useAccount, useBalance } from 'wagmi'; export default function Home() { return ( <main className="container mx-auto px-4 py-8"> <div className="max-w-2xl mx-auto space-y-6"> <h1 className="text-3xl font-bold text-center">Dynamic with Next.js</h1> <div className="flex justify-center"> <DynamicWidget /> </div> </div> </main> ); }

Run Your App:

npm run dev

Troubleshooting & FAQ

Troubleshooting & Debugging Tips

Common Issues

Issue: Sei Global Wallet doesn’t appear in wallet list

# Ensure the import is at the top of your App.tsx import '@sei-js/sei-global-wallet/eip6963';

Issue: TypeScript errors about window.ethereum

// Add this to your App.tsx or create types/global.d.ts declare global { interface Window { ethereum?: any; } }

Issue: WalletConnect connection fails

# Get a proper project ID from cloud.walletconnect.com # Replace 'YOUR_WALLETCONNECT_PROJECT_ID' with your actual ID

Issue: Network not found in MetaMask

// Use the exact chainId in hex format chainId: '0x531'; // for Sei Mainnet (1329) chainId: '0xAE3F3'; // for Sei Testnet (713715)

Debugging Commands

// Check if EIP-6963 events are firing console.log('EIP-6963 providers:', window.eip6963Providers); // Listen for wallet announcements window.addEventListener('eip6963:announceProvider', (event) => { console.log('Wallet announced:', event.detail); }); // Request wallet announcements window.dispatchEvent(new Event('eip6963:requestProvider'));

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

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
Last updated on