diff --git a/packages/adapters/wagmi/src/client.ts b/packages/adapters/wagmi/src/client.ts index c2a3c8027b..fc776d16d1 100644 --- a/packages/adapters/wagmi/src/client.ts +++ b/packages/adapters/wagmi/src/client.ts @@ -232,7 +232,8 @@ export class WagmiAdapter extends AdapterBlueprint { }) } - if (accountData.chainId !== prevAccountData?.chainId) { + // When it receives a non-evm chainId we shouldn't trigger this + if (accountData.chainId !== prevAccountData?.chainId && !isNaN(accountData.chainId)) { this.emit('switchNetwork', { address: accountData.address, chainId: accountData.chainId @@ -604,6 +605,7 @@ export class WagmiAdapter extends AdapterBlueprint { } public override async switchNetwork(params: AdapterBlueprint.SwitchNetworkParams) { + await super.switchNetwork(params) await switchChain(this.wagmiConfig, { chainId: params.caipNetwork.id as number }) } diff --git a/packages/appkit/src/client.ts b/packages/appkit/src/client.ts index 9b4a4e8595..286dc884cb 100644 --- a/packages/appkit/src/client.ts +++ b/packages/appkit/src/client.ts @@ -69,6 +69,7 @@ import { ConstantsUtil as UtilConstantsUtil } from '@reown/appkit-utils' import { + AUTH_ENABLED_CHAINS, W3mFrameHelpers, W3mFrameProvider, W3mFrameRpcConstants, @@ -1030,61 +1031,33 @@ export class AppKit { if (!caipNetwork) { return } - if ( - AccountController.state.address && - caipNetwork.chainNamespace === ChainController.state.activeChain - ) { - const adapter = this.getAdapter(ChainController.state.activeChain) - const provider = ProviderUtil.getProvider(ChainController.state.activeChain) - const providerType = ProviderUtil.state.providerIds[ChainController.state.activeChain] + const newNamespace = caipNetwork.chainNamespace + const adapter = this.getAdapter(newNamespace) + const provider = ProviderUtil.getProvider(newNamespace) + const providerType = ProviderUtil.state.providerIds[newNamespace] + const connectorId = StorageUtil.getConnectedConnectorId(newNamespace) + try { await adapter?.switchNetwork({ caipNetwork, provider, providerType }) this.setCaipNetwork(caipNetwork) - await this.syncAccount({ - address: AccountController.state.address, - chainId: caipNetwork.id, - chainNamespace: caipNetwork.chainNamespace - }) - } else if (AccountController.state.address) { - const providerType = - ProviderUtil.state.providerIds[ChainController.state.activeChain as ChainNamespace] - - if (providerType === UtilConstantsUtil.CONNECTOR_TYPE_AUTH) { - try { - ChainController.state.activeChain = caipNetwork.chainNamespace - await this.connectionControllerClient?.connectExternal?.({ - id: ConstantsUtil.CONNECTOR_ID.AUTH, - provider: this.authProvider, - chain: caipNetwork.chainNamespace, - chainId: caipNetwork.id, - type: UtilConstantsUtil.CONNECTOR_TYPE_AUTH as ConnectorType, - caipNetwork - }) - this.setCaipNetwork(caipNetwork) - } catch (error) { - const adapter = this.getAdapter(caipNetwork.chainNamespace as ChainNamespace) - await adapter?.switchNetwork({ - caipNetwork, - provider: this.authProvider, - providerType - }) - } - } else if (providerType === 'WALLET_CONNECT') { - this.setCaipNetwork(caipNetwork) - this.syncWalletConnectAccount() - } else { - this.setCaipNetwork(caipNetwork) - const address = this.getAddressByChainNamespace(caipNetwork.chainNamespace) + + if (connectorId) { + const accounts = await adapter?.getAccounts({ + namespace: newNamespace, + id: connectorId + }) + + const address = accounts?.accounts?.[0]?.address if (address) { - this.syncAccount({ + await this.syncAccount({ address, chainId: caipNetwork.id, chainNamespace: caipNetwork.chainNamespace }) } } - } else { - this.setCaipNetwork(caipNetwork) + } catch (error) { + this.setUnsupportedNetwork(caipNetwork.id) } }, // eslint-disable-next-line @typescript-eslint/require-await @@ -1159,15 +1132,7 @@ export class AppKit { } } }) - provider.onNotConnected(() => { - const namespace = ChainController.state.activeChain as ChainNamespace - const connectorId = StorageUtil.getConnectedConnectorId(namespace) - const isConnectedWithAuth = connectorId === ConstantsUtil.CONNECTOR_ID.AUTH - if (isConnectedWithAuth) { - this.setCaipAddress(undefined, namespace) - this.setLoading(false) - } - }) + provider.onConnect(async user => { const namespace = ChainController.state.activeChain as ChainNamespace @@ -1267,15 +1232,26 @@ export class AppKit { if (namespace) { if (isConnected && this.connectionControllerClient?.connectExternal) { - await this.connectionControllerClient?.connectExternal({ + const connector = { id: ConstantsUtil.CONNECTOR_ID.AUTH, info: { name: ConstantsUtil.CONNECTOR_ID.AUTH }, type: UtilConstantsUtil.CONNECTOR_TYPE_AUTH as ConnectorType, provider, chainId: ChainController.state.activeCaipNetwork?.id, chain: namespace + } + await this.connectionControllerClient?.connectExternal(connector) + + // Connecting to one namespace connects to all + AUTH_ENABLED_CHAINS.forEach(chain => { + this.setStatus('connected', chain) + this.syncProvider({ + provider, + chainNamespace: connector.chain, + type: connector.type, + id: connector.id + }) }) - this.setStatus('connected', namespace) } else if ( StorageUtil.getConnectedConnectorId(namespace) === ConstantsUtil.CONNECTOR_ID.AUTH ) { @@ -1708,7 +1684,14 @@ export class AppKit { n => n.caipNetworkId === `${chainNamespace}:${chainId}` ) - if (chainNamespace !== ConstantsUtil.CHAIN.EVM || activeCaipNetwork?.testnet) { + if (activeCaipNetwork?.testnet) { + return + } + + if (chainNamespace !== ConstantsUtil.CHAIN.EVM) { + this.setProfileName(null, chainNamespace) + this.setProfileImage(null, chainNamespace) + return } try { diff --git a/packages/wallet/index.ts b/packages/wallet/index.ts index b4f0dea32e..28434cf46a 100644 --- a/packages/wallet/index.ts +++ b/packages/wallet/index.ts @@ -8,7 +8,8 @@ export { W3mFrameSchema } from './src/W3mFrameSchema.js' export { W3mFrameConstants, W3mFrameRpcConstants, - type W3mFrameConstantValue + type W3mFrameConstantValue, + AUTH_ENABLED_CHAINS } from './src/W3mFrameConstants.js' export { W3mFrameStorage } from './src/W3mFrameStorage.js' export type { W3mFrameTypes } from './src/W3mFrameTypes.js' diff --git a/packages/wallet/src/W3mFrameConstants.ts b/packages/wallet/src/W3mFrameConstants.ts index 24bed2b17b..fb798f5bbb 100644 --- a/packages/wallet/src/W3mFrameConstants.ts +++ b/packages/wallet/src/W3mFrameConstants.ts @@ -5,6 +5,8 @@ export const DEFAULT_LOG_LEVEL = process.env['NEXT_PUBLIC_DEFAULT_LOG_LEVEL'] || export const SECURE_SITE_SDK_VERSION = process.env['NEXT_PUBLIC_SECURE_SITE_SDK_VERSION'] || 3 +export const AUTH_ENABLED_CHAINS = ['eip155', 'solana'] as const + export const W3mFrameConstants = { APP_EVENT_KEY: '@w3m-app/', FRAME_EVENT_KEY: '@w3m-frame/',