{"id":1557,"date":"2026-06-23T17:00:00","date_gmt":"2026-06-23T22:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=1557"},"modified":"2026-03-07T03:49:35","modified_gmt":"2026-03-07T08:49:35","slug":"deep-linking-web3","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/deep-linking-web3\/","title":{"rendered":"Deep Linking and Web3: Connecting Decentralized Apps"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Web3 applications (decentralized apps, wallets, DeFi protocols, NFT marketplaces) have unique deep linking challenges. Users navigate between wallet apps, dApps, and web interfaces constantly. A swap on a DeFi protocol requires opening a wallet app to sign a transaction, then returning to the dApp. An NFT purchase links from a marketplace to a wallet for payment, then back to the marketplace for confirmation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers how deep linking works in the Web3 ecosystem. For deep linking in super apps, see <a href=\"https:\/\/tolinku.com\/blog\/deep-linking-super-apps\/\">deep linking for super apps<\/a>. For crypto-specific deep linking patterns, see <a href=\"https:\/\/tolinku.com\/blog\/crypto-app-deep-links\/\">deep links for cryptocurrency apps<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Web3 Deep Linking Landscape<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Key Interactions That Need Deep Links<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Flow<\/th>\n<th>From<\/th>\n<th>To<\/th>\n<th>Context Needed<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Wallet connect<\/td>\n<td>dApp (web\/app)<\/td>\n<td>Wallet app<\/td>\n<td>Session, chain, dApp metadata<\/td>\n<\/tr>\n<tr>\n<td>Transaction signing<\/td>\n<td>dApp<\/td>\n<td>Wallet<\/td>\n<td>Transaction data, callback URL<\/td>\n<\/tr>\n<tr>\n<td>Token viewing<\/td>\n<td>Marketplace<\/td>\n<td>Wallet<\/td>\n<td>Token ID, contract address<\/td>\n<\/tr>\n<tr>\n<td>dApp browsing<\/td>\n<td>Wallet browser<\/td>\n<td>dApp<\/td>\n<td>Wallet address, chain<\/td>\n<\/tr>\n<tr>\n<td>Payment request<\/td>\n<td>Merchant app<\/td>\n<td>Wallet<\/td>\n<td>Amount, recipient, memo<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">WalletConnect Protocol<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/walletconnect.com\/\" rel=\"nofollow noopener\" target=\"_blank\">WalletConnect<\/a> is the most widely used standard for connecting dApps to wallet apps. It uses deep links as the transport:<\/p>\n\n\n\n<pre><code>wc:abc123@2?relay-protocol=irn&amp;symKey=xyz\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This URI launches the wallet app, which establishes an encrypted session with the dApp. The deep link carries the session parameters.<\/p>\n\n\n\n<pre><code class=\"language-javascript\">\/\/ dApp: initiate WalletConnect session\nimport { Core } from &#39;@walletconnect\/core&#39;;\nimport { Web3Wallet } from &#39;@walletconnect\/web3wallet&#39;;\n\nconst core = new Core({ projectId: &#39;YOUR_PROJECT_ID&#39; });\n\n\/\/ Generate connection URI (this is the deep link)\nconst { uri, approval } = await signClient.connect({\n  requiredNamespaces: {\n    eip155: {\n      methods: [&#39;eth_sendTransaction&#39;, &#39;personal_sign&#39;],\n      chains: [&#39;eip155:1&#39;],\n      events: [&#39;accountsChanged&#39;]\n    }\n  }\n});\n\n\/\/ Open wallet app with the URI\nconst walletDeepLink = `https:\/\/metamask.app.link\/wc?uri=${encodeURIComponent(uri)}`;\nwindow.location.href = walletDeepLink;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Wallet App Deep Links<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">MetaMask<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MetaMask supports deep links for common actions:<\/p>\n\n\n\n<pre><code>\/\/ Open MetaMask and connect\nmetamask:\/\/wc?uri=wc:abc123@2...\n\n\/\/ Open a specific dApp in MetaMask&#39;s browser\nhttps:\/\/metamask.app.link\/dapp\/uniswap.org\n\n\/\/ Send transaction\nmetamask:\/\/send\/0xRecipientAddress?value=1e18\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Universal Link Pattern for Wallets<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Most wallets use Universal Links for cross-platform compatibility:<\/p>\n\n\n\n<pre><code>https:\/\/metamask.app.link\/...     (MetaMask)\nhttps:\/\/link.trustwallet.com\/...  (Trust Wallet)\nhttps:\/\/phantom.app\/ul\/...        (Phantom, Solana)\nhttps:\/\/rainbow.me\/...            (Rainbow)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">dApp Deep Link Patterns<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">NFT Marketplace Links<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Link directly to specific tokens, collections, or profiles:<\/p>\n\n\n\n<pre><code>\/assets\/{chain}\/{contract}\/{tokenId}     \u2192 specific NFT\n\/collection\/{slug}                       \u2192 collection page\n\/profile\/{address}                       \u2192 user profile\n\/activity\/{address}                      \u2192 transaction history\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">DeFi Protocol Links<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Link to specific pools, swaps, or positions:<\/p>\n\n\n\n<pre><code>\/swap?inputCurrency=ETH&amp;outputCurrency=0xUSDC&amp;chain=1\n\/pool\/{poolAddress}\n\/positions\/{positionId}\n\/farm\/{farmId}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Web Fallback for Web3 Deep Links<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Web3 deep link pages should work without a wallet connected:<\/p>\n\n\n\n<pre><code class=\"language-html\">&lt;!-- NFT detail page - works for everyone --&gt;\n&lt;div class=&quot;nft-detail&quot;&gt;\n  &lt;img src=&quot;\/images\/nft-preview.jpg&quot; alt=&quot;NFT #1234&quot;&gt;\n  &lt;h1&gt;CryptoArt #1234&lt;\/h1&gt;\n  &lt;p&gt;Current price: 0.5 ETH&lt;\/p&gt;\n\n  &lt;!-- For users with wallet --&gt;\n  &lt;button id=&quot;buyBtn&quot; onclick=&quot;connectAndBuy()&quot;&gt;Buy Now&lt;\/button&gt;\n\n  &lt;!-- For users without wallet --&gt;\n  &lt;div id=&quot;noWallet&quot; style=&quot;display:none;&quot;&gt;\n    &lt;p&gt;You need a wallet to purchase this NFT.&lt;\/p&gt;\n    &lt;a href=&quot;https:\/\/metamask.io\/download\/&quot;&gt;Get MetaMask&lt;\/a&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n\n&lt;script&gt;\n  if (typeof window.ethereum === &#39;undefined&#39;) {\n    document.getElementById(&#39;buyBtn&#39;).style.display = &#39;none&#39;;\n    document.getElementById(&#39;noWallet&#39;).style.display = &#39;block&#39;;\n  }\n&lt;\/script&gt;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Transaction Deep Links<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">EIP-681: Payment Request URLs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-681\" rel=\"nofollow noopener\" target=\"_blank\">EIP-681<\/a> defines a standard URL format for Ethereum payment requests:<\/p>\n\n\n\n<pre><code>ethereum:0xRecipientAddress@1\/transfer?\n  address=0xTokenContract&amp;\n  uint256=1000000&amp;\n  value=0\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Components:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ethereum:<\/code> scheme<\/li>\n<li><code>0xRecipientAddress<\/code> target address<\/li>\n<li><code>@1<\/code> chain ID (Ethereum mainnet)<\/li>\n<li><code>\/transfer<\/code> function name<\/li>\n<li>Query parameters for function arguments<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cross-Chain Deep Links<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Different blockchains use different URL schemes:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Chain<\/th>\n<th>Deep Link Format<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Ethereum<\/td>\n<td><code>ethereum:0xAddress?value=1e18<\/code><\/td>\n<\/tr>\n<tr>\n<td>Bitcoin<\/td>\n<td><code>bitcoin:address?amount=0.001<\/code><\/td>\n<\/tr>\n<tr>\n<td>Solana<\/td>\n<td><code>solana:address?amount=1&amp;spl-token=USDC<\/code><\/td>\n<\/tr>\n<tr>\n<td>Polygon<\/td>\n<td><code>ethereum:0xAddress@137?value=1e18<\/code><\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Handling Transaction Deep Links in Your App<\/h3>\n\n\n\n<pre><code class=\"language-swift\">\/\/ iOS wallet app: handle EIP-681 payment request\nfunc handlePaymentURL(_ url: URL) {\n    guard url.scheme == &quot;ethereum&quot; else { return }\n\n    let components = url.pathComponents\n    let address = url.host \/\/ recipient address\n    let chainId = url.port \/\/ chain ID (e.g., 1 for mainnet)\n\n    let params = url.queryParameters\n    let value = params[&quot;value&quot;] \/\/ ETH amount in wei\n    let gasLimit = params[&quot;gasLimit&quot;]\n\n    \/\/ Show transaction confirmation screen\n    showTransactionConfirmation(\n        to: address,\n        value: value,\n        chain: chainId ?? 1,\n        gasLimit: gasLimit\n    )\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Token-Gated Content via Deep Links<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">The Flow<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Deep links can gate content based on token ownership:<\/p>\n\n\n\n<pre><code>User taps deep link \u2192 https:\/\/yourapp.com\/exclusive\/holders-only\n  \u2192 Web page checks wallet connection\n    \u2192 Wallet connected and owns required token \u2192 show content\n    \u2192 Wallet not connected \u2192 prompt to connect\n    \u2192 Connected but does not own token \u2192 show &quot;token required&quot; message\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Implementation<\/h3>\n\n\n\n<pre><code class=\"language-javascript\">async function checkTokenGate(url) {\n  const path = new URL(url).pathname;\n  const gateConfig = await getGateConfig(path); \/\/ which token is required\n\n  if (!gateConfig) {\n    \/\/ No gate on this content\n    showContent(path);\n    return;\n  }\n\n  const wallet = await connectWallet();\n  if (!wallet) {\n    showConnectPrompt(url);\n    return;\n  }\n\n  const ownsToken = await checkTokenOwnership(\n    wallet.address,\n    gateConfig.contractAddress,\n    gateConfig.chainId,\n    gateConfig.minBalance\n  );\n\n  if (ownsToken) {\n    showContent(path);\n  } else {\n    showTokenRequired(gateConfig);\n  }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Tolinku for Web3 Deep Links<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tolinku.com\/features\/deep-linking\">Tolinku<\/a> handles URL routing for Web3 applications. Configure routes for your dApp pages in the <a href=\"https:\/\/tolinku.com\/docs\/concepts\/deep-linking\/\">Tolinku dashboard<\/a>, and Tolinku routes users to your mobile app (for native dApp experiences) or web fallback. The web fallback can include wallet connection prompts and transaction initiation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For more on industry trends, see <a href=\"https:\/\/tolinku.com\/blog\/future-mobile-deep-linking\/\">the future of mobile deep linking<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bridge deep linking with Web3 applications. Handle wallet connections, dApp navigation, and token-gated content via deep links.<\/p>\n","protected":false},"author":2,"featured_media":1556,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Deep Linking and Web3: Connecting Decentralized Apps","rank_math_description":"Bridge deep linking with Web3 applications. Handle wallet connections, dApp navigation, and token-gated content via deep links.","rank_math_focus_keyword":"deep linking Web3","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-deep-linking-web3.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-deep-linking-web3.png","footnotes":""},"categories":[11],"tags":[422,420,20,424,69,423,421,419],"class_list":["post-1557","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deep-linking","tag-blockchain","tag-dapps","tag-deep-linking","tag-defi","tag-mobile-development","tag-nft","tag-wallet-connect","tag-web3"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1557","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=1557"}],"version-history":[{"count":3,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1557\/revisions"}],"predecessor-version":[{"id":2633,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1557\/revisions\/2633"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/1556"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=1557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=1557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=1557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}