Skip to content

Commit 9ae13b1

Browse files
authored
feat: add deeplink support for binance web3 wallet on bitcoin (#4748)
1 parent f948216 commit 9ae13b1

File tree

3 files changed

+109
-2
lines changed

3 files changed

+109
-2
lines changed

.changeset/smart-lions-fail.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
'@reown/appkit-controllers': patch
3+
'pay-test-exchange': patch
4+
'@reown/appkit-adapter-bitcoin': patch
5+
'@reown/appkit-adapter-ethers': patch
6+
'@reown/appkit-adapter-ethers5': patch
7+
'@reown/appkit-adapter-solana': patch
8+
'@reown/appkit-adapter-wagmi': patch
9+
'@reown/appkit': patch
10+
'@reown/appkit-utils': patch
11+
'@reown/appkit-cdn': patch
12+
'@reown/appkit-cli': patch
13+
'@reown/appkit-codemod': patch
14+
'@reown/appkit-common': patch
15+
'@reown/appkit-core': patch
16+
'@reown/appkit-experimental': patch
17+
'@reown/appkit-pay': patch
18+
'@reown/appkit-polyfills': patch
19+
'@reown/appkit-scaffold-ui': patch
20+
'@reown/appkit-siwe': patch
21+
'@reown/appkit-siwx': patch
22+
'@reown/appkit-testing': patch
23+
'@reown/appkit-ui': patch
24+
'@reown/appkit-universal-connector': patch
25+
'@reown/appkit-wallet': patch
26+
'@reown/appkit-wallet-button': patch
27+
---
28+
29+
Added support for opening Binance Web3 Wallet via deeplink for Bitcoin

packages/controllers/src/utils/MobileWallet.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ConstantsUtil } from '@reown/appkit-common'
22

3-
import type { ChainControllerState } from '../controllers/ChainController.js'
3+
import { ChainController, type ChainControllerState } from '../controllers/ChainController.js'
44

55
/*
66
* Exclude wallets that do not support relay connections but have custom deeplink mechanisms
@@ -20,6 +20,17 @@ export const CUSTOM_DEEPLINK_WALLETS = {
2020
COINBASE: {
2121
id: 'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa',
2222
url: 'https://go.cb-w.com'
23+
},
24+
/*
25+
* Got details from their npm package:
26+
* https://www.npmjs.com/package/@binance/w3w-utils?activeTab=code
27+
* https://developers.binance.com/docs/binance-w3w/evm-compatible-provider#getdeeplink
28+
*/
29+
BINANCE: {
30+
id: '8a0ee50d1f22f6651afcae7eb4253e52a3310b90af5daef78a8c4929a9bb99d4',
31+
appId: 'yFK5FCqYprrXDiVFbhyRx7',
32+
deeplink: 'bnc://app.binance.com/mp/app',
33+
url: 'https://app.binance.com/en/download'
2334
}
2435
}
2536

@@ -56,5 +67,32 @@ export const MobileWalletUtil = {
5667
window.location.href = `${CUSTOM_DEEPLINK_WALLETS.COINBASE.url}/dapp?cb_url=${encodedHref}`
5768
}
5869
}
70+
71+
/*
72+
* Binance Web3 Wallet doesn't support WalletConnect for Bitcoin.
73+
* For now we use their deeplink to open the in-app browser instead.
74+
*/
75+
if (namespace === ConstantsUtil.CHAIN.BITCOIN) {
76+
if (id === CUSTOM_DEEPLINK_WALLETS.BINANCE.id && !('binancew3w' in window)) {
77+
const activeCaipNetwork = ChainController.state.activeCaipNetwork
78+
79+
const startPagePath = window.btoa('/pages/browser/index')
80+
const startPageQuery = window.btoa(
81+
`url=${encodedHref}&defaultChainId=${activeCaipNetwork?.id ?? 1}`
82+
)
83+
84+
const deeplink = new URL(CUSTOM_DEEPLINK_WALLETS.BINANCE.deeplink)
85+
86+
deeplink.searchParams.set('appId', CUSTOM_DEEPLINK_WALLETS.BINANCE.appId)
87+
deeplink.searchParams.set('startPagePath', startPagePath)
88+
deeplink.searchParams.set('startPageQuery', startPageQuery)
89+
90+
const universalLink = new URL(CUSTOM_DEEPLINK_WALLETS.BINANCE.url)
91+
92+
universalLink.searchParams.set('_dp', window.btoa(deeplink.toString()))
93+
94+
window.location.href = universalLink.toString()
95+
}
96+
}
5997
}
6098
}

