From 9c4b8a4df7fcfd40262a172e635fc490fcc444fb Mon Sep 17 00:00:00 2001 From: TerryM Date: Sat, 6 Jun 2026 00:45:24 +0800 Subject: [PATCH] fix: support imToken in-app browser login --- src/wallet/injected.ts | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/wallet/injected.ts b/src/wallet/injected.ts index f2f75be..32983cc 100644 --- a/src/wallet/injected.ts +++ b/src/wallet/injected.ts @@ -15,7 +15,9 @@ export type EthereumProvider = { isMetaMask?: boolean; isTokenPocket?: boolean; isImToken?: boolean; + selectedAddress?: string; providers?: EthereumProvider[]; + enable?: () => Promise; request: (args: { method: string; params?: unknown[]; @@ -75,6 +77,8 @@ async function ensureBnbChain(ethereum: EthereumProvider): Promise { async function requestInjectedAddress( ethereum: EthereumProvider, ): Promise { + if (isAddress(ethereum.selectedAddress)) return ethereum.selectedAddress; + const existingAccounts: unknown[] = await ethereum .request({ method: "eth_accounts" }) .catch((): unknown[] => []); @@ -85,18 +89,25 @@ async function requestInjectedAddress( .request({ method: "eth_requestAccounts", }) - .catch((error: unknown): never => { - throw normalizeWalletError(error); + .catch(async (error: unknown): Promise => { + if (!ethereum.enable) throw normalizeWalletError(error); + return ethereum.enable().catch((fallbackError: unknown): never => { + throw normalizeWalletError(fallbackError || error); + }); }); const requestedAddress = requestedAccounts.find(isAddress); - if (!requestedAddress) throw new Error("walletNoAccount"); - return requestedAddress; + if (requestedAddress) return requestedAddress; + if (isAddress(ethereum.selectedAddress)) return ethereum.selectedAddress; + throw new Error("walletNoAccount"); } export function getInjectedEthereum(): EthereumProvider | null { if (typeof window === "undefined") return null; - const maybeWindow = window as typeof window & { ethereum?: EthereumProvider }; - return maybeWindow.ethereum ?? null; + const maybeWindow = window as typeof window & { + ethereum?: EthereumProvider; + web3?: { currentProvider?: EthereumProvider }; + }; + return maybeWindow.ethereum ?? maybeWindow.web3?.currentProvider ?? null; } export function isTokenPocketBrowser(): boolean { @@ -168,7 +179,9 @@ export async function connectInjectedWallet( console.info("[wallet-login] injected account", address); console.info("[wallet-login] ensuring BNB Chain (0x38)…"); - await ensureBnbChain(ethereum); + await ensureBnbChain(ethereum).catch((error: unknown) => { + console.warn("[wallet-login] BNB Chain switch skipped", error); + }); return address; }