Sei Global Wallet
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.
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
- Visit app.sei.io or any Sei ecosystem application
- Click “Connect Wallet” and select “Sei Global Wallet”
- Choose your preferred login method (Google, X, Telegram, or Email)
- Complete the authentication flow
- 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';
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
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
- Test with multiple browsers to ensure cross-browser compatibility
- Clear browser cache if wallets aren’t appearing
- Check browser console for EIP-6963 events and errors
- Test both testnet and mainnet connections
- 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