From d477a9bf5da790669b1cdcb4f2dce5aeed87f275 Mon Sep 17 00:00:00 2001 From: Thiendekaco Date: Thu, 7 Mar 2024 17:00:02 +0700 Subject: [PATCH] Resolve bug when connect dual walletconnect and connect ledger live on walletconnect modal --- packages/core/src/views/connect/Index.svelte | 25 +++++++--------- packages/demo/src/utils/network.ts | 12 ++++++-- packages/demo/src/web3-onboard.ts | 18 ++++++++++- packages/walletconnect/src/walletConnect.ts | 30 +++++++++++-------- .../src/walletConnect.ts | 8 +++++ 5 files changed, 62 insertions(+), 31 deletions(-) diff --git a/packages/core/src/views/connect/Index.svelte b/packages/core/src/views/connect/Index.svelte index b535b51b1..c99626d6b 100644 --- a/packages/core/src/views/connect/Index.svelte +++ b/packages/core/src/views/connect/Index.svelte @@ -161,7 +161,6 @@ const { chains } = state.get() - const { provider, instance } = await getInterface({ chains: chains.filter((chain) => chain.namespace === type), BigNumber, @@ -182,7 +181,7 @@ instance, accounts: [], chains: [{ namespace: type, id: (type === 'evm' ? - '0x1' : '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3') }] + '0x1' : '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3') }] } connectingErrorMessage = '' @@ -249,16 +248,16 @@ if(qrModalConnect$.value.modal){ qrModalConnect$.value.modal - .subscribeModal(async ({ open }) => { - if(!open - && !(selectedWallet?.accounts - && selectedWallet.accounts.length !== 0)) - { - connectionRejected = true; - removeStateModalListener(); - removeUriListener(); - } - }) + .subscribeModal(async ({ open }) => { + if(!open + && !(selectedWallet?.accounts + && selectedWallet.accounts.length !== 0)) + { + connectionRejected = true; + removeStateModalListener(); + removeUriListener(); + } + }) } cancelPreviousConnect$.next() let chain: string | undefined = undefined; @@ -271,8 +270,6 @@ }) try { - - const valueResponse = await Promise.race([ // resolved account type === 'evm' ? await requestAccounts(provider as EIP1193Provider) : await enable(provider as SubstrateProvider) , diff --git a/packages/demo/src/utils/network.ts b/packages/demo/src/utils/network.ts index 5f942817d..563143c4f 100644 --- a/packages/demo/src/utils/network.ts +++ b/packages/demo/src/utils/network.ts @@ -26,9 +26,9 @@ export const NetworkInfo : Record = { namespace: 'substrate', wsProvider: "wss://westend-rpc.polkadot.io" }, - 'Ethereum Mainnet': { + 'Ethereum': { slug: 'ethereum', - name: 'Ethereum Mainnet', + name: 'Ethereum', namespace: 'evm' }, 'Moonbeam': { @@ -56,11 +56,17 @@ export const NetworkInfo : Record = { name: 'Shiden', namespace: 'evm' }, - 'Mumbai': { + 'Polygon': { slug: 'polygon', name: 'Polygon', namespace: 'evm' }, + 'Binance': { + slug: 'binance', + name: 'Binance', + namespace: 'evm' + }, + 'Polkadot Asset Hub': { slug: 'statemint', namespace: 'substrate', diff --git a/packages/demo/src/web3-onboard.ts b/packages/demo/src/web3-onboard.ts index b8ffadec4..bb5fa3584 100644 --- a/packages/demo/src/web3-onboard.ts +++ b/packages/demo/src/web3-onboard.ts @@ -106,7 +106,7 @@ export default init({ // the native token symbol, eg ETH, BNB, MATIC token: 'ETH', // used for display, eg Ethereum Mainnet - label: 'Ethereum Mainnet', + label: 'Ethereum', // used for network requests rpcUrl: `https://ethereum.publicnode.com`, decimal: 18 @@ -143,6 +143,22 @@ export default init({ namespace : 'evm', decimal: 18 }, + { + id: '0x38', + token: 'BNB', + label: 'Binance', + rpcUrl: 'https://bsc-dataseed.binance.org/', + secondaryTokens: [ + { + address: '0x4d61577d8fd2208a0afb814ea089fdeae19ed202', + icon: `https://assets.coingecko.com/coins/images/15363/small/vfox2.png?1629870083` + }, + { + address: '0xde2f075f6f14eb9d96755b24e416a53e736ca363', + icon: `https://assets.coingecko.com/coins/images/13423/small/frax_share.png?1608478989` + } + ] + }, ], diff --git a/packages/walletconnect/src/walletConnect.ts b/packages/walletconnect/src/walletConnect.ts index 96f02f669..8823f9796 100644 --- a/packages/walletconnect/src/walletConnect.ts +++ b/packages/walletconnect/src/walletConnect.ts @@ -58,11 +58,11 @@ function walletConnect(options: WalletConnectOptions): WalletInit { const { ProviderRpcError, ProviderRpcErrorCode } = await import( '@subwallet-connect/common' - ) + ) const { default: EthereumProvider, REQUIRED_METHODS } = await import( '@walletconnect/ethereum-provider' - ) + ) const { Subject, fromEvent } = await import('rxjs') const { takeUntil, take } = await import('rxjs/operators') @@ -72,10 +72,10 @@ function walletConnect(options: WalletConnectOptions): WalletInit { const url = dappUrl || appMetadata.explore || '' !url && - !url.length && - console.warn( - `It is strongly recommended to supply a dappUrl as it is required by some wallets (i.e. MetaMask) to allow connection.` - ) + !url.length && + console.warn( + `It is strongly recommended to supply a dappUrl as it is required by some wallets (i.e. MetaMask) to allow connection.` + ) const wcMetaData: CoreTypes.Metadata = { name: appMetadata.name, description: appMetadata.description || '', @@ -95,6 +95,8 @@ function walletConnect(options: WalletConnectOptions): WalletInit { return wcMetaData } + const requiredChainForLedger = [1, 137, 56, 42161, 10, 43114, 5] + // default to mainnet const requiredChainsParsed: number[] = Array.isArray(requiredChains) && @@ -102,8 +104,9 @@ function walletConnect(options: WalletConnectOptions): WalletInit { requiredChains.every(num => !isNaN(num)) ? // @ts-ignore // Required as WC package does not support hex numbers - requiredChains.map(chainID => parseInt(chainID)) - : [] + requiredChains.map(chainID => parseInt(chainID)) + : chains.map(({ id }) => parseInt(id, 16)) + .filter(value => requiredChainForLedger.find((value_) => value_ === value)) // Defaults to the chains provided within the web3-onboard init chain property const optionalChainsParsed: number[] = @@ -112,7 +115,7 @@ function walletConnect(options: WalletConnectOptions): WalletInit { optionalChains.every(num => !isNaN(num)) ? // @ts-ignore // Required as WC package does not support hex numbers - optionalChains.map(chainID => parseInt(chainID)) + optionalChains.map(chainID => parseInt(chainID)) : chains.map(({ id }) => parseInt(id, 16)) const requiredMethodsSet = new Set( @@ -160,9 +163,9 @@ function walletConnect(options: WalletConnectOptions): WalletInit { private disconnected$: InstanceType constructor({ - connector, - chains - }: { + connector, + chains + }: { connector: InstanceType chains: Chain[] }) { @@ -214,7 +217,7 @@ function walletConnect(options: WalletConnectOptions): WalletInit { this.emit('accountsChanged', []) this.disconnected$.next(true) typeof localStorage !== 'undefined' && - localStorage.removeItem('walletconnect') + localStorage.removeItem('walletconnect') }, error: console.warn }) @@ -264,6 +267,7 @@ function walletConnect(options: WalletConnectOptions): WalletInit { } if (method === 'eth_requestAccounts') { + return new Promise( async (resolve, reject) => { // Subscribe to connection events diff --git a/packages/walletconnectPolkadot/src/walletConnect.ts b/packages/walletconnectPolkadot/src/walletConnect.ts index a06791a59..a02b33c67 100644 --- a/packages/walletconnectPolkadot/src/walletConnect.ts +++ b/packages/walletconnectPolkadot/src/walletConnect.ts @@ -327,6 +327,13 @@ function walletConnect(options: WalletConnectOptions): WalletInit { events: ['chainChanged", "accountsChanged', 'connect'] }, }, + optionalNamespaces: { + polkadot: { + methods: optionalMethods, + chains: convertChainIdToCaipId(), + events: ['chainChanged", "accountsChanged', 'connect'] + }, + } }).catch(err => { console.error('err creating new session: ', err) reject( @@ -352,6 +359,7 @@ function walletConnect(options: WalletConnectOptions): WalletInit { ) } + if (method === 'polkadot_signMessage') { if(!this.connector.session) {