Web3 Signals

Passive wallet extension detection for Sybil resistance.

How Wallet Detection Works

FingerprintIQ detects installed Web3 wallet extensions without requiring a wallet connection. Detection is entirely passive — there is no popup, no permission request, and no signature prompt. The user is never aware that wallet detection occurred.

Wallet detection works by checking for known JavaScript objects that wallet extensions inject into the window scope. FingerprintIQ never reads wallet addresses, private keys, or any account data — it only detects which wallet software is installed.

Detection uses two complementary methods:

  1. EIP-6963 provider discovery — The modern standard where wallets announce themselves via a eip6963:announceProvider event. Works with all compliant wallets.
  2. Legacy window object detection — Checks known wallet-specific properties (e.g., window.ethereum.isMetaMask) for wallets that predate EIP-6963.

Supported Wallets

WalletChainDetection Method
MetaMaskEVMwindow.ethereum.isMetaMask
PhantomSolanawindow.phantom.solana
CoinbaseEVMwindow.ethereum.isCoinbaseWallet
RabbyEVMwindow.ethereum.isRabby
RainbowEVMwindow.ethereum.isRainbow
Brave WalletEVMwindow.ethereum.isBraveWallet
ZerionEVMwindow.ethereum.isZerion
ExodusEVMwindow.ethereum.isExodus
SolflareSolanawindow.solflare
BackpackSolanawindow.backpack
KeplrCosmoswindow.keplr
UniSatBitcoinwindow.unisat
OKXMulti-chainwindow.okxwallet
XDEFIMulti-chainwindow.xfi
TronLinkTronwindow.tronWeb

Plus EIP-6963 discovery for any compliant wallet not listed above.

Response Format

json
{ "wallets": { "detected": ["MetaMask", "Phantom"], "count": 2, "evmProviders": ["MetaMask"], "solanaProviders": ["Phantom"], "multipleWallets": true, "versions": { "MetaMask": "11.16.0" } } }

Wallet version information (versions) is available for wallets that expose it via their provider object. Not all wallets expose version numbers.

Sybil Detection Use Cases

Prevent users from claiming multiple airdrop allocations by linking different wallet addresses to the same device fingerprint.

javascript
const result = await fiq.identify(); const wallets = result.signals.client.wallets; // Same device claiming multiple airdrop wallets if (result.visitCount > 3 && wallets?.multipleWallets) { // This device has visited multiple times with multiple wallets // Flag as potential Sybil before allowing airdrop claim await flagSybilRisk(result.visitorId); showChallenge(); }

Always verify the visitorId server-side before making airdrop decisions. Client-side checks alone can be bypassed.

Ask a question... ⌘I