export const isWalletInstalled = (id: string): boolean => { const anyWindow = typeof window !== 'undefined' ? (window as any) : undefined switch (id) { case 'metaMask': return ( anyWindow?.ethereum?.isMetaMask || anyWindow?.ethereum?.providers?.some( (provider: any) => provider.isMetaMask ) ) case 'coinbase': return ( // Coinbase Browser doesn't inject itself automatically // We should not consider Coinbase Browser as installed wallet so we can fallback to Coinbase SDK (anyWindow?.ethereum?.isCoinbaseWallet && !anyWindow?.ethereum?.isCoinbaseBrowser) || anyWindow?.coinbaseWalletExtension?.isCoinbaseWallet || anyWindow?.ethereum?.providers?.some( (provider: any) => provider.isCoinbaseWallet ) ) case 'app.phantom.bitcoin': return anyWindow.phantom?.bitcoin?.isPhantom case 'com.okex.wallet.bitcoin': return anyWindow.okxwallet?.bitcoin?.isOkxWallet case 'XverseProviders.BitcoinProvider': return anyWindow.XverseProviders?.BitcoinProvider case 'unisat': return ( anyWindow.unisat && !anyWindow.unisat?.isBinance && !anyWindow.unisat?.isBitKeep ) case 'io.xdefi': return anyWindow.xfi case 'so.onekey.app.wallet.bitcoin': return anyWindow.$onekey?.btc case 'LeatherProvider': return anyWindow.LeatherProvider case 'bitget': return anyWindow.bitkeep?.unisat || anyWindow.unisat?.isBitKeep case 'OylProvider': return anyWindow.oyl case 'binance': return anyWindow.binancew3w?.bitcoin || anyWindow.unisat?.isBinance case 'app.magiceden.bitcoin': return anyWindow?.magicEden?.bitcoin?.isMagicEden default: /** * Return true if the wallet is not in the list of explicitly supported or self-injected wallet */ return true } }