This guide shows our officially recommended pattern for building a wallet picker that surfaces every wallet a user can connect to (or install) through your dapp, in one ordered list. You’ll do the rendering and the click handling. The SDK does the merging, deduplication, and ordering. Prerequisites: A configured Dynamic client. Each connection option this guide covers requires its own client extension — add only what you intend to surface:Documentation Index
Fetch the complete documentation index at: https://www.dynamic.xyz/docs/llms.txt
Use this file to discover all available pages before exploring further.
| Connection option type | Required client extension(s) |
|---|---|
withWalletProvider (installed) | Your chain extensions (addEvmExtension, addSolanaExtension, etc.) |
walletConnect (URI deeplink/QR) | addWalletConnect<Chain>Extension for each chain you want to surface |
metamaskSdkUri (URI deeplink/QR) | addMetaMaskUri<Chain>Extension for each chain you want to surface |
inAppBrowser | None (just open the URL) |
| Install-only entries | None |
1. Fetch the catalogue
WalletOption with a name, iconUrl, an ordered connectionOptions array, and an optional installationUrls bag for wallets the user can install on this device. See the reference for the full shape.
includeMobileOptions: true is what makes the catalogue include URI-based connection options (deeplinking and QR code), in-app browser entries, and install links alongside installed providers. Without it, you only get installed wallets.
2. Decide what to do when a wallet is clicked
Pick the first entry of the wallet’sconnectionOptions array — the catalogue already orders it by priority (withWalletProvider > URI deeplink > inAppBrowser). Switch on its type to drive the right flow:
3. Connect installed wallets (withWalletProvider)
Requires the chain extension for each chain you support (addEvmExtension, addSolanaExtension, etc.).
The catalogue has already resolved the right wallet provider key for the user’s device. Pass it straight into the connect-and-verify flow — Dynamic does the rest.
4. Drive URI-deeplink connections (walletConnect and metamaskSdkUri)
Requires the matching extension(s):
walletConnect→addWalletConnect<Chain>ExtensionmetamaskSdkUri→addMetaMaskUri<Chain>Extension
deeplinks: { native?, universal? } plus the type — but mint their URI through different SDK functions. Wrap the discrimination in one helper so the rest of your picker doesn’t care:
{ uri, approval }:
uriis what the wallet needs to pair with your dapp.approvalis a promise that resolves once the user approves in their wallet.
metamaskSdkUri: that URI is the MetaMask SDK’s own pairing format, not WalletConnect, so it only resolves inside MetaMask. The walletOption.name and walletOption.iconUrl from the catalogue make a good “Open in ” prompt.
Mobile: open the wallet app via deeplink
appendConnectionUriToDeeplink is generic across both discriminators — append the minted URI onto the wallet’s preferred deeplink and open it.
Desktop: render the URI as a QR code
On desktop, encode the same URI into a QR code so the user can scan it from their mobile wallet:5. Open in-app browsers (inAppBrowser)
No extension required.
Mobile wallets that ship with their own in-app browser expose a URL template containing {{encodedDappURI}}. Substitute it with the encoded current URL and open the result — the wallet will load your dapp inside its own browser, where its injected provider is already available.
6. Show install links for install-only wallets
No extension required. When a wallet has noconnectionOptions but has installationUrls, render an install affordance. The exact UI is yours — a button, a modal with platform-specific instructions, a pointer to the user’s app store, etc.:
7. Group installed vs other (optional)
The catalogue’s default'relevance' ordering already buckets installed wallets first. If you want to render them under separate headings, split by checking whether the first connection option is withWalletProvider:
See also
getWalletOptionsCataloguereference- Authenticate with WalletConnect — the lower-level WC-only flow.
- Get Available Wallets to Connect — when you only need installed providers.