packages/controllers/tests/utils/MobileWallet.test.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,15 @@ const mockWindow = {
1212
}
1313
}
1414

15+
const actualWindow = window
16+
1517
describe('MobileWalletUtil', () => {
1618
beforeEach(() => {
1719
vi.restoreAllMocks()
18-
vi.stubGlobal('window', { location: { href: ORIGINAL_HREF } })
20+
vi.stubGlobal('window', {
21+
...actualWindow,
22+
location: { href: ORIGINAL_HREF }
23+
})
1924

2025
mockChainControllerState({ activeChain: ConstantsUtil.CHAIN.SOLANA })
2126
})
@@ -33,6 +38,26 @@ describe('MobileWalletUtil', () => {
3338
expect(window.location.href).toBe(expectedUrl)
3439
})
3540

41+
it('should redirect to Binance Web3 Wallet when Binance is not installed', () => {
42+
MobileWalletUtil.handleMobileDeeplinkRedirect(
43+
CUSTOM_DEEPLINK_WALLETS.BINANCE.id,
44+
ConstantsUtil.CHAIN.BITCOIN
45+
)
46+
47+
const actualUrl = new URL(window.location.href)
48+
const actualDpEncoded = actualUrl.searchParams.get('_dp')!
49+
const actualDp = new URL(atob(actualDpEncoded))
50+
51+
const encodedHref = encodeURIComponent(ORIGINAL_HREF)
52+
const expectedStartPagePath = window.btoa('/pages/browser/index')
53+
const expectedStartPageQuery = window.btoa(`url=${encodedHref}&defaultChainId=1`)
54+
55+
expect(actualUrl.origin + actualUrl.pathname).toBe(CUSTOM_DEEPLINK_WALLETS.BINANCE.url)
56+
expect(actualDp.searchParams.get('appId')).toBe(CUSTOM_DEEPLINK_WALLETS.BINANCE.appId)
57+
expect(actualDp.searchParams.get('startPagePath')).toBe(expectedStartPagePath)
58+
expect(actualDp.searchParams.get('startPageQuery')).toBe(expectedStartPageQuery)
59+
})
60+
3661
it('should not redirect when Phantom is installed', () => {
3762
vi.stubGlobal('window', {
3863
...mockWindow,
@@ -48,6 +73,21 @@ describe('MobileWalletUtil', () => {
4873
expect(window.location.href).toBe(originalHref)
4974
})
5075

76+
it('should not redirect when Binance Web3 Wallet is installed', () => {
77+
vi.stubGlobal('window', {
78+
...mockWindow,
79+
binancew3w: {}
80+
})
81+
82+
const originalHref = window.location.href
83+
MobileWalletUtil.handleMobileDeeplinkRedirect(
84+
CUSTOM_DEEPLINK_WALLETS.BINANCE.id,
85+
ConstantsUtil.CHAIN.BITCOIN
86+
)
87+
88+
expect(window.location.href).toBe(originalHref)
89+
})
90+
5191
it('should redirect to Coinbase Wallet when it is not installed', () => {
5292
MobileWalletUtil.handleMobileDeeplinkRedirect(
5393
CUSTOM_DEEPLINK_WALLETS.COINBASE.id,

0 commit comments

Comments
 (0)