fix: detectProvider priority - TP Wallet > OKX > Bitget > imToken > SafePal > Trust > MetaMask (China-first)
This commit is contained in:
parent
89d536b7cb
commit
299e4a7101
|
|
@ -31,29 +31,78 @@ const INITIAL_STATE: WalletState = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Detect the best available EVM provider across all major wallets
|
// Detect the best available EVM provider across all major wallets
|
||||||
|
// Priority order: TP Wallet (most popular in China) > OKX > Bitget > Trust > MetaMask > others
|
||||||
export function detectProvider(): Eip1193Provider | null {
|
export function detectProvider(): Eip1193Provider | null {
|
||||||
if (typeof window === "undefined") return null;
|
if (typeof window === "undefined") return null;
|
||||||
|
|
||||||
const w = window as unknown as Record<string, unknown>;
|
const w = window as unknown as Record<string, unknown>;
|
||||||
const eth = w.ethereum as (Eip1193Provider & {
|
|
||||||
providers?: Eip1193Provider[];
|
type ExtProvider = Eip1193Provider & {
|
||||||
|
providers?: ExtProvider[];
|
||||||
isMetaMask?: boolean;
|
isMetaMask?: boolean;
|
||||||
isTrust?: boolean;
|
isTrust?: boolean;
|
||||||
|
isTrustWallet?: boolean;
|
||||||
isOKExWallet?: boolean;
|
isOKExWallet?: boolean;
|
||||||
|
isOkxWallet?: boolean;
|
||||||
isCoinbaseWallet?: boolean;
|
isCoinbaseWallet?: boolean;
|
||||||
}) | undefined;
|
isTokenPocket?: boolean;
|
||||||
|
isBitkeep?: boolean;
|
||||||
|
isBitgetWallet?: boolean;
|
||||||
|
isRabby?: boolean;
|
||||||
|
isSafePal?: boolean;
|
||||||
|
isImToken?: boolean;
|
||||||
|
isPhantom?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
const eth = w.ethereum as ExtProvider | undefined;
|
||||||
|
|
||||||
|
// Helper: find in providers array or direct
|
||||||
|
const findIn = (pred: (p: ExtProvider) => boolean): ExtProvider | null => {
|
||||||
|
if (!eth) return null;
|
||||||
|
if (eth.providers && Array.isArray(eth.providers)) {
|
||||||
|
return eth.providers.find(pred) ?? null;
|
||||||
|
}
|
||||||
|
return pred(eth) ? eth : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 1. TokenPocket (most popular in China)
|
||||||
|
const tp = findIn(p => !!p.isTokenPocket);
|
||||||
|
if (tp) return tp;
|
||||||
|
|
||||||
|
// 2. OKX Wallet
|
||||||
|
const okx = (w.okxwallet as ExtProvider | undefined) ?? findIn(p => !!(p.isOKExWallet || p.isOkxWallet));
|
||||||
|
if (okx) return okx;
|
||||||
|
|
||||||
|
// 3. Bitget Wallet
|
||||||
|
const bitget = (w as { bitkeep?: { ethereum?: ExtProvider } }).bitkeep?.ethereum
|
||||||
|
?? findIn(p => !!(p.isBitkeep || p.isBitgetWallet));
|
||||||
|
if (bitget) return bitget;
|
||||||
|
|
||||||
|
// 4. imToken
|
||||||
|
const imtoken = (w.imToken as ExtProvider | undefined) ?? findIn(p => !!p.isImToken);
|
||||||
|
if (imtoken) return imtoken;
|
||||||
|
|
||||||
|
// 5. SafePal
|
||||||
|
const safepal = (w.safepalProvider as ExtProvider | undefined) ?? findIn(p => !!p.isSafePal);
|
||||||
|
if (safepal) return safepal;
|
||||||
|
|
||||||
|
// 6. Trust Wallet
|
||||||
|
const trust = findIn(p => !!(p.isTrust || p.isTrustWallet));
|
||||||
|
if (trust) return trust;
|
||||||
|
|
||||||
|
// 7. MetaMask
|
||||||
|
const metamask = findIn(p => !!p.isMetaMask);
|
||||||
|
if (metamask) return metamask;
|
||||||
|
|
||||||
if (!eth) {
|
if (!eth) {
|
||||||
// Fallback: check wallet-specific globals
|
// Last resort: check wallet-specific globals
|
||||||
if (w.okxwallet) return w.okxwallet as Eip1193Provider;
|
|
||||||
if (w.coinbaseWalletExtension) return w.coinbaseWalletExtension as Eip1193Provider;
|
if (w.coinbaseWalletExtension) return w.coinbaseWalletExtension as Eip1193Provider;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If multiple providers are injected (common when multiple extensions installed)
|
// If multiple providers injected but none matched above, use first
|
||||||
if (eth.providers && Array.isArray(eth.providers) && eth.providers.length > 0) {
|
if (eth.providers && Array.isArray(eth.providers) && eth.providers.length > 0) {
|
||||||
const metamask = eth.providers.find((p: Eip1193Provider & { isMetaMask?: boolean }) => p.isMetaMask);
|
return eth.providers[0];
|
||||||
return metamask ?? eth.providers[0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return eth;
|
return eth;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue