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:
- EIP-6963 provider discovery — The modern standard where wallets announce themselves via a
eip6963:announceProviderevent. Works with all compliant wallets. - Legacy window object detection — Checks known wallet-specific properties (e.g.,
window.ethereum.isMetaMask) for wallets that predate EIP-6963.
Supported Wallets
| Wallet | Chain | Detection Method |
|---|---|---|
| MetaMask | EVM | window.ethereum.isMetaMask |
| Phantom | Solana | window.phantom.solana |
| Coinbase | EVM | window.ethereum.isCoinbaseWallet |
| Rabby | EVM | window.ethereum.isRabby |
| Rainbow | EVM | window.ethereum.isRainbow |
| Brave Wallet | EVM | window.ethereum.isBraveWallet |
| Zerion | EVM | window.ethereum.isZerion |
| Exodus | EVM | window.ethereum.isExodus |
| Solflare | Solana | window.solflare |
| Backpack | Solana | window.backpack |
| Keplr | Cosmos | window.keplr |
| UniSat | Bitcoin | window.unisat |
| OKX | Multi-chain | window.okxwallet |
| XDEFI | Multi-chain | window.xfi |
| TronLink | Tron | window.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.
javascriptconst 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.
Enforce one-device-one-vote to prevent governance manipulation by users running multiple wallet identities from a single machine.
javascriptconst result = await fiq.identify(); // Check if this device has already voted const hasVoted = await checkVoteStatus(result.visitorId); if (hasVoted) { showMessage("This device has already cast a vote in this proposal."); return; } // Record the vote linked to this device fingerprint await recordVote(result.visitorId, selectedOption);
Enforce per-device minting limits to prevent bots from minting out collections.
javascriptconst result = await fiq.identify(); // Block obvious bots before any wallet interaction if (result.botProbability > 0.5) { showCaptcha(); return; } // Enforce device-level mint limit regardless of wallet address const mintCount = await getDeviceMintCount(result.visitorId); if (mintCount >= MAX_MINTS_PER_DEVICE) { showMessage("Mint limit reached for this device."); return; }