From 0520586d632722de331a83af98ea850af613881c Mon Sep 17 00:00:00 2001 From: enesozturk Date: Fri, 27 Sep 2024 14:22:57 +0300 Subject: [PATCH 01/30] refactor: handle viem chains in wagmi adapter constructor --- apps/laboratory/next.config.mjs | 2 +- apps/laboratory/src/pages/library/wagmi.tsx | 5 +- .../tests/shared/validators/ModalValidator.ts | 6 + apps/laboratory/tests/wallet.spec.ts | 9 ++ packages/adapters/wagmi/src/client.ts | 20 ++- .../src/connectors/UniversalConnector.ts | 4 +- packages/adapters/wagmi/src/index.ts | 3 - packages/adapters/wagmi/src/utils/chains.ts | 60 ++++++++ packages/adapters/wagmi/src/utils/helpers.ts | 33 +---- pnpm-lock.yaml | 131 ++++++++++++++---- 10 files changed, 198 insertions(+), 75 deletions(-) create mode 100644 packages/adapters/wagmi/src/utils/chains.ts diff --git a/apps/laboratory/next.config.mjs b/apps/laboratory/next.config.mjs index 9b2b20f7ed..f3e960b4fb 100644 --- a/apps/laboratory/next.config.mjs +++ b/apps/laboratory/next.config.mjs @@ -11,7 +11,7 @@ const cspHeader = ` style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src * 'self' data: blob: https://walletconnect.org https://walletconnect.com https://secure.walletconnect.com https://secure.walletconnect.org https://tokens-data.1inch.io https://tokens.1inch.io https://ipfs.io https://appkit-lab.reown.org; font-src 'self' https://fonts.gstatic.com; - connect-src 'self' https://react-wallet.walletconnect.com https://rpc.walletconnect.com https://rpc.walletconnect.org https://relay.walletconnect.com https://relay.walletconnect.org wss://relay.walletconnect.com wss://relay.walletconnect.org https://pulse.walletconnect.com https://pulse.walletconnect.org https://api.web3modal.com https://api.web3modal.org wss://www.walletlink.org https://o1095249.ingest.sentry.io https://quote-api.jup.ag; + connect-src 'self' https://react-wallet.walletconnect.com https://rpc.walletconnect.com https://rpc.walletconnect.org https://relay.walletconnect.com https://relay.walletconnect.org wss://relay.walletconnect.com wss://relay.walletconnect.org https://pulse.walletconnect.com https://pulse.walletconnect.org https://api.web3modal.com https://api.web3modal.org wss://www.walletlink.org https://o1095249.ingest.sentry.io https://quote-api.jup.ag https://eth-rpc-acala.aca-api.network/ https://build.onbeam.com/rpc; frame-src 'self' https://verify.walletconnect.com https://verify.walletconnect.org https://secure.walletconnect.com https://secure.walletconnect.org ${ process.env.NEXT_PUBLIC_SECURE_SITE_SDK_URL || '' } https://widget.solflare.com/; diff --git a/apps/laboratory/src/pages/library/wagmi.tsx b/apps/laboratory/src/pages/library/wagmi.tsx index 2466f0cc07..5e6e5fbd91 100644 --- a/apps/laboratory/src/pages/library/wagmi.tsx +++ b/apps/laboratory/src/pages/library/wagmi.tsx @@ -7,18 +7,19 @@ import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' import { createAppKit } from '@reown/appkit/react' import { ConstantsUtil } from '../../utils/ConstantsUtil' import { ThemeStore } from '../../utils/StoreUtil' +import { acala, beam } from 'viem/chains' const queryClient = new QueryClient() const wagmiAdapter = new WagmiAdapter({ ssr: true, - networks: ConstantsUtil.EvmNetworks, + networks: [...ConstantsUtil.EvmNetworks, acala, beam], projectId: ConstantsUtil.ProjectId }) const modal = createAppKit({ adapters: [wagmiAdapter], - networks: ConstantsUtil.EvmNetworks, + networks: wagmiAdapter.caipNetworks, projectId: ConstantsUtil.ProjectId, features: { analytics: true, diff --git a/apps/laboratory/tests/shared/validators/ModalValidator.ts b/apps/laboratory/tests/shared/validators/ModalValidator.ts index 49e2a9b88d..3755864e8f 100644 --- a/apps/laboratory/tests/shared/validators/ModalValidator.ts +++ b/apps/laboratory/tests/shared/validators/ModalValidator.ts @@ -220,6 +220,12 @@ export class ModalValidator { throw new Error('Call status not confirmed') } + async expectNetworkVisible(name: string) { + const network = this.page.getByTestId(`w3m-network-switch-${name}`) + await expect(network).toBeVisible() + await expect(network).toBeDisabled() + } + async expectNetworksDisabled(name: string) { const disabledNetwork = this.page.getByTestId(`w3m-network-switch-${name}`) await expect(disabledNetwork.locator('button')).toBeDisabled() diff --git a/apps/laboratory/tests/wallet.spec.ts b/apps/laboratory/tests/wallet.spec.ts index dd98cb135a..afe036b588 100644 --- a/apps/laboratory/tests/wallet.spec.ts +++ b/apps/laboratory/tests/wallet.spec.ts @@ -45,6 +45,15 @@ sampleWalletTest('it should fetch balance as expected', async ({ library }) => { await modalValidator.expectBalanceFetched(library === 'solana' ? 'SOL' : 'ETH') }) +sampleWalletTest('it should show viem networks', async ({ library }) => { + if (library === 'wagmi') { + await modalPage.openModal() + await modalPage.openNetworks() + await modalValidator.expectNetworkVisible('Beam') + await modalPage.closeModal() + } +}) + sampleWalletTest('it should show disabled networks', async ({ library }) => { const disabledNetworks = library === 'solana' ? 'Solana Unsupported' : 'Gnosis' diff --git a/packages/adapters/wagmi/src/client.ts b/packages/adapters/wagmi/src/client.ts index 36f2d8c598..2517910b0d 100644 --- a/packages/adapters/wagmi/src/client.ts +++ b/packages/adapters/wagmi/src/client.ts @@ -57,7 +57,6 @@ import { SafeLocalStorageKeys } from '@reown/appkit-common' import { - convertToAppKitChains, getEmailCaipNetworks, getTransport, getWalletConnectCaipNetworks, @@ -75,6 +74,7 @@ import { walletConnect } from './connectors/UniversalConnector.js' import { coinbaseWallet } from '@wagmi/connectors' import { authConnector } from './connectors/AuthConnector.js' import { ProviderUtil } from '@reown/appkit/store' +import { ChainsUtil } from './utils/chains.js' // -- Types --------------------------------------------------------------------- export interface AdapterOptions @@ -140,16 +140,22 @@ export class WagmiAdapter implements ChainAdapter { public constructor( configParams: Partial & { - networks: CaipNetwork[] + networks: (CaipNetwork | Chain)[] projectId: string } ) { - this.caipNetworks = configParams.networks.map(caipNetwork => ({ - ...caipNetwork, - rpcUrl: CaipNetworksUtil.extendRpcUrlWithProjectId(caipNetwork.rpcUrl, configParams.projectId) - })) + this.caipNetworks = configParams.networks.map(network => { + if ('chainNamespace' in network) { + return { + ...network, + rpcUrl: CaipNetworksUtil.extendRpcUrlWithProjectId(network.rpcUrl, configParams.projectId) + } + } + + return ChainsUtil.convertViemChainToCaipNetwork(network) + }) - this.wagmiChains = convertToAppKitChains( + this.wagmiChains = ChainsUtil.convertCaipNetworksToViemChains( this.caipNetworks.filter( caipNetwork => caipNetwork.chainNamespace === CommonConstantsUtil.CHAIN.EVM ) diff --git a/packages/adapters/wagmi/src/connectors/UniversalConnector.ts b/packages/adapters/wagmi/src/connectors/UniversalConnector.ts index 38b68d9b4e..1768881a47 100644 --- a/packages/adapters/wagmi/src/connectors/UniversalConnector.ts +++ b/packages/adapters/wagmi/src/connectors/UniversalConnector.ts @@ -22,7 +22,7 @@ import { WcHelpersUtil } from '@reown/appkit' import { StorageUtil } from '@reown/appkit-core' import type { AppKitOptions } from '@reown/appkit' import type { AppKit } from '@reown/appkit' -import { convertToAppKitChains } from '../utils/helpers.js' +import { ChainsUtil } from '../utils/chains.js' type UniversalConnector = Connector & { onDisplayUri(uri: string): void @@ -287,7 +287,7 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { } const chain = parameters.networks.find(x => x.chainId === chainId) - const [wagmiChain] = chain ? convertToAppKitChains([chain]) : [] + const [wagmiChain] = chain ? ChainsUtil.convertCaipNetworksToViemChains([chain]) : [] if (!wagmiChain) { throw new SwitchChainError(new ChainNotConfiguredError()) diff --git a/packages/adapters/wagmi/src/index.ts b/packages/adapters/wagmi/src/index.ts index 3d7d7725f9..0fecfc9d21 100644 --- a/packages/adapters/wagmi/src/index.ts +++ b/packages/adapters/wagmi/src/index.ts @@ -7,6 +7,3 @@ export type { AdapterOptions } from './client.js' // -- Connectors export { authConnector } from './connectors/AuthConnector.js' - -// -- Utils -export { convertToAppKitChains } from './utils/helpers.js' diff --git a/packages/adapters/wagmi/src/utils/chains.ts b/packages/adapters/wagmi/src/utils/chains.ts new file mode 100644 index 0000000000..82b9ffac02 --- /dev/null +++ b/packages/adapters/wagmi/src/utils/chains.ts @@ -0,0 +1,60 @@ +import type { CaipNetwork } from '@reown/appkit-common' +import { defineChain, type Chain } from 'viem' + +export const ChainsUtil = { + /** + * Converts a Viem Chain object to a CaipNetwork object. + * @param chain - The Viem Chain object to convert. + * @returns The CaipNetwork object. + */ + convertViemChainToCaipNetwork(chain: Chain): CaipNetwork { + return { + id: `eip155:${chain.id}`, + chainId: chain.id, + chainNamespace: 'eip155', + name: chain.name, + currency: chain.nativeCurrency.symbol, + explorerUrl: chain.blockExplorers?.default?.url || '', + rpcUrl: chain.rpcUrls.default.http[0] || '', + imageUrl: undefined, + imageId: undefined + } + }, + + /** + * Converts an array of CaipNetwork objects to an array of Viem Chain objects. + * @param caipNetworks - The array of CaipNetwork objects to convert. + * @returns An array of Viem Chain objects. + */ + convertCaipNetworksToViemChains(caipNetworks: CaipNetwork[]) { + const chains = caipNetworks.map(caipNetwork => + defineChain({ + id: Number(caipNetwork.chainId), + name: caipNetwork.name, + network: caipNetwork.name, + nativeCurrency: { + decimals: 18, + name: caipNetwork.currency, + symbol: caipNetwork.currency + }, + rpcUrls: { + default: { + http: [caipNetwork.rpcUrl] + } + }, + blockExplorers: { + default: { + apiUrl: '', + name: '', + url: caipNetwork.explorerUrl || '' + } + }, + fees: undefined, + formatters: undefined, + serializers: undefined + }) + ) as unknown as readonly [Chain, ...Chain[]] + + return chains + } +} diff --git a/packages/adapters/wagmi/src/utils/helpers.ts b/packages/adapters/wagmi/src/utils/helpers.ts index 07e3da1577..59b7657795 100644 --- a/packages/adapters/wagmi/src/utils/helpers.ts +++ b/packages/adapters/wagmi/src/utils/helpers.ts @@ -1,4 +1,4 @@ -import { type CaipNetwork, type CaipNetworkId } from '@reown/appkit-common' +import { type CaipNetworkId } from '@reown/appkit-common' import { ConstantsUtil, PresetsUtil } from '@reown/appkit-utils' import { UniversalProvider } from '@walletconnect/universal-provider' import { fallback, http, type Hex } from 'viem' @@ -37,7 +37,7 @@ export function getEmailCaipNetworks() { export function getTransport({ chain, projectId }: { chain: Chain; projectId: string }) { const RPC_URL = CoreHelperUtil.getBlockchainApiUrl() - const chainDefaultUrl = chain.rpcUrls[0]?.http?.[0] + const chainDefaultUrl = chain.rpcUrls.default.http?.[0] if (!PresetsUtil.WalletConnectRpcChainIds.includes(chain.id)) { return http(chainDefaultUrl) @@ -70,32 +70,3 @@ export function requireCaipAddress(caipAddress: string) { return account } - -export function convertToAppKitChains(caipNetworks: CaipNetwork[]) { - const chains = caipNetworks.map(caipNetwork => ({ - blockExplorers: { - default: { - apiUrl: '', - name: '', - url: caipNetwork.explorerUrl || '' - } - }, - fees: undefined, - formatters: undefined, - id: Number(caipNetwork.chainId), - name: caipNetwork.name, - nativeCurrency: { - decimals: 18, - name: caipNetwork.currency, - symbol: caipNetwork.currency - }, - rpcUrls: { - default: { - http: [caipNetwork.rpcUrl] - } - }, - serializers: undefined - })) as unknown as readonly [Chain, ...Chain[]] - - return chains -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index feabd6a486..589aeb9070 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,7 +66,7 @@ importers: version: 0.22.0(rollup@4.21.3)(vite@5.2.11(@types/node@20.11.5)(terser@5.32.0)) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) apps/demo: dependencies: @@ -111,7 +111,7 @@ importers: version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) wagmi: specifier: 2.12.9 - version: 2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.62)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + version: 2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) zustand: specifier: 4.5.2 version: 4.5.2(@types/react@18.2.62)(react@18.2.0) @@ -440,9 +440,6 @@ importers: '@tanstack/react-query': specifier: 5.24.8 version: 5.24.8(react@18.2.0) - '@wagmi/connectors': - specifier: 5.1.9 - version: 5.1.9(@types/react@18.2.62)(@wagmi/core@2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.62)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) '@wagmi/core': specifier: 2.13.4 version: 2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)) @@ -460,7 +457,7 @@ importers: version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) wagmi: specifier: 2.12.9 - version: 2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.62)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + version: 2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) devDependencies: '@types/node': specifier: 20.11.5 @@ -608,7 +605,7 @@ importers: version: 5.2.11(@types/node@20.11.5)(terser@5.32.0) wagmi: specifier: 2.12.9 - version: 2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.62)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + version: 2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) devDependencies: '@types/react': specifier: 18.2.62 @@ -751,7 +748,7 @@ importers: version: 6.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) packages/adapters/ethers5: dependencies: @@ -809,7 +806,7 @@ importers: version: ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) packages/adapters/polkadot: dependencies: @@ -828,7 +825,7 @@ importers: version: 2.0.5(vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0)) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) packages/adapters/solana: dependencies: @@ -923,7 +920,7 @@ importers: version: 18.2.0(react@18.2.0) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) vue: specifier: 3.4.3 version: 3.4.3(typescript@5.3.3) @@ -993,7 +990,7 @@ importers: version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) wagmi: specifier: 2.12.9 version: 2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.0)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.0)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) @@ -1091,7 +1088,7 @@ importers: version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) vue: specifier: 3.4.3 version: 3.4.3(typescript@5.3.3) @@ -1137,7 +1134,7 @@ importers: version: 2.0.5(vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0)) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) packages/cdn: dependencies: @@ -1190,7 +1187,7 @@ importers: version: 2.0.5(vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0)) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) packages/core: dependencies: @@ -1215,7 +1212,7 @@ importers: version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) packages/ethers: dependencies: @@ -1459,7 +1456,7 @@ importers: version: 2.16.1 vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) packages/ui: dependencies: @@ -1493,7 +1490,7 @@ importers: version: 2.0.4(eslint@8.57.0) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) packages/wagmi: dependencies: @@ -1539,7 +1536,7 @@ importers: version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) vue: specifier: 3.4.3 version: 3.4.3(typescript@5.3.3) @@ -1570,7 +1567,7 @@ importers: version: 24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) vitest: specifier: 2.0.5 - version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) services/id-allocation-service: dependencies: @@ -20238,7 +20235,7 @@ snapshots: std-env: 3.7.0 test-exclude: 6.0.0 v8-to-istanbul: 9.3.0 - vitest: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + vitest: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -20256,7 +20253,7 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0) + vitest: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -20428,6 +20425,45 @@ snapshots: - utf-8-validate - zod + '@wagmi/connectors@5.1.9(@types/react@18.2.62)(@wagmi/core@2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': + dependencies: + '@coinbase/wallet-sdk': 4.0.4 + '@metamask/sdk': 0.28.2(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.0)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@wagmi/core': 2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)) + '@walletconnect/ethereum-provider': 2.15.3(@types/react@18.2.62)(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@5.0.10) + '@walletconnect/modal': 2.6.2(@types/react@18.2.62)(react@18.2.0) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + viem: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - react + - react-dom + - react-native + - rollup + - supports-color + - uWebSockets.js + - utf-8-validate + - zod + '@wagmi/core@2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.0)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))': dependencies: eventemitter3: 5.0.1 @@ -22865,7 +22901,7 @@ snapshots: eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.56.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.56.0) eslint-plugin-react: 7.36.1(eslint@8.56.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.56.0) @@ -22884,7 +22920,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0) eslint-plugin-react: 7.36.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -22919,7 +22955,7 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.56.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -22938,7 +22974,7 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -22967,7 +23003,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.56.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -22995,7 +23031,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -28000,7 +28036,7 @@ snapshots: fsevents: 2.3.3 terser: 5.32.0 - vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0): + vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0): dependencies: '@ampproject/remapping': 2.3.0 '@vitest/expect': 2.0.5 @@ -28125,6 +28161,43 @@ snapshots: - utf-8-validate - zod + wagmi@2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4): + dependencies: + '@tanstack/react-query': 5.24.8(react@18.2.0) + '@wagmi/connectors': 5.1.9(@types/react@18.2.62)(@wagmi/core@2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@wagmi/core': 2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)) + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + viem: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - immer + - ioredis + - react-dom + - react-native + - rollup + - supports-color + - uWebSockets.js + - utf-8-validate + - zod + walker@1.0.8: dependencies: makeerror: 1.0.12 From 7911f64194976a9b0d5f033117a7cbef8b3077f9 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Fri, 27 Sep 2024 14:40:21 +0300 Subject: [PATCH 02/30] chore: add viem network images --- apps/laboratory/src/pages/library/wagmi.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/laboratory/src/pages/library/wagmi.tsx b/apps/laboratory/src/pages/library/wagmi.tsx index 5e6e5fbd91..e29a71e576 100644 --- a/apps/laboratory/src/pages/library/wagmi.tsx +++ b/apps/laboratory/src/pages/library/wagmi.tsx @@ -21,6 +21,10 @@ const modal = createAppKit({ adapters: [wagmiAdapter], networks: wagmiAdapter.caipNetworks, projectId: ConstantsUtil.ProjectId, + chainImages: { + 787: 'https://imagedelivery.net/_aTEfDRm7z3tKgu9JhfeKA/59c89b74-8c5a-49e8-467b-607a2c0ac900/md', + 4337: 'https://imagedelivery.net/_aTEfDRm7z3tKgu9JhfeKA/e8537239-736f-4db2-f941-07ff4eb7de00/md' + }, features: { analytics: true, email: true, From 2ed8b256f98584d049f5275401bf742590e14cdd Mon Sep 17 00:00:00 2001 From: enesozturk Date: Mon, 30 Sep 2024 23:31:42 +0300 Subject: [PATCH 03/30] chore: export viem chain types and update wagmi client accordingly --- packages/adapters/wagmi/src/client.ts | 46 ++-- packages/appkit/package.json | 5 +- packages/appkit/src/networks/eip155.ts | 22 ++ packages/appkit/src/networks/index.ts | 239 +++++---------------- packages/common/package.json | 5 +- packages/common/src/utils/TypeUtil.ts | 21 ++ pnpm-lock.yaml | 277 ++++++++++++++++++++++++- 7 files changed, 397 insertions(+), 218 deletions(-) create mode 100644 packages/appkit/src/networks/eip155.ts diff --git a/packages/adapters/wagmi/src/client.ts b/packages/adapters/wagmi/src/client.ts index 2517910b0d..57e2d976f9 100644 --- a/packages/adapters/wagmi/src/client.ts +++ b/packages/adapters/wagmi/src/client.ts @@ -50,12 +50,7 @@ import type { import { formatUnits, parseUnits } from 'viem' import type { Hex } from 'viem' import { ConstantsUtil, PresetsUtil, HelpersUtil } from '@reown/appkit-utils' -import { - CaipNetworksUtil, - isReownName, - SafeLocalStorage, - SafeLocalStorageKeys -} from '@reown/appkit-common' +import { isReownName, SafeLocalStorage, SafeLocalStorageKeys } from '@reown/appkit-common' import { getEmailCaipNetworks, getTransport, @@ -67,7 +62,15 @@ import type { W3mFrameProvider, W3mFrameTypes } from '@reown/appkit-wallet' import { NetworkUtil } from '@reown/appkit-common' import { normalize } from 'viem/ens' import type { AppKitOptions } from '@reown/appkit' -import type { CaipAddress, CaipNetwork, ChainNamespace, AdapterType } from '@reown/appkit-common' +import type { + CaipAddress, + BaseChain, + BaseNetwork, + CaipNetwork, + ChainNamespace, + AdapterType, + CaipNetworkNew +} from '@reown/appkit-common' import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common' import type { AppKit } from '@reown/appkit' import { walletConnect } from './connectors/UniversalConnector.js' @@ -120,7 +123,7 @@ export class WagmiAdapter implements ChainAdapter { public chainNamespace: ChainNamespace = CommonConstantsUtil.CHAIN.EVM - public caipNetworks: CaipNetwork[] + public caipNetworks: [CaipNetworkNew, ...CaipNetworkNew[]] public wagmiChains: readonly [Chain, ...Chain[]] @@ -140,26 +143,19 @@ export class WagmiAdapter implements ChainAdapter { public constructor( configParams: Partial & { - networks: (CaipNetwork | Chain)[] + networks: [BaseChain, ...BaseChain[]] projectId: string } ) { - this.caipNetworks = configParams.networks.map(network => { - if ('chainNamespace' in network) { - return { - ...network, - rpcUrl: CaipNetworksUtil.extendRpcUrlWithProjectId(network.rpcUrl, configParams.projectId) - } - } - - return ChainsUtil.convertViemChainToCaipNetwork(network) - }) - - this.wagmiChains = ChainsUtil.convertCaipNetworksToViemChains( - this.caipNetworks.filter( - caipNetwork => caipNetwork.chainNamespace === CommonConstantsUtil.CHAIN.EVM - ) - ) + this.caipNetworks = configParams.networks.map((caipNetwork: BaseChain) => ({ + ...caipNetwork, + chainNamespace: 'eip155', + caipNetworkId: `${this.chainNamespace}:${caipNetwork.id}` + })) as [CaipNetworkNew, ...CaipNetworkNew[]] + + this.wagmiChains = this.caipNetworks.filter( + caipNetwork => caipNetwork.chainNamespace === 'eip155' + ) as [BaseChain, ...BaseChain[]] const transportsArr = this.wagmiChains.map(chain => [ chain.id, diff --git a/packages/appkit/package.json b/packages/appkit/package.json index e9afc3484a..b10c2e8884 100644 --- a/packages/appkit/package.json +++ b/packages/appkit/package.json @@ -89,16 +89,16 @@ } }, "dependencies": { - "@walletconnect/universal-provider": "2.16.1", "@reown/appkit-common": "workspace:*", "@reown/appkit-core": "workspace:*", "@reown/appkit-polyfills": "workspace:*", "@reown/appkit-scaffold-ui": "workspace:*", - "@reown/appkit-utils": "workspace:*", "@reown/appkit-siwe": "workspace:*", "@reown/appkit-ui": "workspace:*", + "@reown/appkit-utils": "workspace:*", "@reown/appkit-wallet": "workspace:*", "@walletconnect/types": "2.16.1", + "@walletconnect/universal-provider": "2.16.1", "@walletconnect/utils": "2.16.1", "valtio": "1.11.2" }, @@ -123,6 +123,7 @@ "ethers5": "npm:ethers@5.7.2", "react": "18.2.0", "react-dom": "18.2.0", + "tsx": "^4.19.1", "viem": "2.21.4", "vitest": "2.0.5", "vue": "3.4.3", diff --git a/packages/appkit/src/networks/eip155.ts b/packages/appkit/src/networks/eip155.ts new file mode 100644 index 0000000000..560ac7469e --- /dev/null +++ b/packages/appkit/src/networks/eip155.ts @@ -0,0 +1,22 @@ +import * as viemChains from 'viem/chains' + +// Create an object to hold modified chain data +const modifiedChains: Record< + string, + viemChains.Chain & { chainNamespace: string; caipNetworkId: string } +> = {} + +// Iterate through the chains and add the modified chain data +Object.keys(viemChains).forEach(chainName => { + const chain = viemChains[chainName as keyof typeof viemChains] as viemChains.Chain + + modifiedChains[chainName] = { + ...chain, + chainNamespace: 'eip155', + caipNetworkId: `eip155:${chain.id}` + } +}) + +// Export all modified chains using the spread operator +export const { mainnet, ropsten, rinkeby, kovan, goerli, polygon, optimism, arbitrum } = + modifiedChains diff --git a/packages/appkit/src/networks/index.ts b/packages/appkit/src/networks/index.ts index cbdaa4dd15..65b14f4d43 100644 --- a/packages/appkit/src/networks/index.ts +++ b/packages/appkit/src/networks/index.ts @@ -1,195 +1,64 @@ -import type { CaipNetwork, ChainNamespace } from '@reown/appkit-common' +import type { CaipNetworkNew } from '@reown/appkit-common' +import type { Assign, Prettify, ChainFormatters } from 'viem' -export function getBlockchainApiRpcUrl(chainId: number | string, namespace: ChainNamespace) { - return `https://rpc.walletconnect.org/v1/?chainId=${namespace}:${chainId}` -} - -export const mainnet: CaipNetwork = { - id: 'eip155:1', - chainId: 1, - name: 'Ethereum', - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: getBlockchainApiRpcUrl(1, 'eip155'), - chainNamespace: 'eip155' -} - -export const arbitrum: CaipNetwork = { - id: 'eip155:42161', - chainId: 42161, - name: 'Arbitrum', - currency: 'ETH', - explorerUrl: 'https://arbiscan.io', - rpcUrl: getBlockchainApiRpcUrl(42161, 'eip155'), - chainNamespace: 'eip155' -} - -export const avalanche: CaipNetwork = { - id: 'eip155:43114', - chainId: 43114, - name: 'Avalanche', - currency: 'AVAX', - explorerUrl: 'https://snowtrace.io', - rpcUrl: getBlockchainApiRpcUrl(43114, 'eip155'), - chainNamespace: 'eip155' -} - -export const binanceSmartChain: CaipNetwork = { - id: 'eip155:56', - chainId: 56, - name: 'Binance Smart Chain', - currency: 'BNB', - explorerUrl: 'https://bscscan.com', - rpcUrl: getBlockchainApiRpcUrl(56, 'eip155'), - chainNamespace: 'eip155' -} - -export const optimism: CaipNetwork = { - id: 'eip155:10', - chainId: 10, - name: 'Optimism', - currency: 'ETH', - explorerUrl: 'https://optimistic.etherscan.io', - rpcUrl: getBlockchainApiRpcUrl(10, 'eip155'), - chainNamespace: 'eip155' -} - -export const polygon: CaipNetwork = { - id: 'eip155:137', - chainId: 137, - name: 'Polygon', - currency: 'MATIC', - explorerUrl: 'https://polygonscan.com', - rpcUrl: getBlockchainApiRpcUrl(137, 'eip155'), - chainNamespace: 'eip155' -} - -export const gnosis: CaipNetwork = { - id: 'eip155:100', - chainId: 100, - name: 'Gnosis', - currency: 'xDAI', - explorerUrl: 'https://gnosis.blockscout.com', - rpcUrl: getBlockchainApiRpcUrl(100, 'eip155'), - chainNamespace: 'eip155' -} +import type { ChainNamespace } from '@reown/appkit-common' -export const zkSync: CaipNetwork = { - id: 'eip155:324', - chainId: 324, - name: 'ZkSync', - currency: 'ETH', - explorerUrl: 'https://explorer.zksync.io', - rpcUrl: getBlockchainApiRpcUrl(324, 'eip155'), - chainNamespace: 'eip155' -} - -export const zora: CaipNetwork = { - id: 'eip155:7777777', - chainId: 7777777, - name: 'Zora', - currency: 'ETH', - explorerUrl: 'https://explorer.zora.energy', - rpcUrl: getBlockchainApiRpcUrl(7777777, 'eip155'), - chainNamespace: 'eip155' -} - -export const celo: CaipNetwork = { - id: 'eip155:42220', - chainId: 42220, - name: 'Celo', - currency: 'CELO', - explorerUrl: 'https://explorer.celo.org/mainnet', - rpcUrl: getBlockchainApiRpcUrl(42220, 'eip155'), - chainNamespace: 'eip155' -} - -export const base: CaipNetwork = { - id: 'eip155:8453', - chainId: 8453, - name: 'Base', - currency: 'BASE', - explorerUrl: 'https://basescan.org', - rpcUrl: getBlockchainApiRpcUrl(8453, 'eip155'), - chainNamespace: 'eip155' -} - -export const aurora: CaipNetwork = { - id: 'eip155:1313161554', - chainId: 1313161554, - name: 'Aurora', - currency: 'ETH', - explorerUrl: 'https://explorer.aurora.dev', - rpcUrl: getBlockchainApiRpcUrl(1313161554, 'eip155'), - chainNamespace: 'eip155' -} +export * from 'viem/chains' -export const sepolia: CaipNetwork = { - id: 'eip155:11155111', - chainId: 11155111, - name: 'Sepolia', - currency: 'ETH', - explorerUrl: 'https://sepolia.etherscan.io', - rpcUrl: getBlockchainApiRpcUrl(11155111, 'eip155'), - chainNamespace: 'eip155' +export function getBlockchainApiRpcUrl(chainId: number | string, namespace: ChainNamespace) { + return `https://rpc.walletconnect.org/v1/?chainId=${namespace}:${chainId}` } -export const baseSepolia: CaipNetwork = { - id: 'eip155:84532', - chainId: 84532, - name: 'Base Sepolia', - currency: 'BASE', - explorerUrl: 'https://sepolia.basescan.org', - rpcUrl: getBlockchainApiRpcUrl(84532, 'eip155'), - chainNamespace: 'eip155' +export function defineChain< + formatters extends ChainFormatters, + const chain extends CaipNetworkNew +>(chain: chain): Prettify, chain>> { + return { + formatters: undefined, + fees: undefined, + serializers: undefined, + ...chain + } as Assign, chain> } -export const solana: CaipNetwork = { - id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - chainId: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', +export const solana = defineChain({ + id: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana', - currency: 'SOL', - explorerUrl: 'https://solscan.io', - rpcUrl: getBlockchainApiRpcUrl('5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', 'solana'), - chainNamespace: 'solana' -} - -export const solanaTestnet: CaipNetwork = { - id: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', - chainId: '4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', + network: 'solana-mainnet', + nativeCurrency: { name: 'Solana', symbol: 'SOL', decimals: 9 }, + rpcUrls: { + default: { http: [getBlockchainApiRpcUrl('5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', 'solana')] } + }, + blockExplorers: { default: { name: 'Solscan', url: 'https://solscan.io' } }, + testnet: false, + chainNamespace: 'solana', + caipNetworkId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' +}) + +export const solanaTestnet = defineChain({ + id: '4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', name: 'Solana Testnet', - currency: 'SOL', - explorerUrl: 'https://explorer.solana.com/?cluster=testnet', - rpcUrl: getBlockchainApiRpcUrl('4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', 'solana'), - chainNamespace: 'solana' -} - -export const solanaDevnet: CaipNetwork = { - id: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1', - chainId: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1', + network: 'solana-testnet', + nativeCurrency: { name: 'Solana', symbol: 'SOL', decimals: 9 }, + rpcUrls: { + default: { http: [getBlockchainApiRpcUrl('4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', 'solana')] } + }, + blockExplorers: { default: { name: 'Solscan', url: 'https://solscan.io' } }, + testnet: true, + chainNamespace: 'solana', + caipNetworkId: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z' +}) + +export const solanaDevnet = defineChain({ + id: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1', name: 'Solana Devnet', - currency: 'SOL', - explorerUrl: 'https://explorer.solana.com/?cluster=devnet', - rpcUrl: getBlockchainApiRpcUrl('EtWTRABZaYq6iMfeYKouRu166VU2xqa1', 'solana'), - chainNamespace: 'solana' -} - -export const allChains = [ - mainnet, - arbitrum, - avalanche, - binanceSmartChain, - optimism, - polygon, - gnosis, - zkSync, - zora, - celo, - base, - aurora, - sepolia, - baseSepolia, - solana, - solanaTestnet, - solanaDevnet -] + network: 'solana-devnet', + nativeCurrency: { name: 'Solana', symbol: 'SOL', decimals: 9 }, + rpcUrls: { + default: { http: [getBlockchainApiRpcUrl('EtWTRABZaYq6iMfeYKouRu166VU2xqa1', 'solana')] } + }, + blockExplorers: { default: { name: 'Solscan', url: 'https://solscan.io' } }, + testnet: true, + chainNamespace: 'solana', + caipNetworkId: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1' +}) diff --git a/packages/common/package.json b/packages/common/package.json index 96cb5b0ec4..24b9f2c9a9 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -21,8 +21,9 @@ "dayjs": "1.11.10" }, "devDependencies": { - "vitest": "2.0.5", - "@vitest/coverage-v8": "2.0.5" + "@vitest/coverage-v8": "2.0.5", + "viem": "2.21.4", + "vitest": "2.0.5" }, "keywords": [ "utils", diff --git a/packages/common/src/utils/TypeUtil.ts b/packages/common/src/utils/TypeUtil.ts index 3a5eb64533..0227c47c1c 100644 --- a/packages/common/src/utils/TypeUtil.ts +++ b/packages/common/src/utils/TypeUtil.ts @@ -1,3 +1,24 @@ +import type { Chain as BaseChain } from 'viem/chains' +import type { ChainFormatters } from 'viem' + +export type { BaseChain } + +export type BaseNetwork< + formatters extends ChainFormatters | undefined = ChainFormatters | undefined, + custom extends Record | undefined = Record | undefined +> = Omit, 'id'> & { + id: number | string +} + +export type CaipNetworkNew< + formatters extends ChainFormatters | undefined = ChainFormatters | undefined, + custom extends Record | undefined = Record | undefined +> = Omit, 'id'> & { + id: number | string + chainNamespace: ChainNamespace + caipNetworkId: CaipNetworkId +} + export type CaipNetworkId = `${ChainNamespace}:${ChainId}` export type CaipAddress = `${ChainNamespace}:${ChainId}:${string}` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 589aeb9070..19d0ebd16a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,6 +28,9 @@ importers: '@vitest/coverage-v8': specifier: 1.1.2 version: 1.1.2(vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0)) + axios: + specifier: 1.7.2 + version: 1.7.2 danger: specifier: 11.3.1 version: 11.3.1 @@ -1083,6 +1086,9 @@ importers: react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) + tsx: + specifier: ^4.19.1 + version: 4.19.1 viem: specifier: 2.21.4 version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) @@ -1185,6 +1191,9 @@ importers: '@vitest/coverage-v8': specifier: 2.0.5 version: 2.0.5(vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0)) + viem: + specifier: 2.21.4 + version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.32.0) @@ -3122,6 +3131,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -3158,6 +3173,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -3194,6 +3215,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -3230,6 +3257,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -3266,6 +3299,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -3302,6 +3341,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -3338,6 +3383,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -3374,6 +3425,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -3410,6 +3467,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -3446,6 +3509,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -3482,6 +3551,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -3518,6 +3593,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -3554,6 +3635,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -3590,6 +3677,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -3626,6 +3719,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -3662,6 +3761,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -3698,6 +3803,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -3734,6 +3845,18 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -3770,6 +3893,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -3806,6 +3935,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -3842,6 +3977,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -3878,6 +4019,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -3914,6 +4061,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8212,6 +8365,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -11948,6 +12106,11 @@ packages: typescript: optional: true + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + engines: {node: '>=18.0.0'} + hasBin: true + tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} @@ -15177,6 +15340,9 @@ snapshots: '@esbuild/aix-ppc64@0.21.1': optional: true + '@esbuild/aix-ppc64@0.23.1': + optional: true + '@esbuild/android-arm64@0.17.19': optional: true @@ -15195,6 +15361,9 @@ snapshots: '@esbuild/android-arm64@0.21.1': optional: true + '@esbuild/android-arm64@0.23.1': + optional: true + '@esbuild/android-arm@0.17.19': optional: true @@ -15213,6 +15382,9 @@ snapshots: '@esbuild/android-arm@0.21.1': optional: true + '@esbuild/android-arm@0.23.1': + optional: true + '@esbuild/android-x64@0.17.19': optional: true @@ -15231,6 +15403,9 @@ snapshots: '@esbuild/android-x64@0.21.1': optional: true + '@esbuild/android-x64@0.23.1': + optional: true + '@esbuild/darwin-arm64@0.17.19': optional: true @@ -15249,6 +15424,9 @@ snapshots: '@esbuild/darwin-arm64@0.21.1': optional: true + '@esbuild/darwin-arm64@0.23.1': + optional: true + '@esbuild/darwin-x64@0.17.19': optional: true @@ -15267,6 +15445,9 @@ snapshots: '@esbuild/darwin-x64@0.21.1': optional: true + '@esbuild/darwin-x64@0.23.1': + optional: true + '@esbuild/freebsd-arm64@0.17.19': optional: true @@ -15285,6 +15466,9 @@ snapshots: '@esbuild/freebsd-arm64@0.21.1': optional: true + '@esbuild/freebsd-arm64@0.23.1': + optional: true + '@esbuild/freebsd-x64@0.17.19': optional: true @@ -15303,6 +15487,9 @@ snapshots: '@esbuild/freebsd-x64@0.21.1': optional: true + '@esbuild/freebsd-x64@0.23.1': + optional: true + '@esbuild/linux-arm64@0.17.19': optional: true @@ -15321,6 +15508,9 @@ snapshots: '@esbuild/linux-arm64@0.21.1': optional: true + '@esbuild/linux-arm64@0.23.1': + optional: true + '@esbuild/linux-arm@0.17.19': optional: true @@ -15339,6 +15529,9 @@ snapshots: '@esbuild/linux-arm@0.21.1': optional: true + '@esbuild/linux-arm@0.23.1': + optional: true + '@esbuild/linux-ia32@0.17.19': optional: true @@ -15357,6 +15550,9 @@ snapshots: '@esbuild/linux-ia32@0.21.1': optional: true + '@esbuild/linux-ia32@0.23.1': + optional: true + '@esbuild/linux-loong64@0.17.19': optional: true @@ -15375,6 +15571,9 @@ snapshots: '@esbuild/linux-loong64@0.21.1': optional: true + '@esbuild/linux-loong64@0.23.1': + optional: true + '@esbuild/linux-mips64el@0.17.19': optional: true @@ -15393,6 +15592,9 @@ snapshots: '@esbuild/linux-mips64el@0.21.1': optional: true + '@esbuild/linux-mips64el@0.23.1': + optional: true + '@esbuild/linux-ppc64@0.17.19': optional: true @@ -15411,6 +15613,9 @@ snapshots: '@esbuild/linux-ppc64@0.21.1': optional: true + '@esbuild/linux-ppc64@0.23.1': + optional: true + '@esbuild/linux-riscv64@0.17.19': optional: true @@ -15429,6 +15634,9 @@ snapshots: '@esbuild/linux-riscv64@0.21.1': optional: true + '@esbuild/linux-riscv64@0.23.1': + optional: true + '@esbuild/linux-s390x@0.17.19': optional: true @@ -15447,6 +15655,9 @@ snapshots: '@esbuild/linux-s390x@0.21.1': optional: true + '@esbuild/linux-s390x@0.23.1': + optional: true + '@esbuild/linux-x64@0.17.19': optional: true @@ -15465,6 +15676,9 @@ snapshots: '@esbuild/linux-x64@0.21.1': optional: true + '@esbuild/linux-x64@0.23.1': + optional: true + '@esbuild/netbsd-x64@0.17.19': optional: true @@ -15483,6 +15697,12 @@ snapshots: '@esbuild/netbsd-x64@0.21.1': optional: true + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + '@esbuild/openbsd-x64@0.17.19': optional: true @@ -15501,6 +15721,9 @@ snapshots: '@esbuild/openbsd-x64@0.21.1': optional: true + '@esbuild/openbsd-x64@0.23.1': + optional: true + '@esbuild/sunos-x64@0.17.19': optional: true @@ -15519,6 +15742,9 @@ snapshots: '@esbuild/sunos-x64@0.21.1': optional: true + '@esbuild/sunos-x64@0.23.1': + optional: true + '@esbuild/win32-arm64@0.17.19': optional: true @@ -15537,6 +15763,9 @@ snapshots: '@esbuild/win32-arm64@0.21.1': optional: true + '@esbuild/win32-arm64@0.23.1': + optional: true + '@esbuild/win32-ia32@0.17.19': optional: true @@ -15555,6 +15784,9 @@ snapshots: '@esbuild/win32-ia32@0.21.1': optional: true + '@esbuild/win32-ia32@0.23.1': + optional: true + '@esbuild/win32-x64@0.17.19': optional: true @@ -15573,6 +15805,9 @@ snapshots: '@esbuild/win32-x64@0.21.1': optional: true + '@esbuild/win32-x64@0.23.1': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': dependencies: eslint: 8.56.0 @@ -17643,7 +17878,7 @@ snapshots: '@scure/bip32@1.4.0': dependencies: - '@noble/curves': 1.4.0 + '@noble/curves': 1.4.2 '@noble/hashes': 1.4.0 '@scure/base': 1.1.8 @@ -22883,6 +23118,33 @@ snapshots: '@esbuild/win32-ia32': 0.21.1 '@esbuild/win32-x64': 0.21.1 + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -23505,7 +23767,7 @@ snapshots: extension-port-stream@3.0.0: dependencies: - readable-stream: 3.6.2 + readable-stream: 4.5.2 webextension-polyfill: 0.10.0 external-editor@3.1.0: @@ -27591,6 +27853,13 @@ snapshots: - supports-color - ts-node + tsx@4.19.1: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + tty-browserify@0.0.1: {} tty-table@4.2.3: @@ -28222,8 +28491,8 @@ snapshots: webauthn-p256@0.0.5: dependencies: - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 webextension-polyfill@0.10.0: {} From 61b3fdb32565b2a8e86c08f5801aa6946523fae0 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Mon, 30 Sep 2024 23:31:49 +0300 Subject: [PATCH 04/30] chore: update lock file --- pnpm-lock.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19d0ebd16a..be036aed4e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,9 +28,6 @@ importers: '@vitest/coverage-v8': specifier: 1.1.2 version: 1.1.2(vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.32.0)) - axios: - specifier: 1.7.2 - version: 1.7.2 danger: specifier: 11.3.1 version: 11.3.1 @@ -443,6 +440,9 @@ importers: '@tanstack/react-query': specifier: 5.24.8 version: 5.24.8(react@18.2.0) + '@wagmi/connectors': + specifier: 5.1.9 + version: 5.1.9(@types/react@18.2.62)(@wagmi/core@2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.62)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) '@wagmi/core': specifier: 2.13.4 version: 2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)) @@ -460,7 +460,7 @@ importers: version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) wagmi: specifier: 2.12.9 - version: 2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + version: 2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.62)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) devDependencies: '@types/node': specifier: 20.11.5 @@ -23163,7 +23163,7 @@ snapshots: eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.56.0) eslint-plugin-react: 7.36.1(eslint@8.56.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.56.0) @@ -23182,7 +23182,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0) eslint-plugin-react: 7.36.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -23217,7 +23217,7 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.56.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -23236,7 +23236,7 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -23265,7 +23265,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.56.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -23293,7 +23293,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 From 98eb7a9e05b606b28fc754288431bb392ca86197 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Tue, 1 Oct 2024 11:41:17 +0300 Subject: [PATCH 05/30] chore: save state --- packages/adapters/wagmi/src/client.ts | 29 ++++++++++++++------------ packages/appkit/src/client.ts | 2 +- packages/appkit/src/utils/TypesUtil.ts | 4 ++-- packages/common/src/utils/TypeUtil.ts | 8 ++++--- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/packages/adapters/wagmi/src/client.ts b/packages/adapters/wagmi/src/client.ts index 57e2d976f9..a39e20d1ed 100644 --- a/packages/adapters/wagmi/src/client.ts +++ b/packages/adapters/wagmi/src/client.ts @@ -64,12 +64,12 @@ import { normalize } from 'viem/ens' import type { AppKitOptions } from '@reown/appkit' import type { CaipAddress, - BaseChain, BaseNetwork, CaipNetwork, ChainNamespace, AdapterType, - CaipNetworkNew + CaipNetworkNew, + CaipNetworkId } from '@reown/appkit-common' import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common' import type { AppKit } from '@reown/appkit' @@ -77,7 +77,6 @@ import { walletConnect } from './connectors/UniversalConnector.js' import { coinbaseWallet } from '@wagmi/connectors' import { authConnector } from './connectors/AuthConnector.js' import { ProviderUtil } from '@reown/appkit/store' -import { ChainsUtil } from './utils/chains.js' // -- Types --------------------------------------------------------------------- export interface AdapterOptions @@ -125,7 +124,7 @@ export class WagmiAdapter implements ChainAdapter { public caipNetworks: [CaipNetworkNew, ...CaipNetworkNew[]] - public wagmiChains: readonly [Chain, ...Chain[]] + public wagmiChains: readonly [BaseNetwork, ...BaseNetwork[]] public wagmiConfig: AdapterOptions['wagmiConfig'] @@ -143,23 +142,28 @@ export class WagmiAdapter implements ChainAdapter { public constructor( configParams: Partial & { - networks: [BaseChain, ...BaseChain[]] + networks: [CaipNetworkNew, ...CaipNetworkNew[]] projectId: string } ) { - this.caipNetworks = configParams.networks.map((caipNetwork: BaseChain) => ({ + this.caipNetworks = configParams.networks.map((caipNetwork: CaipNetworkNew) => ({ ...caipNetwork, - chainNamespace: 'eip155', - caipNetworkId: `${this.chainNamespace}:${caipNetwork.id}` + id: caipNetwork.id as number | string, + chainNamespace: 'eip155' as ChainNamespace, + caipNetworkId: `${this.chainNamespace}:${caipNetwork.id}` as CaipNetworkId, + assets: { + imageId: '', + imageUrl: '' + } })) as [CaipNetworkNew, ...CaipNetworkNew[]] this.wagmiChains = this.caipNetworks.filter( - caipNetwork => caipNetwork.chainNamespace === 'eip155' - ) as [BaseChain, ...BaseChain[]] + caipNetwork => caipNetwork.chainNamespace === CommonConstantsUtil.CHAIN.EVM + ) as unknown as [BaseNetwork, ...BaseNetwork[]] const transportsArr = this.wagmiChains.map(chain => [ chain.id, - getTransport({ chain, projectId: configParams.projectId }) + getTransport({ chain: chain as Chain, projectId: configParams.projectId }) ]) const transports = Object.fromEntries(transportsArr) @@ -225,7 +229,6 @@ export class WagmiAdapter implements ChainAdapter { this.appKit = appKit this.options = options - this.caipNetworks = options.networks this.defaultCaipNetwork = options.defaultNetwork || options.networks[0] this.tokens = HelpersUtil.getCaipTokens(options.tokens) this.setCustomConnectors(options, appKit) @@ -305,7 +308,7 @@ export class WagmiAdapter implements ChainAdapter { siweParams.chains = this.caipNetworks ?.filter(network => network.chainNamespace === 'eip155') - .map(chain => chain.chainId) as number[] + .map(chain => chain.id) as number[] const result = await provider.authenticate({ nonce: await siweConfig.getNonce(), diff --git a/packages/appkit/src/client.ts b/packages/appkit/src/client.ts index b5f77d2135..b750c4b8e8 100644 --- a/packages/appkit/src/client.ts +++ b/packages/appkit/src/client.ts @@ -522,7 +522,7 @@ export class AppKit { : undefined const network = caipNetwork ?? extendedDefaultNetwork ?? options.networks[0] - ChainController.setActiveCaipNetwork(network) + ChainController.setActiveCaipNetwork(network as CaipNetwork) } private async initOrContinue() { diff --git a/packages/appkit/src/utils/TypesUtil.ts b/packages/appkit/src/utils/TypesUtil.ts index 1ef7f297f9..e56a27662f 100644 --- a/packages/appkit/src/utils/TypesUtil.ts +++ b/packages/appkit/src/utils/TypesUtil.ts @@ -1,4 +1,4 @@ -import type { CaipNetwork, ThemeVariables } from '@reown/appkit-common' +import type { CaipNetworkNew, ThemeVariables } from '@reown/appkit-common' import type { ChainAdapter, Metadata, @@ -47,7 +47,7 @@ export type AppKitOptions = { * You can set the desired caipnetworks for the app: * @see https://docs.reown.com/appkit/react/core/options#defaultchain */ - networks: CaipNetwork[] + networks: readonly [CaipNetworkNew, ...CaipNetworkNew[]] /** * You can set a desired caipnetwork for the initial connection: * @see https://docs.reown.com/appkit/react/core/options#defaultchain diff --git a/packages/common/src/utils/TypeUtil.ts b/packages/common/src/utils/TypeUtil.ts index 0227c47c1c..4f7c9131ce 100644 --- a/packages/common/src/utils/TypeUtil.ts +++ b/packages/common/src/utils/TypeUtil.ts @@ -6,9 +6,7 @@ export type { BaseChain } export type BaseNetwork< formatters extends ChainFormatters | undefined = ChainFormatters | undefined, custom extends Record | undefined = Record | undefined -> = Omit, 'id'> & { - id: number | string -} +> = BaseChain export type CaipNetworkNew< formatters extends ChainFormatters | undefined = ChainFormatters | undefined, @@ -17,6 +15,10 @@ export type CaipNetworkNew< id: number | string chainNamespace: ChainNamespace caipNetworkId: CaipNetworkId + assets: { + imageId: string + imageUrl: string + } } export type CaipNetworkId = `${ChainNamespace}:${ChainId}` From b4a21f61dbafab74d2af8da6b2213ca132274c69 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Tue, 1 Oct 2024 11:44:03 +0300 Subject: [PATCH 06/30] chore: update lock file --- pnpm-lock.yaml | 342 +------------------------------------------------ 1 file changed, 6 insertions(+), 336 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ed8953aca..c37df49c0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1055,6 +1055,9 @@ importers: react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) + viem: + specifier: 2.21.4 + version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.33.0) @@ -1151,6 +1154,9 @@ importers: '@vitest/coverage-v8': specifier: 2.0.5 version: 2.0.5(vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.33.0)) + viem: + specifier: 2.21.4 + version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.33.0) @@ -3092,12 +3098,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -3134,12 +3134,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -3176,12 +3170,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -3218,12 +3206,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -3260,12 +3242,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -3302,12 +3278,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -3344,12 +3314,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -3386,12 +3350,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -3428,12 +3386,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -3470,12 +3422,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -3512,12 +3458,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -3554,12 +3494,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -3596,12 +3530,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -3638,12 +3566,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -3680,12 +3602,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -3722,12 +3638,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -3764,12 +3674,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -3806,18 +3710,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -3854,12 +3746,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -3896,12 +3782,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -3938,12 +3818,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -3980,12 +3854,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -4022,12 +3890,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8329,11 +8191,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -12070,11 +11927,6 @@ packages: typescript: optional: true - tsx@4.19.1: - resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} - engines: {node: '>=18.0.0'} - hasBin: true - tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} @@ -15305,9 +15157,6 @@ snapshots: '@esbuild/aix-ppc64@0.21.1': optional: true - '@esbuild/aix-ppc64@0.23.1': - optional: true - '@esbuild/android-arm64@0.17.19': optional: true @@ -15326,9 +15175,6 @@ snapshots: '@esbuild/android-arm64@0.21.1': optional: true - '@esbuild/android-arm64@0.23.1': - optional: true - '@esbuild/android-arm@0.17.19': optional: true @@ -15347,9 +15193,6 @@ snapshots: '@esbuild/android-arm@0.21.1': optional: true - '@esbuild/android-arm@0.23.1': - optional: true - '@esbuild/android-x64@0.17.19': optional: true @@ -15368,9 +15211,6 @@ snapshots: '@esbuild/android-x64@0.21.1': optional: true - '@esbuild/android-x64@0.23.1': - optional: true - '@esbuild/darwin-arm64@0.17.19': optional: true @@ -15389,9 +15229,6 @@ snapshots: '@esbuild/darwin-arm64@0.21.1': optional: true - '@esbuild/darwin-arm64@0.23.1': - optional: true - '@esbuild/darwin-x64@0.17.19': optional: true @@ -15410,9 +15247,6 @@ snapshots: '@esbuild/darwin-x64@0.21.1': optional: true - '@esbuild/darwin-x64@0.23.1': - optional: true - '@esbuild/freebsd-arm64@0.17.19': optional: true @@ -15431,9 +15265,6 @@ snapshots: '@esbuild/freebsd-arm64@0.21.1': optional: true - '@esbuild/freebsd-arm64@0.23.1': - optional: true - '@esbuild/freebsd-x64@0.17.19': optional: true @@ -15452,9 +15283,6 @@ snapshots: '@esbuild/freebsd-x64@0.21.1': optional: true - '@esbuild/freebsd-x64@0.23.1': - optional: true - '@esbuild/linux-arm64@0.17.19': optional: true @@ -15473,9 +15301,6 @@ snapshots: '@esbuild/linux-arm64@0.21.1': optional: true - '@esbuild/linux-arm64@0.23.1': - optional: true - '@esbuild/linux-arm@0.17.19': optional: true @@ -15494,9 +15319,6 @@ snapshots: '@esbuild/linux-arm@0.21.1': optional: true - '@esbuild/linux-arm@0.23.1': - optional: true - '@esbuild/linux-ia32@0.17.19': optional: true @@ -15515,9 +15337,6 @@ snapshots: '@esbuild/linux-ia32@0.21.1': optional: true - '@esbuild/linux-ia32@0.23.1': - optional: true - '@esbuild/linux-loong64@0.17.19': optional: true @@ -15536,9 +15355,6 @@ snapshots: '@esbuild/linux-loong64@0.21.1': optional: true - '@esbuild/linux-loong64@0.23.1': - optional: true - '@esbuild/linux-mips64el@0.17.19': optional: true @@ -15557,9 +15373,6 @@ snapshots: '@esbuild/linux-mips64el@0.21.1': optional: true - '@esbuild/linux-mips64el@0.23.1': - optional: true - '@esbuild/linux-ppc64@0.17.19': optional: true @@ -15578,9 +15391,6 @@ snapshots: '@esbuild/linux-ppc64@0.21.1': optional: true - '@esbuild/linux-ppc64@0.23.1': - optional: true - '@esbuild/linux-riscv64@0.17.19': optional: true @@ -15599,9 +15409,6 @@ snapshots: '@esbuild/linux-riscv64@0.21.1': optional: true - '@esbuild/linux-riscv64@0.23.1': - optional: true - '@esbuild/linux-s390x@0.17.19': optional: true @@ -15620,9 +15427,6 @@ snapshots: '@esbuild/linux-s390x@0.21.1': optional: true - '@esbuild/linux-s390x@0.23.1': - optional: true - '@esbuild/linux-x64@0.17.19': optional: true @@ -15641,9 +15445,6 @@ snapshots: '@esbuild/linux-x64@0.21.1': optional: true - '@esbuild/linux-x64@0.23.1': - optional: true - '@esbuild/netbsd-x64@0.17.19': optional: true @@ -15662,12 +15463,6 @@ snapshots: '@esbuild/netbsd-x64@0.21.1': optional: true - '@esbuild/netbsd-x64@0.23.1': - optional: true - - '@esbuild/openbsd-arm64@0.23.1': - optional: true - '@esbuild/openbsd-x64@0.17.19': optional: true @@ -15686,9 +15481,6 @@ snapshots: '@esbuild/openbsd-x64@0.21.1': optional: true - '@esbuild/openbsd-x64@0.23.1': - optional: true - '@esbuild/sunos-x64@0.17.19': optional: true @@ -15707,9 +15499,6 @@ snapshots: '@esbuild/sunos-x64@0.21.1': optional: true - '@esbuild/sunos-x64@0.23.1': - optional: true - '@esbuild/win32-arm64@0.17.19': optional: true @@ -15728,9 +15517,6 @@ snapshots: '@esbuild/win32-arm64@0.21.1': optional: true - '@esbuild/win32-arm64@0.23.1': - optional: true - '@esbuild/win32-ia32@0.17.19': optional: true @@ -15749,9 +15535,6 @@ snapshots: '@esbuild/win32-ia32@0.21.1': optional: true - '@esbuild/win32-ia32@0.23.1': - optional: true - '@esbuild/win32-x64@0.17.19': optional: true @@ -15770,9 +15553,6 @@ snapshots: '@esbuild/win32-x64@0.21.1': optional: true - '@esbuild/win32-x64@0.23.1': - optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': dependencies: eslint: 8.56.0 @@ -20666,45 +20446,6 @@ snapshots: - utf-8-validate - zod - '@wagmi/connectors@5.1.9(@types/react@18.2.62)(@wagmi/core@2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': - dependencies: - '@coinbase/wallet-sdk': 4.0.4 - '@metamask/sdk': 0.28.2(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react-native@0.75.3(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.0)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(utf-8-validate@5.0.10))(react@18.2.0)(rollup@4.21.3)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) - '@wagmi/core': 2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)) - '@walletconnect/ethereum-provider': 2.15.3(@types/react@18.2.62)(bufferutil@4.0.8)(react@18.2.0)(utf-8-validate@5.0.10) - '@walletconnect/modal': 2.6.2(@types/react@18.2.62)(react@18.2.0) - cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - react-dom - - react-native - - rollup - - supports-color - - uWebSockets.js - - utf-8-validate - - zod - '@wagmi/core@2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.0)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))': dependencies: eventemitter3: 5.0.1 @@ -23124,33 +22865,6 @@ snapshots: '@esbuild/win32-ia32': 0.21.1 '@esbuild/win32-x64': 0.21.1 - esbuild@0.23.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -27859,13 +27573,6 @@ snapshots: - supports-color - ts-node - tsx@4.19.1: - dependencies: - esbuild: 0.23.1 - get-tsconfig: 4.8.1 - optionalDependencies: - fsevents: 2.3.3 - tty-browserify@0.0.1: {} tty-table@4.2.3: @@ -28473,43 +28180,6 @@ snapshots: - utf-8-validate - zod - wagmi@2.12.9(@tanstack/query-core@5.24.8)(@tanstack/react-query@5.24.8(react@18.2.0))(@types/react@18.2.62)(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4): - dependencies: - '@tanstack/react-query': 5.24.8(react@18.2.0) - '@wagmi/connectors': 5.1.9(@types/react@18.2.62)(@wagmi/core@2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.21.3)(typescript@5.3.3)(utf-8-validate@5.0.10)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) - '@wagmi/core': 2.13.4(@tanstack/query-core@5.24.8)(@types/react@18.2.62)(react@18.2.0)(typescript@5.3.3)(viem@2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4)) - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - viem: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@tanstack/query-core' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - immer - - ioredis - - react-dom - - react-native - - rollup - - supports-color - - uWebSockets.js - - utf-8-validate - - zod - walker@1.0.8: dependencies: makeerror: 1.0.12 From 2ec036ea70ce6242a0f3c673a05952c230130060 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Thu, 3 Oct 2024 13:04:46 +0300 Subject: [PATCH 07/30] refactor: update CaipNetwork type and all related references --- packages/adapters/ethers/src/client.ts | 86 +++++---- .../adapters/ethers/src/tests/client.test.ts | 37 +++- packages/adapters/ethers5/src/client.ts | 88 ++++----- .../adapters/ethers5/src/tests/client.test.ts | 26 ++- packages/adapters/solana/src/client.ts | 32 ++-- packages/adapters/solana/src/index.ts | 3 - .../solana/src/providers/AuthProvider.ts | 4 +- .../src/providers/CoinbaseWalletProvider.ts | 4 +- .../src/providers/WalletConnectProvider.ts | 10 +- .../src/providers/WalletStandardProvider.ts | 2 +- .../solana/src/tests/AuthProvider.test.ts | 6 +- .../src/tests/WalletConnectProvider.test.ts | 24 +-- .../adapters/solana/src/tests/client.test.ts | 4 +- .../src/tests/mocks/UniversalProvider.ts | 2 +- .../src/tests/mocks/W3mFrameProvider.ts | 2 +- .../solana/src/tests/mocks/WalletStandard.ts | 4 +- packages/adapters/solana/src/utils/chains.ts | 33 +--- packages/adapters/wagmi/src/client.ts | 110 +++++++----- .../src/connectors/UniversalConnector.ts | 48 ++--- .../adapters/wagmi/src/tests/client.test.ts | 26 +-- .../wagmi/src/tests/mocks/adapter.mock.ts | 26 ++- packages/adapters/wagmi/src/utils/chains.ts | 60 ------- packages/appkit-utils/exports/index.ts | 1 + .../src/CaipNetworkUtil.ts} | 34 ++-- .../src/ethers/EthersHelpersUtil.ts | 28 +-- .../src/solana/SolanaConstantsUtil.ts | 23 ++- .../src/solana/SolanaHelpersUtils.ts | 27 +-- .../tests/EthersHelpersUtil.test.ts | 30 ---- .../tests/SolanaHelpersUtil.test.ts | 67 ++++--- packages/appkit/src/client.ts | 23 +-- packages/appkit/src/networks/eip155.ts | 15 +- packages/appkit/src/networks/index.ts | 8 +- .../src/tests/universal-adapter.test.ts | 16 +- .../src/tests/utils/HelpersUtil.test.ts | 59 ++++-- .../appkit/src/universal-adapter/client.ts | 88 +++++---- packages/appkit/src/utils/HelpersUtil.ts | 9 +- packages/appkit/src/utils/TypesUtil.ts | 6 +- packages/common/index.ts | 1 - packages/common/src/utils/TypeUtil.ts | 18 +- packages/core/exports/react.ts | 2 +- .../core/src/controllers/AccountController.ts | 2 +- .../core/src/controllers/ApiController.ts | 10 +- .../core/src/controllers/ChainController.ts | 13 +- .../src/controllers/ConnectionController.ts | 5 +- .../core/src/controllers/EnsController.ts | 3 +- .../core/src/controllers/NetworkController.ts | 23 +-- .../core/src/controllers/SendController.ts | 8 +- .../core/src/controllers/SwapController.ts | 8 +- .../src/controllers/TransactionsController.ts | 4 +- packages/core/src/utils/AssetUtil.ts | 8 +- packages/core/src/utils/CoreHelperUtil.ts | 2 +- packages/core/src/utils/SwapApiUtil.ts | 10 +- .../tests/controllers/ApiController.test.ts | 169 ++++++++++++------ .../tests/controllers/EnsController.test.ts | 36 ++-- .../controllers/NetworkController.test.ts | 108 +++++++---- .../tests/controllers/SwapController.test.ts | 17 +- packages/core/tests/hooks/react.test.ts | 22 ++- packages/core/tests/utils/AssetUtil.test.ts | 6 +- packages/core/tests/utils/SwapApiUtil.test.ts | 51 ++++-- .../src/modal/w3m-account-button/index.ts | 4 +- .../scaffold-ui/src/modal/w3m-modal/index.ts | 4 +- .../src/modal/w3m-network-button/index.ts | 4 +- .../index.ts | 9 +- .../src/partials/w3m-activity-list/index.ts | 2 +- .../w3m-onramp-provider-item/index.ts | 4 +- .../views/w3m-account-settings-view/index.ts | 2 +- .../src/views/w3m-networks-view/index.ts | 2 +- .../src/views/w3m-swap-view/index.ts | 6 +- .../views/w3m-switch-address-view/index.ts | 18 +- .../views/w3m-unsupported-chain-view/index.ts | 8 +- .../views/w3m-wallet-receive-view/index.ts | 4 +- .../index.ts | 2 +- .../views/w3m-connecting-siwe-view/index.ts | 8 +- packages/siwe/src/client.ts | 4 +- packages/solana/exports/chains.ts | 1 - .../src/composites/wui-list-account/index.ts | 18 +- packages/wagmi/tests/mocks/adapter.mock.ts | 23 +-- packages/wallet/src/W3mFrameProvider.ts | 2 +- 78 files changed, 952 insertions(+), 770 deletions(-) delete mode 100644 packages/adapters/wagmi/src/utils/chains.ts rename packages/{common/src/utils/CaipNetworksUtil.ts => appkit-utils/src/CaipNetworkUtil.ts} (67%) delete mode 100644 packages/solana/exports/chains.ts diff --git a/packages/adapters/ethers/src/client.ts b/packages/adapters/ethers/src/client.ts index 8f8058cc4b..9bdacb251f 100644 --- a/packages/adapters/ethers/src/client.ts +++ b/packages/adapters/ethers/src/client.ts @@ -1,6 +1,5 @@ import type { AppKitOptions } from '@reown/appkit' import { - NetworkUtil, SafeLocalStorage, SafeLocalStorageKeys, type AdapterType, @@ -33,7 +32,13 @@ import { } from '@reown/appkit-wallet' import { ConstantsUtil as CoreConstantsUtil } from '@reown/appkit-core' import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common' -import { ConstantsUtil, ErrorUtil, HelpersUtil, PresetsUtil } from '@reown/appkit-utils' +import { + CaipNetworksUtil, + ConstantsUtil, + ErrorUtil, + HelpersUtil, + PresetsUtil +} from '@reown/appkit-utils' import UniversalProvider from '@walletconnect/universal-provider' import type { ConnectionControllerClient, NetworkControllerClient } from '@reown/appkit-core' import { WcConstantsUtil } from '@reown/appkit' @@ -146,9 +151,7 @@ export class EthersAdapter { const coinbaseWallet = new CoinbaseWalletSDK({ appName: options?.metadata?.name, appLogoUrl: options?.metadata?.icons[0], - appChainIds: options.networks?.map(caipNetwork => caipNetwork.chainId as number) || [ - 1, 84532 - ] + appChainIds: options.networks?.map(caipNetwork => caipNetwork.id as number) || [1, 84532] }) coinbaseProvider = coinbaseWallet.makeWeb3Provider({ @@ -214,17 +217,26 @@ export class EthersAdapter { ) } - public construct(appKit: AppKit, options: AppKitOptions) { + public construct( + appKit: AppKit, + options: AppKitOptions, + caipNetworks: [CaipNetwork, ...CaipNetwork[]] + ) { this.appKit = appKit this.options = options - this.caipNetworks = options.networks - this.defaultCaipNetwork = options.defaultNetwork || options.networks[0] + this.caipNetworks = caipNetworks + this.defaultCaipNetwork = options.defaultNetwork + ? CaipNetworksUtil.extendCaipNetwork(options.defaultNetwork, { + customNetworkImageUrls: options.chainImages, + projectId: options.projectId + }) + : this.caipNetworks[0] this.tokens = HelpersUtil.getCaipTokens(options.tokens) this.ethersConfig = this.createEthersConfig(options) this.networkControllerClient = { switchCaipNetwork: async caipNetwork => { - if (caipNetwork?.chainId) { + if (caipNetwork?.id) { try { await this.switchNetwork(caipNetwork) } catch (error) { @@ -398,12 +410,7 @@ export class EthersAdapter { throw new Error('Provider is undefined') } - return await EthersMethods.estimateGas( - data, - provider, - address, - Number(caipNetwork?.chainId) - ) + return await EthersMethods.estimateGas(data, provider, address, Number(caipNetwork?.id)) }, sendTransaction: async data => { @@ -423,12 +430,7 @@ export class EthersAdapter { throw new Error('Provider is undefined') } - return await EthersMethods.sendTransaction( - data, - provider, - address, - Number(caipNetwork?.chainId) - ) + return await EthersMethods.sendTransaction(data, provider, address, Number(caipNetwork?.id)) }, writeContract: async data => { @@ -445,12 +447,7 @@ export class EthersAdapter { throw new Error('Provider is undefined') } - return await EthersMethods.writeContract( - data, - provider, - address, - Number(caipNetwork?.chainId) - ) + return await EthersMethods.writeContract(data, provider, address, Number(caipNetwork?.id)) }, getEnsAddress: async (value: string) => { @@ -464,7 +461,7 @@ export class EthersAdapter { getEnsAvatar: async (value: string) => { const caipNetwork = this.appKit?.getCaipNetwork() - return await EthersMethods.getEnsAvatar(value, Number(caipNetwork?.chainId)) + return await EthersMethods.getEnsAvatar(value, Number(caipNetwork?.id)) } } @@ -638,10 +635,7 @@ export class EthersAdapter { preferredAccountType, accounts = [] } = await this.authProvider.connect({ - chainId: Number( - NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id) ?? - this.caipNetworks[0]?.chainId - ) + chainId: Number(this.appKit?.getCaipNetwork()?.id || this.caipNetworks[0]?.id) }) const { smartAccountEnabledNetworks } = @@ -713,7 +707,7 @@ export class EthersAdapter { const chainChangedHandler = (chainId: string) => { const chainIdNumber = typeof chainId === 'string' ? EthersHelpersUtil.hexStringToNumber(chainId) : Number(chainId) - const caipNetwork = this.caipNetworks.find(c => c.chainId === chainIdNumber) + const caipNetwork = this.caipNetworks.find(c => c.id === chainIdNumber) const currentCaipNetwork = this.appKit?.getCaipNetwork() if (!currentCaipNetwork || currentCaipNetwork?.id !== caipNetwork?.id) { @@ -828,7 +822,7 @@ export class EthersAdapter { } this.appKit?.setLoading(true) - const chainId = NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id) + const chainId = this.appKit?.getCaipNetwork()?.id this.appKit?.setCaipAddress(`eip155:${chainId}:${address}`, this.chainNamespace) this.appKit?.setStatus('connected', this.chainNamespace) this.appKit?.setPreferredAccountType(type as W3mFrameTypes.AccountType, this.chainNamespace) @@ -875,9 +869,9 @@ export class EthersAdapter { this.checkActiveProviders(this.ethersConfig) } - if (currentCaipNetwork?.explorerUrl) { + if (currentCaipNetwork?.blockExplorers?.default.url) { this.appKit?.setAddressExplorerUrl( - `${currentCaipNetwork.explorerUrl}/address/${address}`, + `${currentCaipNetwork.blockExplorers.default.url}/address/${address}`, this.chainNamespace ) } @@ -911,7 +905,7 @@ export class EthersAdapter { await this.syncReownName(address) } } catch { - if (caipNetwork?.chainId === 1) { + if (caipNetwork?.id === 1) { const ensProvider = new InfuraProvider('mainnet') const name = await ensProvider.lookupAddress(address) const avatar = await ensProvider.getAvatar(address) @@ -938,8 +932,8 @@ export class EthersAdapter { const isEVMNetwork = caipNetwork.chainNamespace === CommonConstantsUtil.CHAIN.EVM if (caipNetwork && isExistingNetwork && isEVMNetwork) { - const jsonRpcProvider = new JsonRpcProvider(caipNetwork.rpcUrl, { - chainId: caipNetwork.chainId as number, + const jsonRpcProvider = new JsonRpcProvider(caipNetwork.rpcUrls.default.http[0], { + chainId: caipNetwork.id as number, name: caipNetwork.name }) @@ -947,7 +941,11 @@ export class EthersAdapter { const balance = await jsonRpcProvider.getBalance(address) const formattedBalance = formatEther(balance) - this.appKit?.setBalance(formattedBalance, caipNetwork.currency, this.chainNamespace) + this.appKit?.setBalance( + formattedBalance, + caipNetwork.nativeCurrency.symbol, + this.chainNamespace + ) } } } @@ -1010,7 +1008,7 @@ export class EthersAdapter { try { await provider.request({ method: 'wallet_switchEthereumChain', - params: [{ chainId: EthersHelpersUtil.numberToHexString(caipNetwork.chainId) }] + params: [{ chainId: EthersHelpersUtil.numberToHexString(caipNetwork.id) }] }) // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (switchError: any) { @@ -1046,11 +1044,9 @@ export class EthersAdapter { if (this.authProvider) { try { this.appKit?.setLoading(true) - const { chainId } = await this.authProvider.switchNetwork( - caipNetwork.chainId as number - ) + const { chainId } = await this.authProvider.switchNetwork(caipNetwork.id as number) const { address, preferredAccountType } = await this.authProvider.connect({ - chainId: caipNetwork.chainId as number | undefined + chainId: caipNetwork.id as number | undefined }) const caipAddress = `${this.chainNamespace}:${chainId}:${address}` diff --git a/packages/adapters/ethers/src/tests/client.test.ts b/packages/adapters/ethers/src/tests/client.test.ts index e6df11eb68..44c906763c 100644 --- a/packages/adapters/ethers/src/tests/client.test.ts +++ b/packages/adapters/ethers/src/tests/client.test.ts @@ -6,8 +6,12 @@ import { mockCreateEthersConfig } from './mocks/EthersConfig' import mockAppKit from './mocks/AppKit' import { mockAuthConnector } from './mocks/AuthConnector' import { EthersHelpersUtil, type ProviderId, type ProviderType } from '@reown/appkit-utils/ethers' -import { ConstantsUtil } from '@reown/appkit-utils' -import { arbitrum, mainnet, polygon } from '@reown/appkit/networks' +import { CaipNetworksUtil, ConstantsUtil } from '@reown/appkit-utils' +import { + arbitrum as AppkitArbitrum, + mainnet as AppkitMainnet, + polygon as AppkitPolygon +} from '@reown/appkit/networks' import { ProviderUtil } from '@reown/appkit/store' import { SafeLocalStorage, SafeLocalStorageKeys } from '@reown/appkit-common' import { type BlockchainApiLookupEnsName } from '@reown/appkit' @@ -15,6 +19,14 @@ import { InfuraProvider, JsonRpcProvider } from 'ethers' import type { CaipNetwork, ChainNamespace } from '@reown/appkit-common' +const [mainnet, arbitrum, polygon] = CaipNetworksUtil.extendCaipNetworks( + [AppkitMainnet, AppkitArbitrum, AppkitPolygon], + { + customNetworkImageUrls: {}, + projectId: '1234' + } +) as [CaipNetwork, CaipNetwork, CaipNetwork] + vi.mock('@reown/appkit-wallet', () => ({ W3mFrameProvider: vi.fn().mockImplementation(() => mockAuthConnector), W3mFrameHelpers: { @@ -101,7 +113,7 @@ describe('EthersAdapter', () => { ...mockOptions, ethersConfig: mockCreateEthersConfig() } - client.construct(mockAppKit, optionsWithEthersConfig) + client.construct(mockAppKit, optionsWithEthersConfig, [mainnet, arbitrum, polygon]) }) afterEach(() => { @@ -145,10 +157,21 @@ describe('EthersAdapter', () => { it('should switch network for injected provider', async () => { const newNetwork = { - id: 'eip155:137', + id: 137, + caipNetworkId: 'eip155:137', + chainNamespace: 'eip155', name: 'Polygon', - chainId: '137', - rpcUrl: 'https://polygon-rpc.com' + network: 'polygon', + nativeCurrency: { + name: 'MATIC', + symbol: 'MATIC', + decimals: 18 + }, + rpcUrls: { + default: { + http: ['https://polygon-rpc.com'] + } + } } as unknown as CaipNetwork mockProvider.request.mockResolvedValueOnce(null) @@ -758,7 +781,7 @@ describe('EthersAdapter', () => { await client['syncBalance'](mockAddress, mainnet) - expect(JsonRpcProvider).toHaveBeenCalledWith(mainnet.rpcUrl, { + expect(JsonRpcProvider).toHaveBeenCalledWith(mainnet.rpcUrls.default.http[0], { chainId: 1, name: 'Ethereum' }) diff --git a/packages/adapters/ethers5/src/client.ts b/packages/adapters/ethers5/src/client.ts index 346c41a710..daccef3e8c 100644 --- a/packages/adapters/ethers5/src/client.ts +++ b/packages/adapters/ethers5/src/client.ts @@ -1,6 +1,5 @@ import type { AppKitOptions } from '@reown/appkit' import { - NetworkUtil, SafeLocalStorage, SafeLocalStorageKeys, type AdapterType, @@ -33,7 +32,13 @@ import { } from '@reown/appkit-wallet' import { ConstantsUtil as CoreConstantsUtil } from '@reown/appkit-core' import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common' -import { ConstantsUtil, ErrorUtil, HelpersUtil, PresetsUtil } from '@reown/appkit-utils' +import { + CaipNetworksUtil, + ConstantsUtil, + ErrorUtil, + HelpersUtil, + PresetsUtil +} from '@reown/appkit-utils' import UniversalProvider from '@walletconnect/universal-provider' import type { ConnectionControllerClient, NetworkControllerClient } from '@reown/appkit-core' import { WcConstantsUtil } from '@reown/appkit' @@ -146,9 +151,7 @@ export class Ethers5Adapter { const coinbaseWallet = new CoinbaseWalletSDK({ appName: options?.metadata?.name, appLogoUrl: options?.metadata?.icons[0], - appChainIds: options.networks?.map(caipNetwork => caipNetwork.chainId as number) || [ - 1, 84532 - ] + appChainIds: options.networks?.map(caipNetwork => caipNetwork.id as number) || [1, 84532] }) coinbaseProvider = coinbaseWallet.makeWeb3Provider({ @@ -214,17 +217,26 @@ export class Ethers5Adapter { ) } - public construct(appKit: AppKit, options: AppKitOptions) { + public construct( + appKit: AppKit, + options: AppKitOptions, + caipNetworks: [CaipNetwork, ...CaipNetwork[]] + ) { this.appKit = appKit this.options = options - this.caipNetworks = options.networks - this.defaultCaipNetwork = options.defaultNetwork || options.networks[0] + this.caipNetworks = caipNetworks + this.defaultCaipNetwork = options.defaultNetwork + ? CaipNetworksUtil.extendCaipNetwork(options.defaultNetwork, { + customNetworkImageUrls: options.chainImages, + projectId: options.projectId + }) + : this.caipNetworks[0] this.tokens = HelpersUtil.getCaipTokens(options.tokens) this.ethersConfig = this.createEthersConfig(options) this.networkControllerClient = { switchCaipNetwork: async caipNetwork => { - if (caipNetwork?.chainId) { + if (caipNetwork?.id) { try { await this.switchNetwork(caipNetwork) } catch (error) { @@ -398,12 +410,7 @@ export class Ethers5Adapter { throw new Error('Provider is undefined') } - return await Ethers5Methods.estimateGas( - data, - provider, - address, - Number(caipNetwork?.chainId) - ) + return await Ethers5Methods.estimateGas(data, provider, address, Number(caipNetwork?.id)) }, sendTransaction: async data => { @@ -427,7 +434,7 @@ export class Ethers5Adapter { data, provider, address, - Number(caipNetwork?.chainId) + Number(caipNetwork?.id) ) }, @@ -445,12 +452,7 @@ export class Ethers5Adapter { throw new Error('Provider is undefined') } - return await Ethers5Methods.writeContract( - data, - provider, - address, - Number(caipNetwork?.chainId) - ) + return await Ethers5Methods.writeContract(data, provider, address, Number(caipNetwork?.id)) }, getEnsAddress: async (value: string) => { @@ -464,7 +466,7 @@ export class Ethers5Adapter { getEnsAvatar: async (value: string) => { const caipNetwork = this.appKit?.getCaipNetwork() - return await Ethers5Methods.getEnsAvatar(value, Number(caipNetwork?.chainId)) + return await Ethers5Methods.getEnsAvatar(value, Number(caipNetwork?.id)) } } @@ -638,10 +640,7 @@ export class Ethers5Adapter { preferredAccountType, accounts = [] } = await this.authProvider.connect({ - chainId: Number( - NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id) ?? - this.caipNetworks[0]?.chainId - ) + chainId: Number(this.appKit?.getCaipNetwork()?.id || this.caipNetworks[0]?.id) }) const { smartAccountEnabledNetworks } = @@ -713,7 +712,7 @@ export class Ethers5Adapter { const chainChangedHandler = (chainId: string) => { const chainIdNumber = typeof chainId === 'string' ? EthersHelpersUtil.hexStringToNumber(chainId) : Number(chainId) - const caipNetwork = this.caipNetworks.find(c => c.chainId === chainIdNumber) + const caipNetwork = this.caipNetworks.find(c => c.id === chainIdNumber) const currentCaipNetwork = this.appKit?.getCaipNetwork() if (!currentCaipNetwork || currentCaipNetwork?.id !== caipNetwork?.id) { @@ -828,7 +827,7 @@ export class Ethers5Adapter { } this.appKit?.setLoading(true) - const chainId = NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id) + const chainId = this.appKit?.getCaipNetwork()?.id this.appKit?.setCaipAddress(`eip155:${chainId}:${address}`, this.chainNamespace) this.appKit?.setStatus('connected', this.chainNamespace) this.appKit?.setPreferredAccountType(type as W3mFrameTypes.AccountType, this.chainNamespace) @@ -875,9 +874,9 @@ export class Ethers5Adapter { this.checkActiveProviders(this.ethersConfig) } - if (currentCaipNetwork?.explorerUrl) { + if (currentCaipNetwork?.blockExplorers) { this.appKit?.setAddressExplorerUrl( - `${currentCaipNetwork.explorerUrl}/address/${address}`, + `${currentCaipNetwork.blockExplorers.default.url}/address/${address}`, this.chainNamespace ) } @@ -911,7 +910,7 @@ export class Ethers5Adapter { await this.syncReownName(address) } } catch { - if (caipNetwork?.chainId === 1) { + if (caipNetwork?.id === 1) { const ensProvider = new ethers.providers.InfuraProvider('mainnet') const name = await ensProvider.lookupAddress(address) const avatar = await ensProvider.getAvatar(address) @@ -938,16 +937,23 @@ export class Ethers5Adapter { const isEVMNetwork = caipNetwork.chainNamespace === CommonConstantsUtil.CHAIN.EVM if (caipNetwork && isExistingNetwork && isEVMNetwork) { - const jsonRpcProvider = new ethers.providers.JsonRpcProvider(caipNetwork.rpcUrl, { - chainId: caipNetwork.chainId as number, - name: caipNetwork.name - }) + const jsonRpcProvider = new ethers.providers.JsonRpcProvider( + caipNetwork.rpcUrls.default.http[0], + { + chainId: caipNetwork.id as number, + name: caipNetwork.name + } + ) if (jsonRpcProvider) { const balance = await jsonRpcProvider.getBalance(address) const formattedBalance = ethers.utils.formatEther(balance) - this.appKit?.setBalance(formattedBalance, caipNetwork.currency, this.chainNamespace) + this.appKit?.setBalance( + formattedBalance, + caipNetwork.nativeCurrency.symbol, + this.chainNamespace + ) } } } @@ -1010,7 +1016,7 @@ export class Ethers5Adapter { try { await provider.request({ method: 'wallet_switchEthereumChain', - params: [{ chainId: EthersHelpersUtil.numberToHexString(caipNetwork.chainId) }] + params: [{ chainId: EthersHelpersUtil.numberToHexString(caipNetwork.id) }] }) // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (switchError: any) { @@ -1046,11 +1052,9 @@ export class Ethers5Adapter { if (this.authProvider) { try { this.appKit?.setLoading(true) - const { chainId } = await this.authProvider.switchNetwork( - caipNetwork.chainId as number - ) + const { chainId } = await this.authProvider.switchNetwork(caipNetwork.id as number) const { address, preferredAccountType } = await this.authProvider.connect({ - chainId: caipNetwork.chainId as number | undefined + chainId: caipNetwork.id as number | undefined }) const caipAddress = `${this.chainNamespace}:${chainId}:${address}` diff --git a/packages/adapters/ethers5/src/tests/client.test.ts b/packages/adapters/ethers5/src/tests/client.test.ts index 4276fa7b31..dccf8ebfae 100644 --- a/packages/adapters/ethers5/src/tests/client.test.ts +++ b/packages/adapters/ethers5/src/tests/client.test.ts @@ -6,8 +6,12 @@ import { mockCreateEthersConfig } from './mocks/EthersConfig' import mockAppKit from './mocks/AppKit' import { mockAuthConnector } from './mocks/AuthConnector' import { EthersHelpersUtil, type ProviderId, type ProviderType } from '@reown/appkit-utils/ethers' -import { ConstantsUtil } from '@reown/appkit-utils' -import { arbitrum, mainnet, polygon } from '@reown/appkit/networks' +import { CaipNetworksUtil, ConstantsUtil } from '@reown/appkit-utils' +import { + arbitrum as AppkitArbitrum, + mainnet as AppkitMainnet, + polygon as AppkitPolygon +} from '@reown/appkit/networks' import { ProviderUtil } from '@reown/appkit/store' import { SafeLocalStorage, SafeLocalStorageKeys } from '@reown/appkit-common' import { type BlockchainApiLookupEnsName } from '@reown/appkit' @@ -15,6 +19,11 @@ import { ethers } from 'ethers' import type { CaipNetwork, ChainNamespace } from '@reown/appkit-common' +const [mainnet, arbitrum, polygon] = CaipNetworksUtil.extendCaipNetworks( + [AppkitMainnet, AppkitArbitrum, AppkitPolygon], + { customNetworkImageUrls: {}, projectId: '1234' } +) as [CaipNetwork, CaipNetwork, CaipNetwork] + vi.mock('@reown/appkit-wallet', () => ({ W3mFrameProvider: vi.fn().mockImplementation(() => mockAuthConnector), W3mFrameHelpers: { @@ -107,7 +116,7 @@ describe('EthersAdapter', () => { ...mockOptions, ethersConfig: mockCreateEthersConfig() } - client.construct(mockAppKit, optionsWithEthersConfig) + client.construct(mockAppKit, optionsWithEthersConfig, [mainnet, arbitrum, polygon]) }) afterEach(() => { @@ -766,10 +775,13 @@ describe('EthersAdapter', () => { await client['syncBalance'](mockAddress, mainnet) - expect(ethers.providers.JsonRpcProvider).toHaveBeenCalledWith(mainnet.rpcUrl, { - chainId: 1, - name: 'Ethereum' - }) + expect(ethers.providers.JsonRpcProvider).toHaveBeenCalledWith( + mainnet.rpcUrls.default.http[0], + { + chainId: 1, + name: 'Ethereum' + } + ) expect(mockJsonRpcProvider.getBalance).toHaveBeenCalledWith(mockAddress) expect(mockAppKit.setBalance).toHaveBeenCalledWith('1.0', 'ETH', 'eip155') }) diff --git a/packages/adapters/solana/src/client.ts b/packages/adapters/solana/src/client.ts index 126fde5b1d..ffe2a2cd5a 100644 --- a/packages/adapters/solana/src/client.ts +++ b/packages/adapters/solana/src/client.ts @@ -124,14 +124,18 @@ export class SolanaAdapter implements ChainAdapter { ) } - public construct(appKit: AppKit, options: CoreOptions) { + public construct( + appKit: AppKit, + options: CoreOptions, + caipNetworks: [CaipNetwork, ...CaipNetwork[]] + ) { const { projectId } = options this.appKit = appKit this.options = options - this.caipNetworks = options.networks + this.caipNetworks = caipNetworks this.defaultCaipNetwork = SolHelpersUtil.getChainFromCaip( - options.networks, + caipNetworks, SafeLocalStorage.getItem(SafeLocalStorageKeys.ACTIVE_CAIP_NETWORK_ID) ) @@ -154,7 +158,7 @@ export class SolanaAdapter implements ChainAdapter { if (this.provider) { return Promise.resolve({ supportsAllNetworks: false, - approvedCaipNetworkIds: this.provider.chains.map(chain => chain.id) + approvedCaipNetworkIds: this.provider.chains.map(chain => chain.caipNetworkId) }) } @@ -311,9 +315,7 @@ export class SolanaAdapter implements ChainAdapter { this.syncRequestedNetworks(this.caipNetworks) ChainController.subscribeKey('activeCaipNetwork', (newCaipNetwork: CaipNetwork | undefined) => { - const newChain = this.caipNetworks.find( - _chain => _chain.chainId === newCaipNetwork?.id.split(':')[1] - ) + const newChain = this.caipNetworks.find(_chain => _chain.id === newCaipNetwork?.id) if (!newChain) { return @@ -362,7 +364,9 @@ export class SolanaAdapter implements ChainAdapter { const caipNetworkId = caipNetwork?.id if (address && caipNetwork) { - SolStoreUtil.setConnection(new Connection(caipNetwork.rpcUrl, this.connectionSettings)) + SolStoreUtil.setConnection( + new Connection(caipNetwork.rpcUrls.default.http[0] as string, this.connectionSettings) + ) this.appKit?.setAllAccounts([{ address, type: 'eoa' }], this.chainNamespace) this.appKit?.setCaipAddress(`${caipNetworkId}:${address}` as CaipAddress, this.chainNamespace) await this.syncNetwork(address) @@ -392,7 +396,7 @@ export class SolanaAdapter implements ChainAdapter { this.appKit?.setBalance( balance.toString(), - this.appKit?.getCaipNetwork()?.currency, + this.appKit?.getCaipNetwork()?.nativeCurrency.symbol, this.chainNamespace ) } @@ -425,7 +429,7 @@ export class SolanaAdapter implements ChainAdapter { }) this.authSession = user if (user) { - const caipAddress = `solana:${caipNetwork.chainId}:${user.address}` as CaipAddress + const caipAddress = `${caipNetwork.caipNetworkId}:${user.address}` as CaipAddress ProviderUtil.setProvider(this.chainNamespace, this.authProvider) ProviderUtil.setProviderId(this.chainNamespace, 'walletConnect') this.appKit?.setCaipAddress(caipAddress, this.chainNamespace) @@ -454,7 +458,9 @@ export class SolanaAdapter implements ChainAdapter { } this.appKit?.setAddressExplorerUrl( - caipNetwork.explorerUrl ? `${caipNetwork.explorerUrl}/account/${address}` : undefined, + caipNetwork.blockExplorers?.default.url + ? `${caipNetwork.blockExplorers.default.url}/account/${address}` + : undefined, this.chainNamespace ) await this.syncBalance(address) @@ -470,7 +476,7 @@ export class SolanaAdapter implements ChainAdapter { provider.chains.find(chain => chain.id === caipChainId) || provider.chains[0] if (connectionChain) { - const caipAddress = `solana:${connectionChain.chainId}:${address}` as const + const caipAddress = `${connectionChain.caipNetworkId}:${address}` as const this.appKit?.setCaipAddress(caipAddress, this.chainNamespace) await this.switchNetwork(connectionChain) @@ -620,7 +626,7 @@ export class SolanaAdapter implements ChainAdapter { if (emailEnabled || socialsEnabled) { this.w3mFrameProvider = W3mFrameProviderSingleton.getInstance({ projectId: opts.projectId, - chainId: withSolanaNamespace(this.appKit?.getCaipNetwork(this.chainNamespace)?.chainId), + chainId: withSolanaNamespace(this.appKit?.getCaipNetwork(this.chainNamespace)?.id), onTimeout: () => { AlertController.open(ErrorUtil.ALERT_ERRORS.INVALID_APP_CONFIGURATION_SOCIALS, 'error') } diff --git a/packages/adapters/solana/src/index.ts b/packages/adapters/solana/src/index.ts index e3b0804945..87cffa43d7 100644 --- a/packages/adapters/solana/src/index.ts +++ b/packages/adapters/solana/src/index.ts @@ -6,6 +6,3 @@ export { SolanaAdapter } from './client.js' export type { AdapterOptions } from './client.js' export type * from '@solana/wallet-adapter-base' export type * from './utils/SolanaStoreUtil.js' - -// -- Constants ------------------------------------------------------- -export { solana, solanaDevnet, solanaTestnet } from './utils/chains.js' diff --git a/packages/adapters/solana/src/providers/AuthProvider.ts b/packages/adapters/solana/src/providers/AuthProvider.ts index 4759577f0c..b4fd951489 100644 --- a/packages/adapters/solana/src/providers/AuthProvider.ts +++ b/packages/adapters/solana/src/providers/AuthProvider.ts @@ -69,13 +69,13 @@ export class AuthProvider extends ProviderEventEmitter implements Provider, Prov const availableChainIds = this.getProvider().getAvailableChainIds() return this.requestedChains.filter(requestedChain => - availableChainIds.includes(withSolanaNamespace(requestedChain.chainId) as string) + availableChainIds.includes(withSolanaNamespace(requestedChain.id) as string) ) } public async connect() { const session = await this.getProvider().connect({ - chainId: withSolanaNamespace(this.getActiveChain()?.chainId) + chainId: withSolanaNamespace(this.getActiveChain()?.id) }) this.setSession(session) diff --git a/packages/adapters/solana/src/providers/CoinbaseWalletProvider.ts b/packages/adapters/solana/src/providers/CoinbaseWalletProvider.ts index fe5d4bbe5b..827989bf10 100644 --- a/packages/adapters/solana/src/providers/CoinbaseWalletProvider.ts +++ b/packages/adapters/solana/src/providers/CoinbaseWalletProvider.ts @@ -1,7 +1,7 @@ import { type AnyTransaction, type Provider } from '@reown/appkit-utils/solana' import { ProviderEventEmitter } from './shared/ProviderEventEmitter.js' import type { Connection, PublicKey, SendOptions } from '@solana/web3.js' -import { solana } from '../utils/chains.js' +import { solana } from '@reown/appkit/networks' import type { CaipNetwork } from '@reown/appkit-common' export type SolanaCoinbaseWallet = { @@ -41,7 +41,7 @@ export class CoinbaseWalletProvider extends ProviderEventEmitter implements Prov public get chains() { // For Coinbase Wallet, we only support the Solana mainnet - return this.requestedChains.filter(chain => chain.chainId === solana.chainId) + return this.requestedChains.filter(chain => chain.id === solana.id) } public get publicKey() { diff --git a/packages/adapters/solana/src/providers/WalletConnectProvider.ts b/packages/adapters/solana/src/providers/WalletConnectProvider.ts index 8be9d9cc8d..9068b34449 100644 --- a/packages/adapters/solana/src/providers/WalletConnectProvider.ts +++ b/packages/adapters/solana/src/providers/WalletConnectProvider.ts @@ -61,7 +61,7 @@ export class WalletConnectProvider extends ProviderEventEmitter implements Provi } return this.requestedChains.find( - chain => withSolanaNamespace(chain.chainId as string) === chainId + chain => withSolanaNamespace(chain.id as string) === chainId ) }) .filter(Boolean) as CaipNetwork[] @@ -79,7 +79,7 @@ export class WalletConnectProvider extends ProviderEventEmitter implements Provi public async connect() { const rpcMap = this.requestedChains.reduce>((acc, chain) => { - acc[withSolanaNamespace(chain.chainId as string)] = chain.rpcUrl + acc[withSolanaNamespace(chain.id as string)] = chain.rpcUrls.default.http[0] || '' return acc }, {}) @@ -232,10 +232,10 @@ export class WalletConnectProvider extends ProviderEventEmitter implements Provi method: Method, params: WalletConnectProvider.RequestMethods[Method]['params'] ) { - const chain = this.chains.find(c => this.getActiveChain()?.chainId === c.chainId) + const chain = this.chains.find(c => this.getActiveChain()?.id === c.id) // This is a workaround for wallets that only accept Solana deprecated networks - let chainId = withSolanaNamespace(chain?.chainId) + let chainId = withSolanaNamespace(chain?.id) switch (chainId) { case SolConstantsUtil.CHAIN_IDS.Mainnet: @@ -311,7 +311,7 @@ export class WalletConnectProvider extends ProviderEventEmitter implements Provi * This method is a workaround for wallets that only accept Solana deprecated networks */ private getRequestedChainsWithDeprecated() { - const chains = this.requestedChains.map(chain => withSolanaNamespace(chain.chainId)) + const chains = this.requestedChains.map(chain => withSolanaNamespace(chain.id)) if (chains.includes(SolConstantsUtil.CHAIN_IDS.Mainnet)) { chains.push(SolConstantsUtil.CHAIN_IDS.Deprecated_Mainnet) diff --git a/packages/adapters/solana/src/providers/WalletStandardProvider.ts b/packages/adapters/solana/src/providers/WalletStandardProvider.ts index 49027d005f..f36685bcb2 100644 --- a/packages/adapters/solana/src/providers/WalletStandardProvider.ts +++ b/packages/adapters/solana/src/providers/WalletStandardProvider.ts @@ -236,7 +236,7 @@ export class WalletStandardProvider extends ProviderEventEmitter implements Prov private getActiveChainName() { const entry = Object.entries(solanaChains).find( - ([, chain]) => chain.chainId === this.getActiveChain()?.chainId + ([, chain]) => chain.id === this.getActiveChain()?.id ) if (!entry) { diff --git a/packages/adapters/solana/src/tests/AuthProvider.test.ts b/packages/adapters/solana/src/tests/AuthProvider.test.ts index 5f44676bd6..64b86a9529 100644 --- a/packages/adapters/solana/src/tests/AuthProvider.test.ts +++ b/packages/adapters/solana/src/tests/AuthProvider.test.ts @@ -122,10 +122,10 @@ describe('AuthProvider specific tests', () => { const listener = vi.fn() authProvider.on('chainChanged', listener) - await authProvider.switchNetwork(newChain.chainId) + await authProvider.switchNetwork(newChain.id) - expect(provider.switchNetwork).toHaveBeenCalledWith(newChain.chainId) - expect(listener).toHaveBeenCalledWith(newChain.chainId) + expect(provider.switchNetwork).toHaveBeenCalledWith(newChain.id) + expect(listener).toHaveBeenCalledWith(newChain.id) }) it('should call signAllTransactions with correct params', async () => { diff --git a/packages/adapters/solana/src/tests/WalletConnectProvider.test.ts b/packages/adapters/solana/src/tests/WalletConnectProvider.test.ts index 9304db731d..862f7ac91c 100644 --- a/packages/adapters/solana/src/tests/WalletConnectProvider.test.ts +++ b/packages/adapters/solana/src/tests/WalletConnectProvider.test.ts @@ -168,7 +168,7 @@ describe('WalletConnectProvider specific tests', () => { it('should use the correct chain id for requests', async () => { await walletConnectProvider.connect() getActiveChain.mockImplementation( - () => ({ chainId: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1' }) as CaipNetwork + () => ({ id: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1' }) as CaipNetwork ) await walletConnectProvider.signMessage(new Uint8Array([1, 2, 3, 4, 5])) @@ -189,8 +189,8 @@ describe('WalletConnectProvider specific tests', () => { vi.spyOn(provider, 'connect').mockImplementation(() => Promise.resolve( mockUniversalProviderSession({}, [ - { chainId: '4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ' } as CaipNetwork, - { chainId: '8E9rvCKLFQia2Y35HXjjpWzj8weVo44K' } as CaipNetwork + { id: '4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ' } as CaipNetwork, + { id: '8E9rvCKLFQia2Y35HXjjpWzj8weVo44K' } as CaipNetwork ]) ) ) @@ -214,14 +214,14 @@ describe('WalletConnectProvider specific tests', () => { vi.spyOn(provider, 'connect').mockImplementation(() => Promise.resolve( mockUniversalProviderSession({}, [ - { chainId: '4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ' } as CaipNetwork, - { chainId: '8E9rvCKLFQia2Y35HXjjpWzj8weVo44K' } as CaipNetwork + { id: '4sGjMW1sUnHzSxGspuhpqLDx6wiyjNtZ' } as CaipNetwork, + { id: '8E9rvCKLFQia2Y35HXjjpWzj8weVo44K' } as CaipNetwork ]) ) ) getActiveChain.mockImplementation( - () => ({ chainId: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1' }) as CaipNetwork + () => ({ id: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1' }) as CaipNetwork ) await walletConnectProvider.connect() @@ -305,7 +305,7 @@ describe('WalletConnectProvider specific tests', () => { ], events: [], accounts: [ - `solana:${TestConstants.chains[0]?.chainId}:${TestConstants.accounts[0].address}` + `solana:${TestConstants.chains[0]?.id}:${TestConstants.accounts[0].address}` ] } } @@ -328,7 +328,7 @@ describe('WalletConnectProvider specific tests', () => { methods: [], events: [], accounts: [ - `solana:${TestConstants.chains[0]?.chainId}:${TestConstants.accounts[0].address}` + `solana:${TestConstants.chains[0]?.id}:${TestConstants.accounts[0].address}` ] } } @@ -353,7 +353,7 @@ describe('WalletConnectProvider specific tests', () => { methods: ['solana_signMessage'], events: [], accounts: [ - `solana:${TestConstants.chains[0]?.chainId}:${TestConstants.accounts[0].address}` + `solana:${TestConstants.chains[0]?.id}:${TestConstants.accounts[0].address}` ] } } @@ -378,7 +378,7 @@ describe('WalletConnectProvider specific tests', () => { methods: ['solana_signMessage'], events: [], accounts: [ - `solana:${TestConstants.chains[0]?.chainId}:${TestConstants.accounts[0].address}` + `solana:${TestConstants.chains[0]?.id}:${TestConstants.accounts[0].address}` ] } } @@ -403,7 +403,7 @@ describe('WalletConnectProvider specific tests', () => { methods: ['solana_signMessage'], events: [], accounts: [ - `solana:${TestConstants.chains[0]?.chainId}:${TestConstants.accounts[0].address}` + `solana:${TestConstants.chains[0]?.id}:${TestConstants.accounts[0].address}` ] } } @@ -428,7 +428,7 @@ describe('WalletConnectProvider specific tests', () => { methods: ['solana_signAllTransactions'], events: [], accounts: [ - `solana:${TestConstants.chains[0]?.chainId}:${TestConstants.accounts[0].address}` + `solana:${TestConstants.chains[0]?.id}:${TestConstants.accounts[0].address}` ] } } diff --git a/packages/adapters/solana/src/tests/client.test.ts b/packages/adapters/solana/src/tests/client.test.ts index cdbf6f2f0f..01dabf9c4c 100644 --- a/packages/adapters/solana/src/tests/client.test.ts +++ b/packages/adapters/solana/src/tests/client.test.ts @@ -65,7 +65,7 @@ describe('SolanaAdapter', () => { beforeEach(() => { vi.clearAllMocks() client = new SolanaAdapter({}) - client.construct(mockAppKit, mockOptions) + client.construct(mockAppKit, mockOptions, [solana]) }) afterEach(() => { @@ -107,7 +107,7 @@ describe('SolanaAdapter', () => { await client['syncNetwork'](mockAddress) expect(mockAppKit.setAddressExplorerUrl).toHaveBeenCalledWith( - `${solana.explorerUrl}/account/${mockAddress}`, + `${solana.blockExplorers.default.url}/account/${mockAddress}`, 'solana' ) expect(client['syncBalance']).toHaveBeenCalledWith(mockAddress) diff --git a/packages/adapters/solana/src/tests/mocks/UniversalProvider.ts b/packages/adapters/solana/src/tests/mocks/UniversalProvider.ts index b4213210bd..45464f2632 100644 --- a/packages/adapters/solana/src/tests/mocks/UniversalProvider.ts +++ b/packages/adapters/solana/src/tests/mocks/UniversalProvider.ts @@ -49,7 +49,7 @@ export function mockUniversalProviderSession( replaces: Partial = {}, inputChains = TestConstants.chains ): SessionTypes.Struct { - const chains = inputChains.map(chain => `solana:${chain.chainId}`) + const chains = inputChains.map(chain => `solana:${chain.id}`) const accounts = chains.reduce((acc, cur) => { for (const account of TestConstants.accounts) { diff --git a/packages/adapters/solana/src/tests/mocks/W3mFrameProvider.ts b/packages/adapters/solana/src/tests/mocks/W3mFrameProvider.ts index 2b6c21baea..d6bf7b74b5 100644 --- a/packages/adapters/solana/src/tests/mocks/W3mFrameProvider.ts +++ b/packages/adapters/solana/src/tests/mocks/W3mFrameProvider.ts @@ -46,6 +46,6 @@ export function mockW3mFrameProvider() { export function mockSession(): AuthProvider.Session { return { address: TestConstants.accounts[0].address, - chainId: TestConstants.chains[0]?.chainId || '' + chainId: TestConstants.chains[0]?.id || '' } } diff --git a/packages/adapters/solana/src/tests/mocks/WalletStandard.ts b/packages/adapters/solana/src/tests/mocks/WalletStandard.ts index 89da7f495e..204adc0ab3 100644 --- a/packages/adapters/solana/src/tests/mocks/WalletStandard.ts +++ b/packages/adapters/solana/src/tests/mocks/WalletStandard.ts @@ -17,7 +17,7 @@ export function mockWalletStandard() { return { accounts, - chains: TestConstants.chains.map(chain => `solana:${chain.chainId}` as const), + chains: TestConstants.chains.map(chain => `solana:${chain.id}` as const), features: { 'standard:connect': { version: '1.0.0', @@ -87,7 +87,7 @@ export function mockWalletStandard() { function mockAccount(account: TestConstants.Account = TestConstants.accounts[0]): WalletAccount { return { address: account.address, - chains: TestConstants.chains.map(chain => `solana:${chain.chainId}` as const), + chains: TestConstants.chains.map(chain => `solana:${chain.id}` as const), features: [], publicKey: account.publicKey.toBytes(), icon: 'data:image/png;base64,mocked...', diff --git a/packages/adapters/solana/src/utils/chains.ts b/packages/adapters/solana/src/utils/chains.ts index de4c5195f4..0916e37c29 100644 --- a/packages/adapters/solana/src/utils/chains.ts +++ b/packages/adapters/solana/src/utils/chains.ts @@ -1,34 +1,5 @@ -import { ConstantsUtil, type CaipNetwork } from '@reown/appkit-common' - -export const solana = { - id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - chainId: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - name: 'Solana', - currency: 'SOL', - explorerUrl: 'https://solscan.io', - rpcUrl: 'https://rpc.walletconnect.com/v1', - chainNamespace: ConstantsUtil.CHAIN.SOLANA -} as CaipNetwork - -export const solanaTestnet = { - id: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', - chainId: '4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', - name: 'Solana Testnet', - currency: 'SOL', - explorerUrl: 'https://explorer.solana.com/?cluster=testnet', - rpcUrl: 'https://rpc.walletconnect.org/v1', - chainNamespace: ConstantsUtil.CHAIN.SOLANA -} as CaipNetwork - -export const solanaDevnet = { - id: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1', - chainId: 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1', - name: 'Solana Devnet', - currency: 'SOL', - explorerUrl: 'https://explorer.solana.com/?cluster=devnet', - rpcUrl: 'https://rpc.walletconnect.org/v1', - chainNamespace: ConstantsUtil.CHAIN.SOLANA -} as CaipNetwork +import { type CaipNetwork } from '@reown/appkit-common' +import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks' export const solanaChains = { 'solana:mainnet': solana, diff --git a/packages/adapters/wagmi/src/client.ts b/packages/adapters/wagmi/src/client.ts index bb59f2d78b..4d74478533 100644 --- a/packages/adapters/wagmi/src/client.ts +++ b/packages/adapters/wagmi/src/client.ts @@ -49,7 +49,13 @@ import type { } from '@reown/appkit-core' import { formatUnits, parseUnits } from 'viem' import type { Hex } from 'viem' -import { ConstantsUtil, PresetsUtil, HelpersUtil, ErrorUtil } from '@reown/appkit-utils' +import { + ConstantsUtil, + PresetsUtil, + HelpersUtil, + ErrorUtil, + CaipNetworksUtil +} from '@reown/appkit-utils' import { isReownName, SafeLocalStorage, SafeLocalStorageKeys } from '@reown/appkit-common' import { getEmailCaipNetworks, @@ -65,11 +71,11 @@ import type { AppKitOptions } from '@reown/appkit' import type { CaipAddress, BaseNetwork, - CaipNetwork, ChainNamespace, AdapterType, - CaipNetworkNew, - CaipNetworkId + CaipNetwork, + CaipNetworkId, + BaseOrCaipNetwork } from '@reown/appkit-common' import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common' import type { AppKit } from '@reown/appkit' @@ -122,9 +128,9 @@ export class WagmiAdapter implements ChainAdapter { public chainNamespace: ChainNamespace = CommonConstantsUtil.CHAIN.EVM - public caipNetworks: [CaipNetworkNew, ...CaipNetworkNew[]] + public caipNetworks: [CaipNetwork, ...CaipNetwork[]] - public wagmiChains: readonly [BaseNetwork, ...BaseNetwork[]] + public wagmiChains: [BaseNetwork, ...BaseNetwork[]] public wagmiConfig: AdapterOptions['wagmiConfig'] @@ -142,7 +148,7 @@ export class WagmiAdapter implements ChainAdapter { public constructor( configParams: Partial & { - networks: [CaipNetworkNew, ...CaipNetworkNew[]] + networks: BaseOrCaipNetwork[] projectId: string } ) { @@ -150,16 +156,11 @@ export class WagmiAdapter implements ChainAdapter { throw new Error(ErrorUtil.ALERT_ERRORS.PROJECT_ID_NOT_CONFIGURED.shortMessage) } - this.caipNetworks = configParams.networks.map((caipNetwork: CaipNetworkNew) => ({ + this.caipNetworks = configParams.networks.map((caipNetwork: BaseNetwork | CaipNetwork) => ({ ...caipNetwork, - id: caipNetwork.id as number | string, - chainNamespace: 'eip155' as ChainNamespace, - caipNetworkId: `${this.chainNamespace}:${caipNetwork.id}` as CaipNetworkId, - assets: { - imageId: '', - imageUrl: '' - } - })) as [CaipNetworkNew, ...CaipNetworkNew[]] + chainNamespace: CommonConstantsUtil.CHAIN.EVM, + caipNetworkId: `${this.chainNamespace}:${caipNetwork.id}` as CaipNetworkId + })) as [CaipNetwork, ...CaipNetwork[]] this.wagmiChains = this.caipNetworks.filter( caipNetwork => caipNetwork.chainNamespace === CommonConstantsUtil.CHAIN.EVM @@ -185,7 +186,7 @@ export class WagmiAdapter implements ChainAdapter { const customConnectors: CreateConnectorFn[] = [] if (options.enableWalletConnect !== false) { - customConnectors.push(walletConnect(options, appKit)) + customConnectors.push(walletConnect(options, appKit, this.caipNetworks)) } if (options.enableInjected !== false) { @@ -229,7 +230,12 @@ export class WagmiAdapter implements ChainAdapter { public construct(appKit: AppKit, options: AppKitOptions) { this.appKit = appKit this.options = options - this.defaultCaipNetwork = options.defaultNetwork || options.networks[0] + this.defaultCaipNetwork = options.defaultNetwork + ? CaipNetworksUtil.extendCaipNetwork(options.defaultNetwork, { + customNetworkImageUrls: options.chainImages, + projectId: options.projectId + }) + : undefined this.tokens = HelpersUtil.getCaipTokens(options.tokens) this.setCustomConnectors(options, appKit) @@ -239,8 +245,9 @@ export class WagmiAdapter implements ChainAdapter { this.networkControllerClient = { switchCaipNetwork: async caipNetwork => { - const chainId = Number(NetworkUtil.caipNetworkIdToNumber(caipNetwork?.id)) + const chainId = caipNetwork?.id as number | undefined + console.log('>>> switchCaipNetwork', chainId) if (chainId && this.wagmiConfig) { await switchChain(this.wagmiConfig, { chainId }) } @@ -354,7 +361,8 @@ export class WagmiAdapter implements ChainAdapter { } } - const chainId = Number(NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id)) + const activeCaipNetwork = this.appKit?.getCaipNetwork() + const chainId = activeCaipNetwork?.id as number | undefined await connect(this.wagmiConfig, { connector, chainId }) }, connectExternal: async ({ id, provider, info }) => { @@ -372,7 +380,8 @@ export class WagmiAdapter implements ChainAdapter { // @ts-expect-error Exists on EIP6963Connector connector.setEip6963Wallet?.({ provider, info }) } - const chainId = Number(NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id)) + const activeCaipNetwork = this.appKit?.getCaipNetwork() + const chainId = activeCaipNetwork?.id as number | undefined await connect(this.wagmiConfig, { connector, chainId }) }, checkInstalled: ids => { @@ -457,7 +466,13 @@ export class WagmiAdapter implements ChainAdapter { writeContract: async (data: WriteContractArgs) => { const caipAddress = this.appKit?.getCaipAddress() || '' const account = requireCaipAddress(caipAddress) - const chainId = Number(NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id)) + const activeCaipNetwork = this.appKit?.getCaipNetwork() + const chainId = activeCaipNetwork?.id as number | undefined + + if (!chainId) { + throw new Error('networkControllerClient:writeContract - chainId is undefined') + } + const tx = await wagmiWriteContract(this.wagmiConfig, { chain: this.wagmiChains?.[chainId], chainId, @@ -477,11 +492,12 @@ export class WagmiAdapter implements ChainAdapter { 'networkControllerClient:getApprovedCaipNetworksData - wagmiConfig is undefined' ) } - const chainId = Number( - NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id) - ) + const activeCaipNetwork = this.appKit?.getCaipNetwork() + const chainId = activeCaipNetwork?.id as number | undefined + let ensName: boolean | GetEnsAddressReturnType = false let wcName: boolean | string = false + if (isReownName(value)) { wcName = (await this.appKit?.resolveReownName(value)) || false } @@ -498,7 +514,8 @@ export class WagmiAdapter implements ChainAdapter { } }, getEnsAvatar: async (value: string) => { - const chainId = Number(NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id)) + const activeCaipNetwork = this.appKit?.getCaipNetwork() + const chainId = activeCaipNetwork?.id as number | undefined if (chainId !== mainnet.id) { return false } @@ -567,7 +584,9 @@ export class WagmiAdapter implements ChainAdapter { return this.appKit?.subscribeState((state: PublicStateControllerState) => callback({ ...state, - selectedNetworkId: Number(NetworkUtil.caipNetworkIdToNumber(state.selectedNetworkId)) + selectedNetworkId: state.selectedNetworkId + ? Number(NetworkUtil.caipNetworkIdToNumber(state.selectedNetworkId)) + : undefined }) ) } @@ -622,8 +641,8 @@ export class WagmiAdapter implements ChainAdapter { if (this.wagmiConfig) { if (connector) { if (connector && connector.name === 'WalletConnect' && connector.getProvider && address) { - const currentChainId = - chainId || Number(NetworkUtil.caipNetworkIdToNumber(this.appKit?.getCaipNetwork()?.id)) + const activeCaipNetwork = this.appKit?.getCaipNetwork() + const currentChainId = chainId || (activeCaipNetwork?.id as number | undefined) const provider = (await connector.getProvider()) as UniversalProvider const namespaces = provider?.session?.namespaces || {} @@ -641,7 +660,10 @@ export class WagmiAdapter implements ChainAdapter { this.appKit?.setPreferredAccountType(preferredAccountType, chainNamespace) this.appKit?.setCaipAddress(caipAddress, chainNamespace) }) - if (this.appKit?.getCaipNetwork()?.chainNamespace !== 'solana') { + if ( + this.appKit?.getCaipNetwork()?.chainNamespace !== CommonConstantsUtil.CHAIN.SOLANA && + currentChainId + ) { this.syncNetwork(address, currentChainId, true) await Promise.all([ this.syncProfile(address, currentChainId), @@ -688,26 +710,16 @@ export class WagmiAdapter implements ChainAdapter { } private async syncNetwork(address?: Hex, chainId?: number, isConnected?: boolean) { - const chain = this.caipNetworks.find((c: CaipNetwork) => c.chainId === chainId) - - if (chain && chainId) { - this.appKit?.setCaipNetwork({ - chainId: chain.chainId, - id: chain.id, - name: chain.name || '', - imageId: PresetsUtil.NetworkImageIds[chain.chainId], - imageUrl: this.options?.chainImages?.[chain.chainId], - chainNamespace: this.chainNamespace, - currency: chain?.currency || '', - explorerUrl: chain?.explorerUrl || '', - rpcUrl: chain?.rpcUrl || '' - }) + const caipNetwork = this.caipNetworks.find((c: CaipNetwork) => c.id === chainId) + + if (caipNetwork && chainId) { + this.appKit?.setCaipNetwork(caipNetwork) if (isConnected && address && chainId) { const caipAddress: CaipAddress = `eip155:${chainId}:${address}` this.appKit?.setCaipAddress(caipAddress, this.chainNamespace) - if (chain?.explorerUrl) { - const url = `${chain.explorerUrl}/address/${address}` + if (caipNetwork?.blockExplorers?.default.url) { + const url = `${caipNetwork.blockExplorers.default.url}/address/${address}` this.appKit?.setAddressExplorerUrl(url, this.chainNamespace) } else { this.appKit?.setAddressExplorerUrl(undefined, this.chainNamespace) @@ -775,13 +787,13 @@ export class WagmiAdapter implements ChainAdapter { } private async syncBalance(address: Hex, chainId: number) { - const chain = this.caipNetworks.find((c: CaipNetwork) => c.chainId === chainId) + const caipNetwork = this.caipNetworks.find((c: CaipNetwork) => c.id === chainId) - if (chain && this.wagmiConfig) { + if (caipNetwork && this.wagmiConfig) { const balance = await getBalance(this.wagmiConfig, { address, chainId, - token: this.options?.tokens?.[chain.id]?.address as Hex + token: this.options?.tokens?.[caipNetwork.caipNetworkId]?.address as Hex }) this.appKit?.setBalance(balance.formatted, balance.symbol, this.chainNamespace) diff --git a/packages/adapters/wagmi/src/connectors/UniversalConnector.ts b/packages/adapters/wagmi/src/connectors/UniversalConnector.ts index 1768881a47..e62e5f1e8d 100644 --- a/packages/adapters/wagmi/src/connectors/UniversalConnector.ts +++ b/packages/adapters/wagmi/src/connectors/UniversalConnector.ts @@ -22,7 +22,8 @@ import { WcHelpersUtil } from '@reown/appkit' import { StorageUtil } from '@reown/appkit-core' import type { AppKitOptions } from '@reown/appkit' import type { AppKit } from '@reown/appkit' -import { ChainsUtil } from '../utils/chains.js' +import { ConstantsUtil } from '@reown/appkit-common' +import type { CaipNetwork } from '@reown/appkit-common' type UniversalConnector = Connector & { onDisplayUri(uri: string): void @@ -35,7 +36,11 @@ export type AppKitOptionsParams = AppKitOptions & { walletConnect.type = 'walletConnect' as const -export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { +export function walletConnect( + parameters: AppKitOptionsParams, + appKit: AppKit, + caipNetworks: [CaipNetwork, ...CaipNetwork[]] +) { const isNewChainsStale = parameters.isNewChainsStale ?? true type Provider = Awaited> type Properties = { @@ -106,14 +111,14 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { // If there isn't an active session or chains are stale, connect. if (!provider.session || isChainsStale) { - const namespaces = WcHelpersUtil.createNamespaces(parameters.networks) + const namespaces = WcHelpersUtil.createNamespaces(caipNetworks) await provider.connect({ optionalNamespaces: namespaces, ...('pairingTopic' in rest ? { pairingTopic: rest.pairingTopic } : {}) }) - this.setRequestedChainsIds(parameters.networks.map(x => Number(x.chainId))) + this.setRequestedChainsIds(parameters.networks.map(x => Number(x.id))) } // If session exists and chains are authorized, enable provider for required chain @@ -205,7 +210,7 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { }, async getProvider({ chainId } = {}) { async function initProvider() { - const optionalChains = parameters.networks.map(x => Number(x.chainId)) + const optionalChains = parameters.networks.map(x => Number(x.id)) if (!optionalChains.length) { return undefined @@ -228,13 +233,13 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { provider_?.events.setMaxListeners(Number.POSITIVE_INFINITY) } - const currentChainId = appKit.getCaipNetwork()?.chainId + const currentChainId = appKit.getCaipNetwork()?.id if (chainId && currentChainId !== chainId) { const storedCaipNetwork = StorageUtil.getStoredActiveCaipNetwork() - if (storedCaipNetwork && storedCaipNetwork.chainNamespace === 'eip155') { - await this.switchChain?.({ chainId: Number(storedCaipNetwork.chainId) }) + if (storedCaipNetwork && storedCaipNetwork.chainNamespace === ConstantsUtil.CHAIN.EVM) { + await this.switchChain?.({ chainId: Number(storedCaipNetwork.id) }) } else { await this.switchChain?.({ chainId }) } @@ -244,7 +249,7 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { return provider_ as Provider }, async getChainId() { - const chainId = appKit.getCaipNetwork()?.chainId + const chainId = appKit.getCaipNetwork()?.id if (chainId) { return chainId as number @@ -255,7 +260,7 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { const network = parameters.networks.find(c => c.id === chain) - return network?.chainId as number + return network?.id as number }, async isAuthorized() { try { @@ -286,16 +291,15 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { throw new ProviderNotFoundError() } - const chain = parameters.networks.find(x => x.chainId === chainId) - const [wagmiChain] = chain ? ChainsUtil.convertCaipNetworksToViemChains([chain]) : [] + const chainToSwitch = parameters.networks.find(x => x.id === chainId) - if (!wagmiChain) { + if (!chainToSwitch) { throw new SwitchChainError(new ChainNotConfiguredError()) } try { - if (chain?.id) { - provider.setDefaultChain(chain?.id) + if (chainToSwitch?.id) { + provider.setDefaultChain(chainToSwitch?.id as string) } await provider.request({ @@ -307,7 +311,7 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { const requestedChains = await this.getRequestedChainsIds() this.setRequestedChainsIds([...requestedChains, chainId]) - return wagmiChain + return { ...chainToSwitch, id: chainToSwitch.id as number } } catch (err) { const error = err as RpcError @@ -321,18 +325,18 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { if (addEthereumChainParameter?.blockExplorerUrls) { blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls } else { - blockExplorerUrls = wagmiChain.blockExplorers?.default.url - ? [wagmiChain.blockExplorers?.default.url] + blockExplorerUrls = chainToSwitch.blockExplorers?.default.url + ? [chainToSwitch.blockExplorers?.default.url] : [] } const addEthereumChain = { blockExplorerUrls, chainId: numberToHex(chainId), - chainName: wagmiChain.name, + chainName: chainToSwitch.name, iconUrls: addEthereumChainParameter?.iconUrls, - nativeCurrency: wagmiChain.nativeCurrency, - rpcUrls: wagmiChain.rpcUrls.default.http + nativeCurrency: chainToSwitch.nativeCurrency, + rpcUrls: chainToSwitch.rpcUrls.default.http } satisfies AddEthereumChainParameter await provider.request({ @@ -343,7 +347,7 @@ export function walletConnect(parameters: AppKitOptionsParams, appKit: AppKit) { const requestedChains = await this.getRequestedChainsIds() this.setRequestedChainsIds([...requestedChains, chainId]) - return wagmiChain + return { ...chainToSwitch, id: chainToSwitch.id as number } } catch (e) { throw new UserRejectedRequestError(e as Error) } diff --git a/packages/adapters/wagmi/src/tests/client.test.ts b/packages/adapters/wagmi/src/tests/client.test.ts index 3191a92cb0..33e67de2e4 100644 --- a/packages/adapters/wagmi/src/tests/client.test.ts +++ b/packages/adapters/wagmi/src/tests/client.test.ts @@ -7,9 +7,15 @@ import { mockOptions, mockWagmiClient } from './mocks/adapter.mock' -import { arbitrum, mainnet } from '@reown/appkit/networks' +import { arbitrum as AppkitArbitrum, mainnet as AppkitMainnet } from '@reown/appkit/networks' import { connect, disconnect, getAccount, getChainId, getEnsName, getBalance } from '@wagmi/core' -import { ConstantsUtil } from '@reown/appkit-utils' +import { CaipNetworksUtil, ConstantsUtil } from '@reown/appkit-utils' +import type { CaipNetwork } from '@reown/appkit-common' + +const [mainnet, arbitrum] = CaipNetworksUtil.extendCaipNetworks([AppkitMainnet, AppkitArbitrum], { + customNetworkImageUrls: {}, + projectId: '1234' +}) as [CaipNetwork, CaipNetwork] vi.mock('@wagmi/core', async () => { const actual = await vi.importActual('@wagmi/core') @@ -53,7 +59,7 @@ describe('Wagmi Client', () => { * Specifically to Wagmi, we are mutating caipNetworks on both Wagmi constructor and when we set adapters. * So there is not proper way to compare objects since imageId and imageUrl is added later. */ - expect(mockWagmiClient.defaultCaipNetwork?.chainId).toEqual(mockOptions.networks[0]?.chainId) + expect(mockWagmiClient.defaultCaipNetwork?.id).toEqual(mockOptions.networks[0]?.id) expect(mockWagmiClient.defaultCaipNetwork?.name).toEqual(mockOptions.networks[0]?.name) }) @@ -66,7 +72,7 @@ describe('Wagmi Client', () => { it('should switch to correct chain', async () => { await mockWagmiClient.networkControllerClient?.switchCaipNetwork(arbitrum) - expect(getChainId(mockWagmiClient.wagmiConfig)).toBe(arbitrum.chainId) + expect(getChainId(mockWagmiClient.wagmiConfig)).toBe(arbitrum.id) }) it('should sync the correct requested networks', async () => { @@ -105,7 +111,7 @@ describe('Wagmi Client', () => { expect(setApprovedCaipNetworksData).toHaveBeenCalledOnce() expect(mockAppKit.getCaipAddress()).toBe( - `${ConstantsUtil.EIP155}:${mainnet.chainId}:${mockAccount.address}` + `${ConstantsUtil.EIP155}:${mainnet.id}:${mockAccount.address}` ) const connectedWagmiAccount = getAccount(mockWagmiClient.wagmiConfig) @@ -173,7 +179,7 @@ describe('Wagmi Client', () => { const setAddressExplorerUrlSpy = vi.spyOn(mockAppKit, 'setAddressExplorerUrl') const syncBalanceSpy = vi.spyOn(mockWagmiClient as any, 'syncBalance') - await (mockWagmiClient as any).syncNetwork(mockAddress, mockChain.chainId, true) + await (mockWagmiClient as any).syncNetwork(mockAddress, mockChain.id, true) expect(setCaipNetworkSpy).toHaveBeenCalledWith( expect.objectContaining({ @@ -187,23 +193,23 @@ describe('Wagmi Client', () => { ) expect(setCaipAddressSpy).toHaveBeenCalledWith( - `eip155:${mockChain.chainId}:${mockAddress}`, + `eip155:${mockChain.id}:${mockAddress}`, 'eip155' ) expect(setAddressExplorerUrlSpy).toHaveBeenCalledWith( 'https://etherscan.io/address/0x1234567890123456789012345678901234567890', 'eip155' ) - expect(syncBalanceSpy).toHaveBeenCalledWith(mockAddress, mockChain.chainId) + expect(syncBalanceSpy).toHaveBeenCalledWith(mockAddress, mockChain.id) }) - it('should not sync network if chain is not found', async () => { + it.skip('should not sync network if chain is not found', async () => { const mockAddress = '0x1234567890123456789012345678901234567890' const mockChainId = 999 mockWagmiClient.options = { ...mockOptions, - networks: [] + networks: [mockChain] } const setCaipNetworkSpy = vi.spyOn(mockAppKit, 'setCaipNetwork') const syncBalanceSpy = vi.spyOn(mockWagmiClient as any, 'syncBalance') diff --git a/packages/adapters/wagmi/src/tests/mocks/adapter.mock.ts b/packages/adapters/wagmi/src/tests/mocks/adapter.mock.ts index d73d685bc8..9fe49db065 100644 --- a/packages/adapters/wagmi/src/tests/mocks/adapter.mock.ts +++ b/packages/adapters/wagmi/src/tests/mocks/adapter.mock.ts @@ -19,7 +19,7 @@ export const mockWagmiConfig = mockWagmiClient.wagmiConfig export const mockOptions = { adapters: [mockWagmiClient], - networks: [mainnet, arbitrum], + networks: mockWagmiClient.caipNetworks, enableInjected: false, enableCoinbase: false, enableWalletConnect: false, @@ -40,11 +40,25 @@ export const mockOptions = { export const mockAppKit = new AppKit(mockOptions) export const mockChain = { - id: 'eip155:1', + id: 1, name: 'Ethereum', - chainId: 1, + caipNetworkId: 'eip155:1', chainNamespace: 'eip155', - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.example.com' + nativeCurrency: { + name: 'Ethereum', + symbol: 'ETH', + decimals: 18 + }, + blockExplorers: { + default: { + name: 'etherscan', + url: 'https://etherscan.io', + standard: 'EIP3091' + } + }, + rpcUrls: { + default: { + http: ['https://rpc.example.com'] + } + } } as CaipNetwork diff --git a/packages/adapters/wagmi/src/utils/chains.ts b/packages/adapters/wagmi/src/utils/chains.ts deleted file mode 100644 index 82b9ffac02..0000000000 --- a/packages/adapters/wagmi/src/utils/chains.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { CaipNetwork } from '@reown/appkit-common' -import { defineChain, type Chain } from 'viem' - -export const ChainsUtil = { - /** - * Converts a Viem Chain object to a CaipNetwork object. - * @param chain - The Viem Chain object to convert. - * @returns The CaipNetwork object. - */ - convertViemChainToCaipNetwork(chain: Chain): CaipNetwork { - return { - id: `eip155:${chain.id}`, - chainId: chain.id, - chainNamespace: 'eip155', - name: chain.name, - currency: chain.nativeCurrency.symbol, - explorerUrl: chain.blockExplorers?.default?.url || '', - rpcUrl: chain.rpcUrls.default.http[0] || '', - imageUrl: undefined, - imageId: undefined - } - }, - - /** - * Converts an array of CaipNetwork objects to an array of Viem Chain objects. - * @param caipNetworks - The array of CaipNetwork objects to convert. - * @returns An array of Viem Chain objects. - */ - convertCaipNetworksToViemChains(caipNetworks: CaipNetwork[]) { - const chains = caipNetworks.map(caipNetwork => - defineChain({ - id: Number(caipNetwork.chainId), - name: caipNetwork.name, - network: caipNetwork.name, - nativeCurrency: { - decimals: 18, - name: caipNetwork.currency, - symbol: caipNetwork.currency - }, - rpcUrls: { - default: { - http: [caipNetwork.rpcUrl] - } - }, - blockExplorers: { - default: { - apiUrl: '', - name: '', - url: caipNetwork.explorerUrl || '' - } - }, - fees: undefined, - formatters: undefined, - serializers: undefined - }) - ) as unknown as readonly [Chain, ...Chain[]] - - return chains - } -} diff --git a/packages/appkit-utils/exports/index.ts b/packages/appkit-utils/exports/index.ts index 0e2022c5e9..35592d057a 100644 --- a/packages/appkit-utils/exports/index.ts +++ b/packages/appkit-utils/exports/index.ts @@ -4,6 +4,7 @@ export { PresetsUtil } from '../src/PresetsUtil.js' export { HelpersUtil } from '../src/HelpersUtil.js' export { ErrorUtil } from '../src/ErrorUtil.js' export { LoggerUtil } from '../src/LoggerUtil.js' +export { CaipNetworksUtil } from '../src/CaipNetworkUtil.js' export type { SocialProvider } from '../src/TypeUtil.js' import type { W3mFrameProvider } from '@reown/appkit-wallet' diff --git a/packages/common/src/utils/CaipNetworksUtil.ts b/packages/appkit-utils/src/CaipNetworkUtil.ts similarity index 67% rename from packages/common/src/utils/CaipNetworksUtil.ts rename to packages/appkit-utils/src/CaipNetworkUtil.ts index 7c968554f7..593922dee2 100644 --- a/packages/common/src/utils/CaipNetworksUtil.ts +++ b/packages/appkit-utils/src/CaipNetworkUtil.ts @@ -1,9 +1,9 @@ -import type { CaipNetwork } from './TypeUtil.js' +import { ConstantsUtil, type BaseOrCaipNetwork, type CaipNetwork } from '@reown/appkit-common' +import { PresetsUtil } from './PresetsUtil' const RPC_URL_HOST = 'rpc.walletconnect.org' type ExtendCaipNetworkParams = { - networkImageIds: Record customNetworkImageUrls: Record | undefined projectId: string } @@ -40,14 +40,25 @@ export const CaipNetworksUtil = { * @returns The extended array of CaipNetwork objects */ extendCaipNetwork( - caipNetwork: CaipNetwork, - { networkImageIds, customNetworkImageUrls, projectId }: ExtendCaipNetworkParams + caipNetwork: BaseOrCaipNetwork, + { customNetworkImageUrls }: ExtendCaipNetworkParams ): CaipNetwork { + const isCaipNetwork = (network: BaseOrCaipNetwork): network is CaipNetwork => { + return 'chainNamespace' in network && 'caipNetworkId' in network + } + return { ...caipNetwork, - imageId: networkImageIds[caipNetwork.chainId], - imageUrl: customNetworkImageUrls?.[caipNetwork.chainId], - rpcUrl: CaipNetworksUtil.extendRpcUrlWithProjectId(caipNetwork.rpcUrl, projectId) + chainNamespace: isCaipNetwork(caipNetwork) + ? caipNetwork.chainNamespace + : ConstantsUtil.CHAIN.EVM, + caipNetworkId: isCaipNetwork(caipNetwork) + ? caipNetwork.caipNetworkId + : `${ConstantsUtil.CHAIN.EVM}:${caipNetwork.id}`, + assets: { + imageId: PresetsUtil.NetworkImageIds[caipNetwork.id], + imageUrl: customNetworkImageUrls?.[caipNetwork.id] + } } }, @@ -61,15 +72,14 @@ export const CaipNetworksUtil = { * @returns The extended array of CaipNetwork objects */ extendCaipNetworks( - caipNetworks: CaipNetwork[], - { networkImageIds, customNetworkImageUrls, projectId }: ExtendCaipNetworkParams - ): CaipNetwork[] { + caipNetworks: BaseOrCaipNetwork[], + { customNetworkImageUrls, projectId }: ExtendCaipNetworkParams + ) { return caipNetworks.map(caipNetwork => CaipNetworksUtil.extendCaipNetwork(caipNetwork, { - networkImageIds, customNetworkImageUrls, projectId }) - ) + ) as [CaipNetwork, ...CaipNetwork[]] } } diff --git a/packages/appkit-utils/src/ethers/EthersHelpersUtil.ts b/packages/appkit-utils/src/ethers/EthersHelpersUtil.ts index 2c87ed0a00..2949118467 100644 --- a/packages/appkit-utils/src/ethers/EthersHelpersUtil.ts +++ b/packages/appkit-utils/src/ethers/EthersHelpersUtil.ts @@ -1,22 +1,8 @@ -import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common' import type { CaipNetwork } from '@reown/appkit-common' -import { ConstantsUtil } from '../ConstantsUtil.js' import { PresetsUtil } from '../PresetsUtil.js' import type { Provider } from './EthersTypesUtil.js' export const EthersHelpersUtil = { - getCaipDefaultChain(chain?: CaipNetwork) { - if (!chain) { - return undefined - } - - return { - id: `${ConstantsUtil.EIP155}:${chain.chainId}`, - name: chain.name, - imageId: PresetsUtil.NetworkImageIds[chain.chainId], - chainNamespace: CommonConstantsUtil.CHAIN.EVM - } as CaipNetwork - }, hexStringToNumber(value: string) { const string = value.startsWith('0x') ? value.slice(2) : value const number = parseInt(string, 16) @@ -54,16 +40,12 @@ export const EthersHelpersUtil = { method: 'wallet_addEthereumChain', params: [ { - chainId: EthersHelpersUtil.numberToHexString(caipNetwork.chainId), - rpcUrls: [caipNetwork.rpcUrl], + chainId: EthersHelpersUtil.numberToHexString(caipNetwork.id), + rpcUrls: caipNetwork.rpcUrls.default.http, chainName: caipNetwork.name, - nativeCurrency: { - name: caipNetwork.currency, - decimals: 18, - symbol: caipNetwork.currency - }, - blockExplorerUrls: [caipNetwork.explorerUrl], - iconUrls: [PresetsUtil.NetworkImageIds[caipNetwork.chainId]] + nativeCurrency: caipNetwork.nativeCurrency, + blockExplorerUrls: caipNetwork.blockExplorers, + iconUrls: [PresetsUtil.NetworkImageIds[caipNetwork.id]] } ] }) diff --git a/packages/appkit-utils/src/solana/SolanaConstantsUtil.ts b/packages/appkit-utils/src/solana/SolanaConstantsUtil.ts index 3c03554ad3..43659fc430 100644 --- a/packages/appkit-utils/src/solana/SolanaConstantsUtil.ts +++ b/packages/appkit-utils/src/solana/SolanaConstantsUtil.ts @@ -22,13 +22,26 @@ export const SolConstantsUtil = { ERROR_CODE_UNRECOGNIZED_CHAIN_ID: 4902, ERROR_CODE_DEFAULT: 5000, DEFAULT_CHAIN: { - id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - chainId: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + id: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + caipNetworkId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana', chainNamespace: ConstantsUtil.CHAIN.SOLANA, - currency: 'SOL', - explorerUrl: 'https://solscan.io', - rpcUrl: `${ConstantsUtil.BLOCKCHAIN_API_RPC_URL}/v1` + nativeCurrency: { + name: 'Solana', + decimals: 9, + symbol: 'SOL' + }, + blockExplorers: { + default: { + name: 'Solscan', + url: 'https://solscan.io' + } + }, + rpcUrls: { + default: { + http: [`${ConstantsUtil.BLOCKCHAIN_API_RPC_URL}/v1`] + } + } } as CaipNetwork, CHAIN_IDS: { Mainnet: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', diff --git a/packages/appkit-utils/src/solana/SolanaHelpersUtils.ts b/packages/appkit-utils/src/solana/SolanaHelpersUtils.ts index 58da7a1d5e..17d1deda51 100644 --- a/packages/appkit-utils/src/solana/SolanaHelpersUtils.ts +++ b/packages/appkit-utils/src/solana/SolanaHelpersUtils.ts @@ -12,15 +12,19 @@ const NetworkImageIds = { export const SolHelpersUtil = { detectRpcUrl(chain: CaipNetwork, projectId: string) { - if (chain.rpcUrl.includes(new URL(CommonConstantsUtil.BLOCKCHAIN_API_RPC_URL).hostname)) { - return `${chain.rpcUrl}?chainId=solana:${chain.chainId}&projectId=${projectId}` + if ( + chain.rpcUrls.default.http[0]?.includes( + new URL(CommonConstantsUtil.BLOCKCHAIN_API_RPC_URL).hostname + ) + ) { + return `${chain.rpcUrls.default.http[0]}?chainId=solana:${chain.id}&projectId=${projectId}` } - return chain.rpcUrl + return chain.rpcUrls.default.http[0] }, getChain(chains: CaipNetwork[], chainId: string | null) { - const chain = chains.find(lChain => lChain.chainId === chainId) + const chain = chains.find(lChain => lChain.id === chainId) if (chain) { return chain @@ -32,7 +36,7 @@ export const SolHelpersUtil = { getChainFromCaip(chains: CaipNetwork[], chainCaipId: string | undefined | null = ':') { const chainId: string = (chainCaipId?.split(':')[1] ?? '').replace(/\s/gu, '') - const selectedChain = chains.find(chain => chain.chainId === chainId) + const selectedChain = chains.find(chain => chain.id === chainId) if (selectedChain) { return { @@ -51,19 +55,6 @@ export const SolHelpersUtil = { } as CaipNetwork }, - getCaipDefaultChain(chain?: CaipNetwork) { - if (!chain) { - return undefined - } - - return { - id: `solana:${chain.chainId}`, - name: chain.name, - imageId: NetworkImageIds[chain.chainId], - chainNamespace: CommonConstantsUtil.CHAIN.SOLANA - } as CaipNetwork - }, - hexStringToNumber(value: string) { const hexString = value.startsWith('0x') ? value.slice(2) : value const decimalValue = parseInt(hexString, 16) diff --git a/packages/appkit-utils/tests/EthersHelpersUtil.test.ts b/packages/appkit-utils/tests/EthersHelpersUtil.test.ts index 8686113526..29bb2fc47c 100644 --- a/packages/appkit-utils/tests/EthersHelpersUtil.test.ts +++ b/packages/appkit-utils/tests/EthersHelpersUtil.test.ts @@ -1,38 +1,8 @@ import { describe, it, expect, vi } from 'vitest' import { EthersHelpersUtil } from '../src/ethers/EthersHelpersUtil.js' -import { ConstantsUtil } from '../src/ConstantsUtil.js' -import { PresetsUtil } from '../src/PresetsUtil.js' -import type { CaipNetwork } from '@reown/appkit-common' -import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common' import type { Provider } from '../src/ethers/EthersTypesUtil.js' describe('EthersHelpersUtil', () => { - describe('getCaipDefaultChain', () => { - it('should return undefined for undefined input', () => { - const result = EthersHelpersUtil.getCaipDefaultChain(undefined) - expect(result).toBeUndefined() - }) - - it('should convert chain to CAIP format', () => { - const mockChain: CaipNetwork = { - id: 'eip155:1', - name: 'Ethereum', - chainId: '1', - chainNamespace: CommonConstantsUtil.CHAIN.EVM, - rpcUrl: 'https://mainnet.infura.io/v3/', - currency: 'ETH', - explorerUrl: '' - } - const result = EthersHelpersUtil.getCaipDefaultChain(mockChain) - expect(result).toEqual({ - id: `${ConstantsUtil.EIP155}:1`, - name: 'Ethereum', - imageId: PresetsUtil.NetworkImageIds['1'], - chainNamespace: CommonConstantsUtil.CHAIN.EVM - }) - }) - }) - describe('hexStringToNumber', () => { it('should convert hex string to number', () => { expect(EthersHelpersUtil.hexStringToNumber('0xa')).toBe(10) diff --git a/packages/appkit-utils/tests/SolanaHelpersUtil.test.ts b/packages/appkit-utils/tests/SolanaHelpersUtil.test.ts index 777615d959..6b741026a2 100644 --- a/packages/appkit-utils/tests/SolanaHelpersUtil.test.ts +++ b/packages/appkit-utils/tests/SolanaHelpersUtil.test.ts @@ -8,22 +8,48 @@ import type { Provider } from '../src/solana/SolanaTypesUtil.js' describe('SolHelpersUtil', () => { const mockChains: CaipNetwork[] = [ { - id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + id: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana Mainnet', - chainId: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + caipNetworkId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', chainNamespace: CommonConstantsUtil.CHAIN.SOLANA, - rpcUrl: 'https://api.mainnet-beta.solana.com', - currency: 'SOL', - explorerUrl: '' + rpcUrls: { + default: { + http: ['https://api.mainnet-beta.solana.com'] + } + }, + nativeCurrency: { + name: 'Solana', + decimals: 9, + symbol: 'SOL' + }, + blockExplorers: { + default: { + name: 'Solscan', + url: 'https://solscan.io' + } + } }, { - id: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', + id: '4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', name: 'Solana Testnet', - chainId: '4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', + caipNetworkId: 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', chainNamespace: CommonConstantsUtil.CHAIN.SOLANA, - rpcUrl: 'https://api.testnet.solana.com', - currency: 'SOL', - explorerUrl: '' + rpcUrls: { + default: { + http: ['https://api.testnet.solana.com'] + } + }, + nativeCurrency: { + name: 'Solana', + decimals: 9, + symbol: 'SOL' + }, + blockExplorers: { + default: { + name: 'Solscan', + url: 'https://solscan.io' + } + } } ] @@ -35,14 +61,14 @@ describe('SolHelpersUtil', () => { } as CaipNetwork const projectId = 'test-project-id' const result = SolHelpersUtil.detectRpcUrl(chain, projectId) - expect(result).toBe(chain.rpcUrl) + expect(result).toBe(chain.rpcUrls.default.http[0]) }) it('should return original RPC URL for non-blockchain API URLs', () => { const chain = mockChains[0] const projectId = 'test-project-id' const result = SolHelpersUtil.detectRpcUrl(chain!, projectId) - expect(result).toBe(chain?.rpcUrl) + expect(result).toBe(chain?.rpcUrls.default.http[0]) }) }) @@ -83,23 +109,6 @@ describe('SolHelpersUtil', () => { }) }) - describe('getCaipDefaultChain', () => { - it('should return undefined for undefined input', () => { - const result = SolHelpersUtil.getCaipDefaultChain(undefined) - expect(result).toBeUndefined() - }) - - it('should convert chain to CAIP format', () => { - const result = SolHelpersUtil.getCaipDefaultChain(mockChains[0]) - expect(result).toEqual({ - id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - name: 'Solana Mainnet', - imageId: 'a1b58899-f671-4276-6a5e-56ca5bd59700', - chainNamespace: CommonConstantsUtil.CHAIN.SOLANA - }) - }) - }) - describe('hexStringToNumber', () => { it('should convert hex string to number', () => { expect(SolHelpersUtil.hexStringToNumber('0xa')).toBe(10) diff --git a/packages/appkit/src/client.ts b/packages/appkit/src/client.ts index 69142db2b4..0dadb6e17c 100644 --- a/packages/appkit/src/client.ts +++ b/packages/appkit/src/client.ts @@ -33,13 +33,12 @@ import { ConstantsUtil, type CaipNetwork, type ChainNamespace, - CaipNetworksUtil, SafeLocalStorage, SafeLocalStorageKeys } from '@reown/appkit-common' import type { AppKitOptions } from './utils/TypesUtil.js' import { UniversalAdapterClient } from './universal-adapter/client.js' -import { ErrorUtil, PresetsUtil } from '@reown/appkit-utils' +import { CaipNetworksUtil, ErrorUtil } from '@reown/appkit-utils' import type { W3mFrameTypes } from '@reown/appkit-wallet' import { ProviderUtil } from './store/ProviderUtil.js' @@ -66,6 +65,8 @@ export class AppKit { private initPromise?: Promise = undefined + private caipNetworks: [CaipNetwork, ...CaipNetwork[]] + public constructor( options: AppKitOptions & { adapters?: ChainAdapter[] @@ -75,6 +76,10 @@ export class AppKit { ) { // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style this.adapter = options.adapters?.[0] as ChainAdapter + this.caipNetworks = CaipNetworksUtil.extendCaipNetworks(options.networks, { + customNetworkImageUrls: options.chainImages, + projectId: options.projectId + }) this.initControllers(options) this.initOrContinue() } @@ -104,7 +109,7 @@ export class AppKit { } public getChainId() { - return ChainController.state.activeCaipNetwork?.chainId + return ChainController.state.activeCaipNetwork?.id } public switchNetwork(caipNetwork: CaipNetwork) { @@ -495,15 +500,14 @@ export class AppKit { private extendCaipNetworks(options: AppKitOptions) { options.networks = CaipNetworksUtil.extendCaipNetworks(options.networks, { - networkImageIds: PresetsUtil.NetworkImageIds, customNetworkImageUrls: options.chainImages, projectId: options.projectId - }) + }) as [CaipNetwork, ...CaipNetwork[]] options.defaultNetwork = options.networks.find(n => n.id === options.defaultNetwork?.id) } private initializeUniversalAdapter(options: AppKitOptions) { - this.universalAdapter = new UniversalAdapterClient(options) + this.universalAdapter = new UniversalAdapterClient(options, this.caipNetworks) ChainController.initializeUniversalAdapter(this.universalAdapter, options.adapters || []) this.universalAdapter.construct?.(this, options) } @@ -512,14 +516,13 @@ export class AppKit { ChainController.initialize(options.adapters || []) options.adapters?.forEach(adapter => { // @ts-expect-error will introduce construct later - adapter.construct?.(this, options) + adapter.construct?.(this, options, this.caipNetworks) }) } private setDefaultNetwork(options: AppKitOptions) { - const extendedDefaultNetwork = options.defaultNetwork + options.defaultNetwork = options.defaultNetwork ? CaipNetworksUtil.extendCaipNetwork(options.defaultNetwork, { - networkImageIds: PresetsUtil.NetworkImageIds, customNetworkImageUrls: options.chainImages, projectId: options.projectId }) @@ -529,7 +532,7 @@ export class AppKit { ? options.networks.find(n => n.id === previousNetwork) : undefined - const network = caipNetwork ?? extendedDefaultNetwork ?? options.networks[0] + const network = caipNetwork ?? options.defaultNetwork ?? options.networks[0] ChainController.setActiveCaipNetwork(network as CaipNetwork) } diff --git a/packages/appkit/src/networks/eip155.ts b/packages/appkit/src/networks/eip155.ts index 560ac7469e..88250e2fff 100644 --- a/packages/appkit/src/networks/eip155.ts +++ b/packages/appkit/src/networks/eip155.ts @@ -1,12 +1,9 @@ +import type { CaipNetwork } from '@reown/appkit-common' import * as viemChains from 'viem/chains' -// Create an object to hold modified chain data -const modifiedChains: Record< - string, - viemChains.Chain & { chainNamespace: string; caipNetworkId: string } -> = {} +// Modify and collect the chains +const modifiedChains: Record = {} -// Iterate through the chains and add the modified chain data Object.keys(viemChains).forEach(chainName => { const chain = viemChains[chainName as keyof typeof viemChains] as viemChains.Chain @@ -14,9 +11,7 @@ Object.keys(viemChains).forEach(chainName => { ...chain, chainNamespace: 'eip155', caipNetworkId: `eip155:${chain.id}` - } + } as CaipNetwork }) -// Export all modified chains using the spread operator -export const { mainnet, ropsten, rinkeby, kovan, goerli, polygon, optimism, arbitrum } = - modifiedChains +export default modifiedChains diff --git a/packages/appkit/src/networks/index.ts b/packages/appkit/src/networks/index.ts index 65b14f4d43..cd3aae5daa 100644 --- a/packages/appkit/src/networks/index.ts +++ b/packages/appkit/src/networks/index.ts @@ -1,4 +1,4 @@ -import type { CaipNetworkNew } from '@reown/appkit-common' +import type { CaipNetwork } from '@reown/appkit-common' import type { Assign, Prettify, ChainFormatters } from 'viem' import type { ChainNamespace } from '@reown/appkit-common' @@ -11,14 +11,14 @@ export function getBlockchainApiRpcUrl(chainId: number | string, namespace: Chai export function defineChain< formatters extends ChainFormatters, - const chain extends CaipNetworkNew ->(chain: chain): Prettify, chain>> { + const chain extends CaipNetwork +>(chain: chain): Prettify, chain>> { return { formatters: undefined, fees: undefined, serializers: undefined, ...chain - } as Assign, chain> + } as Assign, chain> } export const solana = defineChain({ diff --git a/packages/appkit/src/tests/universal-adapter.test.ts b/packages/appkit/src/tests/universal-adapter.test.ts index 946dfac3dc..fb86a07ab6 100644 --- a/packages/appkit/src/tests/universal-adapter.test.ts +++ b/packages/appkit/src/tests/universal-adapter.test.ts @@ -6,14 +6,19 @@ import mockProvider from './mocks/UniversalProvider' import type UniversalProvider from '@walletconnect/universal-provider' import { NetworkController } from '@reown/appkit-core' import { ProviderUtil } from '../store/index.js' -import { ConstantsUtil, PresetsUtil } from '@reown/appkit-utils' +import { CaipNetworksUtil, ConstantsUtil, PresetsUtil } from '@reown/appkit-utils' import mockAppKit from './mocks/AppKit' +const mockCaipNetworks = CaipNetworksUtil.extendCaipNetworks([mainnet, solana], { + customNetworkImageUrls: {}, + projectId: 'test-project-id' +}) + describe('UniversalAdapter', () => { let universalAdapter: UniversalAdapterClient beforeEach(() => { - universalAdapter = new UniversalAdapterClient(mockOptions) + universalAdapter = new UniversalAdapterClient(mockOptions, mockCaipNetworks) universalAdapter.walletConnectProvider = mockProvider universalAdapter.construct(mockAppKit, mockOptions) }) @@ -27,10 +32,6 @@ describe('UniversalAdapter', () => { expect(universalAdapter?.caipNetworks).toEqual(mockOptions.networks) }) - it('should set defaultNetwork to first caipNetwork option', () => { - expect(universalAdapter?.defaultNetwork).toEqual(mockOptions.networks[0]) - }) - it('should set metadata to metadata options', () => { expect((universalAdapter as any).appKit).toEqual(mockAppKit) }) @@ -39,6 +40,7 @@ describe('UniversalAdapter', () => { describe('UniversalAdapter - Public Methods', () => { it('should return walletConnectProvider when getWalletConnectProvider is invoked', async () => { const switchNetworkSpy = vi.spyOn(universalAdapter, 'switchNetwork') + const mainnet = universalAdapter.caipNetworks[0] await universalAdapter.networkControllerClient.switchCaipNetwork(mainnet) expect(switchNetworkSpy).toHaveBeenCalledWith(mainnet) }) @@ -64,6 +66,7 @@ describe('UniversalAdapter', () => { }) it('should call setDefaultNetwork and set first caipNetwork on setActiveCaipNetwork when there is no active caipNetwork', async () => { + const mainnet = universalAdapter.caipNetworks[0] vi.spyOn(NetworkController, 'state', 'get').mockReturnValue({ caipNetwork: undefined, requestedCaipNetworks: [mainnet, solana], @@ -83,6 +86,7 @@ describe('UniversalAdapter', () => { it('should set correct requestedCaipNetworks in AppKit when syncRequestedNetworks has been called', () => { ;(universalAdapter as any).syncRequestedNetworks(mockOptions.networks) + const mainnet = universalAdapter.caipNetworks[0] expect(mockAppKit.setRequestedCaipNetworks).toHaveBeenCalledWith([mainnet], 'eip155') expect(mockAppKit.setRequestedCaipNetworks).toHaveBeenCalledWith([solana], 'solana') }) diff --git a/packages/appkit/src/tests/utils/HelpersUtil.test.ts b/packages/appkit/src/tests/utils/HelpersUtil.test.ts index 8add47da9d..3226964620 100644 --- a/packages/appkit/src/tests/utils/HelpersUtil.test.ts +++ b/packages/appkit/src/tests/utils/HelpersUtil.test.ts @@ -1,36 +1,57 @@ import { describe, test, expect } from 'vitest' import { WcHelpersUtil } from '../../utils/HelpersUtil' -import type { CaipNetwork } from '@reown/appkit-common' +import { ConstantsUtil, type CaipNetwork } from '@reown/appkit-common' import type { SessionTypes } from '@walletconnect/types' const mockEthereumNetwork = { - id: 'eip155:1', - chainNamespace: 'eip155', - chainId: '1', + id: 1, + chainNamespace: ConstantsUtil.CHAIN.EVM, + caipNetworkId: 'eip155:1', name: 'Ethereum', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://mainnet.infura.io/v3/YOUR-PROJECT-ID', - currency: 'ETH' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: ['https://mainnet.infura.io/v3/YOUR-PROJECT-ID'] + } + } } as const const mockPolygonNetwork = { - id: 'eip155:137', - chainNamespace: 'eip155', - chainId: '137', + id: 137, + chainNamespace: ConstantsUtil.CHAIN.EVM, + caipNetworkId: 'eip155:137', name: 'Polygon', - explorerUrl: 'https://polygonscan.com', - rpcUrl: 'https://polygon.rpc.com', - currency: 'MATIC' + nativeCurrency: { + name: 'Matic', + decimals: 18, + symbol: 'MATIC' + }, + rpcUrls: { + default: { + http: ['https://polygon.rpc.com'] + } + } } as const const mockSolanaNetwork = { - id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - chainNamespace: 'solana', - chainId: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + id: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + chainNamespace: ConstantsUtil.CHAIN.SOLANA, + caipNetworkId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana', - explorerUrl: 'https://explorer.solana.com', - rpcUrl: 'https://api.mainnet-beta.solana.com', - currency: 'SOL' + nativeCurrency: { + name: 'Solana', + decimals: 18, + symbol: 'SOL' + }, + rpcUrls: { + default: { + http: ['https://api.mainnet-beta.solana.com'] + } + } } as const describe('WcHelpersUtil', () => { diff --git a/packages/appkit/src/universal-adapter/client.ts b/packages/appkit/src/universal-adapter/client.ts index aaf7b28ba8..c77ccbea90 100644 --- a/packages/appkit/src/universal-adapter/client.ts +++ b/packages/appkit/src/universal-adapter/client.ts @@ -18,7 +18,11 @@ import { WcHelpersUtil } from '../utils/HelpersUtil.js' import type { AppKit } from '../client.js' import type { SessionTypes } from '@walletconnect/types' import type { CaipNetwork, CaipAddress, ChainNamespace, AdapterType } from '@reown/appkit-common' -import { SafeLocalStorage, SafeLocalStorageKeys } from '@reown/appkit-common' +import { + SafeLocalStorage, + SafeLocalStorageKeys, + ConstantsUtil as CommonConstantsUtil +} from '@reown/appkit-common' import { ProviderUtil } from '../store/index.js' import type { AppKitOptions } from '../utils/TypesUtil.js' @@ -55,7 +59,7 @@ export class UniversalAdapterClient { private appKit: AppKit | undefined = undefined - public caipNetworks: CaipNetwork[] + public caipNetworks: [CaipNetwork, ...CaipNetwork[]] public walletConnectProvider?: UniversalProvider @@ -65,8 +69,6 @@ export class UniversalAdapterClient { public chainNamespace: ChainNamespace - public defaultNetwork: CaipNetwork | undefined = undefined - public networkControllerClient: NetworkControllerClient public connectionControllerClient: ConnectionControllerClient @@ -77,26 +79,20 @@ export class UniversalAdapterClient { public reportErrors = true - public constructor(options: AppKitOptions) { + public constructor(options: AppKitOptions, caipNetworks: [CaipNetwork, ...CaipNetwork[]]) { const { siweConfig, metadata } = options - this.caipNetworks = options.networks + this.caipNetworks = caipNetworks - this.chainNamespace = 'eip155' + this.chainNamespace = CommonConstantsUtil.CHAIN.EVM this.metadata = metadata - this.defaultNetwork = options.defaultNetwork || options.networks[0] - this.networkControllerClient = { // @ts-expect-error switchCaipNetwork is async for some adapter but not for this adapter switchCaipNetwork: caipNetwork => { if (caipNetwork) { - try { - this.switchNetwork(caipNetwork) - } catch (error) { - throw new Error('networkControllerClient:switchCaipNetwork - unable to switch chain') - } + this.switchNetwork(caipNetwork) } }, @@ -153,19 +149,19 @@ export class UniversalAdapterClient { siweParams && isProviderSupported && isSiweParamsValid && - ChainController.state.activeChain === 'eip155' + ChainController.state.activeChain === CommonConstantsUtil.CHAIN.EVM ) { const { SIWEController, getDidChainId, getDidAddress } = await import( '@reown/appkit-siwe' ) const chains = this.caipNetworks - ?.filter(network => network.chainNamespace === 'eip155') + ?.filter(network => network.chainNamespace === CommonConstantsUtil.CHAIN.EVM) .map(chain => chain.id) as string[] siweParams.chains = this.caipNetworks - ?.filter(network => network.chainNamespace === 'eip155') - .map(chain => chain.chainId) as number[] + ?.filter(network => network.chainNamespace === CommonConstantsUtil.CHAIN.EVM) + .map(chain => chain.id) as number[] const result = await WalletConnectProvider.authenticate({ nonce: await siweConfig?.getNonce?.(), @@ -227,8 +223,8 @@ export class UniversalAdapterClient { await this.walletConnectProvider?.disconnect() - this.appKit?.resetAccount('eip155') - this.appKit?.resetAccount('solana') + this.appKit?.resetAccount(CommonConstantsUtil.CHAIN.EVM) + this.appKit?.resetAccount(CommonConstantsUtil.CHAIN.SOLANA) }, signMessage: async (message: string) => { @@ -280,18 +276,22 @@ export class UniversalAdapterClient { } public switchNetwork(caipNetwork: CaipNetwork) { - if (caipNetwork) { - if (this.walletConnectProvider) { - this.walletConnectProvider.setDefaultChain(caipNetwork.id) + try { + if (caipNetwork) { + if (this.walletConnectProvider) { + this.walletConnectProvider.setDefaultChain(caipNetwork.caipNetworkId) + } } + } catch (error) { + console.log('>>> UPA.switchNetwork', error) } } public async disconnect() { if (this.walletConnectProvider) { await (this.walletConnectProvider as unknown as UniversalProvider).disconnect() - this.appKit?.resetAccount('eip155') - this.appKit?.resetAccount('solana') + this.appKit?.resetAccount(CommonConstantsUtil.CHAIN.EVM) + this.appKit?.resetAccount(CommonConstantsUtil.CHAIN.SOLANA) } } @@ -353,9 +353,9 @@ export class UniversalAdapterClient { await this.checkActiveWalletConnectProvider() } - private syncRequestedNetworks(caipNetworks: AppKitOptions['networks']) { + private syncRequestedNetworks(caipNetworks: CaipNetwork[]) { const uniqueChainNamespaces = [ - ...new Set(caipNetworks.map(caipNetwork => caipNetwork.chainNamespace)) + ...new Set((caipNetworks as CaipNetwork[]).map(caipNetwork => caipNetwork.chainNamespace)) ] uniqueChainNamespaces .filter(c => Boolean(c)) @@ -409,7 +409,7 @@ export class UniversalAdapterClient { } else if (!activeCaipNetwork) { this.setDefaultNetwork(nameSpaces) } else if ( - !NetworkController.state.approvedCaipNetworkIds?.includes(activeCaipNetwork.id) + !NetworkController.state.approvedCaipNetworkIds?.includes(activeCaipNetwork.caipNetworkId) ) { this.setDefaultNetwork(nameSpaces) } @@ -470,18 +470,26 @@ export class UniversalAdapterClient { const chainChanged = (chainId: number | string) => { // eslint-disable-next-line eqeqeq - const caipNetwork = this.caipNetworks.find(c => c.chainId == chainId) + const caipNetwork = this.caipNetworks.find(c => c.id == chainId) const currentCaipNetwork = this.appKit?.getCaipNetwork() if (!caipNetwork) { + const namespace = this.appKit?.getActiveChainNamespace() || CommonConstantsUtil.CHAIN.EVM NetworkController.setActiveCaipNetwork({ - chainId: Number(chainId), - id: `eip155:${chainId}`, + id: chainId, + caipNetworkId: `${namespace}:${chainId}`, name: 'Unknown Network', - currency: '', - explorerUrl: '', - rpcUrl: '', - chainNamespace: this.appKit?.getActiveChainNamespace() || 'eip155' + chainNamespace: namespace, + nativeCurrency: { + name: '', + decimals: 0, + symbol: '' + }, + rpcUrls: { + default: { + http: [] + } + } }) return @@ -585,8 +593,14 @@ export class UniversalAdapterClient { chainNamespace ) } else if (currentActiveWallet) { - this.appKit?.setConnectedWalletInfo({ name: currentActiveWallet }, 'eip155') - this.appKit?.setConnectedWalletInfo({ name: currentActiveWallet }, 'solana') + this.appKit?.setConnectedWalletInfo( + { name: currentActiveWallet }, + CommonConstantsUtil.CHAIN.EVM + ) + this.appKit?.setConnectedWalletInfo( + { name: currentActiveWallet }, + CommonConstantsUtil.CHAIN.SOLANA + ) } }) } diff --git a/packages/appkit/src/utils/HelpersUtil.ts b/packages/appkit/src/utils/HelpersUtil.ts index ebc3f247dc..d4f9179896 100644 --- a/packages/appkit/src/utils/HelpersUtil.ts +++ b/packages/appkit/src/utils/HelpersUtil.ts @@ -37,7 +37,8 @@ export const WcHelpersUtil = { createNamespaces(caipNetworks: CaipNetwork[]): NamespaceConfig { return caipNetworks.reduce((acc, chain) => { - const { chainId, chainNamespace, rpcUrl } = chain + const { id, chainNamespace, rpcUrls } = chain + const rpcUrl = rpcUrls.default.http[0] const methods = this.getMethodsByChainNamespace(chainNamespace) @@ -50,15 +51,15 @@ export const WcHelpersUtil = { } satisfies Namespace } - const fullChainId = `${chainNamespace}:${chainId}` + const fullChainId = `${chainNamespace}:${id}` // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style const namespace = acc[chainNamespace] as Namespace namespace.chains.push(fullChainId) - if (namespace?.rpcMap) { - namespace.rpcMap[chainId] = rpcUrl + if (namespace?.rpcMap && rpcUrl) { + namespace.rpcMap[id] = rpcUrl } return acc diff --git a/packages/appkit/src/utils/TypesUtil.ts b/packages/appkit/src/utils/TypesUtil.ts index e56a27662f..b7737cd4af 100644 --- a/packages/appkit/src/utils/TypesUtil.ts +++ b/packages/appkit/src/utils/TypesUtil.ts @@ -1,4 +1,4 @@ -import type { CaipNetworkNew, ThemeVariables } from '@reown/appkit-common' +import type { BaseOrCaipNetwork, ThemeVariables } from '@reown/appkit-common' import type { ChainAdapter, Metadata, @@ -47,12 +47,12 @@ export type AppKitOptions = { * You can set the desired caipnetworks for the app: * @see https://docs.reown.com/appkit/react/core/options#defaultchain */ - networks: readonly [CaipNetworkNew, ...CaipNetworkNew[]] + networks: BaseOrCaipNetwork[] /** * You can set a desired caipnetwork for the initial connection: * @see https://docs.reown.com/appkit/react/core/options#defaultchain */ - defaultNetwork?: NetworkControllerState['caipNetwork'] + defaultNetwork?: BaseOrCaipNetwork /** * Add or override the modal's network images. * @see https://docs.reown.com/appkit/react/core/options#chainimages diff --git a/packages/common/index.ts b/packages/common/index.ts index ffdae5220e..ed4e4a1e7c 100644 --- a/packages/common/index.ts +++ b/packages/common/index.ts @@ -11,7 +11,6 @@ export { ParseUtil } from './src/utils/ParseUtil.js' export { SafeLocalStorage, SafeLocalStorageKeys } from './src/utils/SafeLocalStorage.js' export { getW3mThemeVariables } from './src/utils/ThemeUtil.js' export { isReownName } from './src/utils/NamesUtil.js' -export { CaipNetworksUtil } from './src/utils/CaipNetworksUtil.js' // -- Types ------------------------------------------------------------------- export type * from './src/utils/ThemeUtil.js' diff --git a/packages/common/src/utils/TypeUtil.ts b/packages/common/src/utils/TypeUtil.ts index 4f7c9131ce..6155599c61 100644 --- a/packages/common/src/utils/TypeUtil.ts +++ b/packages/common/src/utils/TypeUtil.ts @@ -8,19 +8,27 @@ export type BaseNetwork< custom extends Record | undefined = Record | undefined > = BaseChain -export type CaipNetworkNew< +export type CaipNetwork< formatters extends ChainFormatters | undefined = ChainFormatters | undefined, custom extends Record | undefined = Record | undefined > = Omit, 'id'> & { id: number | string chainNamespace: ChainNamespace caipNetworkId: CaipNetworkId - assets: { - imageId: string - imageUrl: string + assets?: { + imageId: string | undefined + imageUrl: string | undefined } } +export type BaseOrCaipNetwork = BaseChain | CaipNetwork + +export type BaseNetworkWithOptionalCaipFields = BaseNetwork & { + id: number | string + chainNamespace: ChainNamespace + caipNetworkId: CaipNetworkId +} + export type CaipNetworkId = `${ChainNamespace}:${ChainId}` export type CaipAddress = `${ChainNamespace}:${ChainId}:${string}` @@ -29,7 +37,7 @@ export type ChainId = string | number export type ChainNamespace = 'eip155' | 'solana' | 'polkadot' -export type CaipNetwork = { +export type CaipNetworkLegacy = { id: CaipNetworkId chainId: ChainId chainNamespace: ChainNamespace diff --git a/packages/core/exports/react.ts b/packages/core/exports/react.ts index 4f531196a1..ee9a9d72c4 100644 --- a/packages/core/exports/react.ts +++ b/packages/core/exports/react.ts @@ -9,7 +9,7 @@ export function useAppKitNetwork() { return { caipNetwork: activeCaipNetwork, - chainId: activeCaipNetwork?.chainId + chainId: activeCaipNetwork?.caipNetworkId } } export function useAppKitAccount() { diff --git a/packages/core/src/controllers/AccountController.ts b/packages/core/src/controllers/AccountController.ts index 485564760c..4ace12b837 100644 --- a/packages/core/src/controllers/AccountController.ts +++ b/packages/core/src/controllers/AccountController.ts @@ -222,7 +222,7 @@ export const AccountController = { }, async fetchTokenBalance() { - const chainId = ChainController.state.activeCaipNetwork?.id + const chainId = ChainController.state.activeCaipNetwork?.caipNetworkId const chain = ChainController.state.activeCaipNetwork?.chainNamespace const caipAddress = ChainController.state.activeCaipAddress const address = caipAddress ? CoreHelperUtil.getPlainAddress(caipAddress) : undefined diff --git a/packages/core/src/controllers/ApiController.ts b/packages/core/src/controllers/ApiController.ts index d57e69f432..b42108e32b 100644 --- a/packages/core/src/controllers/ApiController.ts +++ b/packages/core/src/controllers/ApiController.ts @@ -108,7 +108,7 @@ export const ApiController = { async fetchNetworkImages() { const requestedCaipNetworks = NetworkController.getRequestedCaipNetworks() - const ids = requestedCaipNetworks?.map(({ imageId }) => imageId).filter(Boolean) + const ids = requestedCaipNetworks?.map(({ assets }) => assets?.imageId).filter(Boolean) if (ids) { await Promise.allSettled((ids as string[]).map(id => ApiController._fetchNetworkImage(id))) } @@ -160,7 +160,7 @@ export const ApiController = { headers: ApiController._getApiHeaders(), params: { page: '1', - chains: ChainController.state.activeCaipNetwork?.id, + chains: ChainController.state.activeCaipNetwork?.caipNetworkId, entries: recommendedEntries, include: includeWalletIds?.join(','), exclude: exclude?.join(',') @@ -195,7 +195,7 @@ export const ApiController = { params: { page: String(page), entries, - chains: ChainController.state.activeCaipNetwork?.id, + chains: ChainController.state.activeCaipNetwork?.caipNetworkId, include: includeWalletIds?.join(','), exclude: exclude.join(',') } @@ -221,7 +221,7 @@ export const ApiController = { params: { page: '1', entries: String(ids.length), - chains: ChainController.state.activeCaipNetwork?.id, + chains: ChainController.state.activeCaipNetwork?.caipNetworkId, include: ids?.join(',') } }) @@ -245,7 +245,7 @@ export const ApiController = { page: '1', entries: '100', search: search?.trim(), - chains: ChainController.state.activeCaipNetwork?.id, + chains: ChainController.state.activeCaipNetwork?.caipNetworkId, include: includeWalletIds?.join(','), exclude: excludeWalletIds?.join(',') } diff --git a/packages/core/src/controllers/ChainController.ts b/packages/core/src/controllers/ChainController.ts index 1bea9b54bd..7dd8d8d0da 100644 --- a/packages/core/src/controllers/ChainController.ts +++ b/packages/core/src/controllers/ChainController.ts @@ -230,10 +230,13 @@ export const ChainController = { if (caipNetwork?.id) { state.activeCaipAddress = newAdapter?.accountState?.caipAddress state.activeCaipNetwork = caipNetwork - SafeLocalStorage.setItem(SafeLocalStorageKeys.ACTIVE_CAIP_NETWORK_ID, caipNetwork?.id) + SafeLocalStorage.setItem( + SafeLocalStorageKeys.ACTIVE_CAIP_NETWORK_ID, + caipNetwork?.caipNetworkId + ) PublicStateController.set({ activeChain: chain, - selectedNetworkId: caipNetwork?.id + selectedNetworkId: caipNetwork?.caipNetworkId }) } }, @@ -255,9 +258,9 @@ export const ChainController = { PublicStateController.set({ activeChain: state.activeChain, - selectedNetworkId: state.activeCaipNetwork?.id + selectedNetworkId: state.activeCaipNetwork?.caipNetworkId }) - SafeLocalStorage.setItem(SafeLocalStorageKeys.ACTIVE_CAIP_NETWORK_ID, caipNetwork.id) + SafeLocalStorage.setItem(SafeLocalStorageKeys.ACTIVE_CAIP_NETWORK_ID, caipNetwork.caipNetworkId) }, /** @@ -277,7 +280,7 @@ export const ChainController = { state.activeCaipNetwork = caipNetwork PublicStateController.set({ activeChain: state.activeChain, - selectedNetworkId: state.activeCaipNetwork?.id + selectedNetworkId: state.activeCaipNetwork?.caipNetworkId }) this.setChainNetworkData(chain, { caipNetwork }, shouldReplace) }, diff --git a/packages/core/src/controllers/ConnectionController.ts b/packages/core/src/controllers/ConnectionController.ts index 63d19bab08..cd40095c7d 100644 --- a/packages/core/src/controllers/ConnectionController.ts +++ b/packages/core/src/controllers/ConnectionController.ts @@ -119,7 +119,10 @@ export const ConnectionController = { EventsController.sendEvent({ type: 'track', event: 'SET_PREFERRED_ACCOUNT_TYPE', - properties: { accountType, network: ChainController.state.activeCaipNetwork?.id || '' } + properties: { + accountType, + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '' + } }) }, diff --git a/packages/core/src/controllers/EnsController.ts b/packages/core/src/controllers/EnsController.ts index 62bff8ad5c..96d7ea8e79 100644 --- a/packages/core/src/controllers/EnsController.ts +++ b/packages/core/src/controllers/EnsController.ts @@ -6,7 +6,6 @@ import { AccountController } from './AccountController.js' import { ConnectorController } from './ConnectorController.js' import { RouterController } from './RouterController.js' import { ConnectionController } from './ConnectionController.js' -import { NetworkUtil } from '@reown/appkit-common' import { EnsUtil } from '../utils/EnsUtil.js' import { ChainController } from './ChainController.js' @@ -129,7 +128,7 @@ export const EnsController = { }) const signature = await ConnectionController.signMessage(message) - const networkId = NetworkUtil.caipNetworkIdToNumber(network.id) + const networkId = network.id if (!networkId) { throw new Error('Network not found') diff --git a/packages/core/src/controllers/NetworkController.ts b/packages/core/src/controllers/NetworkController.ts index cf614c4483..77b800d321 100644 --- a/packages/core/src/controllers/NetworkController.ts +++ b/packages/core/src/controllers/NetworkController.ts @@ -2,12 +2,7 @@ import { proxy, ref } from 'valtio/vanilla' import { EventsController } from './EventsController.js' import { ModalController } from './ModalController.js' import { CoreHelperUtil } from '../utils/CoreHelperUtil.js' -import { - NetworkUtil, - type CaipNetwork, - type CaipNetworkId, - type ChainNamespace -} from '@reown/appkit-common' +import { type CaipNetwork, type CaipNetworkId, type ChainNamespace } from '@reown/appkit-common' import { ChainController } from './ChainController.js' import { ConstantsUtil } from '../utils/ConstantsUtil.js' @@ -166,8 +161,14 @@ export const NetworkController = { network?.chainNamespace ) - if (networkControllerClient) { - await networkControllerClient.switchCaipNetwork(network) + console.log('>>> switchActiveNetwork', network) + try { + if (networkControllerClient) { + console.log('>>> switchActiveNetwork1', network) + await networkControllerClient.switchCaipNetwork(network) + } + } catch (error) { + console.log('>>> switchActiveNetwork', error) } ChainController.setActiveCaipNetwork(network) @@ -176,7 +177,7 @@ export const NetworkController = { EventsController.sendEvent({ type: 'track', event: 'SWITCH_NETWORK', - properties: { network: network.id } + properties: { network: network.caipNetworkId } }) } }, @@ -232,7 +233,7 @@ export const NetworkController = { }, checkIfSmartAccountEnabled() { - const networkId = NetworkUtil.caipNetworkIdToNumber(ChainController.state.activeCaipNetwork?.id) + const networkId = ChainController.state.activeCaipNetwork?.id const activeChain = ChainController.state.activeChain if (!activeChain) { @@ -286,6 +287,6 @@ export const NetworkController = { ChainController.state.activeCaipNetwork?.chainNamespace || 'eip155' ] - return `${ChainController.state.activeCaipNetwork?.id || 'eip155:1'}:${address}` + return `${ChainController.state.activeCaipNetwork?.caipNetworkId || 'eip155:1'}:${address}` } } diff --git a/packages/core/src/controllers/SendController.ts b/packages/core/src/controllers/SendController.ts index 3fa0efc19f..1b26fe5bee 100644 --- a/packages/core/src/controllers/SendController.ts +++ b/packages/core/src/controllers/SendController.ts @@ -118,7 +118,7 @@ export const SendController = { W3mFrameRpcConstants.ACCOUNT_TYPES.SMART_ACCOUNT, token: this.state.token.address, amount: this.state.sendTokenAmount, - network: ChainController.state.activeCaipNetwork?.id || '' + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '' } }) this.sendERC20Token({ @@ -142,7 +142,7 @@ export const SendController = { W3mFrameRpcConstants.ACCOUNT_TYPES.SMART_ACCOUNT, token: this.state.token?.symbol, amount: this.state.sendTokenAmount, - network: ChainController.state.activeCaipNetwork?.id || '' + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '' } }) this.sendNativeToken({ @@ -186,7 +186,7 @@ export const SendController = { W3mFrameRpcConstants.ACCOUNT_TYPES.SMART_ACCOUNT, token: this.state.token?.symbol || '', amount: params.sendTokenAmount, - network: ChainController.state.activeCaipNetwork?.id || '' + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '' } }) this.resetSend() @@ -200,7 +200,7 @@ export const SendController = { W3mFrameRpcConstants.ACCOUNT_TYPES.SMART_ACCOUNT, token: this.state.token?.symbol || '', amount: params.sendTokenAmount, - network: ChainController.state.activeCaipNetwork?.id || '' + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '' } }) SnackController.showError('Something went wrong') diff --git a/packages/core/src/controllers/SwapController.ts b/packages/core/src/controllers/SwapController.ts index 1498e00aae..6467188540 100644 --- a/packages/core/src/controllers/SwapController.ts +++ b/packages/core/src/controllers/SwapController.ts @@ -438,7 +438,9 @@ export const SwapController = { balances.forEach(token => { state.tokensPriceMap[token.address] = token.price || 0 }) - state.myTokensWithBalance = balances.filter(token => token.address.startsWith(caipNetwork.id)) + state.myTokensWithBalance = balances.filter(token => + token.address.startsWith(caipNetwork.caipNetworkId) + ) state.networkBalanceInUSD = networkToken ? NumberUtil.multiply(networkToken.quantity.numeric, networkToken.price).toString() : '0' @@ -765,7 +767,7 @@ export const SwapController = { type: 'track', event: 'SWAP_SUCCESS', properties: { - network: ChainController.state.activeCaipNetwork?.id || '', + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '', swapFromToken: this.state.sourceToken?.symbol || '', swapToToken: this.state.toToken?.symbol || '', swapFromAmount: this.state.sourceTokenAmount || '', @@ -791,7 +793,7 @@ export const SwapController = { type: 'track', event: 'SWAP_ERROR', properties: { - network: ChainController.state.activeCaipNetwork?.id || '', + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '', swapFromToken: this.state.sourceToken?.symbol || '', swapToToken: this.state.toToken?.symbol || '', swapFromAmount: this.state.sourceTokenAmount || '', diff --git a/packages/core/src/controllers/TransactionsController.ts b/packages/core/src/controllers/TransactionsController.ts index 58d1224cfe..56db602157 100644 --- a/packages/core/src/controllers/TransactionsController.ts +++ b/packages/core/src/controllers/TransactionsController.ts @@ -63,7 +63,7 @@ export const TransactionsController = { onramp, // Coinbase transaction history state updates require the latest data cache: onramp === 'coinbase' ? 'no-cache' : undefined, - chainId: ChainController.state.activeCaipNetwork?.id + chainId: ChainController.state.activeCaipNetwork?.caipNetworkId }) const nonSpamTransactions = this.filterSpamTransactions(response.data) @@ -144,7 +144,7 @@ export const TransactionsController = { }, filterByConnectedChain(transactions: Transaction[]) { - const chainId = ChainController.state.activeCaipNetwork?.id + const chainId = ChainController.state.activeCaipNetwork?.caipNetworkId const filteredTransactions = transactions.filter( transaction => transaction.metadata.chain === chainId ) diff --git a/packages/core/src/utils/AssetUtil.ts b/packages/core/src/utils/AssetUtil.ts index 52243af47d..40b2ab286a 100644 --- a/packages/core/src/utils/AssetUtil.ts +++ b/packages/core/src/utils/AssetUtil.ts @@ -44,12 +44,12 @@ export const AssetUtil = { }, getNetworkImage(network?: CaipNetwork) { - if (network?.imageUrl) { - return network?.imageUrl + if (network?.assets?.imageUrl) { + return network?.assets?.imageUrl } - if (network?.imageId) { - return AssetController.state.networkImages[network.imageId] + if (network?.assets?.imageId) { + return AssetController.state.networkImages[network.assets.imageId] } return undefined diff --git a/packages/core/src/utils/CoreHelperUtil.ts b/packages/core/src/utils/CoreHelperUtil.ts index 85526d9564..191a50c54b 100644 --- a/packages/core/src/utils/CoreHelperUtil.ts +++ b/packages/core/src/utils/CoreHelperUtil.ts @@ -19,7 +19,7 @@ export const CoreHelperUtil = { }, checkCaipNetwork(network: CaipNetwork | undefined, networkName = '') { - return network?.id.toLocaleLowerCase().includes(networkName.toLowerCase()) + return network?.caipNetworkId.toLocaleLowerCase().includes(networkName.toLowerCase()) }, isAndroid() { diff --git a/packages/core/src/utils/SwapApiUtil.ts b/packages/core/src/utils/SwapApiUtil.ts index 8fe3b28dc8..fbcc8237d8 100644 --- a/packages/core/src/utils/SwapApiUtil.ts +++ b/packages/core/src/utils/SwapApiUtil.ts @@ -25,7 +25,7 @@ export const SwapApiUtil = { async getTokenList() { const caipNetwork = ChainController.state.activeCaipNetwork const response = await BlockchainApiController.fetchSwapTokens({ - chainId: caipNetwork?.id, + chainId: caipNetwork?.caipNetworkId, projectId: OptionsController.state.projectId }) const tokens = @@ -72,7 +72,7 @@ export const SwapApiUtil = { default: return await BlockchainApiController.fetchGasPrice({ projectId, - chainId: caipNetwork.id + chainId: caipNetwork.caipNetworkId }) } } catch { @@ -116,7 +116,11 @@ export const SwapApiUtil = { return [] } - const response = await BlockchainApiController.getBalance(address, caipNetwork.id, forceUpdate) + const response = await BlockchainApiController.getBalance( + address, + caipNetwork.caipNetworkId, + forceUpdate + ) const balances = response.balances.filter(balance => balance.quantity.decimals !== '0') AccountController.setTokenBalance(balances, ChainController.state.activeChain) diff --git a/packages/core/tests/controllers/ApiController.test.ts b/packages/core/tests/controllers/ApiController.test.ts index c2e6d710e2..afc79a1a74 100644 --- a/packages/core/tests/controllers/ApiController.test.ts +++ b/packages/core/tests/controllers/ApiController.test.ts @@ -8,7 +8,7 @@ import { OptionsController } from '../../exports/index.js' import { api } from '../../src/controllers/ApiController.js' -import { ConstantsUtil } from '@reown/appkit-common' +import { ConstantsUtil, type CaipNetwork } from '@reown/appkit-common' // -- Constants ---------------------------------------------------------------- const chain = ConstantsUtil.CHAIN.EVM @@ -121,34 +121,61 @@ describe('ApiController', () => { NetworkController.setRequestedCaipNetworks( [ { - id: 'eip155:1', + caipNetworkId: 'eip155:1', + id: 1, name: 'Ethereum Mainnet', - imageId: '12341', + assets: { + imageId: '12341', + imageUrl: '' + }, chainNamespace: chain, - chainId: '1', - currency: 'ETH', - explorerUrl: 'https://explorer.ethereum.org', - rpcUrl: 'https://rpc.ethereum.org' - }, + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } + } as CaipNetwork, { - id: 'eip155:4', + caipNetworkId: 'eip155:4', + id: 4, name: 'Ethereum Rinkeby', - imageId: '12342', + assets: { + imageId: '12342', + imageUrl: '' + }, chainNamespace: chain, - chainId: '4', - currency: 'ETH', - explorerUrl: 'https://explorer.ethereum.org', - rpcUrl: 'https://rpc.ethereum.org' - }, + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } + } as CaipNetwork, { - id: 'eip155:42', + caipNetworkId: 'eip155:42', + id: 42, name: 'Ethereum Kovan', chainNamespace: chain, - chainId: '42', - currency: 'ETH', - explorerUrl: 'https://explorer.ethereum.org', - rpcUrl: 'https://rpc.ethereum.org' - } + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } + } as CaipNetwork ], chain ) @@ -163,33 +190,60 @@ describe('ApiController', () => { NetworkController.setRequestedCaipNetworks( [ { - id: 'eip155:1', + caipNetworkId: 'eip155:1', + id: 1, name: 'Ethereum Mainnet', - imageId: '12341', + assets: { + imageId: '12341', + imageUrl: '' + }, chainNamespace: chain, - chainId: '1', - currency: 'ETH', - explorerUrl: 'https://explorer.ethereum.org', - rpcUrl: 'https://rpc.ethereum.org' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } }, { - id: 'eip155:4', + caipNetworkId: 'eip155:4', + id: 4, name: 'Ethereum Rinkeby', - imageId: '12342', + assets: { + imageId: '12342', + imageUrl: '' + }, chainNamespace: chain, - chainId: '4', - currency: 'ETH', - explorerUrl: 'https://explorer.ethereum.org', - rpcUrl: 'https://rpc.ethereum.org' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } }, { - id: 'eip155:42', + caipNetworkId: 'eip155:42', + id: 42, name: 'Ethereum Kovan', chainNamespace: chain, - chainId: '42', - currency: 'ETH', - explorerUrl: 'https://explorer.ethereum.org', - rpcUrl: 'https://rpc.ethereum.org' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } } ], chain @@ -244,17 +298,20 @@ describe('ApiController', () => { const featuredWalletIds = ['12341', '12342'] const data = [ { - id: '12341', + caipNetworkId: '12341', + id: 12341, name: 'MetaMask', image_id: '12341' }, { - id: '12342', + caipNetworkId: '12342', + id: 12342, name: 'RandomWallet', image_id: '12342' }, { - id: '12343', + caipNetworkId: '12343', + id: 12343, name: 'RandomWallet' } ] @@ -295,17 +352,20 @@ describe('ApiController', () => { const featuredWalletIds = ['12344'] const data = [ { - id: '12341', + caipNetworkId: '12341', + id: 12341, name: 'MetaMask', image_id: '12341' }, { - id: '12342', + caipNetworkId: '12342', + id: 12342, name: 'RandomWallet', image_id: '12342' }, { - id: '12343', + caipNetworkId: '12343', + id: 12343, name: 'RandomWallet' } ] @@ -366,12 +426,14 @@ describe('ApiController', () => { const featuredWalletIds = ['12344'] const data = [ { - id: '12341', + caipNetworkId: '12341', + id: 12341, name: 'MetaMask', image_id: '12341' }, { - id: '12342', + caipNetworkId: '12342', + id: 12342, name: 'RandomWallet', image_id: '12342' } @@ -409,12 +471,14 @@ describe('ApiController', () => { const filteredWallet = [{ name: 'Rainbow', rdns: 'me.rainbow' }] const data = [ { - id: '12345', + caipNetworkId: '12345', + id: 12345, name: 'MetaMask', rdns: 'io.metamask' }, { - id: '12346', + caipNetworkId: '12346', + id: 12346, name: 'Phantom', rdns: 'app.phantom' } @@ -451,7 +515,8 @@ describe('ApiController', () => { const excludeWalletIds = ['12343'] const data = [ { - id: '12341', + caipNetworkId: '12341', + id: 12341, name: 'MetaMask', image_id: '12341' } @@ -486,7 +551,8 @@ describe('ApiController', () => { const excludeWalletIds = ['12343'] let data = [ { - id: '12341', + caipNetworkId: '12341', + id: 12341, name: 'MetaMask', image_id: '12341' } @@ -548,7 +614,8 @@ describe('ApiController', () => { data = [ { - id: '12341', + caipNetworkId: '12341', + id: 12341, name: 'Safe Wallet', image_id: '12341' } diff --git a/packages/core/tests/controllers/EnsController.test.ts b/packages/core/tests/controllers/EnsController.test.ts index f5409c575f..97591e4d35 100644 --- a/packages/core/tests/controllers/EnsController.test.ts +++ b/packages/core/tests/controllers/EnsController.test.ts @@ -137,13 +137,20 @@ describe('EnsController', () => { const result = await EnsController.getNamesForAddress('0x123') expect(result).toEqual([]) NetworkController.setActiveCaipNetwork({ - id: 'eip155:1', + caipNetworkId: 'eip155:1', chainNamespace: ConstantsUtil.CHAIN.EVM, - chainId: 1, + id: 1, name: 'Ethereum', - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.infura.com/v1/' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } }) const resultWithNetwork = await EnsController.getNamesForAddress('0x123') expect(resultWithNetwork).toEqual([TEST_NAME]) @@ -155,13 +162,20 @@ describe('EnsController', () => { it('should register name', async () => { // Setup NetworkController.setActiveCaipNetwork({ - id: 'eip155:137', + caipNetworkId: 'eip155:137', chainNamespace: ConstantsUtil.CHAIN.EVM, - chainId: 137, - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.infura.com/v1/', - name: 'Polygon' + id: 137, + name: 'Polygon', + nativeCurrency: { + name: 'Polygon', + decimals: 18, + symbol: 'MATIC' + }, + rpcUrls: { + default: { + http: [''] + } + } }) AccountController.setCaipAddress('eip155:1:0x123', chain) const getAuthConnectorSpy = vi.spyOn(ConnectorController, 'getAuthConnector').mockReturnValue({ diff --git a/packages/core/tests/controllers/NetworkController.test.ts b/packages/core/tests/controllers/NetworkController.test.ts index ee0874713d..a75be18a8a 100644 --- a/packages/core/tests/controllers/NetworkController.test.ts +++ b/packages/core/tests/controllers/NetworkController.test.ts @@ -6,51 +6,86 @@ import { ConstantsUtil } from '@reown/appkit-common' // -- Setup -------------------------------------------------------------------- const caipNetwork = { - id: 'eip155:1', + id: 1, + caipNetworkId: 'eip155:1', name: 'Ethereum', chainNamespace: ConstantsUtil.CHAIN.EVM, - chainId: 1, - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.infura.com/v1/' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } } as const const solanaCaipNetwork = { - id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + id: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + caipNetworkId: 'eip155:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana', - chainNamespace: ConstantsUtil.CHAIN.SOLANA, - chainId: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - currency: 'SOL', - explorerUrl: 'https://solscan.io', - rpcUrl: 'https://rpc.infura.com/v1/' + chainNamespace: ConstantsUtil.CHAIN.EVM, + nativeCurrency: { + name: 'Solana', + decimals: 18, + symbol: 'SOL' + }, + rpcUrls: { + default: { + http: [''] + } + } } as const const requestedCaipNetworks = [ { - id: 'eip155:1', + id: 1, + caipNetworkId: 'eip155:1', name: 'Ethereum', chainNamespace: ConstantsUtil.CHAIN.EVM, - chainId: 1, - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.infura.com/v1/' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } }, { - id: 'eip155:42161', - name: 'Arbitrum One', + id: 42161, + caipNetworkId: 'eip155:42161', + name: 'Ethereum', chainNamespace: ConstantsUtil.CHAIN.EVM, - chainId: 42161, - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.infura.com/v1/' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } }, { - id: 'eip155:43114', - name: 'Avalanche C-Chain', + id: 43114, + caipNetworkId: 'eip155:43114', + name: 'Ethereum', chainNamespace: ConstantsUtil.CHAIN.EVM, - chainId: 43114, - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.infura.com/v1/' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } } ] as CaipNetwork[] const approvedCaipNetworkIds = ['eip155:1', 'eip155:42161'] as CaipNetworkId[] @@ -124,13 +159,20 @@ describe('NetworkController', () => { NetworkController.setSmartAccountEnabledNetworks([2], chain) expect(NetworkController.checkIfSmartAccountEnabled()).toEqual(false) NetworkController.setActiveCaipNetwork({ - id: 'eip155:2', + id: 2, + caipNetworkId: 'eip155:2', name: 'Ethereum', chainNamespace: ConstantsUtil.CHAIN.EVM, - chainId: 2, - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.infura.com/v1/' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } }) }) diff --git a/packages/core/tests/controllers/SwapController.test.ts b/packages/core/tests/controllers/SwapController.test.ts index f34fdb8988..2cf35ce3fe 100644 --- a/packages/core/tests/controllers/SwapController.test.ts +++ b/packages/core/tests/controllers/SwapController.test.ts @@ -24,13 +24,20 @@ import { ConstantsUtil } from '@reown/appkit-common' // - Mocks --------------------------------------------------------------------- const caipNetwork = { - id: 'eip155:137', + id: 137, + caipNetworkId: 'eip155:137', name: 'Polygon', chainNamespace: ConstantsUtil.CHAIN.EVM, - chainId: 137, - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.infura.com/v1/' + nativeCurrency: { + name: 'Polygon', + decimals: 18, + symbol: 'MATIC' + }, + rpcUrls: { + default: { + http: [''] + } + } } as CaipNetwork const approvedCaipNetworkIds = ['eip155:1', 'eip155:137'] as CaipNetworkId[] const client: NetworkControllerClient = { diff --git a/packages/core/tests/hooks/react.test.ts b/packages/core/tests/hooks/react.test.ts index 95d0ec622b..439b98e3e1 100644 --- a/packages/core/tests/hooks/react.test.ts +++ b/packages/core/tests/hooks/react.test.ts @@ -17,14 +17,24 @@ describe('useAppKitNetwork', () => { it('should return the correct network state', () => { const mockNetwork: CaipNetwork = { - id: 'eip155:1', + id: 1, name: 'Ethereum', - imageId: 'ethereum', - rpcUrl: 'https://mainnet.infura.io/v3/YOUR-PROJECT-ID', - chainId: 1, + assets: { + imageId: 'ethereum', + imageUrl: '' + }, + caipNetworkId: 'eip155:1', chainNamespace: 'eip155', - explorerUrl: 'https://etherscan.io', - currency: 'ETH' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: [''] + } + } } // Mock the useSnapshot hook diff --git a/packages/core/tests/utils/AssetUtil.test.ts b/packages/core/tests/utils/AssetUtil.test.ts index cd6909a5fe..7183eb898c 100644 --- a/packages/core/tests/utils/AssetUtil.test.ts +++ b/packages/core/tests/utils/AssetUtil.test.ts @@ -15,8 +15,10 @@ const connectorWithImageUrl: Partial = { imageId: 'walletconnect' } const network: Partial = { - imageUrl: undefined, - imageId: 'ethereum' + assets: { + imageUrl: undefined, + imageId: 'ethereum' + } } const networkWithImageUrl: Partial = { imageUrl: 'ethereum-logo-src', diff --git a/packages/core/tests/utils/SwapApiUtil.test.ts b/packages/core/tests/utils/SwapApiUtil.test.ts index c62e1a85be..e7ba0627df 100644 --- a/packages/core/tests/utils/SwapApiUtil.test.ts +++ b/packages/core/tests/utils/SwapApiUtil.test.ts @@ -17,23 +17,37 @@ vi.mock('../../src/controllers/AccountController') vi.mock('../../src/controllers/NetworkController') const mockSolanaNetwork = { - id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + id: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + caipNetworkId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', chainNamespace: 'solana', - chainId: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana', - explorerUrl: 'https://explorer.solana.com', - rpcUrl: 'https://api.mainnet-beta.solana.com', - currency: 'SOL' + nativeCurrency: { + name: 'Solana', + decimals: 18, + symbol: 'SOL' + }, + rpcUrls: { + default: { + http: ['https://api.mainnet-beta.solana.com'] + } + } } as const const mockEthereumNetwork = { - id: 'eip155:1', + id: '1', chainNamespace: 'eip155', - chainId: '1', + caipNetworkId: 'eip155:1', name: 'Ethereum', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://mainnet.infura.io/v3/YOUR-PROJECT-ID', - currency: 'ETH' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: ['https://mainnet.infura.io/v3/YOUR-PROJECT-ID'] + } + } } as const describe('SwapApiUtil', () => { @@ -105,13 +119,20 @@ describe('SwapApiUtil', () => { }) it('should return null if there is an error', async () => { ChainController.state.activeCaipNetwork = { - id: 'eip155:1', + id: 1, chainNamespace: 'eip155', - chainId: '1', + caipNetworkId: 'eip155:1', name: 'Ethereum', - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://mainnet.infura.io/v3/YOUR-PROJECT-ID' + nativeCurrency: { + name: 'Ethereum', + decimals: 18, + symbol: 'ETH' + }, + rpcUrls: { + default: { + http: ['https://mainnet.infura.io/v3/YOUR-PROJECT-ID'] + } + } } BlockchainApiController.fetchGasPrice = vi.fn().mockRejectedValue(new Error('API Error')) diff --git a/packages/scaffold-ui/src/modal/w3m-account-button/index.ts b/packages/scaffold-ui/src/modal/w3m-account-button/index.ts index 224cbecd69..2ef3ce5115 100644 --- a/packages/scaffold-ui/src/modal/w3m-account-button/index.ts +++ b/packages/scaffold-ui/src/modal/w3m-account-button/index.ts @@ -50,7 +50,7 @@ export class W3mAccountButton extends LitElement { this.unsubscribe.push( ...[ AssetController.subscribeNetworkImages(() => { - this.networkImage = this.network?.imageId + this.networkImage = this.network?.assets?.imageId ? AssetUtil.getNetworkImage(this.network) : undefined }), @@ -61,7 +61,7 @@ export class W3mAccountButton extends LitElement { AccountController.subscribeKey('profileImage', val => (this.profileImage = val)), ChainController.subscribeKey('activeCaipNetwork', val => { this.network = val - this.networkImage = val?.imageId ? AssetUtil.getNetworkImage(val) : undefined + this.networkImage = val?.assets?.imageId ? AssetUtil.getNetworkImage(val) : undefined }), NetworkController.subscribeKey('isUnsupportedChain', val => { this.isUnsupportedChain = val diff --git a/packages/scaffold-ui/src/modal/w3m-modal/index.ts b/packages/scaffold-ui/src/modal/w3m-modal/index.ts index eedb32756d..9030d8d463 100644 --- a/packages/scaffold-ui/src/modal/w3m-modal/index.ts +++ b/packages/scaffold-ui/src/modal/w3m-modal/index.ts @@ -224,8 +224,8 @@ export class W3mModal extends LitElement { return } - const prevCaipNetworkId = this.caipNetwork?.id?.toString() - const nextNetworkId = nextCaipNetwork?.id?.toString() + const prevCaipNetworkId = this.caipNetwork?.caipNetworkId?.toString() + const nextNetworkId = nextCaipNetwork?.caipNetworkId?.toString() if (prevCaipNetworkId && nextNetworkId && prevCaipNetworkId !== nextNetworkId) { if (this.isSiweEnabled) { diff --git a/packages/scaffold-ui/src/modal/w3m-network-button/index.ts b/packages/scaffold-ui/src/modal/w3m-network-button/index.ts index bd82658073..d61c620b0a 100644 --- a/packages/scaffold-ui/src/modal/w3m-network-button/index.ts +++ b/packages/scaffold-ui/src/modal/w3m-network-button/index.ts @@ -41,7 +41,7 @@ export class W3mNetworkButton extends LitElement { this.unsubscribe.push( ...[ AssetController.subscribeNetworkImages(() => { - this.networkImage = this.network?.imageId + this.networkImage = this.network?.assets?.imageId ? AssetUtil.getNetworkImage(this.network) : undefined }), @@ -50,7 +50,7 @@ export class W3mNetworkButton extends LitElement { }), ChainController.subscribeKey('activeCaipNetwork', val => { this.network = val - this.networkImage = val?.imageId ? AssetUtil.getNetworkImage(val) : undefined + this.networkImage = val?.assets?.imageId ? AssetUtil.getNetworkImage(val) : undefined }), ModalController.subscribeKey('loading', val => (this.loading = val)), NetworkController.subscribeKey('isUnsupportedChain', val => (this.isUnsupportedChain = val)) diff --git a/packages/scaffold-ui/src/partials/w3m-account-wallet-features-widget/index.ts b/packages/scaffold-ui/src/partials/w3m-account-wallet-features-widget/index.ts index 04126647ef..93495db805 100644 --- a/packages/scaffold-ui/src/partials/w3m-account-wallet-features-widget/index.ts +++ b/packages/scaffold-ui/src/partials/w3m-account-wallet-features-widget/index.ts @@ -227,7 +227,10 @@ export class W3mAccountWalletFeaturesWidget extends LitElement { } private onSwapClick() { - if (this.network?.id && !CoreConstantsUtil.SWAP_SUPPORTED_NETWORKS.includes(this.network?.id)) { + if ( + this.network?.caipNetworkId && + !CoreConstantsUtil.SWAP_SUPPORTED_NETWORKS.includes(this.network?.caipNetworkId) + ) { RouterController.push('UnsupportedChain', { swapUnsupportedChain: true }) @@ -236,7 +239,7 @@ export class W3mAccountWalletFeaturesWidget extends LitElement { type: 'track', event: 'OPEN_SWAP', properties: { - network: this.network?.id || '', + network: this.network?.caipNetworkId || '', isSmartAccount: AccountController.state.preferredAccountType === W3mFrameRpcConstants.ACCOUNT_TYPES.SMART_ACCOUNT @@ -255,7 +258,7 @@ export class W3mAccountWalletFeaturesWidget extends LitElement { type: 'track', event: 'OPEN_SEND', properties: { - network: this.network?.id || '', + network: this.network?.caipNetworkId || '', isSmartAccount: AccountController.state.preferredAccountType === W3mFrameRpcConstants.ACCOUNT_TYPES.SMART_ACCOUNT diff --git a/packages/scaffold-ui/src/partials/w3m-activity-list/index.ts b/packages/scaffold-ui/src/partials/w3m-activity-list/index.ts index cb58ee6a72..2fcac28de4 100644 --- a/packages/scaffold-ui/src/partials/w3m-activity-list/index.ts +++ b/packages/scaffold-ui/src/partials/w3m-activity-list/index.ts @@ -93,7 +93,7 @@ export class W3mActivityList extends LitElement { // -- Private ------------------------------------------- // private updateTransactionView() { - const currentNetwork = ChainController.state.activeCaipNetwork?.id + const currentNetwork = ChainController.state.activeCaipNetwork?.caipNetworkId const lastNetworkInView = TransactionsController.state.lastNetworkInView if (lastNetworkInView !== currentNetwork) { diff --git a/packages/scaffold-ui/src/partials/w3m-onramp-provider-item/index.ts b/packages/scaffold-ui/src/partials/w3m-onramp-provider-item/index.ts index 807f2b3a97..1a82bb55d0 100644 --- a/packages/scaffold-ui/src/partials/w3m-onramp-provider-item/index.ts +++ b/packages/scaffold-ui/src/partials/w3m-onramp-provider-item/index.ts @@ -53,7 +53,9 @@ export class W3mOnRampProviderItem extends LitElement { // -- Private ------------------------------------------- // private networksTemplate() { const requestedCaipNetworks = NetworkController.getRequestedCaipNetworks() - const slicedNetworks = requestedCaipNetworks?.filter(network => network?.imageId)?.slice(0, 5) + const slicedNetworks = requestedCaipNetworks + ?.filter(network => network?.assets?.imageId) + ?.slice(0, 5) return html` diff --git a/packages/scaffold-ui/src/views/w3m-account-settings-view/index.ts b/packages/scaffold-ui/src/views/w3m-account-settings-view/index.ts index f78030200b..4fdb111b7f 100644 --- a/packages/scaffold-ui/src/views/w3m-account-settings-view/index.ts +++ b/packages/scaffold-ui/src/views/w3m-account-settings-view/index.ts @@ -83,7 +83,7 @@ export class W3mAccountSettingsView extends LitElement { throw new Error('w3m-account-settings-view: No account provided') } - const networkImage = this.networkImages[this.network?.imageId ?? ''] + const networkImage = this.networkImages[this.network?.assets?.imageId ?? ''] return html` { - if (this.caipNetworkId !== newCaipNetwork?.id) { - this.caipNetworkId = newCaipNetwork?.id + if (this.caipNetworkId !== newCaipNetwork?.caipNetworkId) { + this.caipNetworkId = newCaipNetwork?.caipNetworkId SwapController.resetState() SwapController.initializeState() } diff --git a/packages/scaffold-ui/src/views/w3m-switch-address-view/index.ts b/packages/scaffold-ui/src/views/w3m-switch-address-view/index.ts index 00e020b2d1..9ee72bb870 100644 --- a/packages/scaffold-ui/src/views/w3m-switch-address-view/index.ts +++ b/packages/scaffold-ui/src/views/w3m-switch-address-view/index.ts @@ -45,14 +45,16 @@ export class W3mSwitchAddressView extends LitElement { public override connectedCallback() { super.connectedCallback() this.allAccounts.forEach(account => { - BlockchainApiController.getBalance(account.address, this.caipNetwork?.id).then(response => { - let total = this.balances[account.address] || 0 - if (response.balances.length > 0) { - total = response.balances.reduce((acc, balance) => acc + (balance?.value || 0), 0) + BlockchainApiController.getBalance(account.address, this.caipNetwork?.caipNetworkId).then( + response => { + let total = this.balances[account.address] || 0 + if (response.balances.length > 0) { + total = response.balances.reduce((acc, balance) => acc + (balance?.value || 0), 0) + } + this.balances[account.address] = total + this.requestUpdate() } - this.balances[account.address] = total - this.requestUpdate() - }) + ) }) } @@ -142,7 +144,7 @@ export class W3mSwitchAddressView extends LitElement { private onSwitchAddress(address: string) { const caipNetwork = ChainController.state.activeCaipNetwork const activeChainNamespace = caipNetwork?.chainNamespace - const caipAddress = `${activeChainNamespace}:${caipNetwork?.chainId}:${address}` as CaipAddress + const caipAddress = `${activeChainNamespace}:${caipNetwork?.id}:${address}` as CaipAddress AccountController.setCaipAddress(caipAddress, activeChainNamespace) ModalController.close() } diff --git a/packages/scaffold-ui/src/views/w3m-unsupported-chain-view/index.ts b/packages/scaffold-ui/src/views/w3m-unsupported-chain-view/index.ts index 303a9e062f..dd375d700e 100644 --- a/packages/scaffold-ui/src/views/w3m-unsupported-chain-view/index.ts +++ b/packages/scaffold-ui/src/views/w3m-unsupported-chain-view/index.ts @@ -92,7 +92,9 @@ export class W3mUnsupportedChainView extends LitElement { ) const filteredNetworks = this.swapUnsupportedChain - ? sortedNetworks.filter(network => ConstantsUtil.SWAP_SUPPORTED_NETWORKS.includes(network.id)) + ? sortedNetworks.filter(network => + ConstantsUtil.SWAP_SUPPORTED_NETWORKS.includes(network.caipNetworkId) + ) : sortedNetworks return filteredNetworks.map( @@ -131,8 +133,8 @@ export class W3mUnsupportedChainView extends LitElement { const caipNetwork = ChainController.state.activeCaipNetwork const routerData = RouterController.state.data - if (caipAddress && caipNetwork?.id !== network.id) { - if (approvedCaipNetworkIds?.includes(network.id)) { + if (caipAddress && caipNetwork?.caipNetworkId !== network.caipNetworkId) { + if (approvedCaipNetworkIds?.includes(network.caipNetworkId)) { await NetworkController.switchActiveNetwork(network) } else if (supportsAllNetworks) { RouterController.push('SwitchNetwork', { ...routerData, network }) diff --git a/packages/scaffold-ui/src/views/w3m-wallet-receive-view/index.ts b/packages/scaffold-ui/src/views/w3m-wallet-receive-view/index.ts index ffcdf8725e..9fe215d2f0 100644 --- a/packages/scaffold-ui/src/views/w3m-wallet-receive-view/index.ts +++ b/packages/scaffold-ui/src/views/w3m-wallet-receive-view/index.ts @@ -124,7 +124,9 @@ export class W3mWalletReceiveView extends LitElement { .networkImages=${[AssetUtil.getNetworkImage(caipNetwork) ?? '']} >` } - const slicedNetworks = requestedCaipNetworks?.filter(network => network?.imageId)?.slice(0, 5) + const slicedNetworks = requestedCaipNetworks + ?.filter(network => network?.assets?.imageId) + ?.slice(0, 5) const imagesArray = slicedNetworks.map(AssetUtil.getNetworkImage).filter(Boolean) as string[] return html` token.chainId === ChainController.state.activeCaipNetwork?.id + token => token.chainId === ChainController.state.activeCaipNetwork?.caipNetworkId ) if (this.search) { this.filteredTokens = this.tokenBalance?.filter(token => diff --git a/packages/siwe/scaffold/views/w3m-connecting-siwe-view/index.ts b/packages/siwe/scaffold/views/w3m-connecting-siwe-view/index.ts index c75fa1896c..65a2fa9d29 100644 --- a/packages/siwe/scaffold/views/w3m-connecting-siwe-view/index.ts +++ b/packages/siwe/scaffold/views/w3m-connecting-siwe-view/index.ts @@ -82,7 +82,7 @@ export class W3mConnectingSiweView extends LitElement { event: 'CLICK_SIGN_SIWE_MESSAGE', type: 'track', properties: { - network: ChainController.state.activeCaipNetwork?.id || '', + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '', isSmartAccount: AccountController.state.preferredAccountType === W3mFrameRpcConstants.ACCOUNT_TYPES.SMART_ACCOUNT @@ -96,7 +96,7 @@ export class W3mConnectingSiweView extends LitElement { event: 'SIWE_AUTH_SUCCESS', type: 'track', properties: { - network: ChainController.state.activeCaipNetwork?.id || '', + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '', isSmartAccount: AccountController.state.preferredAccountType === W3mFrameRpcConstants.ACCOUNT_TYPES.SMART_ACCOUNT @@ -119,7 +119,7 @@ export class W3mConnectingSiweView extends LitElement { event: 'SIWE_AUTH_ERROR', type: 'track', properties: { - network: ChainController.state.activeCaipNetwork?.id || '', + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '', isSmartAccount } }) @@ -142,7 +142,7 @@ export class W3mConnectingSiweView extends LitElement { event: 'CLICK_CANCEL_SIWE', type: 'track', properties: { - network: ChainController.state.activeCaipNetwork?.id || '', + network: ChainController.state.activeCaipNetwork?.caipNetworkId || '', isSmartAccount: AccountController.state.preferredAccountType === W3mFrameRpcConstants.ACCOUNT_TYPES.SMART_ACCOUNT diff --git a/packages/siwe/src/client.ts b/packages/siwe/src/client.ts index 31c3f338d7..0f028a946e 100644 --- a/packages/siwe/src/client.ts +++ b/packages/siwe/src/client.ts @@ -16,7 +16,7 @@ import { ModalController, CoreHelperUtil } from '@reown/appkit-core' -import { NetworkUtil, type CaipAddress } from '@reown/appkit-common' +import { type CaipAddress } from '@reown/appkit-common' import { ConstantsUtil } from '../core/utils/ConstantsUtil.js' // -- Client -------------------------------------------------------------------- // @@ -106,7 +106,7 @@ export class AppKitSIWEClient { throw new Error('A chainId is required to create a SIWE message.') } - const chainId = NetworkUtil.caipNetworkIdToNumber(caipNetwork.id) + const chainId = caipNetwork.id if (!chainId) { throw new Error('A chainId is required to create a SIWE message.') diff --git a/packages/solana/exports/chains.ts b/packages/solana/exports/chains.ts deleted file mode 100644 index 333ea62bef..0000000000 --- a/packages/solana/exports/chains.ts +++ /dev/null @@ -1 +0,0 @@ -export { solana, solanaDevnet, solanaTestnet } from '@reown/appkit-adapter-solana' diff --git a/packages/ui/src/composites/wui-list-account/index.ts b/packages/ui/src/composites/wui-list-account/index.ts index 1a46c8e7e3..753143d4bc 100644 --- a/packages/ui/src/composites/wui-list-account/index.ts +++ b/packages/ui/src/composites/wui-list-account/index.ts @@ -47,15 +47,17 @@ export class WuiListAccount extends LitElement { public override connectedCallback() { super.connectedCallback() - BlockchainApiController.getBalance(this.accountAddress, this.caipNetwork?.id).then(response => { - let total = this.balance - if (response.balances.length > 0) { - total = response.balances.reduce((acc, balance) => acc + (balance?.value || 0), 0) + BlockchainApiController.getBalance(this.accountAddress, this.caipNetwork?.caipNetworkId).then( + response => { + let total = this.balance + if (response.balances.length > 0) { + total = response.balances.reduce((acc, balance) => acc + (balance?.value || 0), 0) + } + this.balance = total + this.fetchingBalance = false + this.requestUpdate() } - this.balance = total - this.fetchingBalance = false - this.requestUpdate() - }) + ) } // -- Render -------------------------------------------- // diff --git a/packages/wagmi/tests/mocks/adapter.mock.ts b/packages/wagmi/tests/mocks/adapter.mock.ts index 7b84cce5c9..fb504d71de 100644 --- a/packages/wagmi/tests/mocks/adapter.mock.ts +++ b/packages/wagmi/tests/mocks/adapter.mock.ts @@ -1,38 +1,27 @@ import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' -import { mainnet as wagmiMainnet } from 'viem/chains' import { createConfig, http } from 'wagmi' import { mock } from 'wagmi/connectors' +import { mainnet } from '@reown/appkit/networks' import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts' import { AppKit, type SdkVersion } from '@reown/appkit' -import type { CaipNetwork } from '@reown/appkit-common' - -export const mainnet: CaipNetwork = { - id: 'eip155:1', - chainId: 1, - name: 'Ethereum', - currency: 'ETH', - explorerUrl: 'https://etherscan.io', - rpcUrl: 'https://rpc.walletconnect.org/v1/?chainId=eip155:1&projectId=PROJECT_ID', - chainNamespace: 'eip155' -} const privateKey = generatePrivateKey() export const mockAccount = privateKeyToAccount(privateKey) export const wagmiConfigMock = createConfig({ - chains: [wagmiMainnet], + chains: [mainnet], connectors: [mock({ accounts: [mockAccount.address] })], transports: { - [wagmiMainnet.id]: http() + [mainnet.id]: http() } }) export const wagmiAdapterMock = new WagmiAdapter({ - chains: [wagmiMainnet], + chains: [mainnet], connectors: [mock({ accounts: [mockAccount.address] })], transports: { - [wagmiMainnet.id]: http() + [mainnet.id]: http() }, networks: [mainnet], projectId: '1234' @@ -40,7 +29,7 @@ export const wagmiAdapterMock = new WagmiAdapter({ const mockAppKitData = { adapters: [wagmiAdapterMock], - networks: [mainnet], + networks: wagmiAdapterMock.caipNetworks, defaultNetwork: mainnet, metadata: { description: 'Desc', diff --git a/packages/wallet/src/W3mFrameProvider.ts b/packages/wallet/src/W3mFrameProvider.ts index d731554280..13321839b4 100644 --- a/packages/wallet/src/W3mFrameProvider.ts +++ b/packages/wallet/src/W3mFrameProvider.ts @@ -465,7 +465,7 @@ export class W3mFrameProvider { event: AppEventType ): Promise { await this.w3mFrame.frameLoadPromise - let timer: NodeJS.Timeout | undefined = undefined + let timer: ReturnType | undefined = undefined function replaceEventType(type: AppEventType['type']) { return type.replace('@w3m-app/', '') From c16c2f916af5a8126e3a7cc749b16bbe8d8be1d7 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Thu, 3 Oct 2024 13:05:21 +0300 Subject: [PATCH 08/30] refactor: update lab and examples --- apps/laboratory/src/pages/library/wagmi.tsx | 3 +-- apps/laboratory/src/utils/ConstantsUtil.ts | 14 ++++++++------ examples/react-wagmi/src/App.tsx | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/apps/laboratory/src/pages/library/wagmi.tsx b/apps/laboratory/src/pages/library/wagmi.tsx index e29a71e576..1d968d870b 100644 --- a/apps/laboratory/src/pages/library/wagmi.tsx +++ b/apps/laboratory/src/pages/library/wagmi.tsx @@ -7,13 +7,12 @@ import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' import { createAppKit } from '@reown/appkit/react' import { ConstantsUtil } from '../../utils/ConstantsUtil' import { ThemeStore } from '../../utils/StoreUtil' -import { acala, beam } from 'viem/chains' const queryClient = new QueryClient() const wagmiAdapter = new WagmiAdapter({ ssr: true, - networks: [...ConstantsUtil.EvmNetworks, acala, beam], + networks: ConstantsUtil.EvmNetworks, projectId: ConstantsUtil.ProjectId }) diff --git a/apps/laboratory/src/utils/ConstantsUtil.ts b/apps/laboratory/src/utils/ConstantsUtil.ts index e5e032dc86..e71240b813 100644 --- a/apps/laboratory/src/utils/ConstantsUtil.ts +++ b/apps/laboratory/src/utils/ConstantsUtil.ts @@ -53,13 +53,15 @@ const customWallet = storedCustomWallet ? [JSON.parse(storedCustomWallet)] : [] const EvmNetworks = [mainnet, optimism, polygon, zkSync, arbitrum, base, sepolia, gnosis] export const solanaNotExist = { - id: 'solana:chaindoesntexist', - chainId: 'chaindoesntexist', + id: 'chaindoesntexist', + caipNetworkId: 'solana:chaindoesntexist', + chainNamespace: 'solana', name: 'Solana Unsupported', - currency: 'SOL', - explorerUrl: 'https://explorer.solana.com/?cluster=unsupported', - rpcUrl: 'https://api.unsupported.solana.com', - chainNamespace: 'solana' + nativeCurrency: { name: 'Solana', symbol: 'SOL', decimals: 9 }, + blockExplorers: { + default: { name: 'Solscan', url: 'https://explorer.solana.com/?cluster=unsupported' } + }, + rpcUrls: { default: { http: ['https://api.unsupported.solana.com'] } } } as CaipNetwork const SolanaNetworks = [solana, solanaTestnet, solanaDevnet, solanaNotExist] diff --git a/examples/react-wagmi/src/App.tsx b/examples/react-wagmi/src/App.tsx index 0126bbaa80..c0daf98468 100644 --- a/examples/react-wagmi/src/App.tsx +++ b/examples/react-wagmi/src/App.tsx @@ -5,7 +5,7 @@ import { useAppKitState, useAppKitTheme } from '@reown/appkit/react' -import { mainnet, polygon } from '@reown/appkit/networks' +import { mainnet, polygon, bsc } from '@reown/appkit/networks' import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' import { WagmiProvider } from 'wagmi' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' @@ -23,7 +23,7 @@ if (!projectId) { // 2. Setup wagmi adapter const wagmiAdapter = new WagmiAdapter({ projectId, - networks: [mainnet, polygon] + networks: [mainnet, polygon, bsc] }) // 3. Create modal From 24c0b7543293050354f672c57f37450c9e9e8807 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Thu, 3 Oct 2024 15:55:58 +0300 Subject: [PATCH 09/30] fix: unit tests --- .../adapters/ethers/src/tests/client.test.ts | 62 +++-------- packages/adapters/ethers5/src/client.ts | 1 + .../adapters/ethers5/src/tests/client.test.ts | 57 +++------- packages/adapters/solana/src/client.ts | 10 +- .../adapters/solana/src/tests/client.test.ts | 4 +- packages/adapters/wagmi/src/client.ts | 19 ++-- .../adapters/wagmi/src/tests/client.test.ts | 52 +++++---- packages/appkit-utils/src/CaipNetworkUtil.ts | 103 ++++++++++++++++-- packages/appkit/package.json | 4 +- packages/appkit/src/library/react/index.ts | 3 + packages/appkit/src/library/vue/index.ts | 27 ++--- .../src/tests/mocks/UniversalProvider.ts | 4 +- .../src/tests/universal-adapter.test.ts | 10 +- .../src/tests/utils/HelpersUtil.test.ts | 2 +- .../appkit/src/universal-adapter/client.ts | 14 +-- packages/cdn/package.json | 2 +- packages/common/package.json | 4 +- packages/core/exports/react.ts | 11 +- packages/core/exports/vue.ts | 58 ++++++++++ packages/core/package.json | 11 +- .../core/src/controllers/ChainController.ts | 14 +++ .../core/src/controllers/NetworkController.ts | 10 +- .../controllers/NetworkController.test.ts | 6 +- .../TransactionsController.test.ts | 3 +- packages/core/tests/utils/AssetUtil.test.ts | 8 +- packages/core/tests/utils/SwapApiUtil.test.ts | 2 +- packages/wagmi/package.json | 4 +- pnpm-lock.yaml | 40 +++---- 28 files changed, 323 insertions(+), 222 deletions(-) create mode 100644 packages/core/exports/vue.ts diff --git a/packages/adapters/ethers/src/tests/client.test.ts b/packages/adapters/ethers/src/tests/client.test.ts index 44c906763c..c03a6933d6 100644 --- a/packages/adapters/ethers/src/tests/client.test.ts +++ b/packages/adapters/ethers/src/tests/client.test.ts @@ -10,7 +10,9 @@ import { CaipNetworksUtil, ConstantsUtil } from '@reown/appkit-utils' import { arbitrum as AppkitArbitrum, mainnet as AppkitMainnet, - polygon as AppkitPolygon + polygon as AppkitPolygon, + optimism as AppkitOptimism, + bsc as AppkitBsc } from '@reown/appkit/networks' import { ProviderUtil } from '@reown/appkit/store' import { SafeLocalStorage, SafeLocalStorageKeys } from '@reown/appkit-common' @@ -19,13 +21,10 @@ import { InfuraProvider, JsonRpcProvider } from 'ethers' import type { CaipNetwork, ChainNamespace } from '@reown/appkit-common' -const [mainnet, arbitrum, polygon] = CaipNetworksUtil.extendCaipNetworks( - [AppkitMainnet, AppkitArbitrum, AppkitPolygon], - { - customNetworkImageUrls: {}, - projectId: '1234' - } -) as [CaipNetwork, CaipNetwork, CaipNetwork] +const [mainnet, arbitrum, polygon, optimism, bsc] = CaipNetworksUtil.extendCaipNetworks( + [AppkitMainnet, AppkitArbitrum, AppkitPolygon, AppkitOptimism, AppkitBsc], + { customNetworkImageUrls: {}, projectId: '1234' } +) as [CaipNetwork, CaipNetwork, CaipNetwork, CaipNetwork, CaipNetwork] vi.mock('@reown/appkit-wallet', () => ({ W3mFrameProvider: vi.fn().mockImplementation(() => mockAuthConnector), @@ -38,13 +37,16 @@ vi.mock('@reown/appkit-wallet', () => ({ } })) -vi.mock('@reown/appkit-utils', () => { +vi.mock('@reown/appkit-utils', async importOriginal => { + const actual = await importOriginal() const INJECTED_CONNECTOR_ID = 'injected' const COINBASE_SDK_CONNECTOR_ID = 'coinbaseWallet' const EIP6963_CONNECTOR_ID = 'eip6963' const WALLET_CONNECT_CONNECTOR_ID = 'walletConnect' const AUTH_CONNECTOR_ID = 'w3mAuth' return { + // @ts-expect-error - actual is not typed + ...actual, PresetsUtil: { ConnectorTypesMap: { [INJECTED_CONNECTOR_ID]: 'INJECTED', @@ -127,11 +129,11 @@ describe('EthersAdapter', () => { }) it('should set caipNetworks to provided caipNetworks options', () => { - expect(client.caipNetworks).toEqual(mockOptions.networks) + expect(client.caipNetworks).toEqual([mainnet, arbitrum, polygon]) }) it('should set defaultNetwork to first caipNetwork option', () => { - expect(client.defaultCaipNetwork).toEqual(mockOptions.networks[0]) + expect(client.defaultCaipNetwork).toEqual(mainnet) }) it('should create ethers config', () => { @@ -156,27 +158,9 @@ describe('EthersAdapter', () => { }) it('should switch network for injected provider', async () => { - const newNetwork = { - id: 137, - caipNetworkId: 'eip155:137', - chainNamespace: 'eip155', - name: 'Polygon', - network: 'polygon', - nativeCurrency: { - name: 'MATIC', - symbol: 'MATIC', - decimals: 18 - }, - rpcUrls: { - default: { - http: ['https://polygon-rpc.com'] - } - } - } as unknown as CaipNetwork - mockProvider.request.mockResolvedValueOnce(null) - await client.switchNetwork(newNetwork) + await client.switchNetwork(polygon) expect(mockProvider.request).toHaveBeenCalledWith( expect.objectContaining({ @@ -191,18 +175,11 @@ describe('EthersAdapter', () => { }) it('should add network if not recognized by wallet', async () => { - const newNetwork = { - id: 'eip155:42161', - name: 'Arbitrum One', - chainId: '42161', - rpcUrl: 'https://arb1.arbitrum.io/rpc' - } as unknown as CaipNetwork - const switchError = { code: 4902 } mockProvider.request.mockRejectedValueOnce(switchError) mockProvider.request.mockResolvedValueOnce(null) - await client.switchNetwork(newNetwork) + await client.switchNetwork(arbitrum) expect(mockProvider.request).toHaveBeenCalledWith( expect.objectContaining({ @@ -217,17 +194,10 @@ describe('EthersAdapter', () => { }) it('should throw error if switching fails', async () => { - const newNetwork = { - id: 'eip155:56', - name: 'Binance Smart Chain', - chainId: '56', - rpcUrl: 'https://bsc-dataseed.binance.org' - } as unknown as CaipNetwork - const switchError = new Error('User rejected the request') mockProvider.request.mockRejectedValueOnce(switchError) - await expect(client.switchNetwork(newNetwork)).rejects.toThrow('Chain is not supported') + await expect(client.switchNetwork(bsc)).rejects.toThrow('Chain is not supported') }) it('should use universal adapter for WalletConnect', async () => { diff --git a/packages/adapters/ethers5/src/client.ts b/packages/adapters/ethers5/src/client.ts index daccef3e8c..6ee82ee484 100644 --- a/packages/adapters/ethers5/src/client.ts +++ b/packages/adapters/ethers5/src/client.ts @@ -1020,6 +1020,7 @@ export class Ethers5Adapter { }) // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (switchError: any) { + console.log('>>> switchError', switchError) if ( switchError.code === WcConstantsUtil.ERROR_CODE_UNRECOGNIZED_CHAIN_ID || switchError.code === WcConstantsUtil.ERROR_CODE_DEFAULT || diff --git a/packages/adapters/ethers5/src/tests/client.test.ts b/packages/adapters/ethers5/src/tests/client.test.ts index dccf8ebfae..fb5d0a7d46 100644 --- a/packages/adapters/ethers5/src/tests/client.test.ts +++ b/packages/adapters/ethers5/src/tests/client.test.ts @@ -10,7 +10,9 @@ import { CaipNetworksUtil, ConstantsUtil } from '@reown/appkit-utils' import { arbitrum as AppkitArbitrum, mainnet as AppkitMainnet, - polygon as AppkitPolygon + polygon as AppkitPolygon, + optimism as AppkitOptimism, + bsc as AppkitBsc } from '@reown/appkit/networks' import { ProviderUtil } from '@reown/appkit/store' import { SafeLocalStorage, SafeLocalStorageKeys } from '@reown/appkit-common' @@ -19,10 +21,10 @@ import { ethers } from 'ethers' import type { CaipNetwork, ChainNamespace } from '@reown/appkit-common' -const [mainnet, arbitrum, polygon] = CaipNetworksUtil.extendCaipNetworks( - [AppkitMainnet, AppkitArbitrum, AppkitPolygon], +const [mainnet, arbitrum, polygon, optimism, bsc] = CaipNetworksUtil.extendCaipNetworks( + [AppkitMainnet, AppkitArbitrum, AppkitPolygon, AppkitOptimism, AppkitBsc], { customNetworkImageUrls: {}, projectId: '1234' } -) as [CaipNetwork, CaipNetwork, CaipNetwork] +) as [CaipNetwork, CaipNetwork, CaipNetwork, CaipNetwork, CaipNetwork] vi.mock('@reown/appkit-wallet', () => ({ W3mFrameProvider: vi.fn().mockImplementation(() => mockAuthConnector), @@ -35,13 +37,16 @@ vi.mock('@reown/appkit-wallet', () => ({ } })) -vi.mock('@reown/appkit-utils', () => { +vi.mock('@reown/appkit-utils', async importOriginal => { + const actual = await importOriginal() const INJECTED_CONNECTOR_ID = 'injected' const COINBASE_SDK_CONNECTOR_ID = 'coinbaseWallet' const EIP6963_CONNECTOR_ID = 'eip6963' const WALLET_CONNECT_CONNECTOR_ID = 'walletConnect' const AUTH_CONNECTOR_ID = 'w3mAuth' return { + // @ts-expect-error - actual is not typed + ...actual, PresetsUtil: { ConnectorTypesMap: { [INJECTED_CONNECTOR_ID]: 'INJECTED', @@ -130,11 +135,11 @@ describe('EthersAdapter', () => { }) it('should set caipNetworks to provided caipNetworks options', () => { - expect(client.caipNetworks).toEqual(mockOptions.networks) + expect(client.caipNetworks).toEqual([mainnet, arbitrum, polygon]) }) it('should set defaultNetwork to first caipNetwork option', () => { - expect(client.defaultCaipNetwork).toEqual(mockOptions.networks[0]) + expect(client.defaultCaipNetwork).toEqual(mainnet) }) it('should create ethers config', () => { @@ -159,16 +164,9 @@ describe('EthersAdapter', () => { }) it('should switch network for injected provider', async () => { - const newNetwork = { - id: 'eip155:137', - name: 'Polygon', - chainId: '137', - rpcUrl: 'https://polygon-rpc.com' - } as unknown as CaipNetwork - mockProvider.request.mockResolvedValueOnce(null) - await client.switchNetwork(newNetwork) + await client.switchNetwork(polygon) expect(mockProvider.request).toHaveBeenCalledWith( expect.objectContaining({ @@ -183,18 +181,11 @@ describe('EthersAdapter', () => { }) it('should add network if not recognized by wallet', async () => { - const newNetwork = { - id: 'eip155:42161', - name: 'Arbitrum One', - chainId: '42161', - rpcUrl: 'https://arb1.arbitrum.io/rpc' - } as unknown as CaipNetwork - const switchError = { code: 4902 } mockProvider.request.mockRejectedValueOnce(switchError) mockProvider.request.mockResolvedValueOnce(null) - await client.switchNetwork(newNetwork) + await client.switchNetwork(arbitrum) expect(mockProvider.request).toHaveBeenCalledWith( expect.objectContaining({ @@ -209,17 +200,10 @@ describe('EthersAdapter', () => { }) it('should throw error if switching fails', async () => { - const newNetwork = { - id: 'eip155:56', - name: 'Binance Smart Chain', - chainId: '56', - rpcUrl: 'https://bsc-dataseed.binance.org' - } as unknown as CaipNetwork - const switchError = new Error('User rejected the request') mockProvider.request.mockRejectedValueOnce(switchError) - await expect(client.switchNetwork(newNetwork)).rejects.toThrow('Chain is not supported') + await expect(client.switchNetwork(bsc)).rejects.toThrow('Chain is not supported') }) it('should use universal adapter for WalletConnect', async () => { @@ -229,18 +213,11 @@ describe('EthersAdapter', () => { polkadot: undefined }) - const newNetwork = { - id: 'eip155:10', - name: 'Optimism', - chainId: '10', - rpcUrl: 'https://mainnet.optimism.io' - } as unknown as CaipNetwork - - await client.switchNetwork(newNetwork) + await client.switchNetwork(optimism) expect( mockAppKit.universalAdapter?.networkControllerClient.switchCaipNetwork - ).toHaveBeenCalledWith(newNetwork) + ).toHaveBeenCalledWith(optimism) }) it('should set requested CAIP networks for each unique chain namespace', () => { diff --git a/packages/adapters/solana/src/client.ts b/packages/adapters/solana/src/client.ts index f77ae6cc31..82eb2834bf 100644 --- a/packages/adapters/solana/src/client.ts +++ b/packages/adapters/solana/src/client.ts @@ -365,7 +365,7 @@ export class SolanaAdapter implements ChainAdapter { if (address && caipNetwork) { SolStoreUtil.setConnection( - new Connection(caipNetwork.rpcUrls.default.http[0] as string, this.connectionSettings) + new Connection(caipNetwork.rpcUrls.default.http?.[0] as string, this.connectionSettings) ) this.appKit?.setAllAccounts([{ address, type: 'eoa' }], this.chainNamespace) this.appKit?.setCaipAddress(`${caipNetworkId}:${address}` as CaipAddress, this.chainNamespace) @@ -429,10 +429,10 @@ export class SolanaAdapter implements ChainAdapter { }) this.authSession = user if (user) { - const caipAddress = `${caipNetwork.caipNetworkId}:${user.address}` as CaipAddress + const caipAddress = `${caipNetwork.caipNetworkId}:${user.address}` ProviderUtil.setProvider(this.chainNamespace, this.authProvider) ProviderUtil.setProviderId(this.chainNamespace, 'walletConnect') - this.appKit?.setCaipAddress(caipAddress, this.chainNamespace) + this.appKit?.setCaipAddress(caipAddress as CaipAddress, this.chainNamespace) this.syncAccount({ address: user.address, caipNetwork @@ -470,10 +470,10 @@ export class SolanaAdapter implements ChainAdapter { try { this.appKit?.setLoading(true) const address = await provider.connect() - const caipChainId = SafeLocalStorage.getItem(SafeLocalStorageKeys.ACTIVE_CAIP_NETWORK_ID) + const caipNetworkId = SafeLocalStorage.getItem(SafeLocalStorageKeys.ACTIVE_CAIP_NETWORK_ID) const connectionChain = - provider.chains.find(chain => chain.id === caipChainId) || provider.chains[0] + provider.chains.find(chain => chain.caipNetworkId === caipNetworkId) || provider.chains[0] if (connectionChain) { const caipAddress = `${connectionChain.caipNetworkId}:${address}` as const diff --git a/packages/adapters/solana/src/tests/client.test.ts b/packages/adapters/solana/src/tests/client.test.ts index 01dabf9c4c..fe2b020f9f 100644 --- a/packages/adapters/solana/src/tests/client.test.ts +++ b/packages/adapters/solana/src/tests/client.test.ts @@ -10,7 +10,7 @@ import { SolHelpersUtil } from '@reown/appkit-utils/solana' import { SolStoreUtil } from '../utils/SolanaStoreUtil.js' import { WalletConnectProvider } from '../providers/WalletConnectProvider' import UniversalProvider from '@walletconnect/universal-provider' -import { solana } from '@reown/appkit/networks' +import { solana, solanaTestnet } from '@reown/appkit/networks' vi.mock('@solana/web3.js', () => ({ Connection: vi.fn(), @@ -151,7 +151,7 @@ describe('SolanaAdapter', () => { connect: vi.fn().mockResolvedValue('DjPi1LtwrXJMAh2AUvuUMajCpMJEKg8N1J1PbLGjCH5B'), name: 'MockProvider', on: vi.fn(), - chains: [{ chainId: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' }] + chains: [solana, solanaTestnet] } vi.spyOn(SafeLocalStorage, 'getItem').mockReturnValue( 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' diff --git a/packages/adapters/wagmi/src/client.ts b/packages/adapters/wagmi/src/client.ts index 46602d8816..c94b286201 100644 --- a/packages/adapters/wagmi/src/client.ts +++ b/packages/adapters/wagmi/src/client.ts @@ -74,7 +74,6 @@ import type { ChainNamespace, AdapterType, CaipNetwork, - CaipNetworkId, BaseOrCaipNetwork } from '@reown/appkit-common' import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common' @@ -157,7 +156,7 @@ export class WagmiAdapter implements ChainAdapter { this.caipNetworks = configParams.networks.map((caipNetwork: BaseNetwork | CaipNetwork) => ({ ...caipNetwork, chainNamespace: CommonConstantsUtil.CHAIN.EVM, - caipNetworkId: `${this.chainNamespace}:${caipNetwork.id}` as CaipNetworkId + caipNetworkId: `${this.chainNamespace}:${caipNetwork.id}` })) as [CaipNetwork, ...CaipNetwork[]] this.wagmiChains = this.caipNetworks.filter( @@ -225,15 +224,17 @@ export class WagmiAdapter implements ChainAdapter { }) } - public construct(appKit: AppKit, options: AppKitOptions) { + public construct( + appKit: AppKit, + options: Omit & { + defaultNetwork: CaipNetwork + networks: CaipNetwork[] + } + ) { this.appKit = appKit this.options = options - this.defaultCaipNetwork = options.defaultNetwork - ? CaipNetworksUtil.extendCaipNetwork(options.defaultNetwork, { - customNetworkImageUrls: options.chainImages, - projectId: options.projectId - }) - : undefined + this.defaultCaipNetwork = options.defaultNetwork || options.networks?.[0] + console.log('>>> setDefaultNetwork', this.defaultCaipNetwork) this.tokens = HelpersUtil.getCaipTokens(options.tokens) this.setCustomConnectors(options, appKit) diff --git a/packages/adapters/wagmi/src/tests/client.test.ts b/packages/adapters/wagmi/src/tests/client.test.ts index 33e67de2e4..76367635db 100644 --- a/packages/adapters/wagmi/src/tests/client.test.ts +++ b/packages/adapters/wagmi/src/tests/client.test.ts @@ -1,21 +1,21 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { mockAccount, mockAppKit, mockOptions, mockWagmiClient } from './mocks/adapter.mock' import { - mockAccount, - mockAppKit, - mockChain, - mockOptions, - mockWagmiClient -} from './mocks/adapter.mock' -import { arbitrum as AppkitArbitrum, mainnet as AppkitMainnet } from '@reown/appkit/networks' + arbitrum as AppkitArbitrum, + mainnet as AppkitMainnet, + polygon as AppkitPolygon, + optimism as AppkitOptimism, + bsc as AppkitBsc +} from '@reown/appkit/networks' import { connect, disconnect, getAccount, getChainId, getEnsName, getBalance } from '@wagmi/core' import { CaipNetworksUtil, ConstantsUtil } from '@reown/appkit-utils' import type { CaipNetwork } from '@reown/appkit-common' -const [mainnet, arbitrum] = CaipNetworksUtil.extendCaipNetworks([AppkitMainnet, AppkitArbitrum], { - customNetworkImageUrls: {}, - projectId: '1234' -}) as [CaipNetwork, CaipNetwork] +const [mainnet, arbitrum] = CaipNetworksUtil.extendCaipNetworks( + [AppkitMainnet, AppkitArbitrum, AppkitPolygon, AppkitOptimism, AppkitBsc], + { customNetworkImageUrls: {}, projectId: '1234' } +) as [CaipNetwork, CaipNetwork, CaipNetwork, CaipNetwork, CaipNetwork] vi.mock('@wagmi/core', async () => { const actual = await vi.importActual('@wagmi/core') @@ -49,8 +49,8 @@ describe('Wagmi Client', () => { * Specifically to Wagmi, we are mutating caipNetworks on both Wagmi constructor and when we set adapters. * So there is not proper way to compare objects since imageId and imageUrl is added later. */ - mockOptions.networks.forEach((network, index) => { - expect(mockWagmiClient.caipNetworks[index]?.name).toEqual(network.name) + mockWagmiClient.caipNetworks.forEach((network, index) => { + expect(network.name).toEqual(mockOptions.networks[index]?.name) }) }) @@ -59,8 +59,8 @@ describe('Wagmi Client', () => { * Specifically to Wagmi, we are mutating caipNetworks on both Wagmi constructor and when we set adapters. * So there is not proper way to compare objects since imageId and imageUrl is added later. */ - expect(mockWagmiClient.defaultCaipNetwork?.id).toEqual(mockOptions.networks[0]?.id) - expect(mockWagmiClient.defaultCaipNetwork?.name).toEqual(mockOptions.networks[0]?.name) + expect(mockWagmiClient.defaultCaipNetwork?.id).toEqual(mainnet.id) + expect(mockWagmiClient.defaultCaipNetwork?.name).toEqual(mainnet.name) }) it('should create wagmi config', () => { @@ -78,7 +78,7 @@ describe('Wagmi Client', () => { it('should sync the correct requested networks', async () => { const setRequestedCaipNetworks = vi.spyOn(mockAppKit, 'setRequestedCaipNetworks') - mockWagmiClient['syncRequestedNetworks'](mockOptions.networks) + mockWagmiClient['syncRequestedNetworks']([mainnet, arbitrum]) /** * Specifically to Wagmi, we are mutating caipNetworks on both Wagmi constructor and when we set adapters. @@ -172,35 +172,33 @@ describe('Wagmi Client', () => { it('should sync network correctly', async () => { const mockAddress = '0x1234567890123456789012345678901234567890' - mockWagmiClient.caipNetworks = [mockChain] + mockWagmiClient.caipNetworks = [mainnet, arbitrum] const setCaipNetworkSpy = vi.spyOn(mockAppKit, 'setCaipNetwork') const setCaipAddressSpy = vi.spyOn(mockAppKit, 'setCaipAddress') const setAddressExplorerUrlSpy = vi.spyOn(mockAppKit, 'setAddressExplorerUrl') const syncBalanceSpy = vi.spyOn(mockWagmiClient as any, 'syncBalance') - await (mockWagmiClient as any).syncNetwork(mockAddress, mockChain.id, true) + await (mockWagmiClient as any).syncNetwork(mockAddress, mainnet.id, true) expect(setCaipNetworkSpy).toHaveBeenCalledWith( expect.objectContaining({ - chainId: 1, - id: 'eip155:1', + id: 1, + caipNetworkId: 'eip155:1', name: 'Ethereum', - chainNamespace: 'eip155', - currency: 'ETH', - explorerUrl: 'https://etherscan.io' + chainNamespace: 'eip155' }) ) expect(setCaipAddressSpy).toHaveBeenCalledWith( - `eip155:${mockChain.id}:${mockAddress}`, + `eip155:${mainnet.id}:${mockAddress}`, 'eip155' ) expect(setAddressExplorerUrlSpy).toHaveBeenCalledWith( 'https://etherscan.io/address/0x1234567890123456789012345678901234567890', 'eip155' ) - expect(syncBalanceSpy).toHaveBeenCalledWith(mockAddress, mockChain.id) + expect(syncBalanceSpy).toHaveBeenCalledWith(mockAddress, mainnet.id) }) it.skip('should not sync network if chain is not found', async () => { @@ -209,7 +207,7 @@ describe('Wagmi Client', () => { mockWagmiClient.options = { ...mockOptions, - networks: [mockChain] + networks: [mainnet] } const setCaipNetworkSpy = vi.spyOn(mockAppKit, 'setCaipNetwork') const syncBalanceSpy = vi.spyOn(mockWagmiClient as any, 'syncBalance') @@ -271,7 +269,7 @@ describe('Wagmi Client', () => { const mockChainId = 1 // Ethereum mainnet beforeEach(() => { - mockWagmiClient.options = { networks: [mockChain], projectId: '123' } + mockWagmiClient.options = { networks: [mainnet], projectId: '123' } mockAppKit.setBalance = vi.fn() ;(getBalance as any).mockReset() }) diff --git a/packages/appkit-utils/src/CaipNetworkUtil.ts b/packages/appkit-utils/src/CaipNetworkUtil.ts index 593922dee2..3d81bdbade 100644 --- a/packages/appkit-utils/src/CaipNetworkUtil.ts +++ b/packages/appkit-utils/src/CaipNetworkUtil.ts @@ -1,8 +1,55 @@ -import { ConstantsUtil, type BaseOrCaipNetwork, type CaipNetwork } from '@reown/appkit-common' -import { PresetsUtil } from './PresetsUtil' +import { + ConstantsUtil, + type BaseOrCaipNetwork, + type CaipNetwork, + type CaipNetworkId +} from '@reown/appkit-common' +import { PresetsUtil } from './PresetsUtil.js' const RPC_URL_HOST = 'rpc.walletconnect.org' +export function getBlockchainApiRpcUrl(caipNetworkId: CaipNetworkId, projectId: string) { + return `https://rpc.walletconnect.org/v1/?chainId=${caipNetworkId}&projectId=${projectId}` +} + +const WC_HTTP_RPC_SUPPORTED_CHAINS = [ + 'near:mainnet', + 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + 'eip155:1101', + 'eip155:56', + 'eip155:42161', + 'eip155:7777777', + 'eip155:59144', + 'eip155:324', + 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1', + 'eip155:5000', + 'solana:4sgjmw1sunhzsxgspuhpqldx6wiyjntz', + 'eip155:80084', + 'eip155:5003', + 'eip155:100', + 'eip155:8453', + 'eip155:42220', + 'eip155:1313161555', + 'eip155:17000', + 'eip155:1', + 'eip155:300', + 'eip155:1313161554', + 'eip155:1329', + 'eip155:84532', + 'eip155:421614', + 'eip155:11155111', + 'eip155:8217', + 'eip155:43114', + 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z', + 'eip155:999999999', + 'eip155:11155420', + 'eip155:80002', + 'eip155:97', + 'eip155:43113', + 'eip155:137', + 'eip155:10' +] + type ExtendCaipNetworkParams = { customNetworkImageUrls: Record | undefined projectId: string @@ -30,6 +77,36 @@ export const CaipNetworksUtil = { return rpcUrl }, + isCaipNetwork(network: BaseOrCaipNetwork): network is CaipNetwork { + return 'chainNamespace' in network && 'caipNetworkId' in network + }, + + getChainNamespace(network: BaseOrCaipNetwork) { + if (this.isCaipNetwork(network)) { + return network.chainNamespace + } + + return ConstantsUtil.CHAIN.EVM + }, + + getCaipNetworkId(network: BaseOrCaipNetwork) { + if (this.isCaipNetwork(network)) { + return network.caipNetworkId + } + + return `${ConstantsUtil.CHAIN.EVM}:${network.id}` as CaipNetworkId + }, + + getRpcUrl(caipNetwork: BaseOrCaipNetwork, caipNetworkId: CaipNetworkId, projectId: string) { + const defaultRpcUrl = caipNetwork.rpcUrls?.default?.http?.[0] + + if (WC_HTTP_RPC_SUPPORTED_CHAINS.includes(caipNetworkId)) { + return getBlockchainApiRpcUrl(caipNetworkId, projectId) + } + + return defaultRpcUrl || '' + }, + /** * Extends the CaipNetwork object with the image ID and image URL if the image ID is not provided * @param params - The parameters object @@ -41,23 +118,25 @@ export const CaipNetworksUtil = { */ extendCaipNetwork( caipNetwork: BaseOrCaipNetwork, - { customNetworkImageUrls }: ExtendCaipNetworkParams + { customNetworkImageUrls, projectId }: ExtendCaipNetworkParams ): CaipNetwork { - const isCaipNetwork = (network: BaseOrCaipNetwork): network is CaipNetwork => { - return 'chainNamespace' in network && 'caipNetworkId' in network - } + const caipNetworkId = this.getCaipNetworkId(caipNetwork) + const chainNamespace = this.getChainNamespace(caipNetwork) + const rpcUrl = this.getRpcUrl(caipNetwork, caipNetworkId, projectId) return { ...caipNetwork, - chainNamespace: isCaipNetwork(caipNetwork) - ? caipNetwork.chainNamespace - : ConstantsUtil.CHAIN.EVM, - caipNetworkId: isCaipNetwork(caipNetwork) - ? caipNetwork.caipNetworkId - : `${ConstantsUtil.CHAIN.EVM}:${caipNetwork.id}`, + chainNamespace, + caipNetworkId, assets: { imageId: PresetsUtil.NetworkImageIds[caipNetwork.id], imageUrl: customNetworkImageUrls?.[caipNetwork.id] + }, + rpcUrls: { + ...caipNetwork.rpcUrls, + default: { + http: [rpcUrl] + } } } }, diff --git a/packages/appkit/package.json b/packages/appkit/package.json index 331ad14775..1eb9060ffc 100644 --- a/packages/appkit/package.json +++ b/packages/appkit/package.json @@ -102,6 +102,9 @@ "@walletconnect/universal-provider": "2.17.0", "valtio": "1.11.2" }, + "peerDependencies": { + "viem": "2.x" + }, "devDependencies": { "@types/react": "18.2.0", "@types/react-dom": "18.2.0", @@ -111,7 +114,6 @@ "@walletconnect/universal-provider": "2.17.0", "react": "18.2.0", "react-dom": "18.2.0", - "viem": "2.21.4", "vitest": "2.0.5", "vue": "3.4.3" }, diff --git a/packages/appkit/src/library/react/index.ts b/packages/appkit/src/library/react/index.ts index ea9674fceb..b86a19e0c9 100644 --- a/packages/appkit/src/library/react/index.ts +++ b/packages/appkit/src/library/react/index.ts @@ -40,6 +40,9 @@ export function getAppKit(appKit: AppKit) { } } +// -- Core Hooks --------------------------------------------------------------- +export * from '@reown/appkit-core/react' + export function useAppKitProvider(chainNamespace: ChainNamespace) { const { providers, providerIds } = useSnapshot(ProviderUtil.state) diff --git a/packages/appkit/src/library/vue/index.ts b/packages/appkit/src/library/vue/index.ts index 8c073d414d..9bc7c230a7 100644 --- a/packages/appkit/src/library/vue/index.ts +++ b/packages/appkit/src/library/vue/index.ts @@ -1,5 +1,5 @@ import { onUnmounted, reactive, ref } from 'vue' -import { AccountController, ChainController, CoreHelperUtil, type Event } from '@reown/appkit-core' +import { type Event } from '@reown/appkit-core' import type { W3mAccountButton, W3mButton, @@ -12,6 +12,11 @@ import type { AppKitOptions } from '../../utils/TypesUtil.js' import { ProviderUtil } from '../../store/ProviderUtil.js' import type { ChainNamespace } from '@reown/appkit-common' +export interface AppKitEvent { + timestamp: number + data: Event +} + type OpenOptions = { view: 'Account' | 'Connect' | 'Networks' | 'ApproveTransaction' | 'OnRampProviders' } @@ -38,19 +43,8 @@ export function getAppKit(appKit: AppKit) { } } -export function useAppKitAccount() { - const state = ref(ChainController.state) - const accountState = ref(AccountController.state) - const { activeCaipAddress } = state.value - const { status } = accountState.value - - return { - caipAddress: activeCaipAddress, - address: CoreHelperUtil.getPlainAddress(activeCaipAddress), - isConnected: Boolean(activeCaipAddress), - status - } -} +// -- Core Hooks --------------------------------------------------------------- +export * from '@reown/appkit-core/vue' export function useAppKitProvider(chainNamespace: ChainNamespace) { const state = ref(ProviderUtil.state) @@ -160,11 +154,6 @@ export function useAppKitState() { return reactive({ open, selectedNetworkId }) } -export interface AppKitEvent { - timestamp: number - data: Event -} - export function useAppKitEvents(): AppKitEvent { if (!modal) { throw new Error('Please call "createAppKit" before using "useAppKitEvents" composable') diff --git a/packages/appkit/src/tests/mocks/UniversalProvider.ts b/packages/appkit/src/tests/mocks/UniversalProvider.ts index 1a2c67698e..bea8d9ff66 100644 --- a/packages/appkit/src/tests/mocks/UniversalProvider.ts +++ b/packages/appkit/src/tests/mocks/UniversalProvider.ts @@ -27,7 +27,7 @@ export const mockProvider = { 'wallet_switchEthereumChain' ], rpcMap: { - '1': 'https://rpc.walletconnect.org/v1/?chainId=eip155:1' + '1': 'https://rpc.walletconnect.org/v1/?chainId=eip155:1&projectId=test-project-id' } }, solana: { @@ -43,7 +43,7 @@ export const mockProvider = { events: ['accountsChanged', 'chainChanged'], rpcMap: { '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': - 'https://rpc.walletconnect.org/v1/?chainId=solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' + 'https://rpc.walletconnect.org/v1/?chainId=solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp&projectId=test-project-id' } } }, diff --git a/packages/appkit/src/tests/universal-adapter.test.ts b/packages/appkit/src/tests/universal-adapter.test.ts index fb86a07ab6..12f826cd3b 100644 --- a/packages/appkit/src/tests/universal-adapter.test.ts +++ b/packages/appkit/src/tests/universal-adapter.test.ts @@ -29,7 +29,7 @@ describe('UniversalAdapter', () => { describe('UniversalAdapter - Initialization', () => { it('should set caipNetworks to provided caipNetworks options', () => { - expect(universalAdapter?.caipNetworks).toEqual(mockOptions.networks) + expect(universalAdapter?.caipNetworks).toEqual(mockCaipNetworks) }) it('should set metadata to metadata options', () => { @@ -74,14 +74,14 @@ describe('UniversalAdapter', () => { supportsAllNetworks: true }) - const adapterSpy = vi.spyOn(universalAdapter as any, 'setDefaultNetwork') - const networkControllerSpy = vi.spyOn(NetworkController, 'setActiveCaipNetwork') + const setDefaultNetworkSpy = vi.spyOn(universalAdapter as any, 'setDefaultNetwork') + const setActiveCaipNetworkSpy = vi.spyOn(NetworkController, 'setActiveCaipNetwork') const mockOnUri = vi.fn() await universalAdapter?.connectionControllerClient?.connectWalletConnect?.(mockOnUri) - expect(adapterSpy).toHaveBeenCalledWith(mockProvider.session?.namespaces) - expect(networkControllerSpy).toHaveBeenCalledWith(mainnet) + expect(setDefaultNetworkSpy).toHaveBeenCalledWith(mockProvider.session?.namespaces) + expect(setActiveCaipNetworkSpy).toHaveBeenCalledWith(mainnet) }) it('should set correct requestedCaipNetworks in AppKit when syncRequestedNetworks has been called', () => { diff --git a/packages/appkit/src/tests/utils/HelpersUtil.test.ts b/packages/appkit/src/tests/utils/HelpersUtil.test.ts index 3226964620..2683627bf8 100644 --- a/packages/appkit/src/tests/utils/HelpersUtil.test.ts +++ b/packages/appkit/src/tests/utils/HelpersUtil.test.ts @@ -44,7 +44,7 @@ const mockSolanaNetwork = { name: 'Solana', nativeCurrency: { name: 'Solana', - decimals: 18, + decimals: 9, symbol: 'SOL' }, rpcUrls: { diff --git a/packages/appkit/src/universal-adapter/client.ts b/packages/appkit/src/universal-adapter/client.ts index c77ccbea90..d3fdc0b801 100644 --- a/packages/appkit/src/universal-adapter/client.ts +++ b/packages/appkit/src/universal-adapter/client.ts @@ -276,14 +276,10 @@ export class UniversalAdapterClient { } public switchNetwork(caipNetwork: CaipNetwork) { - try { - if (caipNetwork) { - if (this.walletConnectProvider) { - this.walletConnectProvider.setDefaultChain(caipNetwork.caipNetworkId) - } + if (caipNetwork) { + if (this.walletConnectProvider) { + this.walletConnectProvider.setDefaultChain(caipNetwork.caipNetworkId) } - } catch (error) { - console.log('>>> UPA.switchNetwork', error) } } @@ -355,7 +351,7 @@ export class UniversalAdapterClient { private syncRequestedNetworks(caipNetworks: CaipNetwork[]) { const uniqueChainNamespaces = [ - ...new Set((caipNetworks as CaipNetwork[]).map(caipNetwork => caipNetwork.chainNamespace)) + ...new Set(caipNetworks.map(caipNetwork => caipNetwork.chainNamespace)) ] uniqueChainNamespaces .filter(c => Boolean(c)) @@ -435,7 +431,7 @@ export class UniversalAdapterClient { const requestedCaipNetworks = NetworkController.state?.requestedCaipNetworks if (requestedCaipNetworks) { - const network = requestedCaipNetworks.find(c => c.id === chainId) + const network = requestedCaipNetworks.find(c => c.caipNetworkId === chainId) if (network) { NetworkController.setActiveCaipNetwork(network as unknown as CaipNetwork) diff --git a/packages/cdn/package.json b/packages/cdn/package.json index 94615d4342..23e6d4f4fb 100644 --- a/packages/cdn/package.json +++ b/packages/cdn/package.json @@ -31,7 +31,7 @@ "@reown/appkit-polyfills": "workspace:*", "@wagmi/connectors": "5.1.9", "@wagmi/core": "2.13.4", - "viem": "2.21.4", + "viem": "2.x", "vite": "5.2.11", "wagmi": "2.12.9" } diff --git a/packages/common/package.json b/packages/common/package.json index 88ef77fe44..9fdc24259a 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -20,9 +20,11 @@ "bignumber.js": "9.1.2", "dayjs": "1.11.10" }, + "peerDependencies": { + "viem": "2.x" + }, "devDependencies": { "@vitest/coverage-v8": "2.0.5", - "viem": "2.21.4", "vitest": "2.0.5" }, "keywords": [ diff --git a/packages/core/exports/react.ts b/packages/core/exports/react.ts index ee9a9d72c4..8e678821be 100644 --- a/packages/core/exports/react.ts +++ b/packages/core/exports/react.ts @@ -2,16 +2,23 @@ import { useSnapshot } from 'valtio' import { AccountController } from '../src/controllers/AccountController.js' import { CoreHelperUtil } from '../src/utils/CoreHelperUtil.js' import { ChainController } from '../src/controllers/ChainController.js' +import type { CaipNetwork, CaipNetworkId } from '@reown/appkit-common' // -- Hooks ------------------------------------------------------------ -export function useAppKitNetwork() { +export function useAppKitNetwork(): { + caipNetwork: CaipNetwork | undefined + chainId: number | string | undefined + caipNetworkId: CaipNetworkId | undefined +} { const { activeCaipNetwork } = useSnapshot(ChainController.state) return { caipNetwork: activeCaipNetwork, - chainId: activeCaipNetwork?.caipNetworkId + chainId: activeCaipNetwork?.id, + caipNetworkId: activeCaipNetwork?.caipNetworkId } } + export function useAppKitAccount() { const { status } = useSnapshot(AccountController.state) const { activeCaipAddress } = useSnapshot(ChainController.state) diff --git a/packages/core/exports/vue.ts b/packages/core/exports/vue.ts new file mode 100644 index 0000000000..48abacff6e --- /dev/null +++ b/packages/core/exports/vue.ts @@ -0,0 +1,58 @@ +import { AccountController } from '../src/controllers/AccountController.js' +import { CoreHelperUtil } from '../src/utils/CoreHelperUtil.js' +import { ChainController } from '../src/controllers/ChainController.js' +import type { CaipNetwork, CaipNetworkId } from '@reown/appkit-common' +import { ref } from 'valtio/vanilla' +import { onUnmounted } from 'vue' + +// -- Hooks ------------------------------------------------------------ +export function useAppKitNetwork(): { + caipNetwork: CaipNetwork | undefined + chainId: number | string | undefined + caipNetworkId: CaipNetworkId | undefined +} { + const state = ref({ + activeCaipNetwork: ChainController.state.activeCaipNetwork + }) + + const unsubscribe = ChainController.subscribeKey('activeCaipNetwork', val => { + state.activeCaipNetwork = val + }) + + onUnmounted(() => { + unsubscribe?.() + }) + + return { + caipNetwork: state.activeCaipNetwork, + chainId: state.activeCaipNetwork?.id, + caipNetworkId: state.activeCaipNetwork?.caipNetworkId + } +} + +export function useAppKitAccount() { + const state = ref({ + activeCaipAddress: ChainController.state.activeCaipAddress, + status: AccountController.state.status + }) + + const unsubscribe = ChainController.subscribeKey('activeCaipAddress', val => { + state.activeCaipAddress = val + }) + + const unsubscribeStatus = AccountController.subscribeKey('status', val => { + state.status = val + }) + + onUnmounted(() => { + unsubscribe?.() + unsubscribeStatus?.() + }) + + return { + caipAddress: state.activeCaipAddress, + address: CoreHelperUtil.getPlainAddress(state.activeCaipAddress), + isConnected: Boolean(state.activeCaipAddress), + status: state.status + } +} diff --git a/packages/core/package.json b/packages/core/package.json index 03bfd8faef..8446fb92e1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -26,6 +26,11 @@ "types": "./dist/types/exports/react.d.ts", "import": "./dist/esm/exports/react.js", "default": "./dist/esm/exports/react.js" + }, + "./vue": { + "types": "./dist/types/exports/vue.d.ts", + "import": "./dist/esm/exports/vue.js", + "default": "./dist/esm/exports/vue.js" } }, "dependencies": { @@ -34,10 +39,12 @@ "@walletconnect/universal-provider": "2.17.0", "valtio": "1.11.2" }, + "peerDependencies": { + "viem": "2.x" + }, "devDependencies": { "vitest": "2.0.5", - "@vitest/coverage-v8": "2.0.5", - "viem": "2.21.4" + "@vitest/coverage-v8": "2.0.5" }, "author": "Reown (https://reown.com)", "license": "Apache-2.0", diff --git a/packages/core/src/controllers/ChainController.ts b/packages/core/src/controllers/ChainController.ts index 7dd8d8d0da..0a94ca0b86 100644 --- a/packages/core/src/controllers/ChainController.ts +++ b/packages/core/src/controllers/ChainController.ts @@ -68,6 +68,12 @@ const state = proxy({ export const ChainController = { state, + subscribe(callback: (value: ChainControllerState) => void) { + return sub(state, () => { + callback(state) + }) + }, + subscribeKey( key: K, callback: (value: ChainControllerState[K]) => void @@ -426,6 +432,14 @@ export const ChainController = { return approvedCaipNetworkIds }, + getActiveCaipNetwork() { + return state.activeCaipNetwork + }, + + getActiveCaipAddress() { + return state.activeCaipAddress + }, + resetAccount(chain: ChainNamespace | undefined) { const chainToWrite = chain diff --git a/packages/core/src/controllers/NetworkController.ts b/packages/core/src/controllers/NetworkController.ts index 45ecb700d4..6de40cd12b 100644 --- a/packages/core/src/controllers/NetworkController.ts +++ b/packages/core/src/controllers/NetworkController.ts @@ -161,14 +161,8 @@ export const NetworkController = { network?.chainNamespace ) - console.log('>>> switchActiveNetwork', network) - try { - if (networkControllerClient) { - console.log('>>> switchActiveNetwork1', network) - await networkControllerClient.switchCaipNetwork(network) - } - } catch (error) { - console.log('>>> switchActiveNetwork', error) + if (networkControllerClient) { + await networkControllerClient.switchCaipNetwork(network) } ChainController.setActiveCaipNetwork(network) diff --git a/packages/core/tests/controllers/NetworkController.test.ts b/packages/core/tests/controllers/NetworkController.test.ts index 910accc537..de3d082c6a 100644 --- a/packages/core/tests/controllers/NetworkController.test.ts +++ b/packages/core/tests/controllers/NetworkController.test.ts @@ -24,12 +24,12 @@ const caipNetwork = { const solanaCaipNetwork = { id: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', - caipNetworkId: 'eip155:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', + caipNetworkId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', name: 'Solana', - chainNamespace: ConstantsUtil.CHAIN.EVM, + chainNamespace: ConstantsUtil.CHAIN.SOLANA, nativeCurrency: { name: 'Solana', - decimals: 18, + decimals: 9, symbol: 'SOL' }, rpcUrls: { diff --git a/packages/core/tests/controllers/TransactionsController.test.ts b/packages/core/tests/controllers/TransactionsController.test.ts index 9b235cedc7..c5650e5fb1 100644 --- a/packages/core/tests/controllers/TransactionsController.test.ts +++ b/packages/core/tests/controllers/TransactionsController.test.ts @@ -289,7 +289,8 @@ describe('TransactionsController', () => { vi.spyOn(ChainController, 'state', 'get').mockReturnValue({ activeCaipNetwork: { - id: 'eip155:1' + id: 1, + caipNetworkId: 'eip155:1' } } as any) diff --git a/packages/core/tests/utils/AssetUtil.test.ts b/packages/core/tests/utils/AssetUtil.test.ts index 7183eb898c..0b14d7aaea 100644 --- a/packages/core/tests/utils/AssetUtil.test.ts +++ b/packages/core/tests/utils/AssetUtil.test.ts @@ -20,9 +20,11 @@ const network: Partial = { imageId: 'ethereum' } } -const networkWithImageUrl: Partial = { - imageUrl: 'ethereum-logo-src', - imageId: 'ethereum' +const networkWithImageUrl: Partial = { + assets: { + imageUrl: 'ethereum-logo-src', + imageId: 'ethereum' + } } const wallet: Partial = { image_url: undefined, diff --git a/packages/core/tests/utils/SwapApiUtil.test.ts b/packages/core/tests/utils/SwapApiUtil.test.ts index e7ba0627df..03ec628809 100644 --- a/packages/core/tests/utils/SwapApiUtil.test.ts +++ b/packages/core/tests/utils/SwapApiUtil.test.ts @@ -23,7 +23,7 @@ const mockSolanaNetwork = { name: 'Solana', nativeCurrency: { name: 'Solana', - decimals: 18, + decimals: 9, symbol: 'SOL' }, rpcUrls: { diff --git a/packages/wagmi/package.json b/packages/wagmi/package.json index 6d2f4bfabe..4672542eb6 100644 --- a/packages/wagmi/package.json +++ b/packages/wagmi/package.json @@ -65,7 +65,7 @@ "@wagmi/core": "2.13.4", "react": "18.2.0", "react-dom": "18.2.0", - "viem": "2.21.4", + "viem": "2.x", "vue": "3.4.3", "wagmi": "2.12.9", "vitest": "2.0.5" @@ -75,7 +75,7 @@ "@wagmi/core": ">=2.0.0", "react": ">=17", "react-dom": ">=17", - "viem": ">=2.0.0", + "viem": "2.x", "vue": ">=3", "wagmi": ">=2.0.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf92790108..0394b1f9c1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1140,6 +1140,9 @@ importers: valtio: specifier: 1.11.2 version: 1.11.2(@types/react@18.2.0)(react@18.2.0) + viem: + specifier: 2.x + version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) devDependencies: '@types/react': specifier: 18.2.0 @@ -1159,9 +1162,6 @@ importers: react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) - viem: - specifier: 2.21.4 - version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.33.0) @@ -1233,7 +1233,7 @@ importers: specifier: '>=5' version: 5.3.3 viem: - specifier: 2.21.4 + specifier: 2.x version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vite: specifier: 5.2.11 @@ -1254,13 +1254,13 @@ importers: dayjs: specifier: 1.11.10 version: 1.11.10 + viem: + specifier: 2.x + version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) devDependencies: '@vitest/coverage-v8': specifier: 2.0.5 version: 2.0.5(vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.33.0)) - viem: - specifier: 2.21.4 - version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.33.0) @@ -1279,13 +1279,13 @@ importers: valtio: specifier: 1.11.2 version: 1.11.2(@types/react@18.2.62)(react@18.2.0) + viem: + specifier: 2.x + version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) devDependencies: '@vitest/coverage-v8': specifier: 2.0.5 version: 2.0.5(vitest@2.0.5(@types/node@20.11.5)(jsdom@24.1.0)(terser@5.33.0)) - viem: - specifier: 2.21.4 - version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.33.0) @@ -1612,7 +1612,7 @@ importers: specifier: 18.2.0 version: 18.2.0(react@18.2.0) viem: - specifier: 2.21.4 + specifier: 2.x version: 2.21.4(bufferutil@4.0.8)(typescript@5.3.3)(utf-8-validate@5.0.10)(zod@3.22.4) vitest: specifier: 2.0.5 @@ -23001,8 +23001,8 @@ snapshots: '@typescript-eslint/parser': 6.18.1(eslint@8.56.0)(typescript@5.3.3) eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.56.0) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.56.0) eslint-plugin-react: 7.36.1(eslint@8.56.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.56.0) @@ -23044,19 +23044,19 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.56.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.56.0 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.56.0))(eslint@8.56.0) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.56.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -23082,14 +23082,14 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.56.0))(eslint@8.56.0): + eslint-module-utils@2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.18.1(eslint@8.56.0)(typescript@5.3.3) eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0) transitivePeerDependencies: - supports-color @@ -23104,7 +23104,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.56.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -23115,7 +23115,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.56.0))(eslint@8.56.0) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 From b1b292f995ec30b808aa2242c21dae09b8b9a881 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Thu, 3 Oct 2024 15:58:28 +0300 Subject: [PATCH 10/30] chore: lint and type issues --- packages/adapters/ethers5/src/client.ts | 1 - packages/adapters/wagmi/src/client.ts | 8 +------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/adapters/ethers5/src/client.ts b/packages/adapters/ethers5/src/client.ts index 6ee82ee484..daccef3e8c 100644 --- a/packages/adapters/ethers5/src/client.ts +++ b/packages/adapters/ethers5/src/client.ts @@ -1020,7 +1020,6 @@ export class Ethers5Adapter { }) // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (switchError: any) { - console.log('>>> switchError', switchError) if ( switchError.code === WcConstantsUtil.ERROR_CODE_UNRECOGNIZED_CHAIN_ID || switchError.code === WcConstantsUtil.ERROR_CODE_DEFAULT || diff --git a/packages/adapters/wagmi/src/client.ts b/packages/adapters/wagmi/src/client.ts index c94b286201..41e8db8f28 100644 --- a/packages/adapters/wagmi/src/client.ts +++ b/packages/adapters/wagmi/src/client.ts @@ -49,13 +49,7 @@ import type { } from '@reown/appkit-core' import { formatUnits, parseUnits } from 'viem' import type { Hex } from 'viem' -import { - ConstantsUtil, - PresetsUtil, - HelpersUtil, - ErrorUtil, - CaipNetworksUtil -} from '@reown/appkit-utils' +import { ConstantsUtil, PresetsUtil, HelpersUtil, ErrorUtil } from '@reown/appkit-utils' import { isReownName, SafeLocalStorage, SafeLocalStorageKeys } from '@reown/appkit-common' import { getEmailCaipNetworks, From a06c31bbd65b454b6949b112235ac90eb29fb7b1 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Thu, 3 Oct 2024 15:59:27 +0300 Subject: [PATCH 11/30] chore: tests --- .../adapters/ethers/src/tests/client.test.ts | 11 ++--------- ....ts.timestamp-1727960367257-8deaba46def5c.mjs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 vite.config.ts.timestamp-1727960367257-8deaba46def5c.mjs diff --git a/packages/adapters/ethers/src/tests/client.test.ts b/packages/adapters/ethers/src/tests/client.test.ts index c03a6933d6..4d2d2cee29 100644 --- a/packages/adapters/ethers/src/tests/client.test.ts +++ b/packages/adapters/ethers/src/tests/client.test.ts @@ -207,18 +207,11 @@ describe('EthersAdapter', () => { polkadot: undefined }) - const newNetwork = { - id: 'eip155:10', - name: 'Optimism', - chainId: '10', - rpcUrl: 'https://mainnet.optimism.io' - } as unknown as CaipNetwork - - await client.switchNetwork(newNetwork) + await client.switchNetwork(optimism) expect( mockAppKit.universalAdapter?.networkControllerClient.switchCaipNetwork - ).toHaveBeenCalledWith(newNetwork) + ).toHaveBeenCalledWith(optimism) }) it('should set requested CAIP networks for each unique chain namespace', () => { diff --git a/vite.config.ts.timestamp-1727960367257-8deaba46def5c.mjs b/vite.config.ts.timestamp-1727960367257-8deaba46def5c.mjs new file mode 100644 index 0000000000..a6bfc5c626 --- /dev/null +++ b/vite.config.ts.timestamp-1727960367257-8deaba46def5c.mjs @@ -0,0 +1,16 @@ +// ../../vite.config.ts +import { defineConfig } from "file:///Users/enes/Desktop/Projects/walletconnect/web3modal/node_modules/.pnpm/vite@5.2.11_@types+node@20.11.5_terser@5.33.0/node_modules/vite/dist/node/index.js"; +var vite_config_default = defineConfig({ + test: { + coverage: { + provider: "v8", + reportOnFailure: true, + all: true, + reporter: ["text", "json", "json-summary"] + } + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vdml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvZW5lcy9EZXNrdG9wL1Byb2plY3RzL3dhbGxldGNvbm5lY3Qvd2ViM21vZGFsXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvZW5lcy9EZXNrdG9wL1Byb2plY3RzL3dhbGxldGNvbm5lY3Qvd2ViM21vZGFsL3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9lbmVzL0Rlc2t0b3AvUHJvamVjdHMvd2FsbGV0Y29ubmVjdC93ZWIzbW9kYWwvdml0ZS5jb25maWcudHNcIjsvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGVzdFwiIC8+XG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJ1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICB0ZXN0OiB7XG4gICAgY292ZXJhZ2U6IHtcbiAgICAgIHByb3ZpZGVyOiAndjgnLFxuICAgICAgcmVwb3J0T25GYWlsdXJlOiB0cnVlLFxuICAgICAgYWxsOiB0cnVlLFxuICAgICAgcmVwb3J0ZXI6IFsndGV4dCcsICdqc29uJywgJ2pzb24tc3VtbWFyeSddXG4gICAgfVxuICB9XG59KVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUNBLFNBQVMsb0JBQW9CO0FBRTdCLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLE1BQU07QUFBQSxJQUNKLFVBQVU7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLGlCQUFpQjtBQUFBLE1BQ2pCLEtBQUs7QUFBQSxNQUNMLFVBQVUsQ0FBQyxRQUFRLFFBQVEsY0FBYztBQUFBLElBQzNDO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg== From fcd4cfcaa7fa9f0e3b4e9833942f628d9483b235 Mon Sep 17 00:00:00 2001 From: enesozturk Date: Thu, 3 Oct 2024 16:07:18 +0300 Subject: [PATCH 12/30] chore: remove unexpected vite config ts file --- ....ts.timestamp-1727960367257-8deaba46def5c.mjs | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 vite.config.ts.timestamp-1727960367257-8deaba46def5c.mjs diff --git a/vite.config.ts.timestamp-1727960367257-8deaba46def5c.mjs b/vite.config.ts.timestamp-1727960367257-8deaba46def5c.mjs deleted file mode 100644 index a6bfc5c626..0000000000 --- a/vite.config.ts.timestamp-1727960367257-8deaba46def5c.mjs +++ /dev/null @@ -1,16 +0,0 @@ -// ../../vite.config.ts -import { defineConfig } from "file:///Users/enes/Desktop/Projects/walletconnect/web3modal/node_modules/.pnpm/vite@5.2.11_@types+node@20.11.5_terser@5.33.0/node_modules/vite/dist/node/index.js"; -var vite_config_default = defineConfig({ - test: { - coverage: { - provider: "v8", - reportOnFailure: true, - all: true, - reporter: ["text", "json", "json-summary"] - } - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vdml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvZW5lcy9EZXNrdG9wL1Byb2plY3RzL3dhbGxldGNvbm5lY3Qvd2ViM21vZGFsXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvZW5lcy9EZXNrdG9wL1Byb2plY3RzL3dhbGxldGNvbm5lY3Qvd2ViM21vZGFsL3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9lbmVzL0Rlc2t0b3AvUHJvamVjdHMvd2FsbGV0Y29ubmVjdC93ZWIzbW9kYWwvdml0ZS5jb25maWcudHNcIjsvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGVzdFwiIC8+XG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJ1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICB0ZXN0OiB7XG4gICAgY292ZXJhZ2U6IHtcbiAgICAgIHByb3ZpZGVyOiAndjgnLFxuICAgICAgcmVwb3J0T25GYWlsdXJlOiB0cnVlLFxuICAgICAgYWxsOiB0cnVlLFxuICAgICAgcmVwb3J0ZXI6IFsndGV4dCcsICdqc29uJywgJ2pzb24tc3VtbWFyeSddXG4gICAgfVxuICB9XG59KVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUNBLFNBQVMsb0JBQW9CO0FBRTdCLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQzFCLE1BQU07QUFBQSxJQUNKLFVBQVU7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLGlCQUFpQjtBQUFBLE1BQ2pCLEtBQUs7QUFBQSxNQUNMLFVBQVUsQ0FBQyxRQUFRLFFBQVEsY0FBYztBQUFBLElBQzNDO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg== From d2c095b3fd079f13604bc14a938e04209508aaad Mon Sep 17 00:00:00 2001 From: enesozturk Date: Thu, 3 Oct 2024 16:12:39 +0300 Subject: [PATCH 13/30] chore: update core deps for path exports and vue --- packages/appkit/package.json | 2 +- packages/core/package.json | 13 ++++++++++++- pnpm-lock.yaml | 35 ++++++++++++++++++++++++----------- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/packages/appkit/package.json b/packages/appkit/package.json index 1eb9060ffc..301b6f9b27 100644 --- a/packages/appkit/package.json +++ b/packages/appkit/package.json @@ -115,7 +115,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "vitest": "2.0.5", - "vue": "3.4.3" + "vue": "3.x" }, "author": "Reown (https://reown.com)", "license": "Apache-2.0", diff --git a/packages/core/package.json b/packages/core/package.json index 8446fb92e1..2b5934c685 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -33,6 +33,16 @@ "default": "./dist/esm/exports/vue.js" } }, + "typesVersions": { + "*": { + "react": [ + "./dist/types/exports/react.d.ts" + ], + "vue": [ + "./dist/types/exports/vue.d.ts" + ] + } + }, "dependencies": { "@reown/appkit-common": "workspace:*", "@reown/appkit-wallet": "workspace:*", @@ -44,7 +54,8 @@ }, "devDependencies": { "vitest": "2.0.5", - "@vitest/coverage-v8": "2.0.5" + "@vitest/coverage-v8": "2.0.5", + "vue": "3.x" }, "author": "Reown (https://reown.com)", "license": "Apache-2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0394b1f9c1..6db45db66e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1166,7 +1166,7 @@ importers: specifier: 2.0.5 version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.33.0) vue: - specifier: 3.4.3 + specifier: 3.x version: 3.4.3(typescript@5.3.3) packages/appkit-utils: @@ -1289,6 +1289,9 @@ importers: vitest: specifier: 2.0.5 version: 2.0.5(@types/node@20.11.5)(jsdom@24.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.33.0) + vue: + specifier: 3.x + version: 3.4.3(typescript@5.3.3) packages/ethers: dependencies: @@ -23020,8 +23023,8 @@ snapshots: '@typescript-eslint/parser': 6.18.1(eslint@8.57.0)(typescript@5.3.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0) eslint-plugin-react: 7.36.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -23063,19 +23066,19 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -23093,14 +23096,24 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.18.1(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.18.1(eslint@8.57.0)(typescript@5.3.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -23132,7 +23145,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -23143,7 +23156,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.18.1(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -23154,7 +23167,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.18.1(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.18.1(eslint@8.56.0)(typescript@5.3.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack From 422e8da7e16359b1dee519f4ee880fe2320a068c Mon Sep 17 00:00:00 2001 From: enesozturk Date: Thu, 3 Oct 2024 16:24:08 +0300 Subject: [PATCH 14/30] chore: GH code review and lab issues --- .../src/components/Ethers/Ethers5TransactionTest.tsx | 2 +- .../src/components/Ethers/Ethers5WriteContractTest.tsx | 4 ++-- .../src/components/Ethers/EthersTransactionTest.tsx | 2 +- .../src/components/Ethers/EthersWriteContractTest.tsx | 4 ++-- apps/laboratory/src/components/Solana/SolanaTests.tsx | 5 ++--- .../src/components/Solana/SolanaWriteContractTest.tsx | 2 +- .../src/components/UPA/UpaSolanaSignMessageTest.tsx | 2 +- apps/laboratory/src/utils/EthersConstants.ts | 4 ++-- apps/laboratory/src/utils/SiweUtils.ts | 2 +- apps/laboratory/src/utils/SolanaConstants.ts | 4 ++-- package.json | 2 +- packages/appkit-utils/src/CaipNetworkUtil.ts | 8 +++++++- 12 files changed, 23 insertions(+), 18 deletions(-) diff --git a/apps/laboratory/src/components/Ethers/Ethers5TransactionTest.tsx b/apps/laboratory/src/components/Ethers/Ethers5TransactionTest.tsx index cbefc5d5ba..9c0ca636e4 100644 --- a/apps/laboratory/src/components/Ethers/Ethers5TransactionTest.tsx +++ b/apps/laboratory/src/components/Ethers/Ethers5TransactionTest.tsx @@ -49,7 +49,7 @@ export function Ethers5TransactionTest() { } } - return Number(chainId) !== mainnet.chainId && address ? ( + return chainId !== mainnet.id && address ? (