From 731bb1e4b7ecd0ef48fb69ecebc69c24eed03705 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Mon, 25 Aug 2025 09:25:48 +0100 Subject: [PATCH 01/24] feat: prototype for modular architecture, sui example --- packages/wallet-management/package.json | 4 +- .../src/components/SuiListItemButton.tsx | 6 +- .../wallet-management/src/hooks/useAccount.ts | 4 +- .../src/hooks/useAccountDisconnect.ts | 4 +- .../src/hooks/useCombinedWallets.ts | 4 +- packages/wallet-provider-sui/package.json | 24 ++++++ packages/wallet-provider-sui/src/index.ts | 1 + .../src/providers}/SuiBaseProvider.tsx | 9 +-- .../src/providers}/SuiExternalContext.ts | 0 .../src/providers/SuiProvider.tsx | 70 ++++++++++++++++ packages/wallet-provider-sui/tsconfig.json | 13 +++ packages/wallet-store/package.json | 19 +++++ packages/wallet-store/src/index.ts | 6 ++ packages/wallet-store/src/stores/suiStore.ts | 21 +++++ .../src/stores/suiStoreZustand.ts | 24 ++++++ packages/wallet-store/src/useWalletStore.ts | 7 ++ packages/wallet-store/tsconfig.json | 13 +++ packages/widget-playground/package.json | 1 + packages/widget/package.json | 3 +- .../providers/WalletProvider/SDKProviders.tsx | 4 +- .../providers/WalletProvider/SuiProvider.tsx | 26 ------ .../WalletProvider/WalletProvider.tsx | 2 +- .../useExternalWalletProvider.ts | 6 +- packages/widget/src/utils/chainType.ts | 2 +- pnpm-lock.yaml | 80 ++++++++++++++++--- 25 files changed, 290 insertions(+), 63 deletions(-) create mode 100644 packages/wallet-provider-sui/package.json create mode 100644 packages/wallet-provider-sui/src/index.ts rename packages/{widget/src/providers/WalletProvider => wallet-provider-sui/src/providers}/SuiBaseProvider.tsx (67%) rename packages/{widget/src/providers/WalletProvider => wallet-provider-sui/src/providers}/SuiExternalContext.ts (100%) create mode 100644 packages/wallet-provider-sui/src/providers/SuiProvider.tsx create mode 100644 packages/wallet-provider-sui/tsconfig.json create mode 100644 packages/wallet-store/package.json create mode 100644 packages/wallet-store/src/index.ts create mode 100644 packages/wallet-store/src/stores/suiStore.ts create mode 100644 packages/wallet-store/src/stores/suiStoreZustand.ts create mode 100644 packages/wallet-store/src/useWalletStore.ts create mode 100644 packages/wallet-store/tsconfig.json delete mode 100644 packages/widget/src/providers/WalletProvider/SuiProvider.tsx diff --git a/packages/wallet-management/package.json b/packages/wallet-management/package.json index b1a7c3bb9..3770e5398 100644 --- a/packages/wallet-management/package.json +++ b/packages/wallet-management/package.json @@ -76,12 +76,12 @@ }, "peerDependencies": { "@bigmi/react": ">=0.4.0", - "@mysten/dapp-kit": ">=0.17.0", "@solana/wallet-adapter-react": ">=0.15.35", "@tanstack/react-query": ">=5.68.0", "react": ">=18", "react-dom": ">=18", - "wagmi": ">=2.14.0" + "wagmi": ">=2.14.0", + "@lifi/wallet-store": "workspace:*" }, "files": [ "dist/**", diff --git a/packages/wallet-management/src/components/SuiListItemButton.tsx b/packages/wallet-management/src/components/SuiListItemButton.tsx index a714d58a9..6735b7278 100644 --- a/packages/wallet-management/src/components/SuiListItemButton.tsx +++ b/packages/wallet-management/src/components/SuiListItemButton.tsx @@ -1,5 +1,5 @@ import { ChainId, ChainType } from '@lifi/sdk' -import { useConnectWallet } from '@mysten/dapp-kit' +import { useWalletStore } from '@lifi/wallet-store' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' @@ -22,7 +22,7 @@ export const SuiListItemButton = ({ onError, }: SuiListItemButtonProps) => { const emitter = useWalletManagementEvents() - const { mutateAsync: connect } = useConnectWallet() + const { connectWallet: connect } = useWalletStore(ChainType.MVM) const { setLastConnectedAccount } = useLastConnectedAccount() const connectorName = wallet.name @@ -39,7 +39,7 @@ export const SuiListItemButton = ({ await connect( { wallet }, { - onSuccess: (standardConnectOutput) => { + onSuccess: (standardConnectOutput: any) => { setLastConnectedAccount(wallet) emitter.emit(WalletManagementEvent.WalletConnected, { address: standardConnectOutput.accounts[0].address, diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index cef5a09bf..f07ff5466 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -1,7 +1,7 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { useAccount as useBigmiAccount } from '@bigmi/react' import { ChainId, ChainType } from '@lifi/sdk' -import { useCurrentWallet } from '@mysten/dapp-kit' +import { useWalletStore } from '@lifi/wallet-store' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import type { WalletAdapter } from '@solana/wallet-adapter-base' import { useWallet } from '@solana/wallet-adapter-react' @@ -90,7 +90,7 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { const bigmiAccount = useBigmiAccount() const wagmiAccount = useAccountInternal() const { wallet } = useWallet() - const { currentWallet, connectionStatus } = useCurrentWallet() + const { currentWallet, connectionStatus } = useWalletStore(ChainType.MVM) const { lastConnectedAccount } = useLastConnectedAccount() // biome-ignore lint/correctness/useExhaustiveDependencies: run only when wallet changes diff --git a/packages/wallet-management/src/hooks/useAccountDisconnect.ts b/packages/wallet-management/src/hooks/useAccountDisconnect.ts index a0e1e7c26..e410bc276 100644 --- a/packages/wallet-management/src/hooks/useAccountDisconnect.ts +++ b/packages/wallet-management/src/hooks/useAccountDisconnect.ts @@ -5,7 +5,7 @@ import { } from '@bigmi/client' import { useConfig as useBigmiConfig } from '@bigmi/react' import { ChainType } from '@lifi/sdk' -import { useDisconnectWallet } from '@mysten/dapp-kit' +import { useWalletStore } from '@lifi/wallet-store' import { useWallet } from '@solana/wallet-adapter-react' import type { Config } from 'wagmi' import { useConfig as useWagmiConfig } from 'wagmi' @@ -16,7 +16,7 @@ export const useAccountDisconnect = () => { const bigmiConfig = useBigmiConfig() const wagmiConfig = useWagmiConfig() const { disconnect: solanaDisconnect } = useWallet() - const { mutateAsync: disconnectWallet } = useDisconnectWallet() + const { disconnectWallet } = useWalletStore(ChainType.MVM) const handleDisconnectEVM = async (config: Config) => { const connectedAccount = getAccount(config) diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 2092ba59a..04e5a088d 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -1,9 +1,9 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { useConnect as useBigmiConnect } from '@bigmi/react' import { ChainType } from '@lifi/sdk' +import { useWalletStore } from '@lifi/wallet-store' import type { Theme } from '@mui/material' import { useMediaQuery } from '@mui/material' -import { useWallets } from '@mysten/dapp-kit' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import { WalletReadyState } from '@solana/wallet-adapter-base' import type { Wallet } from '@solana/wallet-adapter-react' @@ -134,7 +134,7 @@ export const useCombinedWallets = () => { const { connectors: wagmiConnectors } = useConnect() const { connectors: bigmiConnectors } = useBigmiConnect() const { wallets: solanaWallets } = useWallet() - const suiWallets = useWallets() + const { suiWallets } = useWalletStore(ChainType.MVM) const [combinedWallets, setCombinedWallets] = useState( () => { return { diff --git a/packages/wallet-provider-sui/package.json b/packages/wallet-provider-sui/package.json new file mode 100644 index 000000000..80adb68fa --- /dev/null +++ b/packages/wallet-provider-sui/package.json @@ -0,0 +1,24 @@ +{ + "name": "@lifi/wallet-provider-sui", + "version": "1.0.0", + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.d.ts", + "dependencies": { + "@mysten/sui": "^1.37.3", + "@mysten/wallet-standard": "^0.16.11" + }, + "peerDependencies": { + "@mysten/dapp-kit": "^0.17.4", + "@lifi/wallet-store": "workspace:*" + }, + "devDependencies": { + "react": "^19.1.1", + "typescript": "^5.9.2" + }, + "files": [ + "dist/**", + "src/**", + "!tsconfig.json" + ] +} diff --git a/packages/wallet-provider-sui/src/index.ts b/packages/wallet-provider-sui/src/index.ts new file mode 100644 index 000000000..2ecc249c8 --- /dev/null +++ b/packages/wallet-provider-sui/src/index.ts @@ -0,0 +1 @@ +export { SuiProvider } from './providers/SuiProvider.js' diff --git a/packages/widget/src/providers/WalletProvider/SuiBaseProvider.tsx b/packages/wallet-provider-sui/src/providers/SuiBaseProvider.tsx similarity index 67% rename from packages/widget/src/providers/WalletProvider/SuiBaseProvider.tsx rename to packages/wallet-provider-sui/src/providers/SuiBaseProvider.tsx index 2d373036e..e680790b9 100644 --- a/packages/widget/src/providers/WalletProvider/SuiBaseProvider.tsx +++ b/packages/wallet-provider-sui/src/providers/SuiBaseProvider.tsx @@ -1,4 +1,3 @@ -import { ChainId } from '@lifi/sdk' import { createNetworkConfig, SuiClientProvider, @@ -6,17 +5,13 @@ import { } from '@mysten/dapp-kit' import { getFullnodeUrl } from '@mysten/sui/client' import { type FC, type PropsWithChildren, useMemo } from 'react' -import { useAvailableChains } from '../../hooks/useAvailableChains.js' export const SuiBaseProvider: FC = ({ children }) => { - const { chains } = useAvailableChains() - const config = useMemo(() => { - const sui = chains?.find((chain) => chain.id === ChainId.SUI) return createNetworkConfig({ - mainnet: { url: sui?.metamask?.rpcUrls[0] ?? getFullnodeUrl('mainnet') }, + mainnet: { url: getFullnodeUrl('mainnet') }, }) - }, [chains]) + }, []) return ( diff --git a/packages/widget/src/providers/WalletProvider/SuiExternalContext.ts b/packages/wallet-provider-sui/src/providers/SuiExternalContext.ts similarity index 100% rename from packages/widget/src/providers/WalletProvider/SuiExternalContext.ts rename to packages/wallet-provider-sui/src/providers/SuiExternalContext.ts diff --git a/packages/wallet-provider-sui/src/providers/SuiProvider.tsx b/packages/wallet-provider-sui/src/providers/SuiProvider.tsx new file mode 100644 index 000000000..06698a6fc --- /dev/null +++ b/packages/wallet-provider-sui/src/providers/SuiProvider.tsx @@ -0,0 +1,70 @@ +import { setSuiValues } from '@lifi/wallet-store' +import { + SuiClientContext, + useConnectWallet, + useCurrentWallet, + useDisconnectWallet, + useWallets, +} from '@mysten/dapp-kit' +import { type FC, type PropsWithChildren, useContext, useEffect } from 'react' +import { SuiBaseProvider } from './SuiBaseProvider.js' +import { SuiExternalContext } from './SuiExternalContext.js' + +export function useInSuiContext(): boolean { + const context = useContext(SuiClientContext) + + return Boolean(context) +} + +export const SuiProviderWrapper: FC = ({ children }) => { + const inSuiContext = useInSuiContext() + + return inSuiContext ? ( + + {children} + + ) : ( + {children} + ) +} + +export const SuiProvider: FC = ({ children }) => { + const inSuiContext = useInSuiContext() + + return ( + + + {children} + + + ) +} + +const CaptureSuiValues: FC< + PropsWithChildren<{ isExternalContext: boolean }> +> = ({ children, isExternalContext }) => { + const suiWallets = useWallets() + const { currentWallet, connectionStatus } = useCurrentWallet() + const { mutateAsync: disconnectWallet } = useDisconnectWallet() + const { mutateAsync: connectWallet } = useConnectWallet() + + useEffect(() => { + setSuiValues({ + suiWallets, + currentWallet, + connectionStatus, + connectWallet, + disconnectWallet, + isExternalContext, + }) + }, [ + suiWallets, + currentWallet, + connectionStatus, + connectWallet, + disconnectWallet, + isExternalContext, + ]) + + return children +} diff --git a/packages/wallet-provider-sui/tsconfig.json b/packages/wallet-provider-sui/tsconfig.json new file mode 100644 index 000000000..8e1598c91 --- /dev/null +++ b/packages/wallet-provider-sui/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "declaration": true, + "sourceMap": true, + "outDir": "dist/esm", + "rootDir": "./src", + "module": "ESNext", + "moduleResolution": "Bundler" + }, + "include": ["./src/**/*", "./src/**/*.json"] +} diff --git a/packages/wallet-store/package.json b/packages/wallet-store/package.json new file mode 100644 index 000000000..8b16a4a63 --- /dev/null +++ b/packages/wallet-store/package.json @@ -0,0 +1,19 @@ +{ + "name": "@lifi/wallet-store", + "version": "1.0.0", + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.d.ts", + "dependencies": { + "zustand": "^4.5.0" + }, + "devDependencies": { + "react": "^19.1.1", + "typescript": "^5.9.2" + }, + "files": [ + "dist/**", + "src/**", + "!tsconfig.json" + ] +} diff --git a/packages/wallet-store/src/index.ts b/packages/wallet-store/src/index.ts new file mode 100644 index 000000000..2c13bf6f3 --- /dev/null +++ b/packages/wallet-store/src/index.ts @@ -0,0 +1,6 @@ +// export { setSuiValues } from './stores/suiStore.js' +export { + setSuiValues, + useSuiStore, +} from './stores/suiStoreZustand.js' +export { useWalletStore } from './useWalletStore.js' diff --git a/packages/wallet-store/src/stores/suiStore.ts b/packages/wallet-store/src/stores/suiStore.ts new file mode 100644 index 000000000..4d043a4b3 --- /dev/null +++ b/packages/wallet-store/src/stores/suiStore.ts @@ -0,0 +1,21 @@ +import { useSyncExternalStore } from 'react' + +let suiValues = {} +const listeners = new Set() + +export const setSuiValues = (values: any) => { + suiValues = values + listeners.forEach((fn: any) => { + fn() + }) +} + +export const useSuiValues = () => { + return useSyncExternalStore( + (callback) => { + listeners.add(callback) + return () => listeners.delete(callback) + }, + () => suiValues + ) +} diff --git a/packages/wallet-store/src/stores/suiStoreZustand.ts b/packages/wallet-store/src/stores/suiStoreZustand.ts new file mode 100644 index 000000000..5de2115c9 --- /dev/null +++ b/packages/wallet-store/src/stores/suiStoreZustand.ts @@ -0,0 +1,24 @@ +import { create } from 'zustand' + +interface SuiValues { + suiWallets?: any + currentWallet?: any + connectionStatus?: any + connectWallet?: any + disconnectWallet?: any + isExternalContext?: boolean +} + +interface SuiStore { + suiValues: SuiValues + setSuiValues: (values: SuiValues) => void +} + +export const useSuiStore = create((set) => ({ + suiValues: {}, + setSuiValues: (values: SuiValues) => set({ suiValues: values }), +})) + +export const setSuiValues = (values: SuiValues): void => { + useSuiStore.getState().setSuiValues(values) +} diff --git a/packages/wallet-store/src/useWalletStore.ts b/packages/wallet-store/src/useWalletStore.ts new file mode 100644 index 000000000..80ed18968 --- /dev/null +++ b/packages/wallet-store/src/useWalletStore.ts @@ -0,0 +1,7 @@ +import { useSuiStore } from './stores/suiStoreZustand.js' + +export const useWalletStore = (chainType: string) => { + const suiSnapshot = useSuiStore((state) => state.suiValues) + const store: Record = { MVM: suiSnapshot } + return chainType ? store[chainType as keyof typeof store] : store +} diff --git a/packages/wallet-store/tsconfig.json b/packages/wallet-store/tsconfig.json new file mode 100644 index 000000000..e187e5655 --- /dev/null +++ b/packages/wallet-store/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "declaration": true, + "sourceMap": true, + "outDir": "dist/esm", + "rootDir": "./src", + "module": "ESNext", + "moduleResolution": "Bundler" + }, + "include": ["./src/**/*", "./src/**/*.json", "src/stores/suiStore.ts"] +} diff --git a/packages/widget-playground/package.json b/packages/widget-playground/package.json index c953e31c9..3fc773d8e 100644 --- a/packages/widget-playground/package.json +++ b/packages/widget-playground/package.json @@ -32,6 +32,7 @@ "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.10.1", "@lifi/wallet-management": "workspace:*", + "@lifi/wallet-provider-sui": "workspace:*", "@lifi/widget": "workspace:*", "@monaco-editor/react": "^4.7.0", "@mui/icons-material": "^7.3.1", diff --git a/packages/widget/package.json b/packages/widget/package.json index ed6003185..e5ee5fb3c 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -55,6 +55,8 @@ "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.10.1", "@lifi/wallet-management": "workspace:^", + "@lifi/wallet-provider-sui": "workspace:^", + "@lifi/wallet-store": "workspace:^", "@mui/icons-material": "^7.3.1", "@mui/material": "^7.3.1", "@mui/system": "^7.3.1", @@ -84,7 +86,6 @@ }, "peerDependencies": { "@bigmi/react": ">=0.4.0", - "@mysten/dapp-kit": ">=0.17.0", "@solana/wallet-adapter-react": ">=0.15.35", "@tanstack/react-query": ">=5.68.0", "react": ">=18", diff --git a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx index f9defd968..b2490acf6 100644 --- a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx +++ b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx @@ -2,7 +2,7 @@ import { getConnectorClient as getBigmiConnectorClient } from '@bigmi/client' import { useConfig as useBigmiConfig } from '@bigmi/react' import type { SDKProvider } from '@lifi/sdk' import { ChainType, config, EVM, Solana, Sui, UTXO } from '@lifi/sdk' -import { useCurrentWallet } from '@mysten/dapp-kit' +import { useWalletStore } from '@lifi/wallet-store' import type { SignerWalletAdapter } from '@solana/wallet-adapter-base' import { useWallet } from '@solana/wallet-adapter-react' import { useEffect } from 'react' @@ -18,7 +18,7 @@ export const SDKProviders = () => { const { wallet } = useWallet() const wagmiConfig = useWagmiConfig() const bigmiConfig = useBigmiConfig() - const { currentWallet } = useCurrentWallet() + const { currentWallet } = useWalletStore(ChainType.MVM) useEffect(() => { // Configure SDK Providers diff --git a/packages/widget/src/providers/WalletProvider/SuiProvider.tsx b/packages/widget/src/providers/WalletProvider/SuiProvider.tsx deleted file mode 100644 index 1891b9ed8..000000000 --- a/packages/widget/src/providers/WalletProvider/SuiProvider.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { ChainType } from '@lifi/sdk' -import { SuiClientContext } from '@mysten/dapp-kit' -import { type FC, type PropsWithChildren, useContext } from 'react' -import { isItemAllowed } from '../../utils/item.js' -import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' -import { SuiBaseProvider } from './SuiBaseProvider.js' -import { SuiExternalContext } from './SuiExternalContext.js' - -export function useInSuiContext(): boolean { - const { chains } = useWidgetConfig() - const context = useContext(SuiClientContext) - - return Boolean(context) && isItemAllowed(ChainType.MVM, chains?.types) -} - -export const SuiProvider: FC = ({ children }) => { - const inSuiContext = useInSuiContext() - - return inSuiContext ? ( - - {children} - - ) : ( - {children} - ) -} diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index 63df77d10..2b64f8c6b 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -1,11 +1,11 @@ import type { WalletManagementConfig } from '@lifi/wallet-management' import { WalletManagementProvider } from '@lifi/wallet-management' +import { SuiProvider } from '@lifi/wallet-provider-sui' import { type FC, type PropsWithChildren, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' import { EVMProvider } from './EVMProvider.js' import { SDKProviders } from './SDKProviders.js' -import { SuiProvider } from './SuiProvider.js' import { SVMProvider } from './SVMProvider.js' import { UTXOProvider } from './UTXOProvider.js' import { useExternalWalletProvider } from './useExternalWalletProvider.js' diff --git a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts index 2effc96b5..929db295d 100644 --- a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts +++ b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts @@ -1,8 +1,8 @@ import { ChainType } from '@lifi/sdk' +import { useWalletStore } from '@lifi/wallet-store' import { useContext, useMemo } from 'react' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' import { EVMExternalContext } from './EVMExternalContext.js' -import { SuiExternalContext } from './SuiExternalContext.js' import { SVMExternalContext } from './SVMExternalContext.js' import { UTXOExternalContext } from './UTXOExternalContext.js' @@ -24,7 +24,9 @@ export function useExternalWalletProvider(): ExternalWalletProvider { const hasExternalEVMContext = useContext(EVMExternalContext) const hasExternalSVMContext = useContext(SVMExternalContext) const hasExternalUTXOContext = useContext(UTXOExternalContext) - const hasExternalSuiContext = useContext(SuiExternalContext) + const { isExternalContext: hasExternalSuiContext } = useWalletStore( + ChainType.MVM + ) const data = useMemo(() => { const providers: ChainType[] = [] if (hasExternalEVMContext) { diff --git a/packages/widget/src/utils/chainType.ts b/packages/widget/src/utils/chainType.ts index 8a31bbb58..0d88b52d5 100644 --- a/packages/widget/src/utils/chainType.ts +++ b/packages/widget/src/utils/chainType.ts @@ -1,6 +1,6 @@ import { isUTXOAddress } from '@bigmi/core' import { ChainId, ChainType, isSVMAddress } from '@lifi/sdk' -import { isValidSuiAddress } from '@mysten/sui/utils' +import { isValidSuiAddress } from '@mysten/sui/utils' // TODO: move to @lifi/sdk import { isAddress as isEVMAddress } from 'viem' const chainTypeAddressValidation = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc75db8f5..afe5144a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -929,6 +929,9 @@ importers: '@lifi/sdk': specifier: ^3.10.1 version: 3.10.1(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.10)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + '@lifi/wallet-store': + specifier: workspace:* + version: link:../wallet-store '@mui/icons-material': specifier: ^7.3.1 version: 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) @@ -938,9 +941,6 @@ importers: '@mui/system': specifier: ^7.3.1 version: 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mysten/dapp-kit': - specifier: '>=0.17.0' - version: 0.17.4(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) '@mysten/wallet-standard': specifier: ^0.16.11 version: 0.16.11(typescript@5.9.2) @@ -997,6 +997,41 @@ importers: specifier: ^5.9.2 version: 5.9.2 + packages/wallet-provider-sui: + dependencies: + '@lifi/wallet-store': + specifier: workspace:* + version: link:../wallet-store + '@mysten/dapp-kit': + specifier: ^0.17.4 + version: 0.17.4(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@mysten/sui': + specifier: ^1.37.3 + version: 1.37.3(typescript@5.9.2) + '@mysten/wallet-standard': + specifier: ^0.16.11 + version: 0.16.11(typescript@5.9.2) + devDependencies: + react: + specifier: ^19.1.1 + version: 19.1.1 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + + packages/wallet-store: + dependencies: + zustand: + specifier: ^4.5.0 + version: 4.5.7(@types/react@19.1.10)(react@19.1.1) + devDependencies: + react: + specifier: ^19.1.1 + version: 19.1.1 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + packages/widget: dependencies: '@bigmi/client': @@ -1020,6 +1055,12 @@ importers: '@lifi/wallet-management': specifier: workspace:^ version: link:../wallet-management + '@lifi/wallet-provider-sui': + specifier: workspace:^ + version: link:../wallet-provider-sui + '@lifi/wallet-store': + specifier: workspace:^ + version: link:../wallet-store '@mui/icons-material': specifier: ^7.3.1 version: 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) @@ -1029,9 +1070,6 @@ importers: '@mui/system': specifier: ^7.3.1 version: 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mysten/dapp-kit': - specifier: '>=0.17.0' - version: 0.17.4(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react-dom@19.1.7(@types/react@19.1.10))(@types/react@19.1.10)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) '@mysten/sui': specifier: ^1.37.3 version: 1.37.3(typescript@5.9.2) @@ -1196,6 +1234,9 @@ importers: '@lifi/wallet-management': specifier: workspace:* version: link:../wallet-management + '@lifi/wallet-provider-sui': + specifier: workspace:* + version: link:../wallet-provider-sui '@lifi/widget': specifier: workspace:* version: link:../widget @@ -23036,7 +23077,7 @@ snapshots: '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) '@walletconnect/ethereum-provider': 2.21.1(@netlify/blobs@9.1.2)(@types/react@19.1.10)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.7.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' viem: 2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -23079,7 +23120,7 @@ snapshots: '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.1.10)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' viem: 2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -23114,6 +23155,21 @@ snapshots: - utf-8-validate - zod + '@wagmi/core@2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.9.2) + viem: 2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@19.1.10)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) + optionalDependencies: + '@tanstack/query-core': 5.85.5 + typescript: 5.9.2 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + '@wagmi/core@2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: eventemitter3: 5.0.1 @@ -27246,7 +27302,7 @@ snapshots: extension-port-stream@3.0.0: dependencies: - readable-stream: 3.6.2 + readable-stream: 4.7.0 webextension-polyfill: 0.10.0 externality@1.0.2: @@ -33639,7 +33695,7 @@ snapshots: dependencies: '@tanstack/react-query': 5.85.5(react@19.1.1) '@wagmi/connectors': 5.9.4(@netlify/blobs@9.1.2)(@react-native-async-storage/async-storage@1.24.0(react-native@0.74.0(@babel/core@7.28.3)(@babel/preset-env@7.28.3(@babel/core@7.28.3))(@types/react@19.1.10)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(utf-8-validate@5.0.10)))(@types/react@19.1.10)(@wagmi/core@2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.7.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 19.1.1 use-sync-external-store: 1.4.0(react@19.1.1) viem: 2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -33677,7 +33733,7 @@ snapshots: dependencies: '@tanstack/react-query': 5.85.5(react@19.1.1) '@wagmi/connectors': 5.9.4(@netlify/blobs@9.1.2)(@types/react@19.1.10)(@wagmi/core@2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.7.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 19.1.1 use-sync-external-store: 1.4.0(react@19.1.1) viem: 2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -33715,7 +33771,7 @@ snapshots: dependencies: '@tanstack/react-query': 5.85.5(react@19.1.1) '@wagmi/connectors': 5.9.4(@types/react@19.1.10)(@wagmi/core@2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/core': 2.19.0(@tanstack/query-core@5.85.5)(@types/react@19.1.10)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 19.1.1 use-sync-external-store: 1.4.0(react@19.1.1) viem: 2.34.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) From 44401aad0baf81e1843ee90e499133a57966c9e7 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Fri, 29 Aug 2025 12:08:01 +0100 Subject: [PATCH 02/24] feat: replace stores with context --- .../src/components/SuiListItemButton.tsx | 4 +- .../wallet-management/src/hooks/useAccount.ts | 4 +- .../src/hooks/useAccountDisconnect.ts | 4 +- .../src/hooks/useCombinedWallets.ts | 4 +- .../src/providers/SuiProvider.tsx | 37 ++++++++----------- .../wallet-store/src/contexts/suiContext.ts | 7 ++++ packages/wallet-store/src/index.ts | 7 +--- packages/wallet-store/src/stores/suiStore.ts | 21 ----------- .../src/stores/suiStoreZustand.ts | 24 ------------ packages/wallet-store/src/useWalletStore.ts | 7 ---- .../providers/WalletProvider/SDKProviders.tsx | 4 +- .../useExternalWalletProvider.ts | 6 +-- 12 files changed, 36 insertions(+), 93 deletions(-) create mode 100644 packages/wallet-store/src/contexts/suiContext.ts delete mode 100644 packages/wallet-store/src/stores/suiStore.ts delete mode 100644 packages/wallet-store/src/stores/suiStoreZustand.ts delete mode 100644 packages/wallet-store/src/useWalletStore.ts diff --git a/packages/wallet-management/src/components/SuiListItemButton.tsx b/packages/wallet-management/src/components/SuiListItemButton.tsx index 6735b7278..101d8a52f 100644 --- a/packages/wallet-management/src/components/SuiListItemButton.tsx +++ b/packages/wallet-management/src/components/SuiListItemButton.tsx @@ -1,5 +1,5 @@ import { ChainId, ChainType } from '@lifi/sdk' -import { useWalletStore } from '@lifi/wallet-store' +import { useSuiContext } from '@lifi/wallet-store' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' @@ -22,7 +22,7 @@ export const SuiListItemButton = ({ onError, }: SuiListItemButtonProps) => { const emitter = useWalletManagementEvents() - const { connectWallet: connect } = useWalletStore(ChainType.MVM) + const { connectWallet: connect } = useSuiContext() const { setLastConnectedAccount } = useLastConnectedAccount() const connectorName = wallet.name diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index 6800d90cb..e284907bb 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -1,7 +1,7 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { useAccount as useBigmiAccount } from '@bigmi/react' import { ChainId, ChainType } from '@lifi/sdk' -import { useWalletStore } from '@lifi/wallet-store' +import { useSuiContext } from '@lifi/wallet-store' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import type { WalletAdapter } from '@solana/wallet-adapter-base' import { useWallet } from '@solana/wallet-adapter-react' @@ -90,7 +90,7 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { const bigmiAccount = useBigmiAccount() const wagmiAccount = useAccountInternal() const { wallet } = useWallet() - const { currentWallet, connectionStatus } = useWalletStore(ChainType.MVM) + const { currentWallet, connectionStatus } = useSuiContext() const { lastConnectedAccount } = useLastConnectedAccount() // biome-ignore lint/correctness/useExhaustiveDependencies: run only when wallet changes diff --git a/packages/wallet-management/src/hooks/useAccountDisconnect.ts b/packages/wallet-management/src/hooks/useAccountDisconnect.ts index e410bc276..7d4c00dee 100644 --- a/packages/wallet-management/src/hooks/useAccountDisconnect.ts +++ b/packages/wallet-management/src/hooks/useAccountDisconnect.ts @@ -5,7 +5,7 @@ import { } from '@bigmi/client' import { useConfig as useBigmiConfig } from '@bigmi/react' import { ChainType } from '@lifi/sdk' -import { useWalletStore } from '@lifi/wallet-store' +import { useSuiContext } from '@lifi/wallet-store' import { useWallet } from '@solana/wallet-adapter-react' import type { Config } from 'wagmi' import { useConfig as useWagmiConfig } from 'wagmi' @@ -16,7 +16,7 @@ export const useAccountDisconnect = () => { const bigmiConfig = useBigmiConfig() const wagmiConfig = useWagmiConfig() const { disconnect: solanaDisconnect } = useWallet() - const { disconnectWallet } = useWalletStore(ChainType.MVM) + const { disconnectWallet } = useSuiContext() const handleDisconnectEVM = async (config: Config) => { const connectedAccount = getAccount(config) diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 04e5a088d..43d3f18e8 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -1,7 +1,7 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { useConnect as useBigmiConnect } from '@bigmi/react' import { ChainType } from '@lifi/sdk' -import { useWalletStore } from '@lifi/wallet-store' +import { useSuiContext } from '@lifi/wallet-store' import type { Theme } from '@mui/material' import { useMediaQuery } from '@mui/material' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' @@ -134,7 +134,7 @@ export const useCombinedWallets = () => { const { connectors: wagmiConnectors } = useConnect() const { connectors: bigmiConnectors } = useBigmiConnect() const { wallets: solanaWallets } = useWallet() - const { suiWallets } = useWalletStore(ChainType.MVM) + const { suiWallets } = useSuiContext() const [combinedWallets, setCombinedWallets] = useState( () => { return { diff --git a/packages/wallet-provider-sui/src/providers/SuiProvider.tsx b/packages/wallet-provider-sui/src/providers/SuiProvider.tsx index cb82d5cef..a951a818f 100644 --- a/packages/wallet-provider-sui/src/providers/SuiProvider.tsx +++ b/packages/wallet-provider-sui/src/providers/SuiProvider.tsx @@ -1,4 +1,4 @@ -import { setSuiValues } from '@lifi/wallet-store' +import { SuiContext } from '@lifi/wallet-store' import { SuiClientContext, useConnectWallet, @@ -6,7 +6,7 @@ import { useDisconnectWallet, useWallets, } from '@mysten/dapp-kit' -import { type FC, type PropsWithChildren, useContext, useEffect } from 'react' +import { type FC, type PropsWithChildren, useContext } from 'react' import { SuiBaseProvider } from './SuiBaseProvider.js' import { SuiExternalContext } from './SuiExternalContext.js' @@ -54,23 +54,18 @@ const CaptureSuiValues: FC< const { mutateAsync: disconnectWallet } = useDisconnectWallet() const { mutateAsync: connectWallet } = useConnectWallet() - useEffect(() => { - setSuiValues({ - suiWallets, - currentWallet, - connectionStatus, - connectWallet, - disconnectWallet, - isExternalContext, - }) - }, [ - suiWallets, - currentWallet, - connectionStatus, - connectWallet, - disconnectWallet, - isExternalContext, - ]) - - return children + return ( + + {children} + + ) } diff --git a/packages/wallet-store/src/contexts/suiContext.ts b/packages/wallet-store/src/contexts/suiContext.ts new file mode 100644 index 000000000..039d07210 --- /dev/null +++ b/packages/wallet-store/src/contexts/suiContext.ts @@ -0,0 +1,7 @@ +import { createContext, useContext } from 'react' + +export const SuiContext = createContext(null) + +export const useSuiContext = () => { + return useContext(SuiContext) +} diff --git a/packages/wallet-store/src/index.ts b/packages/wallet-store/src/index.ts index 2c13bf6f3..12374667f 100644 --- a/packages/wallet-store/src/index.ts +++ b/packages/wallet-store/src/index.ts @@ -1,6 +1 @@ -// export { setSuiValues } from './stores/suiStore.js' -export { - setSuiValues, - useSuiStore, -} from './stores/suiStoreZustand.js' -export { useWalletStore } from './useWalletStore.js' +export { SuiContext, useSuiContext } from './contexts/suiContext.js' diff --git a/packages/wallet-store/src/stores/suiStore.ts b/packages/wallet-store/src/stores/suiStore.ts deleted file mode 100644 index 4d043a4b3..000000000 --- a/packages/wallet-store/src/stores/suiStore.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useSyncExternalStore } from 'react' - -let suiValues = {} -const listeners = new Set() - -export const setSuiValues = (values: any) => { - suiValues = values - listeners.forEach((fn: any) => { - fn() - }) -} - -export const useSuiValues = () => { - return useSyncExternalStore( - (callback) => { - listeners.add(callback) - return () => listeners.delete(callback) - }, - () => suiValues - ) -} diff --git a/packages/wallet-store/src/stores/suiStoreZustand.ts b/packages/wallet-store/src/stores/suiStoreZustand.ts deleted file mode 100644 index 5de2115c9..000000000 --- a/packages/wallet-store/src/stores/suiStoreZustand.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { create } from 'zustand' - -interface SuiValues { - suiWallets?: any - currentWallet?: any - connectionStatus?: any - connectWallet?: any - disconnectWallet?: any - isExternalContext?: boolean -} - -interface SuiStore { - suiValues: SuiValues - setSuiValues: (values: SuiValues) => void -} - -export const useSuiStore = create((set) => ({ - suiValues: {}, - setSuiValues: (values: SuiValues) => set({ suiValues: values }), -})) - -export const setSuiValues = (values: SuiValues): void => { - useSuiStore.getState().setSuiValues(values) -} diff --git a/packages/wallet-store/src/useWalletStore.ts b/packages/wallet-store/src/useWalletStore.ts deleted file mode 100644 index 80ed18968..000000000 --- a/packages/wallet-store/src/useWalletStore.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { useSuiStore } from './stores/suiStoreZustand.js' - -export const useWalletStore = (chainType: string) => { - const suiSnapshot = useSuiStore((state) => state.suiValues) - const store: Record = { MVM: suiSnapshot } - return chainType ? store[chainType as keyof typeof store] : store -} diff --git a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx index b2490acf6..780b1938d 100644 --- a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx +++ b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx @@ -2,7 +2,7 @@ import { getConnectorClient as getBigmiConnectorClient } from '@bigmi/client' import { useConfig as useBigmiConfig } from '@bigmi/react' import type { SDKProvider } from '@lifi/sdk' import { ChainType, config, EVM, Solana, Sui, UTXO } from '@lifi/sdk' -import { useWalletStore } from '@lifi/wallet-store' +import { useSuiContext } from '@lifi/wallet-store' import type { SignerWalletAdapter } from '@solana/wallet-adapter-base' import { useWallet } from '@solana/wallet-adapter-react' import { useEffect } from 'react' @@ -18,7 +18,7 @@ export const SDKProviders = () => { const { wallet } = useWallet() const wagmiConfig = useWagmiConfig() const bigmiConfig = useBigmiConfig() - const { currentWallet } = useWalletStore(ChainType.MVM) + const { currentWallet } = useSuiContext() useEffect(() => { // Configure SDK Providers diff --git a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts index bbd927da9..eda49363e 100644 --- a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts +++ b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts @@ -1,5 +1,5 @@ import { ChainType } from '@lifi/sdk' -import { useWalletStore } from '@lifi/wallet-store' +import { useSuiContext } from '@lifi/wallet-store' import { useContext, useMemo } from 'react' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' import { EVMExternalContext } from './EVMExternalContext.js' @@ -24,9 +24,7 @@ export function useExternalWalletProvider(): ExternalWalletProvider { const hasExternalEVMContext = useContext(EVMExternalContext) const hasExternalSVMContext = useContext(SVMExternalContext) const hasExternalUTXOContext = useContext(UTXOExternalContext) - const { isExternalContext: hasExternalSuiContext } = useWalletStore( - ChainType.MVM - ) + const { isExternalContext: hasExternalSuiContext } = useSuiContext() const data = useMemo(() => { const providers: ChainType[] = [] if (hasExternalEVMContext) { From e609cfba1c0db7ff674a2ad3d30b14229b3d7ed7 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Mon, 1 Sep 2025 07:00:50 +0100 Subject: [PATCH 03/24] feat: solana wallet store and provider --- packages/wallet-management/package.json | 1 - .../src/components/SVMListItemButton.tsx | 10 +- .../src/components/SuiListItemButton.tsx | 2 +- .../wallet-management/src/hooks/useAccount.ts | 29 ++- .../src/hooks/useAccountDisconnect.ts | 11 +- .../src/hooks/useCombinedWallets.ts | 14 +- .../src/providers/SuiExternalContext.ts | 3 - .../src/providers/SuiProvider.tsx | 51 +++-- packages/wallet-provider-svm/package.json | 25 +++ packages/wallet-provider-svm/src/index.ts | 1 + .../src/providers}/SVMBaseProvider.tsx | 0 .../src/providers/SVMProvider.tsx | 64 ++++++ packages/wallet-provider-svm/tsconfig.json | 13 ++ .../wallet-store/src/contexts/SVMContext.ts | 7 + packages/wallet-store/src/index.ts | 3 +- packages/widget/package.json | 2 +- .../providers/WalletProvider/SDKProviders.tsx | 15 +- .../WalletProvider/SVMExternalContext.ts | 3 - .../providers/WalletProvider/SVMProvider.tsx | 29 --- .../WalletProvider/WalletProvider.tsx | 9 +- .../useExternalWalletProvider.ts | 5 +- packages/widget/tsconfig.json | 6 +- pnpm-lock.yaml | 191 +++++++++++++++++- 23 files changed, 368 insertions(+), 126 deletions(-) delete mode 100644 packages/wallet-provider-sui/src/providers/SuiExternalContext.ts create mode 100644 packages/wallet-provider-svm/package.json create mode 100644 packages/wallet-provider-svm/src/index.ts rename packages/{widget/src/providers/WalletProvider => wallet-provider-svm/src/providers}/SVMBaseProvider.tsx (100%) create mode 100644 packages/wallet-provider-svm/src/providers/SVMProvider.tsx create mode 100644 packages/wallet-provider-svm/tsconfig.json create mode 100644 packages/wallet-store/src/contexts/SVMContext.ts delete mode 100644 packages/widget/src/providers/WalletProvider/SVMExternalContext.ts delete mode 100644 packages/widget/src/providers/WalletProvider/SVMProvider.tsx diff --git a/packages/wallet-management/package.json b/packages/wallet-management/package.json index 6745a4fee..0d359bbb7 100644 --- a/packages/wallet-management/package.json +++ b/packages/wallet-management/package.json @@ -76,7 +76,6 @@ }, "peerDependencies": { "@bigmi/react": ">=0.5.0", - "@solana/wallet-adapter-react": ">=0.15.35", "@tanstack/react-query": ">=5.68.0", "react": ">=18", "react-dom": ">=18", diff --git a/packages/wallet-management/src/components/SVMListItemButton.tsx b/packages/wallet-management/src/components/SVMListItemButton.tsx index 7a4fd7146..2e749554f 100644 --- a/packages/wallet-management/src/components/SVMListItemButton.tsx +++ b/packages/wallet-management/src/components/SVMListItemButton.tsx @@ -1,6 +1,6 @@ import { ChainId, ChainType } from '@lifi/sdk' +import { useSVMContext } from '@lifi/wallet-store' import type { WalletAdapter } from '@solana/wallet-adapter-base' -import { useWallet } from '@solana/wallet-adapter-react' import type { PublicKey } from '@solana/web3.js' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' @@ -23,7 +23,7 @@ export const SVMListItemButton = ({ onError, }: SVMListItemButtonProps) => { const emitter = useWalletManagementEvents() - const { select, disconnect, connected } = useWallet() + const { connect, disconnect, isConnected } = useSVMContext() const { setLastConnectedAccount } = useLastConnectedAccount() const connectorName = walletAdapter.name @@ -39,12 +39,10 @@ export const SVMListItemButton = ({ try { onConnecting?.() - if (connected) { + if (isConnected) { await disconnect() } - select(walletAdapter.name) - // We use autoConnect on wallet selection - // await connect() + connect(walletAdapter.name) walletAdapter.once('connect', (publicKey: PublicKey) => { setLastConnectedAccount(walletAdapter) emitter.emit(WalletManagementEvent.WalletConnected, { diff --git a/packages/wallet-management/src/components/SuiListItemButton.tsx b/packages/wallet-management/src/components/SuiListItemButton.tsx index 101d8a52f..40aaa0287 100644 --- a/packages/wallet-management/src/components/SuiListItemButton.tsx +++ b/packages/wallet-management/src/components/SuiListItemButton.tsx @@ -22,7 +22,7 @@ export const SuiListItemButton = ({ onError, }: SuiListItemButtonProps) => { const emitter = useWalletManagementEvents() - const { connectWallet: connect } = useSuiContext() + const { connect } = useSuiContext() const { setLastConnectedAccount } = useLastConnectedAccount() const connectorName = wallet.name diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index e284907bb..82140f296 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -1,10 +1,9 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { useAccount as useBigmiAccount } from '@bigmi/react' import { ChainId, ChainType } from '@lifi/sdk' -import { useSuiContext } from '@lifi/wallet-store' +import { useSuiContext, useSVMContext } from '@lifi/wallet-store' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import type { WalletAdapter } from '@solana/wallet-adapter-base' -import { useWallet } from '@solana/wallet-adapter-react' import { useMemo } from 'react' import type { Connector } from 'wagmi' import { useAccount as useAccountInternal } from 'wagmi' @@ -89,22 +88,22 @@ export const useLastConnectedAccount = create( export const useAccount = (args?: UseAccountArgs): AccountResult => { const bigmiAccount = useBigmiAccount() const wagmiAccount = useAccountInternal() - const { wallet } = useWallet() - const { currentWallet, connectionStatus } = useSuiContext() + const { currentWallet: svmWallet } = useSVMContext() + const { currentWallet: suiWallet, connectionStatus } = useSuiContext() const { lastConnectedAccount } = useLastConnectedAccount() // biome-ignore lint/correctness/useExhaustiveDependencies: run only when wallet changes return useMemo(() => { - const svm: Account = wallet?.adapter.publicKey + const svm: Account = svmWallet?.adapter.publicKey ? { - address: wallet?.adapter.publicKey.toString(), + address: svmWallet?.adapter.publicKey.toString(), chainId: ChainId.SOL, chainType: ChainType.SVM, - connector: wallet?.adapter, - isConnected: Boolean(wallet?.adapter.publicKey), + connector: svmWallet?.adapter, + isConnected: Boolean(svmWallet?.adapter.publicKey), isConnecting: false, isReconnecting: false, - isDisconnected: !wallet, + isDisconnected: !svmWallet, status: 'connected', } : { @@ -116,16 +115,16 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { status: 'disconnected', } const sui: Account = - currentWallet?.accounts?.length && connectionStatus === 'connected' + suiWallet?.accounts?.length && connectionStatus === 'connected' ? { - address: currentWallet?.accounts[0].address, + address: suiWallet?.accounts[0].address, chainId: ChainId.SUI, chainType: ChainType.MVM, - connector: currentWallet, + connector: suiWallet, isConnected: connectionStatus === 'connected', isConnecting: false, isReconnecting: false, - isDisconnected: !currentWallet, + isDisconnected: !suiWallet, status: connectionStatus, } : { @@ -181,7 +180,7 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { accounts: connectedAccounts, } }, [ - wallet?.adapter.publicKey, + svmWallet?.adapter.publicKey, wagmiAccount.connector?.uid, wagmiAccount.connector?.id, wagmiAccount.status, @@ -194,7 +193,7 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { bigmiAccount.chainId, args?.chainType, lastConnectedAccount, - currentWallet?.accounts?.length, + suiWallet?.accounts?.length, connectionStatus, ]) } diff --git a/packages/wallet-management/src/hooks/useAccountDisconnect.ts b/packages/wallet-management/src/hooks/useAccountDisconnect.ts index 7d4c00dee..80e6b8ad3 100644 --- a/packages/wallet-management/src/hooks/useAccountDisconnect.ts +++ b/packages/wallet-management/src/hooks/useAccountDisconnect.ts @@ -5,8 +5,7 @@ import { } from '@bigmi/client' import { useConfig as useBigmiConfig } from '@bigmi/react' import { ChainType } from '@lifi/sdk' -import { useSuiContext } from '@lifi/wallet-store' -import { useWallet } from '@solana/wallet-adapter-react' +import { useSuiContext, useSVMContext } from '@lifi/wallet-store' import type { Config } from 'wagmi' import { useConfig as useWagmiConfig } from 'wagmi' import { disconnect, getAccount } from 'wagmi/actions' @@ -15,8 +14,8 @@ import type { Account } from './useAccount.js' export const useAccountDisconnect = () => { const bigmiConfig = useBigmiConfig() const wagmiConfig = useWagmiConfig() - const { disconnect: solanaDisconnect } = useWallet() - const { disconnectWallet } = useSuiContext() + const { disconnect: svmDisconnect } = useSVMContext() + const { disconnect: suiDisconnect } = useSuiContext() const handleDisconnectEVM = async (config: Config) => { const connectedAccount = getAccount(config) @@ -41,10 +40,10 @@ export const useAccountDisconnect = () => { await handleDisconnectUTXO(bigmiConfig) break case ChainType.SVM: - await solanaDisconnect() + await svmDisconnect() break case ChainType.MVM: - await disconnectWallet() + await suiDisconnect() break } } diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 43d3f18e8..db154cec9 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -1,13 +1,11 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { useConnect as useBigmiConnect } from '@bigmi/react' import { ChainType } from '@lifi/sdk' -import { useSuiContext } from '@lifi/wallet-store' +import { useSuiContext, useSVMContext } from '@lifi/wallet-store' import type { Theme } from '@mui/material' import { useMediaQuery } from '@mui/material' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import { WalletReadyState } from '@solana/wallet-adapter-base' -import type { Wallet } from '@solana/wallet-adapter-react' -import { useWallet } from '@solana/wallet-adapter-react' import { useEffect, useState } from 'react' import type { Connector } from 'wagmi' import { useConnect } from 'wagmi' @@ -48,7 +46,7 @@ const normalizeName = (name: string) => name.split(' ')[0].toLowerCase().trim() const combineWalletLists = ( utxoConnectorList: BigmiConnector[], evmConnectorList: (CreateConnectorFnExtended | Connector)[], - svmWalletList: Wallet[], + svmWalletList: any[], // TODO: this is Wallet type from @solana/wallet-adapter-react suiWalletList: WalletWithRequiredFeatures[], walletEcosystemsOrder?: Record ): CombinedWallet[] => { @@ -133,8 +131,8 @@ export const useCombinedWallets = () => { const walletConfig = useWalletManagementConfig() const { connectors: wagmiConnectors } = useConnect() const { connectors: bigmiConnectors } = useBigmiConnect() - const { wallets: solanaWallets } = useWallet() - const { suiWallets } = useSuiContext() + const { wallets: solanaWallets } = useSVMContext() + const { wallets: suiWallets } = useSuiContext() const [combinedWallets, setCombinedWallets] = useState( () => { return { @@ -248,7 +246,7 @@ export const useCombinedWallets = () => { : [] const installedSVMWallets = includeEcosystem(ChainType.SVM) - ? solanaWallets.filter((wallet) => { + ? solanaWallets.filter((wallet: any) => { const isInstalled = wallet.adapter.readyState === WalletReadyState.Installed || wallet.adapter.readyState === WalletReadyState.Loadable @@ -278,7 +276,7 @@ export const useCombinedWallets = () => { return !isInstalled && isDesktopView }) - const notDetectedSVMWallets = solanaWallets.filter((wallet) => { + const notDetectedSVMWallets = solanaWallets.filter((wallet: any) => { const isInstalled = wallet.adapter.readyState === WalletReadyState.Installed || wallet.adapter.readyState === WalletReadyState.Loadable diff --git a/packages/wallet-provider-sui/src/providers/SuiExternalContext.ts b/packages/wallet-provider-sui/src/providers/SuiExternalContext.ts deleted file mode 100644 index 7e7ee8ccb..000000000 --- a/packages/wallet-provider-sui/src/providers/SuiExternalContext.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createContext } from 'react' - -export const SuiExternalContext = createContext(false) diff --git a/packages/wallet-provider-sui/src/providers/SuiProvider.tsx b/packages/wallet-provider-sui/src/providers/SuiProvider.tsx index a951a818f..9a4eb4214 100644 --- a/packages/wallet-provider-sui/src/providers/SuiProvider.tsx +++ b/packages/wallet-provider-sui/src/providers/SuiProvider.tsx @@ -8,60 +8,55 @@ import { } from '@mysten/dapp-kit' import { type FC, type PropsWithChildren, useContext } from 'react' import { SuiBaseProvider } from './SuiBaseProvider.js' -import { SuiExternalContext } from './SuiExternalContext.js' + +interface SuiProviderProps { + forceInternalWalletManagement?: boolean +} export function useInSuiContext(): boolean { const context = useContext(SuiClientContext) - return Boolean(context) } -export const SuiProviderWrapper: FC< - PropsWithChildren<{ forceInternalWalletManagement?: boolean }> -> = ({ children, forceInternalWalletManagement }) => { +export const SuiProvider: FC> = ({ + forceInternalWalletManagement, + children, +}) => { const inSuiContext = useInSuiContext() - return inSuiContext && !forceInternalWalletManagement ? ( - - {children} - - ) : ( - {children} - ) -} - -export const SuiProvider: FC< - PropsWithChildren<{ forceInternalWalletManagement?: boolean }> -> = ({ forceInternalWalletManagement, children }) => { - const inSuiContext = useInSuiContext() + if (inSuiContext && !forceInternalWalletManagement) { + return ( + + {children} + + ) + } return ( - + {children} - + ) } const CaptureSuiValues: FC< PropsWithChildren<{ isExternalContext: boolean }> > = ({ children, isExternalContext }) => { - const suiWallets = useWallets() + const wallets = useWallets() const { currentWallet, connectionStatus } = useCurrentWallet() - const { mutateAsync: disconnectWallet } = useDisconnectWallet() - const { mutateAsync: connectWallet } = useConnectWallet() + const { mutateAsync: disconnect } = useDisconnectWallet() + const { mutateAsync: connect } = useConnectWallet() return ( diff --git a/packages/wallet-provider-svm/package.json b/packages/wallet-provider-svm/package.json new file mode 100644 index 000000000..aed1df268 --- /dev/null +++ b/packages/wallet-provider-svm/package.json @@ -0,0 +1,25 @@ +{ + "name": "@lifi/wallet-provider-svm", + "version": "1.0.0", + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.d.ts", + "dependencies": { + "@solana/wallet-adapter-base": "^0.9.27", + "@solana/wallet-adapter-coinbase": "^0.1.23", + "@solana/web3.js": "^1.98.4" + }, + "peerDependencies": { + "@solana/wallet-adapter-react": "^0.15.39", + "@lifi/wallet-store": "workspace:*" + }, + "devDependencies": { + "react": "^19.1.1", + "typescript": "^5.9.2" + }, + "files": [ + "dist/**", + "src/**", + "!tsconfig.json" + ] +} diff --git a/packages/wallet-provider-svm/src/index.ts b/packages/wallet-provider-svm/src/index.ts new file mode 100644 index 000000000..9356f71bf --- /dev/null +++ b/packages/wallet-provider-svm/src/index.ts @@ -0,0 +1 @@ +export { SVMProvider } from './providers/SVMProvider.js' diff --git a/packages/widget/src/providers/WalletProvider/SVMBaseProvider.tsx b/packages/wallet-provider-svm/src/providers/SVMBaseProvider.tsx similarity index 100% rename from packages/widget/src/providers/WalletProvider/SVMBaseProvider.tsx rename to packages/wallet-provider-svm/src/providers/SVMBaseProvider.tsx diff --git a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx new file mode 100644 index 000000000..15fc6853c --- /dev/null +++ b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx @@ -0,0 +1,64 @@ +import { SVMContext } from '@lifi/wallet-store' +import { ConnectionContext, useWallet } from '@solana/wallet-adapter-react' +import { type FC, type PropsWithChildren, useContext } from 'react' +import { SVMBaseProvider } from './SVMBaseProvider.js' + +interface SVMProviderProps { + forceInternalWalletManagement?: boolean +} + +export function useInSVMContext(): boolean { + const context = useContext(ConnectionContext) + return Boolean(context?.connection) +} + +export const SVMProvider: FC> = ({ + forceInternalWalletManagement, + children, +}) => { + const inSVMContext = useInSVMContext() + + if (inSVMContext && !forceInternalWalletManagement) { + return ( + + {children} + + ) + } + + return ( + + + {children} + + + ) +} + +const CaptureSVMValues: FC< + PropsWithChildren<{ isExternalContext: boolean }> +> = ({ children, isExternalContext }) => { + const { + wallets, + wallet: currentWallet, + select: connect, // We use autoConnect on wallet selection + disconnect, + connected, + } = useWallet() + + return ( + + {children} + + ) +} diff --git a/packages/wallet-provider-svm/tsconfig.json b/packages/wallet-provider-svm/tsconfig.json new file mode 100644 index 000000000..8e1598c91 --- /dev/null +++ b/packages/wallet-provider-svm/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "declaration": true, + "sourceMap": true, + "outDir": "dist/esm", + "rootDir": "./src", + "module": "ESNext", + "moduleResolution": "Bundler" + }, + "include": ["./src/**/*", "./src/**/*.json"] +} diff --git a/packages/wallet-store/src/contexts/SVMContext.ts b/packages/wallet-store/src/contexts/SVMContext.ts new file mode 100644 index 000000000..cee227812 --- /dev/null +++ b/packages/wallet-store/src/contexts/SVMContext.ts @@ -0,0 +1,7 @@ +import { createContext, useContext } from 'react' + +export const SVMContext = createContext(null) + +export const useSVMContext = () => { + return useContext(SVMContext) +} diff --git a/packages/wallet-store/src/index.ts b/packages/wallet-store/src/index.ts index 12374667f..b01df7676 100644 --- a/packages/wallet-store/src/index.ts +++ b/packages/wallet-store/src/index.ts @@ -1 +1,2 @@ -export { SuiContext, useSuiContext } from './contexts/suiContext.js' +export { SuiContext, useSuiContext } from './contexts/SuiContext.js' +export { SVMContext, useSVMContext } from './contexts/SVMContext.js' diff --git a/packages/widget/package.json b/packages/widget/package.json index 44782dd9b..de6f9c72d 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -56,13 +56,13 @@ "@lifi/sdk": "^3.11.3", "@lifi/wallet-management": "workspace:^", "@lifi/wallet-provider-sui": "workspace:^", + "@lifi/wallet-provider-svm": "workspace:^", "@lifi/wallet-store": "workspace:^", "@mui/icons-material": "^7.3.1", "@mui/material": "^7.3.1", "@mui/system": "^7.3.1", "@mysten/sui": "^1.37.4", "@solana/wallet-adapter-base": "^0.9.27", - "@solana/wallet-adapter-coinbase": "^0.1.23", "@solana/web3.js": "^1.98.4", "@tanstack/react-virtual": "^3.13.12", "i18next": "^25.4.2", diff --git a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx index 780b1938d..0be75e1a0 100644 --- a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx +++ b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx @@ -2,9 +2,8 @@ import { getConnectorClient as getBigmiConnectorClient } from '@bigmi/client' import { useConfig as useBigmiConfig } from '@bigmi/react' import type { SDKProvider } from '@lifi/sdk' import { ChainType, config, EVM, Solana, Sui, UTXO } from '@lifi/sdk' -import { useSuiContext } from '@lifi/wallet-store' +import { useSuiContext, useSVMContext } from '@lifi/wallet-store' import type { SignerWalletAdapter } from '@solana/wallet-adapter-base' -import { useWallet } from '@solana/wallet-adapter-react' import { useEffect } from 'react' import { useConfig as useWagmiConfig } from 'wagmi' import { @@ -15,10 +14,10 @@ import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' export const SDKProviders = () => { const { sdkConfig } = useWidgetConfig() - const { wallet } = useWallet() const wagmiConfig = useWagmiConfig() const bigmiConfig = useBigmiConfig() - const { currentWallet } = useSuiContext() + const { currentWallet: svmWallet } = useSVMContext() + const { currentWallet: suiWallet } = useSuiContext() useEffect(() => { // Configure SDK Providers @@ -50,7 +49,7 @@ export const SDKProviders = () => { providers.push( Solana({ async getWalletAdapter() { - return wallet?.adapter as SignerWalletAdapter + return svmWallet?.adapter as SignerWalletAdapter }, }) ) @@ -65,7 +64,7 @@ export const SDKProviders = () => { if (!hasConfiguredSuiProvider) { providers.push( Sui({ - getWallet: async () => currentWallet!, + getWallet: async () => suiWallet!, }) ) } @@ -75,10 +74,10 @@ export const SDKProviders = () => { config.setProviders(providers) }, [ bigmiConfig, - currentWallet, + suiWallet, sdkConfig?.providers, wagmiConfig, - wallet?.adapter, + svmWallet?.adapter, ]) return null diff --git a/packages/widget/src/providers/WalletProvider/SVMExternalContext.ts b/packages/widget/src/providers/WalletProvider/SVMExternalContext.ts deleted file mode 100644 index d94ddac64..000000000 --- a/packages/widget/src/providers/WalletProvider/SVMExternalContext.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createContext } from 'react' - -export const SVMExternalContext = createContext(false) diff --git a/packages/widget/src/providers/WalletProvider/SVMProvider.tsx b/packages/widget/src/providers/WalletProvider/SVMProvider.tsx deleted file mode 100644 index 499b0fe30..000000000 --- a/packages/widget/src/providers/WalletProvider/SVMProvider.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { ChainType } from '@lifi/sdk' -import { ConnectionContext } from '@solana/wallet-adapter-react' -import { type FC, type PropsWithChildren, useContext } from 'react' -import { useInternalWalletProvider } from '../../hooks/useInternalWalletProvider.js' -import { isItemAllowed } from '../../utils/item.js' -import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' -import { SVMBaseProvider } from './SVMBaseProvider.js' -import { SVMExternalContext } from './SVMExternalContext.js' - -export function useInSolanaContext(): boolean { - const { chains } = useWidgetConfig() - const context = useContext(ConnectionContext) - return ( - Boolean(context?.connection) && isItemAllowed(ChainType.SVM, chains?.types) - ) -} - -export const SVMProvider: FC = ({ children }) => { - const inSolanaContext = useInSolanaContext() - const useInternalWallet = useInternalWalletProvider(inSolanaContext) - - return useInternalWallet ? ( - {children} - ) : ( - - {children} - - ) -} diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index 571531e84..a19850a8b 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -1,20 +1,25 @@ import type { WalletManagementConfig } from '@lifi/wallet-management' import { WalletManagementProvider } from '@lifi/wallet-management' import { SuiProvider } from '@lifi/wallet-provider-sui' +import { SVMProvider } from '@lifi/wallet-provider-svm' import { type FC, type PropsWithChildren, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' import { EVMProvider } from './EVMProvider.js' import { SDKProviders } from './SDKProviders.js' -import { SVMProvider } from './SVMProvider.js' import { UTXOProvider } from './UTXOProvider.js' import { useExternalWalletProvider } from './useExternalWalletProvider.js' export const WalletProvider: FC = ({ children }) => { const { walletConfig } = useWidgetConfig() + // TODO: isItemAllowed(ChainType.SVM, chains?.types) - should we check it? return ( - + { diff --git a/packages/widget/tsconfig.json b/packages/widget/tsconfig.json index 5132cce13..6e51eb2f7 100644 --- a/packages/widget/tsconfig.json +++ b/packages/widget/tsconfig.json @@ -11,5 +11,9 @@ "skipLibCheck": true }, "include": ["./src/**/*", "./src/**/*.json"], - "references": [{ "path": "../wallet-management" }] + "references": [ + { "path": "../wallet-management" }, + { "path": "../wallet-provider-sui" }, + { "path": "../wallet-provider-svm" } + ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b1e382a35..6725acae2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,10 +77,10 @@ importers: dependencies: '@lifi/wallet-management': specifier: ^3.14.7 - version: 3.14.7(1b39d3f2c65fdc4201704dbd8de3b0fe) + version: 3.14.7(7229dfdb141d78352b0fd7e434adffd1) '@lifi/widget': specifier: ^3.28.0 - version: 3.28.0(414dae9f9c67dec7d615bd179522cd36) + version: 3.28.0(5ba9ead94cb3a3c8b0c385073c5c7c43) '@mui/icons-material': specifier: ^7.3.1 version: 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) @@ -141,7 +141,7 @@ importers: dependencies: '@lifi/sdk': specifier: ^3.11.3 - version: 3.11.3(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.11)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + version: 3.11.3(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.11)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) '@lifi/widget': specifier: workspace:^ version: link:../../packages/widget @@ -947,9 +947,6 @@ importers: '@solana/wallet-adapter-base': specifier: ^0.9.27 version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-react': - specifier: '>=0.15.35' - version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.0(@babel/core@7.28.3)(@babel/preset-env@7.28.3(@babel/core@7.28.3))(@types/react@19.1.11)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) @@ -1019,6 +1016,31 @@ importers: specifier: ^5.9.2 version: 5.9.2 + packages/wallet-provider-svm: + dependencies: + '@lifi/wallet-store': + specifier: workspace:* + version: link:../wallet-store + '@solana/wallet-adapter-base': + specifier: ^0.9.27 + version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-coinbase': + specifier: ^0.1.23 + version: 0.1.23(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-react': + specifier: ^0.15.39 + version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.0(@babel/core@7.28.3)(@babel/preset-env@7.28.3(@babel/core@7.28.3))(@types/react@19.1.11)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1) + '@solana/web3.js': + specifier: ^1.98.4 + version: 1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) + devDependencies: + react: + specifier: ^19.1.1 + version: 19.1.1 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + packages/wallet-store: dependencies: zustand: @@ -1058,6 +1080,9 @@ importers: '@lifi/wallet-provider-sui': specifier: workspace:^ version: link:../wallet-provider-sui + '@lifi/wallet-provider-svm': + specifier: workspace:^ + version: link:../wallet-provider-svm '@lifi/wallet-store': specifier: workspace:^ version: link:../wallet-store @@ -1076,9 +1101,6 @@ importers: '@solana/wallet-adapter-base': specifier: ^0.9.27 version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-coinbase': - specifier: ^0.1.23 - version: 0.1.23(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-react': specifier: '>=0.15.35' version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.0(@babel/core@7.28.3)(@babel/preset-env@7.28.3(@babel/core@7.28.3))(@types/react@19.1.11)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1) @@ -15628,6 +15650,20 @@ snapshots: - utf-8-validate - zod + '@bigmi/client@0.4.5(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))': + dependencies: + '@bigmi/core': 0.4.5(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1)) + '@tanstack/query-core': 5.85.5 + eventemitter3: 5.0.1 + zustand: 5.0.8(@types/react@19.1.11)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + transitivePeerDependencies: + - '@types/react' + - bs58 + - immer + - react + - typescript + - use-sync-external-store + '@bigmi/client@0.4.5(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))': dependencies: '@bigmi/core': 0.4.5(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) @@ -15642,6 +15678,20 @@ snapshots: - typescript - use-sync-external-store + '@bigmi/client@0.5.2(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))': + dependencies: + '@bigmi/core': 0.5.2(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1)) + '@tanstack/query-core': 5.85.5 + eventemitter3: 5.0.1 + zustand: 5.0.8(@types/react@19.1.11)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + transitivePeerDependencies: + - '@types/react' + - bs58 + - immer + - react + - typescript + - use-sync-external-store + '@bigmi/client@0.5.2(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))': dependencies: '@bigmi/core': 0.5.2(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) @@ -15656,6 +15706,21 @@ snapshots: - typescript - use-sync-external-store + '@bigmi/core@0.4.5(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))': + dependencies: + '@noble/hashes': 1.8.0 + bech32: 2.0.0 + bitcoinjs-lib: 7.0.0-rc.0(typescript@5.9.2) + bs58: 6.0.0 + eventemitter3: 5.0.1 + zustand: 5.0.8(@types/react@19.1.11)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + transitivePeerDependencies: + - '@types/react' + - immer + - react + - typescript + - use-sync-external-store + '@bigmi/core@0.4.5(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))': dependencies: '@noble/hashes': 1.8.0 @@ -15701,6 +15766,21 @@ snapshots: - typescript - use-sync-external-store + '@bigmi/react@0.5.2(@tanstack/query-core@5.85.5)(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react@19.1.11)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))': + dependencies: + '@bigmi/client': 0.5.2(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1)) + '@bigmi/core': 0.5.2(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1)) + '@tanstack/react-query': 5.85.5(react@19.1.1) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + transitivePeerDependencies: + - '@tanstack/query-core' + - '@types/react' + - bs58 + - immer + - typescript + - use-sync-external-store + '@bigmi/react@0.5.2(@tanstack/query-core@5.85.5)(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react@19.1.11)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))': dependencies: '@bigmi/client': 0.5.2(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) @@ -17740,6 +17820,48 @@ snapshots: - utf-8-validate - zod + '@lifi/wallet-management@3.14.7(7229dfdb141d78352b0fd7e434adffd1)': + dependencies: + '@bigmi/client': 0.4.5(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) + '@bigmi/core': 0.4.5(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) + '@bigmi/react': 0.5.2(@tanstack/query-core@5.85.5)(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react@19.1.11)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1)) + '@emotion/react': 11.14.0(@types/react@19.1.11)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@lifi/sdk': 3.11.3(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.11)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + '@mui/icons-material': 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/system': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@mysten/dapp-kit': 0.17.5(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.11))(@types/react@19.1.11)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@mysten/wallet-standard': 0.16.12(typescript@5.9.2) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-react': 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.0(@babel/core@7.28.3)(@babel/preset-env@7.28.3(@babel/core@7.28.3))(@types/react@19.1.11)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@tanstack/react-query': 5.85.5(react@19.1.1) + i18next: 25.4.2(typescript@5.9.2) + mitt: 3.0.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-i18next: 15.7.2(i18next@25.4.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react-native@0.74.0(@babel/core@7.28.3)(@babel/preset-env@7.28.3(@babel/core@7.28.3))(@types/react@19.1.11)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1)(typescript@5.9.2) + use-sync-external-store: 1.5.0(react@19.1.1) + viem: 2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.16.8(@tanstack/query-core@5.85.5)(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react@19.1.11)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + zustand: 5.0.8(@types/react@19.1.11)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@mui/material-pigment-css' + - '@tanstack/query-core' + - '@types/react' + - bs58 + - bufferutil + - encoding + - immer + - react-native + - supports-color + - typescript + - utf-8-validate + - zod + '@lifi/wallet-management@3.14.7(b35333522e70beb8d3a1cda23fc2ed41)': dependencies: '@bigmi/client': 0.4.5(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) @@ -17971,6 +18093,55 @@ snapshots: - utf-8-validate - zod + '@lifi/widget@3.28.0(5ba9ead94cb3a3c8b0c385073c5c7c43)': + dependencies: + '@bigmi/client': 0.4.5(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1)) + '@bigmi/core': 0.4.5(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1)) + '@bigmi/react': 0.5.2(@tanstack/query-core@5.85.5)(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react@19.1.11)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1)) + '@emotion/react': 11.14.0(@types/react@19.1.11)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@lifi/sdk': 3.11.3(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.11)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + '@lifi/wallet-management': 3.14.7(7229dfdb141d78352b0fd7e434adffd1) + '@mui/icons-material': 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/system': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) + '@mysten/dapp-kit': 0.17.5(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.11))(@types/react@19.1.11)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@mysten/sui': 1.37.4(typescript@5.9.2) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-coinbase': 0.1.23(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-react': 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.74.0(@babel/core@7.28.3)(@babel/preset-env@7.28.3(@babel/core@7.28.3))(@types/react@19.1.11)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@tanstack/react-query': 5.85.5(react@19.1.1) + '@tanstack/react-virtual': 3.13.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + i18next: 25.4.2(typescript@5.9.2) + microdiff: 1.5.0 + mitt: 3.0.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-i18next: 15.7.2(i18next@25.4.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react-native@0.74.0(@babel/core@7.28.3)(@babel/preset-env@7.28.3(@babel/core@7.28.3))(@types/react@19.1.11)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1)(typescript@5.9.2) + react-intersection-observer: 9.16.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-router-dom: 6.30.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + viem: 2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.16.8(@tanstack/query-core@5.85.5)(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react@19.1.11)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + zustand: 5.0.8(@types/react@19.1.11)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - '@mui/material-pigment-css' + - '@tanstack/query-core' + - '@types/react' + - bs58 + - bufferutil + - encoding + - immer + - react-native + - supports-color + - typescript + - use-sync-external-store + - utf-8-validate + - zod + '@lit-labs/ssr-dom-shim@1.4.0': {} '@lit/react@1.0.8(@types/react@19.1.11)': @@ -27532,7 +27703,7 @@ snapshots: extension-port-stream@3.0.0: dependencies: - readable-stream: 3.6.2 + readable-stream: 4.7.0 webextension-polyfill: 0.10.0 externality@1.0.2: From 638c39cdcd1eda60284d2e643f5d1d3426d0e263 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Fri, 5 Sep 2025 16:03:37 +0100 Subject: [PATCH 04/24] feat: utxo provider --- .../src/components/UTXOListItemButton.tsx | 13 ++- .../wallet-management/src/hooks/useAccount.ts | 25 +++--- .../src/hooks/useAccountDisconnect.ts | 23 ++--- .../src/hooks/useCombinedWallets.ts | 22 +++-- packages/wallet-management/src/index.ts | 1 - packages/wallet-provider-utxo/package.json | 23 +++++ packages/wallet-provider-utxo/src/index.ts | 1 + .../src/providers}/UTXOBaseProvider.tsx | 6 +- .../src/providers/UTXOProvider.tsx | 85 +++++++++++++++++++ .../providers}/createDefaultBigmiConfig.ts | 0 packages/wallet-provider-utxo/tsconfig.json | 13 +++ .../wallet-store/src/contexts/UTXOContext.ts | 7 ++ packages/wallet-store/src/index.ts | 1 + packages/widget-playground/package.json | 2 + packages/widget/package.json | 7 +- .../providers/WalletProvider/SDKProviders.tsx | 14 +-- .../WalletProvider/UTXOExternalContext.ts | 3 - .../providers/WalletProvider/UTXOProvider.tsx | 28 ------ .../WalletProvider/WalletProvider.tsx | 8 +- .../useExternalWalletProvider.ts | 9 +- pnpm-lock.yaml | 33 ++++++- 21 files changed, 232 insertions(+), 92 deletions(-) create mode 100644 packages/wallet-provider-utxo/package.json create mode 100644 packages/wallet-provider-utxo/src/index.ts rename packages/{widget/src/providers/WalletProvider => wallet-provider-utxo/src/providers}/UTXOBaseProvider.tsx (83%) create mode 100644 packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx rename packages/{wallet-management/src => wallet-provider-utxo/src/providers}/createDefaultBigmiConfig.ts (100%) create mode 100644 packages/wallet-provider-utxo/tsconfig.json create mode 100644 packages/wallet-store/src/contexts/UTXOContext.ts delete mode 100644 packages/widget/src/providers/WalletProvider/UTXOExternalContext.ts delete mode 100644 packages/widget/src/providers/WalletProvider/UTXOProvider.tsx diff --git a/packages/wallet-management/src/components/UTXOListItemButton.tsx b/packages/wallet-management/src/components/UTXOListItemButton.tsx index 9c4294984..4206ebad9 100644 --- a/packages/wallet-management/src/components/UTXOListItemButton.tsx +++ b/packages/wallet-management/src/components/UTXOListItemButton.tsx @@ -1,6 +1,6 @@ -import { type Connector, connect, disconnect, getAccount } from '@bigmi/client' -import { useConfig } from '@bigmi/react' +import type { Connector } from '@bigmi/client' import { ChainId, ChainType } from '@lifi/sdk' +import { useUTXOContext } from '@lifi/wallet-store' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' import { getChainTypeIcon } from '../icons.js' @@ -25,7 +25,7 @@ export const UTXOListItemButton = ({ onError, }: UTXOListItemButtonProps) => { const emitter = useWalletManagementEvents() - const config = useConfig() + const { connect, disconnect } = useUTXOContext() const { setLastConnectedAccount } = useLastConnectedAccount() const connectorName = connector.name @@ -45,12 +45,9 @@ export const UTXOListItemButton = ({ onNotInstalled?.(connector as Connector) return } - const connectedAccount = getAccount(config) onConnecting?.() - const data = await connect(config, { connector }) - if (connectedAccount.connector) { - await disconnect(config, { connector: connectedAccount.connector }) - } + const data = await connect(connector) + await disconnect() setLastConnectedAccount(connector) emitter.emit(WalletManagementEvent.WalletConnected, { address: data.accounts[0].address, diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index 82140f296..ef33ea2e2 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -1,7 +1,10 @@ import type { Connector as BigmiConnector } from '@bigmi/client' -import { useAccount as useBigmiAccount } from '@bigmi/react' import { ChainId, ChainType } from '@lifi/sdk' -import { useSuiContext, useSVMContext } from '@lifi/wallet-store' +import { + useSuiContext, + useSVMContext, + useUTXOContext, +} from '@lifi/wallet-store' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import type { WalletAdapter } from '@solana/wallet-adapter-base' import { useMemo } from 'react' @@ -86,8 +89,8 @@ export const useLastConnectedAccount = create( * @returns - Account result */ export const useAccount = (args?: UseAccountArgs): AccountResult => { - const bigmiAccount = useBigmiAccount() const wagmiAccount = useAccountInternal() + const { currentWallet: utxoWallet } = useUTXOContext() const { currentWallet: svmWallet } = useSVMContext() const { currentWallet: suiWallet, connectionStatus } = useSuiContext() const { lastConnectedAccount } = useLastConnectedAccount() @@ -137,12 +140,12 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { } const evm: Account = { ...wagmiAccount, chainType: ChainType.EVM } const utxo: Account = { - ...bigmiAccount, + ...utxoWallet, chainType: ChainType.UTXO, chainId: ChainId.BTC, - address: bigmiAccount.account?.address, - addresses: bigmiAccount.accounts?.map((account) => account.address), + address: utxoWallet.account?.address, + addresses: utxoWallet.accounts?.map((account: any) => account.address), } const accounts = [evm, svm, utxo, sui] const connectedAccounts = accounts.filter( @@ -186,11 +189,11 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { wagmiAccount.status, wagmiAccount.address, wagmiAccount.chainId, - bigmiAccount.connector?.uid, - bigmiAccount.connector?.id, - bigmiAccount.status, - bigmiAccount.account?.address, - bigmiAccount.chainId, + utxoWallet.connector?.uid, + utxoWallet.connector?.id, + utxoWallet.status, + utxoWallet.account?.address, + utxoWallet.chainId, args?.chainType, lastConnectedAccount, suiWallet?.accounts?.length, diff --git a/packages/wallet-management/src/hooks/useAccountDisconnect.ts b/packages/wallet-management/src/hooks/useAccountDisconnect.ts index 80e6b8ad3..c10fa7caf 100644 --- a/packages/wallet-management/src/hooks/useAccountDisconnect.ts +++ b/packages/wallet-management/src/hooks/useAccountDisconnect.ts @@ -1,19 +1,17 @@ -import type { Config as BigmiConfig } from '@bigmi/client' -import { - disconnect as bigmiDisconnect, - getAccount as bigmiGetAccount, -} from '@bigmi/client' -import { useConfig as useBigmiConfig } from '@bigmi/react' import { ChainType } from '@lifi/sdk' -import { useSuiContext, useSVMContext } from '@lifi/wallet-store' +import { + useSuiContext, + useSVMContext, + useUTXOContext, +} from '@lifi/wallet-store' import type { Config } from 'wagmi' import { useConfig as useWagmiConfig } from 'wagmi' import { disconnect, getAccount } from 'wagmi/actions' import type { Account } from './useAccount.js' export const useAccountDisconnect = () => { - const bigmiConfig = useBigmiConfig() const wagmiConfig = useWagmiConfig() + const { disconnect: utxoDisconnect } = useUTXOContext() const { disconnect: svmDisconnect } = useSVMContext() const { disconnect: suiDisconnect } = useSuiContext() @@ -24,20 +22,13 @@ export const useAccountDisconnect = () => { } } - const handleDisconnectUTXO = async (config: BigmiConfig) => { - const connectedAccount = bigmiGetAccount(config) - if (connectedAccount.connector) { - await bigmiDisconnect(config, { connector: connectedAccount.connector }) - } - } - return async (account: Account) => { switch (account.chainType) { case ChainType.EVM: await handleDisconnectEVM(wagmiConfig) break case ChainType.UTXO: - await handleDisconnectUTXO(bigmiConfig) + await utxoDisconnect() break case ChainType.SVM: await svmDisconnect() diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index db154cec9..10e71da3b 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -1,7 +1,11 @@ import type { Connector as BigmiConnector } from '@bigmi/client' -import { useConnect as useBigmiConnect } from '@bigmi/react' + import { ChainType } from '@lifi/sdk' -import { useSuiContext, useSVMContext } from '@lifi/wallet-store' +import { + useSuiContext, + useSVMContext, + useUTXOContext, +} from '@lifi/wallet-store' import type { Theme } from '@mui/material' import { useMediaQuery } from '@mui/material' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' @@ -130,7 +134,7 @@ const combineWalletLists = ( export const useCombinedWallets = () => { const walletConfig = useWalletManagementConfig() const { connectors: wagmiConnectors } = useConnect() - const { connectors: bigmiConnectors } = useBigmiConnect() + const { wallets: bigmiConnectors } = useUTXOContext() const { wallets: solanaWallets } = useSVMContext() const { wallets: suiWallets } = useSuiContext() const [combinedWallets, setCombinedWallets] = useState( @@ -232,7 +236,7 @@ export const useCombinedWallets = () => { walletConfig.enabledChainTypes.includes(chainType) const installedUTXOConnectors = includeEcosystem(ChainType.UTXO) - ? bigmiConnectors.filter((connector) => { + ? bigmiConnectors.filter((connector: any) => { const isInstalled = isWalletInstalled(connector.id) return isInstalled }) @@ -266,10 +270,12 @@ export const useCombinedWallets = () => { walletConfig.walletEcosystemsOrder ) - const notDetectedUTXOConnectors = bigmiConnectors.filter((connector) => { - const isInstalled = isWalletInstalled(connector.id) - return !isInstalled && isDesktopView - }) + const notDetectedUTXOConnectors = bigmiConnectors.filter( + (connector: any) => { + const isInstalled = isWalletInstalled(connector.id) + return !isInstalled && isDesktopView + } + ) const notDetectedEVMConnectors = evmConnectors.filter((connector) => { const isInstalled = isWalletInstalled(connector.id) diff --git a/packages/wallet-management/src/index.ts b/packages/wallet-management/src/index.ts index fe5e2d57e..2904b22cf 100644 --- a/packages/wallet-management/src/index.ts +++ b/packages/wallet-management/src/index.ts @@ -5,7 +5,6 @@ export * from './connectors/metaMask.js' export * from './connectors/types.js' export * from './connectors/utils.js' export * from './connectors/walletConnect.js' -export * from './createDefaultBigmiConfig.js' export * from './createDefaultWagmiConfig.js' export * from './hooks/useAccount.js' export * from './hooks/useAccountDisconnect.js' diff --git a/packages/wallet-provider-utxo/package.json b/packages/wallet-provider-utxo/package.json new file mode 100644 index 000000000..26213956b --- /dev/null +++ b/packages/wallet-provider-utxo/package.json @@ -0,0 +1,23 @@ +{ + "name": "@lifi/wallet-provider-utxo", + "version": "1.0.0", + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.d.ts", + "dependencies": {}, + "peerDependencies": { + "@lifi/wallet-store": "workspace:*", + "@bigmi/react": ">=0.5.2", + "@bigmi/client": ">=0.5.2", + "@bigmi/core": ">=0.5.2" + }, + "devDependencies": { + "react": "^19.1.1", + "typescript": "^5.9.2" + }, + "files": [ + "dist/**", + "src/**", + "!tsconfig.json" + ] +} diff --git a/packages/wallet-provider-utxo/src/index.ts b/packages/wallet-provider-utxo/src/index.ts new file mode 100644 index 000000000..6c950533c --- /dev/null +++ b/packages/wallet-provider-utxo/src/index.ts @@ -0,0 +1 @@ +export { UTXOProvider, useInUTXOContext } from './providers/UTXOProvider.js' diff --git a/packages/widget/src/providers/WalletProvider/UTXOBaseProvider.tsx b/packages/wallet-provider-utxo/src/providers/UTXOBaseProvider.tsx similarity index 83% rename from packages/widget/src/providers/WalletProvider/UTXOBaseProvider.tsx rename to packages/wallet-provider-utxo/src/providers/UTXOBaseProvider.tsx index eacd21ef9..5a60375d6 100644 --- a/packages/widget/src/providers/WalletProvider/UTXOBaseProvider.tsx +++ b/packages/wallet-provider-utxo/src/providers/UTXOBaseProvider.tsx @@ -1,8 +1,10 @@ import type { Config } from '@bigmi/client' import { BigmiProvider, useReconnect } from '@bigmi/react' -import type { DefaultBigmiConfigResult } from '@lifi/wallet-management' -import { createDefaultBigmiConfig } from '@lifi/wallet-management' import { type FC, type PropsWithChildren, useRef } from 'react' +import { + createDefaultBigmiConfig, + type DefaultBigmiConfigResult, +} from './createDefaultBigmiConfig.js' export const UTXOBaseProvider: FC = ({ children }) => { const bigmi = useRef(null) diff --git a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx new file mode 100644 index 000000000..666d327e5 --- /dev/null +++ b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx @@ -0,0 +1,85 @@ +import { + type Connector, + connect, + disconnect, + getAccount, + getConnectorClient as getBigmiConnectorClient, +} from '@bigmi/client' +import { BigmiContext, useAccount, useConfig, useConnect } from '@bigmi/react' +import { UTXOContext } from '@lifi/wallet-store' +import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' +import { UTXOBaseProvider } from './UTXOBaseProvider.js' + +interface UTXOProviderProps { + forceInternalWalletManagement?: boolean +} + +export function useInUTXOContext(): boolean { + const context = useContext(BigmiContext) + + return Boolean(context) +} + +export const UTXOProvider: FC> = ({ + forceInternalWalletManagement, + children, +}) => { + const inUTXOContext = useInUTXOContext() + + if (inUTXOContext && !forceInternalWalletManagement) { + return ( + + {children} + + ) + } + + return ( + + + {children} + + + ) +} + +const CaptureUTXOValues: FC< + PropsWithChildren<{ isExternalContext: boolean }> +> = ({ children, isExternalContext }) => { + const bigmiConfig = useConfig() + const { connectors: bigmiConnectors } = useConnect() + const bigmiAccount = useAccount() + + const handleConnect = useCallback( + async (connector: Connector) => { + return await connect(bigmiConfig, { connector }) + }, + [bigmiConfig] + ) + + const handleDisconnect = useCallback(async () => { + const connectedAccount = getAccount(bigmiConfig) + if (connectedAccount.connector) { + await disconnect(bigmiConfig, { + connector: connectedAccount.connector, + }) + } + }, [bigmiConfig]) + + return ( + + {children} + + ) +} diff --git a/packages/wallet-management/src/createDefaultBigmiConfig.ts b/packages/wallet-provider-utxo/src/providers/createDefaultBigmiConfig.ts similarity index 100% rename from packages/wallet-management/src/createDefaultBigmiConfig.ts rename to packages/wallet-provider-utxo/src/providers/createDefaultBigmiConfig.ts diff --git a/packages/wallet-provider-utxo/tsconfig.json b/packages/wallet-provider-utxo/tsconfig.json new file mode 100644 index 000000000..8e1598c91 --- /dev/null +++ b/packages/wallet-provider-utxo/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "declaration": true, + "sourceMap": true, + "outDir": "dist/esm", + "rootDir": "./src", + "module": "ESNext", + "moduleResolution": "Bundler" + }, + "include": ["./src/**/*", "./src/**/*.json"] +} diff --git a/packages/wallet-store/src/contexts/UTXOContext.ts b/packages/wallet-store/src/contexts/UTXOContext.ts new file mode 100644 index 000000000..f71fd307f --- /dev/null +++ b/packages/wallet-store/src/contexts/UTXOContext.ts @@ -0,0 +1,7 @@ +import { createContext, useContext } from 'react' + +export const UTXOContext = createContext(null) + +export const useUTXOContext = () => { + return useContext(UTXOContext) +} diff --git a/packages/wallet-store/src/index.ts b/packages/wallet-store/src/index.ts index b01df7676..5f56561e4 100644 --- a/packages/wallet-store/src/index.ts +++ b/packages/wallet-store/src/index.ts @@ -1,2 +1,3 @@ export { SuiContext, useSuiContext } from './contexts/SuiContext.js' export { SVMContext, useSVMContext } from './contexts/SVMContext.js' +export { UTXOContext, useUTXOContext } from './contexts/UTXOContext.js' diff --git a/packages/widget-playground/package.json b/packages/widget-playground/package.json index b490e52be..3cf02f66e 100644 --- a/packages/widget-playground/package.json +++ b/packages/widget-playground/package.json @@ -33,6 +33,8 @@ "@lifi/sdk": "^3.11.3", "@lifi/wallet-management": "workspace:*", "@lifi/wallet-provider-sui": "workspace:*", + "@lifi/wallet-provider-utxo": "workspace:*", + "@lifi/wallet-provider-svm": "workspace:*", "@lifi/widget": "workspace:*", "@monaco-editor/react": "^4.7.0", "@mui/icons-material": "^7.3.1", diff --git a/packages/widget/package.json b/packages/widget/package.json index de6f9c72d..1e0adc0db 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -55,8 +55,6 @@ "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.11.3", "@lifi/wallet-management": "workspace:^", - "@lifi/wallet-provider-sui": "workspace:^", - "@lifi/wallet-provider-svm": "workspace:^", "@lifi/wallet-store": "workspace:^", "@mui/icons-material": "^7.3.1", "@mui/material": "^7.3.1", @@ -85,8 +83,11 @@ "vitest": "^3.2.4" }, "peerDependencies": { - "@bigmi/react": ">=0.5.0", + "@bigmi/react": ">=0.5.2", "@solana/wallet-adapter-react": ">=0.15.35", + "@lifi/wallet-provider-sui": "workspace:^", + "@lifi/wallet-provider-svm": "workspace:^", + "@lifi/wallet-provider-utxo": "workspace:^", "@tanstack/react-query": ">=5.68.0", "react": ">=18", "react-dom": ">=18", diff --git a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx index 0be75e1a0..bc8c1913a 100644 --- a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx +++ b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx @@ -1,8 +1,10 @@ -import { getConnectorClient as getBigmiConnectorClient } from '@bigmi/client' -import { useConfig as useBigmiConfig } from '@bigmi/react' import type { SDKProvider } from '@lifi/sdk' import { ChainType, config, EVM, Solana, Sui, UTXO } from '@lifi/sdk' -import { useSuiContext, useSVMContext } from '@lifi/wallet-store' +import { + useSuiContext, + useSVMContext, + useUTXOContext, +} from '@lifi/wallet-store' import type { SignerWalletAdapter } from '@solana/wallet-adapter-base' import { useEffect } from 'react' import { useConfig as useWagmiConfig } from 'wagmi' @@ -15,7 +17,7 @@ import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' export const SDKProviders = () => { const { sdkConfig } = useWidgetConfig() const wagmiConfig = useWagmiConfig() - const bigmiConfig = useBigmiConfig() + const { walletClient: utxoWalletClient } = useUTXOContext() const { currentWallet: svmWallet } = useSVMContext() const { currentWallet: suiWallet } = useSuiContext() @@ -57,7 +59,7 @@ export const SDKProviders = () => { if (!hasConfiguredUTXOProvider) { providers.push( UTXO({ - getWalletClient: () => getBigmiConnectorClient(bigmiConfig), + getWalletClient: () => utxoWalletClient, }) ) } @@ -73,11 +75,11 @@ export const SDKProviders = () => { } config.setProviders(providers) }, [ - bigmiConfig, suiWallet, sdkConfig?.providers, wagmiConfig, svmWallet?.adapter, + utxoWalletClient, ]) return null diff --git a/packages/widget/src/providers/WalletProvider/UTXOExternalContext.ts b/packages/widget/src/providers/WalletProvider/UTXOExternalContext.ts deleted file mode 100644 index 93c9b7244..000000000 --- a/packages/widget/src/providers/WalletProvider/UTXOExternalContext.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createContext } from 'react' - -export const UTXOExternalContext = createContext(false) diff --git a/packages/widget/src/providers/WalletProvider/UTXOProvider.tsx b/packages/widget/src/providers/WalletProvider/UTXOProvider.tsx deleted file mode 100644 index 309ae1157..000000000 --- a/packages/widget/src/providers/WalletProvider/UTXOProvider.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { BigmiContext } from '@bigmi/react' -import { ChainType } from '@lifi/sdk' -import { type FC, type PropsWithChildren, useContext } from 'react' -import { useInternalWalletProvider } from '../../hooks/useInternalWalletProvider.js' -import { isItemAllowed } from '../../utils/item.js' -import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' -import { UTXOBaseProvider } from './UTXOBaseProvider.js' -import { UTXOExternalContext } from './UTXOExternalContext.js' - -export function useInBigmiContext(): boolean { - const { chains } = useWidgetConfig() - const context = useContext(BigmiContext) - - return Boolean(context) && isItemAllowed(ChainType.UTXO, chains?.types) -} - -export const UTXOProvider: FC = ({ children }) => { - const inBigmiContext = useInBigmiContext() - const useInternalWallet = useInternalWalletProvider(inBigmiContext) - - return useInternalWallet ? ( - {children} - ) : ( - - {children} - - ) -} diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index a19850a8b..ed9998128 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -2,12 +2,12 @@ import type { WalletManagementConfig } from '@lifi/wallet-management' import { WalletManagementProvider } from '@lifi/wallet-management' import { SuiProvider } from '@lifi/wallet-provider-sui' import { SVMProvider } from '@lifi/wallet-provider-svm' +import { UTXOProvider } from '@lifi/wallet-provider-utxo' import { type FC, type PropsWithChildren, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' import { EVMProvider } from './EVMProvider.js' import { SDKProviders } from './SDKProviders.js' -import { UTXOProvider } from './UTXOProvider.js' import { useExternalWalletProvider } from './useExternalWalletProvider.js' export const WalletProvider: FC = ({ children }) => { @@ -20,7 +20,11 @@ export const WalletProvider: FC = ({ children }) => { walletConfig?.forceInternalWalletManagement } > - + { const providers: ChainType[] = [] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6725acae2..e690b899d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1041,6 +1041,28 @@ importers: specifier: ^5.9.2 version: 5.9.2 + packages/wallet-provider-utxo: + dependencies: + '@bigmi/client': + specifier: '>=0.5.2' + version: 0.5.2(@tanstack/query-core@5.85.5)(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) + '@bigmi/core': + specifier: '>=0.5.2' + version: 0.5.2(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) + '@bigmi/react': + specifier: '>=0.5.2' + version: 0.5.2(@tanstack/query-core@5.85.5)(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react@19.1.11)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) + '@lifi/wallet-store': + specifier: workspace:* + version: link:../wallet-store + devDependencies: + react: + specifier: ^19.1.1 + version: 19.1.1 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + packages/wallet-store: dependencies: zustand: @@ -1063,7 +1085,7 @@ importers: specifier: ^0.5.2 version: 0.5.2(@types/react@19.1.11)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@bigmi/react': - specifier: '>=0.5.0' + specifier: '>=0.5.2' version: 0.5.2(@tanstack/query-core@5.85.5)(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react@19.1.11)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@emotion/react': specifier: ^11.14.0 @@ -1083,6 +1105,9 @@ importers: '@lifi/wallet-provider-svm': specifier: workspace:^ version: link:../wallet-provider-svm + '@lifi/wallet-provider-utxo': + specifier: workspace:^ + version: link:../wallet-provider-utxo '@lifi/wallet-store': specifier: workspace:^ version: link:../wallet-store @@ -1259,6 +1284,12 @@ importers: '@lifi/wallet-provider-sui': specifier: workspace:* version: link:../wallet-provider-sui + '@lifi/wallet-provider-svm': + specifier: workspace:* + version: link:../wallet-provider-svm + '@lifi/wallet-provider-utxo': + specifier: workspace:* + version: link:../wallet-provider-utxo '@lifi/widget': specifier: workspace:* version: link:../widget From d95b091c7dbec855c554f5ff3e4c971b52a4a463 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Fri, 5 Sep 2025 16:28:40 +0100 Subject: [PATCH 05/24] refactor: rename wallet-store to wallet-provider --- packages/wallet-management/package.json | 2 +- .../src/components/SVMListItemButton.tsx | 2 +- .../src/components/SuiListItemButton.tsx | 2 +- .../src/components/UTXOListItemButton.tsx | 2 +- .../wallet-management/src/hooks/useAccount.ts | 2 +- .../src/hooks/useAccountDisconnect.ts | 2 +- .../src/hooks/useCombinedWallets.ts | 2 +- packages/wallet-provider-sui/package.json | 2 +- .../src/providers/SuiProvider.tsx | 2 +- packages/wallet-provider-svm/package.json | 2 +- .../src/providers/SVMProvider.tsx | 2 +- packages/wallet-provider-utxo/package.json | 2 +- .../src/providers/UTXOProvider.tsx | 2 +- .../package.json | 2 +- .../src/contexts/SVMContext.ts | 0 .../src/contexts/UTXOContext.ts | 0 .../src/contexts/suiContext.ts | 0 .../src/index.ts | 0 .../tsconfig.json | 2 +- packages/widget/package.json | 2 +- .../providers/WalletProvider/SDKProviders.tsx | 4 +- .../useExternalWalletProvider.ts | 2 +- pnpm-lock.yaml | 48 +++++++++---------- 23 files changed, 43 insertions(+), 43 deletions(-) rename packages/{wallet-store => wallet-provider}/package.json (89%) rename packages/{wallet-store => wallet-provider}/src/contexts/SVMContext.ts (100%) rename packages/{wallet-store => wallet-provider}/src/contexts/UTXOContext.ts (100%) rename packages/{wallet-store => wallet-provider}/src/contexts/suiContext.ts (100%) rename packages/{wallet-store => wallet-provider}/src/index.ts (100%) rename packages/{wallet-store => wallet-provider}/tsconfig.json (77%) diff --git a/packages/wallet-management/package.json b/packages/wallet-management/package.json index 0d359bbb7..70738b426 100644 --- a/packages/wallet-management/package.json +++ b/packages/wallet-management/package.json @@ -80,7 +80,7 @@ "react": ">=18", "react-dom": ">=18", "wagmi": ">=2.14.0", - "@lifi/wallet-store": "workspace:*" + "@lifi/wallet-provider": "workspace:*" }, "files": [ "dist/**", diff --git a/packages/wallet-management/src/components/SVMListItemButton.tsx b/packages/wallet-management/src/components/SVMListItemButton.tsx index 2e749554f..347cc1248 100644 --- a/packages/wallet-management/src/components/SVMListItemButton.tsx +++ b/packages/wallet-management/src/components/SVMListItemButton.tsx @@ -1,5 +1,5 @@ import { ChainId, ChainType } from '@lifi/sdk' -import { useSVMContext } from '@lifi/wallet-store' +import { useSVMContext } from '@lifi/wallet-provider' import type { WalletAdapter } from '@solana/wallet-adapter-base' import type { PublicKey } from '@solana/web3.js' import { useLastConnectedAccount } from '../hooks/useAccount.js' diff --git a/packages/wallet-management/src/components/SuiListItemButton.tsx b/packages/wallet-management/src/components/SuiListItemButton.tsx index 40aaa0287..b38ba5ebe 100644 --- a/packages/wallet-management/src/components/SuiListItemButton.tsx +++ b/packages/wallet-management/src/components/SuiListItemButton.tsx @@ -1,5 +1,5 @@ import { ChainId, ChainType } from '@lifi/sdk' -import { useSuiContext } from '@lifi/wallet-store' +import { useSuiContext } from '@lifi/wallet-provider' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' diff --git a/packages/wallet-management/src/components/UTXOListItemButton.tsx b/packages/wallet-management/src/components/UTXOListItemButton.tsx index 4206ebad9..98829c1f1 100644 --- a/packages/wallet-management/src/components/UTXOListItemButton.tsx +++ b/packages/wallet-management/src/components/UTXOListItemButton.tsx @@ -1,6 +1,6 @@ import type { Connector } from '@bigmi/client' import { ChainId, ChainType } from '@lifi/sdk' -import { useUTXOContext } from '@lifi/wallet-store' +import { useUTXOContext } from '@lifi/wallet-provider' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' import { getChainTypeIcon } from '../icons.js' diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index ef33ea2e2..6ab48733b 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -4,7 +4,7 @@ import { useSuiContext, useSVMContext, useUTXOContext, -} from '@lifi/wallet-store' +} from '@lifi/wallet-provider' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import type { WalletAdapter } from '@solana/wallet-adapter-base' import { useMemo } from 'react' diff --git a/packages/wallet-management/src/hooks/useAccountDisconnect.ts b/packages/wallet-management/src/hooks/useAccountDisconnect.ts index c10fa7caf..d1b9c6e8a 100644 --- a/packages/wallet-management/src/hooks/useAccountDisconnect.ts +++ b/packages/wallet-management/src/hooks/useAccountDisconnect.ts @@ -3,7 +3,7 @@ import { useSuiContext, useSVMContext, useUTXOContext, -} from '@lifi/wallet-store' +} from '@lifi/wallet-provider' import type { Config } from 'wagmi' import { useConfig as useWagmiConfig } from 'wagmi' import { disconnect, getAccount } from 'wagmi/actions' diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 10e71da3b..64a5003e2 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -5,7 +5,7 @@ import { useSuiContext, useSVMContext, useUTXOContext, -} from '@lifi/wallet-store' +} from '@lifi/wallet-provider' import type { Theme } from '@mui/material' import { useMediaQuery } from '@mui/material' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' diff --git a/packages/wallet-provider-sui/package.json b/packages/wallet-provider-sui/package.json index 80adb68fa..a7b725d7c 100644 --- a/packages/wallet-provider-sui/package.json +++ b/packages/wallet-provider-sui/package.json @@ -10,7 +10,7 @@ }, "peerDependencies": { "@mysten/dapp-kit": "^0.17.4", - "@lifi/wallet-store": "workspace:*" + "@lifi/wallet-provider": "workspace:*" }, "devDependencies": { "react": "^19.1.1", diff --git a/packages/wallet-provider-sui/src/providers/SuiProvider.tsx b/packages/wallet-provider-sui/src/providers/SuiProvider.tsx index 9a4eb4214..8ce3bef0e 100644 --- a/packages/wallet-provider-sui/src/providers/SuiProvider.tsx +++ b/packages/wallet-provider-sui/src/providers/SuiProvider.tsx @@ -1,4 +1,4 @@ -import { SuiContext } from '@lifi/wallet-store' +import { SuiContext } from '@lifi/wallet-provider' import { SuiClientContext, useConnectWallet, diff --git a/packages/wallet-provider-svm/package.json b/packages/wallet-provider-svm/package.json index aed1df268..5ba6316fa 100644 --- a/packages/wallet-provider-svm/package.json +++ b/packages/wallet-provider-svm/package.json @@ -11,7 +11,7 @@ }, "peerDependencies": { "@solana/wallet-adapter-react": "^0.15.39", - "@lifi/wallet-store": "workspace:*" + "@lifi/wallet-provider": "workspace:*" }, "devDependencies": { "react": "^19.1.1", diff --git a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx index 15fc6853c..dd7c351f1 100644 --- a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx +++ b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx @@ -1,4 +1,4 @@ -import { SVMContext } from '@lifi/wallet-store' +import { SVMContext } from '@lifi/wallet-provider' import { ConnectionContext, useWallet } from '@solana/wallet-adapter-react' import { type FC, type PropsWithChildren, useContext } from 'react' import { SVMBaseProvider } from './SVMBaseProvider.js' diff --git a/packages/wallet-provider-utxo/package.json b/packages/wallet-provider-utxo/package.json index 26213956b..adf6c03d0 100644 --- a/packages/wallet-provider-utxo/package.json +++ b/packages/wallet-provider-utxo/package.json @@ -6,7 +6,7 @@ "types": "./src/index.d.ts", "dependencies": {}, "peerDependencies": { - "@lifi/wallet-store": "workspace:*", + "@lifi/wallet-provider": "workspace:*", "@bigmi/react": ">=0.5.2", "@bigmi/client": ">=0.5.2", "@bigmi/core": ">=0.5.2" diff --git a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx index 666d327e5..f1be67886 100644 --- a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx +++ b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx @@ -6,7 +6,7 @@ import { getConnectorClient as getBigmiConnectorClient, } from '@bigmi/client' import { BigmiContext, useAccount, useConfig, useConnect } from '@bigmi/react' -import { UTXOContext } from '@lifi/wallet-store' +import { UTXOContext } from '@lifi/wallet-provider' import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' import { UTXOBaseProvider } from './UTXOBaseProvider.js' diff --git a/packages/wallet-store/package.json b/packages/wallet-provider/package.json similarity index 89% rename from packages/wallet-store/package.json rename to packages/wallet-provider/package.json index 8b16a4a63..4f4f15397 100644 --- a/packages/wallet-store/package.json +++ b/packages/wallet-provider/package.json @@ -1,5 +1,5 @@ { - "name": "@lifi/wallet-store", + "name": "@lifi/wallet-provider", "version": "1.0.0", "type": "module", "main": "./src/index.ts", diff --git a/packages/wallet-store/src/contexts/SVMContext.ts b/packages/wallet-provider/src/contexts/SVMContext.ts similarity index 100% rename from packages/wallet-store/src/contexts/SVMContext.ts rename to packages/wallet-provider/src/contexts/SVMContext.ts diff --git a/packages/wallet-store/src/contexts/UTXOContext.ts b/packages/wallet-provider/src/contexts/UTXOContext.ts similarity index 100% rename from packages/wallet-store/src/contexts/UTXOContext.ts rename to packages/wallet-provider/src/contexts/UTXOContext.ts diff --git a/packages/wallet-store/src/contexts/suiContext.ts b/packages/wallet-provider/src/contexts/suiContext.ts similarity index 100% rename from packages/wallet-store/src/contexts/suiContext.ts rename to packages/wallet-provider/src/contexts/suiContext.ts diff --git a/packages/wallet-store/src/index.ts b/packages/wallet-provider/src/index.ts similarity index 100% rename from packages/wallet-store/src/index.ts rename to packages/wallet-provider/src/index.ts diff --git a/packages/wallet-store/tsconfig.json b/packages/wallet-provider/tsconfig.json similarity index 77% rename from packages/wallet-store/tsconfig.json rename to packages/wallet-provider/tsconfig.json index e187e5655..8e1598c91 100644 --- a/packages/wallet-store/tsconfig.json +++ b/packages/wallet-provider/tsconfig.json @@ -9,5 +9,5 @@ "module": "ESNext", "moduleResolution": "Bundler" }, - "include": ["./src/**/*", "./src/**/*.json", "src/stores/suiStore.ts"] + "include": ["./src/**/*", "./src/**/*.json"] } diff --git a/packages/widget/package.json b/packages/widget/package.json index 1e0adc0db..8484ce52d 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -55,7 +55,7 @@ "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.11.3", "@lifi/wallet-management": "workspace:^", - "@lifi/wallet-store": "workspace:^", + "@lifi/wallet-provider": "workspace:^", "@mui/icons-material": "^7.3.1", "@mui/material": "^7.3.1", "@mui/system": "^7.3.1", diff --git a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx index bc8c1913a..41c2d06e1 100644 --- a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx +++ b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx @@ -4,7 +4,7 @@ import { useSuiContext, useSVMContext, useUTXOContext, -} from '@lifi/wallet-store' +} from '@lifi/wallet-provider' import type { SignerWalletAdapter } from '@solana/wallet-adapter-base' import { useEffect } from 'react' import { useConfig as useWagmiConfig } from 'wagmi' @@ -24,7 +24,7 @@ export const SDKProviders = () => { useEffect(() => { // Configure SDK Providers const providers: SDKProvider[] = [] - const hasConfiguredEVMProvider = sdkConfig?.providers?.find( + const hasConfiguredEVMProvider = sdkConfig?.providers?.some( (provider) => provider.type === ChainType.EVM ) const hasConfiguredSVMProvider = sdkConfig?.providers?.some( diff --git a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts index 5a4b28175..28b955941 100644 --- a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts +++ b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts @@ -3,7 +3,7 @@ import { useSuiContext, useSVMContext, useUTXOContext, -} from '@lifi/wallet-store' +} from '@lifi/wallet-provider' import { useContext, useMemo } from 'react' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' import { EVMExternalContext } from './EVMExternalContext.js' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e690b899d..526deeb87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -929,9 +929,9 @@ importers: '@lifi/sdk': specifier: ^3.11.3 version: 3.11.3(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.11)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - '@lifi/wallet-store': + '@lifi/wallet-provider': specifier: workspace:* - version: link:../wallet-store + version: link:../wallet-provider '@mui/icons-material': specifier: ^7.3.1 version: 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) @@ -994,11 +994,24 @@ importers: specifier: ^5.9.2 version: 5.9.2 + packages/wallet-provider: + dependencies: + zustand: + specifier: ^4.5.0 + version: 4.5.7(@types/react@19.1.11)(react@19.1.1) + devDependencies: + react: + specifier: ^19.1.1 + version: 19.1.1 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + packages/wallet-provider-sui: dependencies: - '@lifi/wallet-store': + '@lifi/wallet-provider': specifier: workspace:* - version: link:../wallet-store + version: link:../wallet-provider '@mysten/dapp-kit': specifier: ^0.17.4 version: 0.17.5(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.11))(@types/react@19.1.11)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) @@ -1018,9 +1031,9 @@ importers: packages/wallet-provider-svm: dependencies: - '@lifi/wallet-store': + '@lifi/wallet-provider': specifier: workspace:* - version: link:../wallet-store + version: link:../wallet-provider '@solana/wallet-adapter-base': specifier: ^0.9.27 version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) @@ -1052,22 +1065,9 @@ importers: '@bigmi/react': specifier: '>=0.5.2' version: 0.5.2(@tanstack/query-core@5.85.5)(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react@19.1.11)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) - '@lifi/wallet-store': + '@lifi/wallet-provider': specifier: workspace:* - version: link:../wallet-store - devDependencies: - react: - specifier: ^19.1.1 - version: 19.1.1 - typescript: - specifier: ^5.9.2 - version: 5.9.2 - - packages/wallet-store: - dependencies: - zustand: - specifier: ^4.5.0 - version: 4.5.7(@types/react@19.1.11)(react@19.1.1) + version: link:../wallet-provider devDependencies: react: specifier: ^19.1.1 @@ -1099,6 +1099,9 @@ importers: '@lifi/wallet-management': specifier: workspace:^ version: link:../wallet-management + '@lifi/wallet-provider': + specifier: workspace:^ + version: link:../wallet-provider '@lifi/wallet-provider-sui': specifier: workspace:^ version: link:../wallet-provider-sui @@ -1108,9 +1111,6 @@ importers: '@lifi/wallet-provider-utxo': specifier: workspace:^ version: link:../wallet-provider-utxo - '@lifi/wallet-store': - specifier: workspace:^ - version: link:../wallet-store '@mui/icons-material': specifier: ^7.3.1 version: 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react@19.1.1))(@types/react@19.1.11)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.11)(react@19.1.1) From bd21ee064c1ad902e5b4ba0fd7bb6dff67687564 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Fri, 5 Sep 2025 17:40:21 +0100 Subject: [PATCH 06/24] refactor: sui to mvm --- .../src/components/SuiListItemButton.tsx | 4 +-- .../wallet-management/src/hooks/useAccount.ts | 4 +-- .../src/hooks/useAccountDisconnect.ts | 4 +-- .../src/hooks/useCombinedWallets.ts | 4 +-- .../package.json | 2 +- packages/wallet-provider-mvm/src/index.ts | 1 + .../src/providers/MVMBaseProvider.tsx} | 2 +- .../src/providers/MVMProvider.tsx} | 30 +++++++++---------- .../tsconfig.json | 0 packages/wallet-provider-sui/src/index.ts | 1 - packages/wallet-provider/package.json | 4 +-- .../src/contexts/MVMContext.ts | 7 +++++ .../src/contexts/suiContext.ts | 7 ----- packages/wallet-provider/src/index.ts | 2 +- packages/widget-playground/package.json | 2 +- packages/widget/package.json | 2 +- .../providers/WalletProvider/SDKProviders.tsx | 4 +-- .../WalletProvider/WalletProvider.tsx | 6 ++-- .../useExternalWalletProvider.ts | 4 +-- packages/widget/tsconfig.json | 6 +--- pnpm-lock.yaml | 22 ++++++-------- 21 files changed, 54 insertions(+), 64 deletions(-) rename packages/{wallet-provider-sui => wallet-provider-mvm}/package.json (92%) create mode 100644 packages/wallet-provider-mvm/src/index.ts rename packages/{wallet-provider-sui/src/providers/SuiBaseProvider.tsx => wallet-provider-mvm/src/providers/MVMBaseProvider.tsx} (90%) rename packages/{wallet-provider-sui/src/providers/SuiProvider.tsx => wallet-provider-mvm/src/providers/MVMProvider.tsx} (63%) rename packages/{wallet-provider-sui => wallet-provider-mvm}/tsconfig.json (100%) delete mode 100644 packages/wallet-provider-sui/src/index.ts create mode 100644 packages/wallet-provider/src/contexts/MVMContext.ts delete mode 100644 packages/wallet-provider/src/contexts/suiContext.ts diff --git a/packages/wallet-management/src/components/SuiListItemButton.tsx b/packages/wallet-management/src/components/SuiListItemButton.tsx index b38ba5ebe..7d5aedceb 100644 --- a/packages/wallet-management/src/components/SuiListItemButton.tsx +++ b/packages/wallet-management/src/components/SuiListItemButton.tsx @@ -1,5 +1,5 @@ import { ChainId, ChainType } from '@lifi/sdk' -import { useSuiContext } from '@lifi/wallet-provider' +import { useMVMContext } from '@lifi/wallet-provider' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' @@ -22,7 +22,7 @@ export const SuiListItemButton = ({ onError, }: SuiListItemButtonProps) => { const emitter = useWalletManagementEvents() - const { connect } = useSuiContext() + const { connect } = useMVMContext() const { setLastConnectedAccount } = useLastConnectedAccount() const connectorName = wallet.name diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index 6ab48733b..4cd90cccd 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -1,7 +1,7 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { ChainId, ChainType } from '@lifi/sdk' import { - useSuiContext, + useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' @@ -92,7 +92,7 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { const wagmiAccount = useAccountInternal() const { currentWallet: utxoWallet } = useUTXOContext() const { currentWallet: svmWallet } = useSVMContext() - const { currentWallet: suiWallet, connectionStatus } = useSuiContext() + const { currentWallet: suiWallet, connectionStatus } = useMVMContext() const { lastConnectedAccount } = useLastConnectedAccount() // biome-ignore lint/correctness/useExhaustiveDependencies: run only when wallet changes diff --git a/packages/wallet-management/src/hooks/useAccountDisconnect.ts b/packages/wallet-management/src/hooks/useAccountDisconnect.ts index d1b9c6e8a..df99dc149 100644 --- a/packages/wallet-management/src/hooks/useAccountDisconnect.ts +++ b/packages/wallet-management/src/hooks/useAccountDisconnect.ts @@ -1,6 +1,6 @@ import { ChainType } from '@lifi/sdk' import { - useSuiContext, + useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' @@ -13,7 +13,7 @@ export const useAccountDisconnect = () => { const wagmiConfig = useWagmiConfig() const { disconnect: utxoDisconnect } = useUTXOContext() const { disconnect: svmDisconnect } = useSVMContext() - const { disconnect: suiDisconnect } = useSuiContext() + const { disconnect: suiDisconnect } = useMVMContext() const handleDisconnectEVM = async (config: Config) => { const connectedAccount = getAccount(config) diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 64a5003e2..13376746a 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -2,7 +2,7 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { ChainType } from '@lifi/sdk' import { - useSuiContext, + useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' @@ -136,7 +136,7 @@ export const useCombinedWallets = () => { const { connectors: wagmiConnectors } = useConnect() const { wallets: bigmiConnectors } = useUTXOContext() const { wallets: solanaWallets } = useSVMContext() - const { wallets: suiWallets } = useSuiContext() + const { wallets: suiWallets } = useMVMContext() const [combinedWallets, setCombinedWallets] = useState( () => { return { diff --git a/packages/wallet-provider-sui/package.json b/packages/wallet-provider-mvm/package.json similarity index 92% rename from packages/wallet-provider-sui/package.json rename to packages/wallet-provider-mvm/package.json index a7b725d7c..7286a5d75 100644 --- a/packages/wallet-provider-sui/package.json +++ b/packages/wallet-provider-mvm/package.json @@ -1,5 +1,5 @@ { - "name": "@lifi/wallet-provider-sui", + "name": "@lifi/wallet-provider-mvm", "version": "1.0.0", "type": "module", "main": "./src/index.ts", diff --git a/packages/wallet-provider-mvm/src/index.ts b/packages/wallet-provider-mvm/src/index.ts new file mode 100644 index 000000000..8d0cda697 --- /dev/null +++ b/packages/wallet-provider-mvm/src/index.ts @@ -0,0 +1 @@ +export { MVMProvider } from './providers/MVMProvider.js' diff --git a/packages/wallet-provider-sui/src/providers/SuiBaseProvider.tsx b/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx similarity index 90% rename from packages/wallet-provider-sui/src/providers/SuiBaseProvider.tsx rename to packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx index e680790b9..efeb55e3d 100644 --- a/packages/wallet-provider-sui/src/providers/SuiBaseProvider.tsx +++ b/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx @@ -6,7 +6,7 @@ import { import { getFullnodeUrl } from '@mysten/sui/client' import { type FC, type PropsWithChildren, useMemo } from 'react' -export const SuiBaseProvider: FC = ({ children }) => { +export const MVMBaseProvider: FC = ({ children }) => { const config = useMemo(() => { return createNetworkConfig({ mainnet: { url: getFullnodeUrl('mainnet') }, diff --git a/packages/wallet-provider-sui/src/providers/SuiProvider.tsx b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx similarity index 63% rename from packages/wallet-provider-sui/src/providers/SuiProvider.tsx rename to packages/wallet-provider-mvm/src/providers/MVMProvider.tsx index 8ce3bef0e..b250b19f0 100644 --- a/packages/wallet-provider-sui/src/providers/SuiProvider.tsx +++ b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx @@ -1,4 +1,4 @@ -import { SuiContext } from '@lifi/wallet-provider' +import { MVMContext } from '@lifi/wallet-provider' import { SuiClientContext, useConnectWallet, @@ -7,41 +7,41 @@ import { useWallets, } from '@mysten/dapp-kit' import { type FC, type PropsWithChildren, useContext } from 'react' -import { SuiBaseProvider } from './SuiBaseProvider.js' +import { MVMBaseProvider } from './MVMBaseProvider.js' -interface SuiProviderProps { +interface MVMProviderProps { forceInternalWalletManagement?: boolean } -export function useInSuiContext(): boolean { +export function useInMVMContext(): boolean { const context = useContext(SuiClientContext) return Boolean(context) } -export const SuiProvider: FC> = ({ +export const MVMProvider: FC> = ({ forceInternalWalletManagement, children, }) => { - const inSuiContext = useInSuiContext() + const inSuiContext = useInMVMContext() if (inSuiContext && !forceInternalWalletManagement) { return ( - + {children} - + ) } return ( - - + + {children} - - + + ) } -const CaptureSuiValues: FC< +const CaptureMVMValues: FC< PropsWithChildren<{ isExternalContext: boolean }> > = ({ children, isExternalContext }) => { const wallets = useWallets() @@ -50,7 +50,7 @@ const CaptureSuiValues: FC< const { mutateAsync: connect } = useConnectWallet() return ( - {children} - + ) } diff --git a/packages/wallet-provider-sui/tsconfig.json b/packages/wallet-provider-mvm/tsconfig.json similarity index 100% rename from packages/wallet-provider-sui/tsconfig.json rename to packages/wallet-provider-mvm/tsconfig.json diff --git a/packages/wallet-provider-sui/src/index.ts b/packages/wallet-provider-sui/src/index.ts deleted file mode 100644 index 2ecc249c8..000000000 --- a/packages/wallet-provider-sui/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { SuiProvider } from './providers/SuiProvider.js' diff --git a/packages/wallet-provider/package.json b/packages/wallet-provider/package.json index 4f4f15397..375953130 100644 --- a/packages/wallet-provider/package.json +++ b/packages/wallet-provider/package.json @@ -4,9 +4,7 @@ "type": "module", "main": "./src/index.ts", "types": "./src/index.d.ts", - "dependencies": { - "zustand": "^4.5.0" - }, + "dependencies": {}, "devDependencies": { "react": "^19.1.1", "typescript": "^5.9.2" diff --git a/packages/wallet-provider/src/contexts/MVMContext.ts b/packages/wallet-provider/src/contexts/MVMContext.ts new file mode 100644 index 000000000..f0ed932a6 --- /dev/null +++ b/packages/wallet-provider/src/contexts/MVMContext.ts @@ -0,0 +1,7 @@ +import { createContext, useContext } from 'react' + +export const MVMContext = createContext(null) + +export const useMVMContext = () => { + return useContext(MVMContext) +} diff --git a/packages/wallet-provider/src/contexts/suiContext.ts b/packages/wallet-provider/src/contexts/suiContext.ts deleted file mode 100644 index 039d07210..000000000 --- a/packages/wallet-provider/src/contexts/suiContext.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createContext, useContext } from 'react' - -export const SuiContext = createContext(null) - -export const useSuiContext = () => { - return useContext(SuiContext) -} diff --git a/packages/wallet-provider/src/index.ts b/packages/wallet-provider/src/index.ts index 5f56561e4..d4fd6bba8 100644 --- a/packages/wallet-provider/src/index.ts +++ b/packages/wallet-provider/src/index.ts @@ -1,3 +1,3 @@ -export { SuiContext, useSuiContext } from './contexts/SuiContext.js' +export { MVMContext, useMVMContext } from './contexts/MVMContext.js' export { SVMContext, useSVMContext } from './contexts/SVMContext.js' export { UTXOContext, useUTXOContext } from './contexts/UTXOContext.js' diff --git a/packages/widget-playground/package.json b/packages/widget-playground/package.json index 3cf02f66e..05321c88f 100644 --- a/packages/widget-playground/package.json +++ b/packages/widget-playground/package.json @@ -32,7 +32,7 @@ "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.11.3", "@lifi/wallet-management": "workspace:*", - "@lifi/wallet-provider-sui": "workspace:*", + "@lifi/wallet-provider-mvm": "workspace:*", "@lifi/wallet-provider-utxo": "workspace:*", "@lifi/wallet-provider-svm": "workspace:*", "@lifi/widget": "workspace:*", diff --git a/packages/widget/package.json b/packages/widget/package.json index 8484ce52d..94c57ae0c 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -85,7 +85,7 @@ "peerDependencies": { "@bigmi/react": ">=0.5.2", "@solana/wallet-adapter-react": ">=0.15.35", - "@lifi/wallet-provider-sui": "workspace:^", + "@lifi/wallet-provider-mvm": "workspace:^", "@lifi/wallet-provider-svm": "workspace:^", "@lifi/wallet-provider-utxo": "workspace:^", "@tanstack/react-query": ">=5.68.0", diff --git a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx index 41c2d06e1..b99a67054 100644 --- a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx +++ b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx @@ -1,7 +1,7 @@ import type { SDKProvider } from '@lifi/sdk' import { ChainType, config, EVM, Solana, Sui, UTXO } from '@lifi/sdk' import { - useSuiContext, + useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' @@ -19,7 +19,7 @@ export const SDKProviders = () => { const wagmiConfig = useWagmiConfig() const { walletClient: utxoWalletClient } = useUTXOContext() const { currentWallet: svmWallet } = useSVMContext() - const { currentWallet: suiWallet } = useSuiContext() + const { currentWallet: suiWallet } = useMVMContext() useEffect(() => { // Configure SDK Providers diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index ed9998128..3e443c1fe 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -1,6 +1,6 @@ import type { WalletManagementConfig } from '@lifi/wallet-management' import { WalletManagementProvider } from '@lifi/wallet-management' -import { SuiProvider } from '@lifi/wallet-provider-sui' +import { MVMProvider } from '@lifi/wallet-provider-mvm' import { SVMProvider } from '@lifi/wallet-provider-svm' import { UTXOProvider } from '@lifi/wallet-provider-utxo' import { type FC, type PropsWithChildren, useMemo } from 'react' @@ -25,14 +25,14 @@ export const WalletProvider: FC = ({ children }) => { walletConfig?.forceInternalWalletManagement } > - {children} - + diff --git a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts index 28b955941..186ec94c1 100644 --- a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts +++ b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts @@ -1,6 +1,6 @@ import { ChainType } from '@lifi/sdk' import { - useSuiContext, + useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' @@ -26,7 +26,7 @@ export function useExternalWalletProvider(): ExternalWalletProvider { const hasExternalEVMContext = useContext(EVMExternalContext) const { isExternalContext: hasExternalSVMContext } = useSVMContext() const { isExternalContext: hasExternalUTXOContext } = useUTXOContext() - const { isExternalContext: hasExternalSuiContext } = useSuiContext() + const { isExternalContext: hasExternalSuiContext } = useMVMContext() const data = useMemo(() => { const providers: ChainType[] = [] if (hasExternalEVMContext) { diff --git a/packages/widget/tsconfig.json b/packages/widget/tsconfig.json index 6e51eb2f7..5132cce13 100644 --- a/packages/widget/tsconfig.json +++ b/packages/widget/tsconfig.json @@ -11,9 +11,5 @@ "skipLibCheck": true }, "include": ["./src/**/*", "./src/**/*.json"], - "references": [ - { "path": "../wallet-management" }, - { "path": "../wallet-provider-sui" }, - { "path": "../wallet-provider-svm" } - ] + "references": [{ "path": "../wallet-management" }] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 526deeb87..b746e2f08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -995,10 +995,6 @@ importers: version: 5.9.2 packages/wallet-provider: - dependencies: - zustand: - specifier: ^4.5.0 - version: 4.5.7(@types/react@19.1.11)(react@19.1.1) devDependencies: react: specifier: ^19.1.1 @@ -1007,7 +1003,7 @@ importers: specifier: ^5.9.2 version: 5.9.2 - packages/wallet-provider-sui: + packages/wallet-provider-mvm: dependencies: '@lifi/wallet-provider': specifier: workspace:* @@ -1017,10 +1013,10 @@ importers: version: 0.17.5(@tanstack/react-query@5.85.5(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.11))(@types/react@19.1.11)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) '@mysten/sui': specifier: ^1.37.3 - version: 1.37.4(typescript@5.9.2) + version: 1.37.5(typescript@5.9.2) '@mysten/wallet-standard': specifier: ^0.16.11 - version: 0.16.12(typescript@5.9.2) + version: 0.16.13(typescript@5.9.2) devDependencies: react: specifier: ^19.1.1 @@ -1102,9 +1098,9 @@ importers: '@lifi/wallet-provider': specifier: workspace:^ version: link:../wallet-provider - '@lifi/wallet-provider-sui': + '@lifi/wallet-provider-mvm': specifier: workspace:^ - version: link:../wallet-provider-sui + version: link:../wallet-provider-mvm '@lifi/wallet-provider-svm': specifier: workspace:^ version: link:../wallet-provider-svm @@ -1281,9 +1277,9 @@ importers: '@lifi/wallet-management': specifier: workspace:* version: link:../wallet-management - '@lifi/wallet-provider-sui': + '@lifi/wallet-provider-mvm': specifier: workspace:* - version: link:../wallet-provider-sui + version: link:../wallet-provider-mvm '@lifi/wallet-provider-svm': specifier: workspace:* version: link:../wallet-provider-svm @@ -30932,8 +30928,8 @@ snapshots: '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.9.2)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: From b74629918e14492aa2305b86fe0a92f017f84793 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Fri, 26 Sep 2025 13:10:10 +0100 Subject: [PATCH 07/24] fix: utxo connection --- .../wallet-management/src/components/UTXOListItemButton.tsx | 3 ++- packages/wallet-management/src/hooks/useCombinedWallets.ts | 1 - packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/wallet-management/src/components/UTXOListItemButton.tsx b/packages/wallet-management/src/components/UTXOListItemButton.tsx index 98829c1f1..3911d3913 100644 --- a/packages/wallet-management/src/components/UTXOListItemButton.tsx +++ b/packages/wallet-management/src/components/UTXOListItemButton.tsx @@ -46,8 +46,9 @@ export const UTXOListItemButton = ({ return } onConnecting?.() - const data = await connect(connector) + // Disconnect currently connected UTXO wallet (if any) await disconnect() + const data = await connect(connector) setLastConnectedAccount(connector) emitter.emit(WalletManagementEvent.WalletConnected, { address: data.accounts[0].address, diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 3409cb7b6..8191f8fea 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -1,5 +1,4 @@ import type { Connector as BigmiConnector } from '@bigmi/client' - import { ChainType } from '@lifi/sdk' import { useMVMContext, diff --git a/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx b/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx index efeb55e3d..750ad208f 100644 --- a/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx +++ b/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx @@ -9,6 +9,8 @@ import { type FC, type PropsWithChildren, useMemo } from 'react' export const MVMBaseProvider: FC = ({ children }) => { const config = useMemo(() => { return createNetworkConfig({ + // TODO: original: mainnet: { url: sui?.metamask?.rpcUrls[0] ?? getFullnodeUrl('mainnet') }, + // sui chain: from useAvailableChains() mainnet: { url: getFullnodeUrl('mainnet') }, }) }, []) From 327a43af8e37613b90229d131e4c1d475c3c4722 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Fri, 26 Sep 2025 15:17:00 +0100 Subject: [PATCH 08/24] feat: evm wallet provider --- .../src/components/EVMListItemButton.tsx | 13 +-- .../wallet-management/src/hooks/useAccount.ts | 16 +-- .../src/hooks/useAccountDisconnect.ts | 15 +-- .../src/hooks/useCombinedWallets.ts | 10 +- packages/wallet-management/src/index.ts | 1 - packages/wallet-provider-evm/package.json | 24 +++++ .../src/config/baseAccount.ts | 2 +- .../src/config/coinbase.ts | 2 +- .../src/config/metaMask.ts | 2 +- .../src/config/walletConnect.ts | 0 .../src/connectors/baseAccount.ts | 7 ++ .../src/connectors/coinbase.ts | 12 +++ .../src/connectors/metaMask.ts | 7 ++ .../src/connectors/porto.ts | 6 ++ .../src/connectors/walletConnect.ts | 20 ++++ .../src/hooks/useSyncWagmiConfig.ts | 34 ++++++ packages/wallet-provider-evm/src/index.ts | 1 + .../src/providers}/EVMBaseProvider.tsx | 34 +++--- .../src/providers/EVMProvider.tsx | 100 ++++++++++++++++++ .../src/types/connectors.ts | 6 ++ .../src/utils/convertExtendedChain.ts | 53 ++++++++++ .../src/utils}/createDefaultWagmiConfig.ts | 12 +-- .../src/utils/extendConnector.ts | 13 +++ .../src/utils/isWalletInstalled.ts | 54 ++++++++++ .../wallet-provider-evm/src/utils/lifi.ts | 2 + .../src/utils/syncWagmiConfig.ts | 25 +++++ packages/wallet-provider-evm/tsconfig.json | 13 +++ .../src/providers/MVMProvider.tsx | 7 +- .../src/providers/SVMProvider.tsx | 7 +- .../src/providers/UTXOProvider.tsx | 7 +- .../src/contexts/EVMContext.ts | 7 ++ packages/wallet-provider/src/index.ts | 1 + packages/widget-playground/package.json | 1 + packages/widget/package.json | 1 + .../src/hooks/useInternalWalletProvider.ts | 6 -- .../WalletProvider/EVMExternalContext.ts | 3 - .../providers/WalletProvider/EVMProvider.tsx | 28 ----- .../providers/WalletProvider/SDKProviders.tsx | 19 ++-- .../WalletProvider/WalletProvider.tsx | 25 ++--- .../useExternalWalletProvider.ts | 6 +- pnpm-lock.yaml | 55 +++++++--- 41 files changed, 508 insertions(+), 149 deletions(-) create mode 100644 packages/wallet-provider-evm/package.json rename packages/{widget => wallet-provider-evm}/src/config/baseAccount.ts (79%) rename packages/{widget => wallet-provider-evm}/src/config/coinbase.ts (79%) rename packages/{widget => wallet-provider-evm}/src/config/metaMask.ts (86%) rename packages/{widget => wallet-provider-evm}/src/config/walletConnect.ts (100%) create mode 100644 packages/wallet-provider-evm/src/connectors/baseAccount.ts create mode 100644 packages/wallet-provider-evm/src/connectors/coinbase.ts create mode 100644 packages/wallet-provider-evm/src/connectors/metaMask.ts create mode 100644 packages/wallet-provider-evm/src/connectors/porto.ts create mode 100644 packages/wallet-provider-evm/src/connectors/walletConnect.ts create mode 100644 packages/wallet-provider-evm/src/hooks/useSyncWagmiConfig.ts create mode 100644 packages/wallet-provider-evm/src/index.ts rename packages/{widget/src/providers/WalletProvider => wallet-provider-evm/src/providers}/EVMBaseProvider.tsx (55%) create mode 100644 packages/wallet-provider-evm/src/providers/EVMProvider.tsx create mode 100644 packages/wallet-provider-evm/src/types/connectors.ts create mode 100644 packages/wallet-provider-evm/src/utils/convertExtendedChain.ts rename packages/{wallet-management/src => wallet-provider-evm/src/utils}/createDefaultWagmiConfig.ts (90%) create mode 100644 packages/wallet-provider-evm/src/utils/extendConnector.ts create mode 100644 packages/wallet-provider-evm/src/utils/isWalletInstalled.ts create mode 100644 packages/wallet-provider-evm/src/utils/lifi.ts create mode 100644 packages/wallet-provider-evm/src/utils/syncWagmiConfig.ts create mode 100644 packages/wallet-provider-evm/tsconfig.json create mode 100644 packages/wallet-provider/src/contexts/EVMContext.ts delete mode 100644 packages/widget/src/hooks/useInternalWalletProvider.ts delete mode 100644 packages/widget/src/providers/WalletProvider/EVMExternalContext.ts delete mode 100644 packages/widget/src/providers/WalletProvider/EVMProvider.tsx diff --git a/packages/wallet-management/src/components/EVMListItemButton.tsx b/packages/wallet-management/src/components/EVMListItemButton.tsx index 9d9376663..07ef72138 100644 --- a/packages/wallet-management/src/components/EVMListItemButton.tsx +++ b/packages/wallet-management/src/components/EVMListItemButton.tsx @@ -1,7 +1,6 @@ import { ChainType } from '@lifi/sdk' +import { useEVMContext } from '@lifi/wallet-provider' import type { Connector } from 'wagmi' -import { useConfig } from 'wagmi' -import { connect, disconnect, getAccount } from 'wagmi/actions' import type { CreateConnectorFnExtended } from '../connectors/types.js' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' @@ -28,7 +27,7 @@ export const EVMListItemButton = ({ onError, }: EVMListItemButtonProps) => { const emitter = useWalletManagementEvents() - const config = useConfig() + const { connect, disconnect } = useEVMContext() const { setLastConnectedAccount } = useLastConnectedAccount() const connectorName = @@ -52,12 +51,10 @@ export const EVMListItemButton = ({ if (connector.id === 'walletConnect') { createWalletConnectElement() } - const connectedAccount = getAccount(config) onConnecting?.() - const data = await connect(config, { connector }) - if (connectedAccount.connector) { - await disconnect(config, { connector: connectedAccount.connector }) - } + // Disconnect currently connected EVM wallet (if any) + await disconnect() + const data = await connect(connector) setLastConnectedAccount(connector) emitter.emit(WalletManagementEvent.WalletConnected, { address: data.accounts[0], diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index 4cd90cccd..c7407a317 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -1,6 +1,7 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { ChainId, ChainType } from '@lifi/sdk' import { + useEVMContext, useMVMContext, useSVMContext, useUTXOContext, @@ -9,7 +10,6 @@ import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import type { WalletAdapter } from '@solana/wallet-adapter-base' import { useMemo } from 'react' import type { Connector } from 'wagmi' -import { useAccount as useAccountInternal } from 'wagmi' import { create } from 'zustand' import type { CreateConnectorFnExtended } from '../connectors/types.js' @@ -89,7 +89,7 @@ export const useLastConnectedAccount = create( * @returns - Account result */ export const useAccount = (args?: UseAccountArgs): AccountResult => { - const wagmiAccount = useAccountInternal() + const { currentWallet: evmWallet } = useEVMContext() const { currentWallet: utxoWallet } = useUTXOContext() const { currentWallet: svmWallet } = useSVMContext() const { currentWallet: suiWallet, connectionStatus } = useMVMContext() @@ -138,7 +138,7 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { isDisconnected: true, status: 'disconnected', } - const evm: Account = { ...wagmiAccount, chainType: ChainType.EVM } + const evm: Account = { ...evmWallet, chainType: ChainType.EVM } const utxo: Account = { ...utxoWallet, @@ -184,11 +184,11 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { } }, [ svmWallet?.adapter.publicKey, - wagmiAccount.connector?.uid, - wagmiAccount.connector?.id, - wagmiAccount.status, - wagmiAccount.address, - wagmiAccount.chainId, + evmWallet.connector?.uid, + evmWallet.connector?.id, + evmWallet.status, + evmWallet.address, + evmWallet.chainId, utxoWallet.connector?.uid, utxoWallet.connector?.id, utxoWallet.status, diff --git a/packages/wallet-management/src/hooks/useAccountDisconnect.ts b/packages/wallet-management/src/hooks/useAccountDisconnect.ts index df99dc149..d090ae665 100644 --- a/packages/wallet-management/src/hooks/useAccountDisconnect.ts +++ b/packages/wallet-management/src/hooks/useAccountDisconnect.ts @@ -1,31 +1,22 @@ import { ChainType } from '@lifi/sdk' import { + useEVMContext, useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' -import type { Config } from 'wagmi' -import { useConfig as useWagmiConfig } from 'wagmi' -import { disconnect, getAccount } from 'wagmi/actions' import type { Account } from './useAccount.js' export const useAccountDisconnect = () => { - const wagmiConfig = useWagmiConfig() + const { disconnect: evmDisconnect } = useEVMContext() const { disconnect: utxoDisconnect } = useUTXOContext() const { disconnect: svmDisconnect } = useSVMContext() const { disconnect: suiDisconnect } = useMVMContext() - const handleDisconnectEVM = async (config: Config) => { - const connectedAccount = getAccount(config) - if (connectedAccount.connector) { - await disconnect(config, { connector: connectedAccount.connector }) - } - } - return async (account: Account) => { switch (account.chainType) { case ChainType.EVM: - await handleDisconnectEVM(wagmiConfig) + await evmDisconnect() break case ChainType.UTXO: await utxoDisconnect() diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 8191f8fea..ddc86de9a 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -1,6 +1,7 @@ import type { Connector as BigmiConnector } from '@bigmi/client' import { ChainType } from '@lifi/sdk' import { + useEVMContext, useMVMContext, useSVMContext, useUTXOContext, @@ -11,7 +12,6 @@ import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import { WalletReadyState } from '@solana/wallet-adapter-base' import { useEffect, useState } from 'react' import type { Connector } from 'wagmi' -import { useConnect } from 'wagmi' import { defaultBaseAccountConfig } from '../config/baseAccount.js' import { defaultCoinbaseConfig } from '../config/coinbase.js' import { defaultMetaMaskConfig } from '../config/metaMask.js' @@ -133,7 +133,7 @@ const combineWalletLists = ( export const useCombinedWallets = () => { const walletConfig = useWalletManagementConfig() - const { connectors: wagmiConnectors } = useConnect() + const { wallets: wagmiConnectors } = useEVMContext() const { wallets: bigmiConnectors } = useUTXOContext() const { wallets: solanaWallets } = useSVMContext() const { wallets: suiWallets } = useMVMContext() @@ -152,12 +152,12 @@ export const useCombinedWallets = () => { useEffect(() => { ;(async () => { - let evmConnectors: (CreateConnectorFnExtended | Connector)[] = Array.from( + let evmConnectors: any[] = Array.from( wagmiConnectors // Remove duplicate connectors ).filter( - (connector, index, self) => - index === self.findIndex((c) => c.id === connector.id) + (connector: any, index: number, self: any) => + index === self.findIndex((c: any) => c.id === connector.id) ) // Check if Safe connector exists and can get a provider diff --git a/packages/wallet-management/src/index.ts b/packages/wallet-management/src/index.ts index 2904b22cf..b99d262b4 100644 --- a/packages/wallet-management/src/index.ts +++ b/packages/wallet-management/src/index.ts @@ -5,7 +5,6 @@ export * from './connectors/metaMask.js' export * from './connectors/types.js' export * from './connectors/utils.js' export * from './connectors/walletConnect.js' -export * from './createDefaultWagmiConfig.js' export * from './hooks/useAccount.js' export * from './hooks/useAccountDisconnect.js' export * from './hooks/useWalletManagementEvents.js' diff --git a/packages/wallet-provider-evm/package.json b/packages/wallet-provider-evm/package.json new file mode 100644 index 000000000..2ed7ca5fb --- /dev/null +++ b/packages/wallet-provider-evm/package.json @@ -0,0 +1,24 @@ +{ + "name": "@lifi/wallet-provider-evm", + "version": "1.0.0", + "type": "module", + "main": "./src/index.ts", + "types": "./src/index.d.ts", + "dependencies": { + "viem": "^2.37.7", + "@lifi/sdk": "^3.12.10" + }, + "peerDependencies": { + "@lifi/wallet-provider": "workspace:*", + "wagmi": ">=2.16.0" + }, + "devDependencies": { + "react": "^19.1.1", + "typescript": "^5.9.2" + }, + "files": [ + "dist/**", + "src/**", + "!tsconfig.json" + ] +} diff --git a/packages/widget/src/config/baseAccount.ts b/packages/wallet-provider-evm/src/config/baseAccount.ts similarity index 79% rename from packages/widget/src/config/baseAccount.ts rename to packages/wallet-provider-evm/src/config/baseAccount.ts index b680048ba..9a19d3bdc 100644 --- a/packages/widget/src/config/baseAccount.ts +++ b/packages/wallet-provider-evm/src/config/baseAccount.ts @@ -1,5 +1,5 @@ import type { BaseAccountParameters } from 'wagmi/connectors' -import { lifiLogoUrl } from '../icons/lifi.js' +import { lifiLogoUrl } from '../utils/lifi.js' export const defaultBaseAccountConfig: BaseAccountParameters = { appName: 'LI.FI', diff --git a/packages/widget/src/config/coinbase.ts b/packages/wallet-provider-evm/src/config/coinbase.ts similarity index 79% rename from packages/widget/src/config/coinbase.ts rename to packages/wallet-provider-evm/src/config/coinbase.ts index a8039330a..726331282 100644 --- a/packages/widget/src/config/coinbase.ts +++ b/packages/wallet-provider-evm/src/config/coinbase.ts @@ -1,5 +1,5 @@ import type { CoinbaseWalletParameters } from 'wagmi/connectors' -import { lifiLogoUrl } from '../icons/lifi.js' +import { lifiLogoUrl } from '../utils/lifi.js' export const defaultCoinbaseConfig: CoinbaseWalletParameters = { appName: 'LI.FI', diff --git a/packages/widget/src/config/metaMask.ts b/packages/wallet-provider-evm/src/config/metaMask.ts similarity index 86% rename from packages/widget/src/config/metaMask.ts rename to packages/wallet-provider-evm/src/config/metaMask.ts index a8f7c37ec..2a00e8bcf 100644 --- a/packages/widget/src/config/metaMask.ts +++ b/packages/wallet-provider-evm/src/config/metaMask.ts @@ -1,5 +1,5 @@ import type { MetaMaskParameters } from 'wagmi/connectors' -import { lifiLogoUrl } from '../icons/lifi.js' +import { lifiLogoUrl } from '../utils/lifi.js' export const defaultMetaMaskConfig: MetaMaskParameters = { dappMetadata: { diff --git a/packages/widget/src/config/walletConnect.ts b/packages/wallet-provider-evm/src/config/walletConnect.ts similarity index 100% rename from packages/widget/src/config/walletConnect.ts rename to packages/wallet-provider-evm/src/config/walletConnect.ts diff --git a/packages/wallet-provider-evm/src/connectors/baseAccount.ts b/packages/wallet-provider-evm/src/connectors/baseAccount.ts new file mode 100644 index 000000000..da6196bc3 --- /dev/null +++ b/packages/wallet-provider-evm/src/connectors/baseAccount.ts @@ -0,0 +1,7 @@ +import type { BaseAccountParameters } from 'wagmi/connectors' +import { baseAccount } from 'wagmi/connectors' +import { extendConnector } from '../utils/extendConnector.js' + +export const createBaseAccountConnector = /*#__PURE__*/ ( + params: BaseAccountParameters +) => extendConnector(baseAccount(params), 'baseAccount', 'Base Account') diff --git a/packages/wallet-provider-evm/src/connectors/coinbase.ts b/packages/wallet-provider-evm/src/connectors/coinbase.ts new file mode 100644 index 000000000..0187ddf76 --- /dev/null +++ b/packages/wallet-provider-evm/src/connectors/coinbase.ts @@ -0,0 +1,12 @@ +import type { CoinbaseWalletParameters } from 'wagmi/connectors' +import { coinbaseWallet } from 'wagmi/connectors' +import { extendConnector } from '../utils/extendConnector.js' + +export const createCoinbaseConnector = /*#__PURE__*/ ( + params: CoinbaseWalletParameters +) => + extendConnector( + coinbaseWallet(params), + 'coinbaseWalletSDK', + 'Coinbase Wallet' + ) diff --git a/packages/wallet-provider-evm/src/connectors/metaMask.ts b/packages/wallet-provider-evm/src/connectors/metaMask.ts new file mode 100644 index 000000000..5f4eee26b --- /dev/null +++ b/packages/wallet-provider-evm/src/connectors/metaMask.ts @@ -0,0 +1,7 @@ +import type { MetaMaskParameters } from 'wagmi/connectors' +import { metaMask } from 'wagmi/connectors' +import { extendConnector } from '../utils/extendConnector.js' + +export const createMetaMaskConnector = /*#__PURE__*/ ( + params: MetaMaskParameters +) => extendConnector(metaMask(params), 'metaMaskSDK', 'MetaMask') diff --git a/packages/wallet-provider-evm/src/connectors/porto.ts b/packages/wallet-provider-evm/src/connectors/porto.ts new file mode 100644 index 000000000..75d0fafea --- /dev/null +++ b/packages/wallet-provider-evm/src/connectors/porto.ts @@ -0,0 +1,6 @@ +import { type PortoParameters, porto } from 'wagmi/connectors' +import { extendConnector } from '../utils/extendConnector.js' + +export const createPortoConnector = /*#__PURE__*/ ( + params?: Partial +) => extendConnector(porto(params), 'xyz.ithaca.porto', 'Porto') diff --git a/packages/wallet-provider-evm/src/connectors/walletConnect.ts b/packages/wallet-provider-evm/src/connectors/walletConnect.ts new file mode 100644 index 000000000..0ddb5565a --- /dev/null +++ b/packages/wallet-provider-evm/src/connectors/walletConnect.ts @@ -0,0 +1,20 @@ +import type { WalletConnectParameters } from 'wagmi/connectors' +import { walletConnect } from 'wagmi/connectors' +import { extendConnector } from '../utils/extendConnector.js' + +export const createWalletConnectConnector = /*#__PURE__*/ ( + params: WalletConnectParameters +) => + extendConnector( + walletConnect({ + showQrModal: true, + qrModalOptions: { + themeVariables: { + '--wcm-z-index': '3000', + }, + }, + ...params, + }), + 'walletConnect', + 'WalletConnect' + ) diff --git a/packages/wallet-provider-evm/src/hooks/useSyncWagmiConfig.ts b/packages/wallet-provider-evm/src/hooks/useSyncWagmiConfig.ts new file mode 100644 index 000000000..03a162c92 --- /dev/null +++ b/packages/wallet-provider-evm/src/hooks/useSyncWagmiConfig.ts @@ -0,0 +1,34 @@ +import { ChainType, type ExtendedChain } from '@lifi/sdk' +import { useEffect, useMemo } from 'react' +import type { Chain } from 'viem' +import type { Config, CreateConnectorFn } from 'wagmi' +import { + convertExtendedChain, + isExtendedChain, +} from '../utils/convertExtendedChain.js' +import { syncWagmiConfig } from '../utils/syncWagmiConfig.js' + +export const useSyncWagmiConfig = ( + wagmiConfig: Config, + connectors: CreateConnectorFn[], + chains?: (ExtendedChain | Chain)[] +) => { + const _chains = useMemo(() => { + const mappedChains = chains + ?.map((chain) => + isExtendedChain(chain) + ? chain.chainType === ChainType.EVM + ? convertExtendedChain(chain) + : undefined + : chain + ) + .filter(Boolean) as [Chain, ...Chain[]] + return mappedChains + }, [chains]) + + useEffect(() => { + if (_chains?.length) { + syncWagmiConfig(wagmiConfig, connectors, _chains) + } + }, [_chains, connectors, wagmiConfig]) +} diff --git a/packages/wallet-provider-evm/src/index.ts b/packages/wallet-provider-evm/src/index.ts new file mode 100644 index 000000000..ca2fdab95 --- /dev/null +++ b/packages/wallet-provider-evm/src/index.ts @@ -0,0 +1 @@ +export { EVMProvider, useInEVMContext } from './providers/EVMProvider.js' diff --git a/packages/widget/src/providers/WalletProvider/EVMBaseProvider.tsx b/packages/wallet-provider-evm/src/providers/EVMBaseProvider.tsx similarity index 55% rename from packages/widget/src/providers/WalletProvider/EVMBaseProvider.tsx rename to packages/wallet-provider-evm/src/providers/EVMBaseProvider.tsx index 55e497552..7f8951b06 100644 --- a/packages/widget/src/providers/WalletProvider/EVMBaseProvider.tsx +++ b/packages/wallet-provider-evm/src/providers/EVMBaseProvider.tsx @@ -1,20 +1,26 @@ -import type { DefaultWagmiConfigResult } from '@lifi/wallet-management' -import { - createDefaultWagmiConfig, - useSyncWagmiConfig, -} from '@lifi/wallet-management' +import type { ExtendedChain } from '@lifi/sdk' import { type FC, type PropsWithChildren, useRef } from 'react' import { WagmiProvider } from 'wagmi' -import { defaultBaseAccountConfig } from '../../config/baseAccount.js' -import { defaultCoinbaseConfig } from '../../config/coinbase.js' -import { defaultMetaMaskConfig } from '../../config/metaMask.js' -import { defaultWalletConnectConfig } from '../../config/walletConnect.js' -import { useAvailableChains } from '../../hooks/useAvailableChains.js' -import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' +import { defaultBaseAccountConfig } from '../config/baseAccount.js' +import { defaultCoinbaseConfig } from '../config/coinbase.js' +import { defaultMetaMaskConfig } from '../config/metaMask.js' +import { defaultWalletConnectConfig } from '../config/walletConnect.js' +import { useSyncWagmiConfig } from '../hooks/useSyncWagmiConfig.js' +import { + createDefaultWagmiConfig, + type DefaultWagmiConfigResult, +} from '../utils/createDefaultWagmiConfig.js' + +interface EVMBaseProviderProps { + walletConfig?: any // TODO: WidgetWalletConfig type + chains?: ExtendedChain[] +} -export const EVMBaseProvider: FC = ({ children }) => { - const { walletConfig } = useWidgetConfig() - const { chains } = useAvailableChains() +export const EVMBaseProvider: FC> = ({ + chains, + walletConfig, + children, +}) => { const wagmi = useRef(null) if (!wagmi.current) { diff --git a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx new file mode 100644 index 000000000..5b41530bd --- /dev/null +++ b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx @@ -0,0 +1,100 @@ +import type { ExtendedChain } from '@lifi/sdk' +import { EVMContext } from '@lifi/wallet-provider' +import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' +import { + type Connector, + useAccount, + useConfig, + useConnect, + WagmiContext, +} from 'wagmi' +import { + connect, + disconnect, + getAccount, + getConnectorClient, + switchChain, +} from 'wagmi/actions' +import { EVMBaseProvider } from './EVMBaseProvider.js' + +interface EVMProviderProps { + walletConfig?: any // TODO: WidgetWalletConfig type + chains?: ExtendedChain[] +} + +export function useInEVMContext(): boolean { + const context = useContext(WagmiContext) + return Boolean(context) +} + +export const EVMProvider: FC> = ({ + walletConfig, + chains, + children, +}) => { + const forceInternalWalletManagement = + walletConfig?.forceInternalWalletManagement + + const inEVMContext = useInEVMContext() + + if (inEVMContext && !forceInternalWalletManagement) { + return ( + + {children} + + ) + } + + return ( + + + {children} + + + ) +} + +const CaptureEVMValues: FC< + PropsWithChildren<{ isExternalContext: boolean }> +> = ({ children, isExternalContext }) => { + const config = useConfig() + const account = useAccount() + const { connectors } = useConnect() + + const handleConnect = useCallback( + async (connector: Connector) => { + return await connect(config, { connector }) + }, + [config] + ) + + const handleDisconnect = useCallback(async () => { + const connectedAccount = getAccount(config) + if (connectedAccount.connector) { + await disconnect(config, { + connector: connectedAccount.connector, + }) + } + }, [config]) + + return ( + { + const chain = await switchChain(config, { chainId }) + return getConnectorClient(config, { chainId: chain.id }) + }, + }} + > + {children} + + ) +} diff --git a/packages/wallet-provider-evm/src/types/connectors.ts b/packages/wallet-provider-evm/src/types/connectors.ts new file mode 100644 index 000000000..1a5b8787c --- /dev/null +++ b/packages/wallet-provider-evm/src/types/connectors.ts @@ -0,0 +1,6 @@ +import type { CreateConnectorFn } from 'wagmi' + +export interface CreateConnectorFnExtended extends CreateConnectorFn { + id: string + displayName: string +} diff --git a/packages/wallet-provider-evm/src/utils/convertExtendedChain.ts b/packages/wallet-provider-evm/src/utils/convertExtendedChain.ts new file mode 100644 index 000000000..a28cf26ae --- /dev/null +++ b/packages/wallet-provider-evm/src/utils/convertExtendedChain.ts @@ -0,0 +1,53 @@ +import type { ExtendedChain } from '@lifi/sdk' +import type { Address, Chain } from 'viem' + +type ChainBlockExplorer = { + name: string + url: string +} + +type ChainBlockExplorers = { + [key: string]: ChainBlockExplorer + default: ChainBlockExplorer +} + +export const convertExtendedChain = (chain: ExtendedChain): Chain => ({ + ...chain, + ...chain.metamask, + blockExplorers: chain.metamask.blockExplorerUrls.reduce( + (blockExplorers, blockExplorer, index) => { + blockExplorers[index === 0 ? 'default' : `${index}`] = { + name: blockExplorer, + url: blockExplorer, + } + return blockExplorers + }, + {} as ChainBlockExplorers + ), + name: chain.metamask.chainName, + rpcUrls: { + default: { http: chain.metamask.rpcUrls }, + public: { http: chain.metamask.rpcUrls }, + }, + contracts: { + ...(chain.multicallAddress + ? { multicall3: { address: chain.multicallAddress as Address } } + : undefined), + }, +}) + +export function isExtendedChain(chain: any): chain is ExtendedChain { + return ( + typeof chain === 'object' && + chain !== null && + 'key' in chain && + 'chainType' in chain && + 'coin' in chain && + 'mainnet' in chain && + 'logoURI' in chain && + typeof chain.metamask === 'object' && + chain.metamask !== null && + typeof chain.nativeToken === 'object' && + chain.nativeToken !== null + ) +} diff --git a/packages/wallet-management/src/createDefaultWagmiConfig.ts b/packages/wallet-provider-evm/src/utils/createDefaultWagmiConfig.ts similarity index 90% rename from packages/wallet-management/src/createDefaultWagmiConfig.ts rename to packages/wallet-provider-evm/src/utils/createDefaultWagmiConfig.ts index 4ebb76237..9b409dedd 100644 --- a/packages/wallet-management/src/createDefaultWagmiConfig.ts +++ b/packages/wallet-provider-evm/src/utils/createDefaultWagmiConfig.ts @@ -10,12 +10,12 @@ import type { WalletConnectParameters, } from 'wagmi/connectors' import { safe } from 'wagmi/connectors' -import { createBaseAccountConnector } from './connectors/baseAccount.js' -import { createCoinbaseConnector } from './connectors/coinbase.js' -import { createMetaMaskConnector } from './connectors/metaMask.js' -import { createPortoConnector } from './connectors/porto.js' -import { createWalletConnectConnector } from './connectors/walletConnect.js' -import { isWalletInstalled } from './utils/isWalletInstalled.js' +import { createBaseAccountConnector } from '../connectors/baseAccount.js' +import { createCoinbaseConnector } from '../connectors/coinbase.js' +import { createMetaMaskConnector } from '../connectors/metaMask.js' +import { createPortoConnector } from '../connectors/porto.js' +import { createWalletConnectConnector } from '../connectors/walletConnect.js' +import { isWalletInstalled } from './isWalletInstalled.js' export interface DefaultWagmiConfigProps { walletConnect?: WalletConnectParameters diff --git a/packages/wallet-provider-evm/src/utils/extendConnector.ts b/packages/wallet-provider-evm/src/utils/extendConnector.ts new file mode 100644 index 000000000..3b84eb696 --- /dev/null +++ b/packages/wallet-provider-evm/src/utils/extendConnector.ts @@ -0,0 +1,13 @@ +import type { CreateConnectorFn } from 'wagmi' +import type { CreateConnectorFnExtended } from '../types/connectors.js' + +export const extendConnector = ( + connector: CreateConnectorFn, + id: string, + name: string +): CreateConnectorFnExtended => { + const extendedConnector = connector as CreateConnectorFnExtended + extendedConnector.id = id + extendedConnector.displayName = name + return extendedConnector +} diff --git a/packages/wallet-provider-evm/src/utils/isWalletInstalled.ts b/packages/wallet-provider-evm/src/utils/isWalletInstalled.ts new file mode 100644 index 000000000..b63369322 --- /dev/null +++ b/packages/wallet-provider-evm/src/utils/isWalletInstalled.ts @@ -0,0 +1,54 @@ +export const isWalletInstalled = (id: string): boolean => { + const anyWindow = typeof window !== 'undefined' ? (window as any) : undefined + switch (id) { + case 'metaMask': + return ( + anyWindow?.ethereum?.isMetaMask || + anyWindow?.ethereum?.providers?.some( + (provider: any) => provider.isMetaMask + ) + ) + case 'coinbase': + return ( + // Coinbase Browser doesn't inject itself automatically + // We should not consider Coinbase Browser as installed wallet so we can fallback to Coinbase SDK + (anyWindow?.ethereum?.isCoinbaseWallet && + !anyWindow?.ethereum?.isCoinbaseBrowser) || + anyWindow?.coinbaseWalletExtension?.isCoinbaseWallet || + anyWindow?.ethereum?.providers?.some( + (provider: any) => provider.isCoinbaseWallet + ) + ) + case 'app.phantom.bitcoin': + return anyWindow.phantom?.bitcoin?.isPhantom + case 'com.okex.wallet.bitcoin': + return anyWindow.okxwallet?.bitcoin?.isOkxWallet + case 'XverseProviders.BitcoinProvider': + return anyWindow.XverseProviders?.BitcoinProvider + case 'unisat': + return ( + anyWindow.unisat && + !anyWindow.unisat?.isBinance && + !anyWindow.unisat?.isBitKeep + ) + case 'io.xdefi': + return anyWindow.xfi + case 'so.onekey.app.wallet.bitcoin': + return anyWindow.$onekey?.btc + case 'LeatherProvider': + return anyWindow.LeatherProvider + case 'bitget': + return anyWindow.bitkeep?.unisat || anyWindow.unisat?.isBitKeep + case 'OylProvider': + return anyWindow.oyl + case 'binance': + return anyWindow.binancew3w?.bitcoin || anyWindow.unisat?.isBinance + case 'app.magiceden.bitcoin': + return anyWindow?.magicEden?.bitcoin?.isMagicEden + default: + /** + * Return true if the wallet is not in the list of explicitly supported or self-injected wallet + */ + return true + } +} diff --git a/packages/wallet-provider-evm/src/utils/lifi.ts b/packages/wallet-provider-evm/src/utils/lifi.ts new file mode 100644 index 000000000..30c1bd692 --- /dev/null +++ b/packages/wallet-provider-evm/src/utils/lifi.ts @@ -0,0 +1,2 @@ +export const lifiLogoUrl = + 'https://lifinance.github.io/types/src/assets/icons/bridges/lifi.svg' diff --git a/packages/wallet-provider-evm/src/utils/syncWagmiConfig.ts b/packages/wallet-provider-evm/src/utils/syncWagmiConfig.ts new file mode 100644 index 000000000..49b82819e --- /dev/null +++ b/packages/wallet-provider-evm/src/utils/syncWagmiConfig.ts @@ -0,0 +1,25 @@ +import type { Chain } from 'viem' +import { mainnet } from 'viem/chains' +import type { Config, CreateConnectorFn } from 'wagmi' +import { reconnect } from 'wagmi/actions' + +export const syncWagmiConfig = async ( + wagmiConfig: Config, + connectors: CreateConnectorFn[], + chains: readonly [Chain, ...Chain[]] +) => { + const _mainnet = chains.find((chain) => chain.id === mainnet.id) + if (_mainnet) { + _mainnet.contracts = { ...mainnet.contracts, ..._mainnet.contracts } + } + wagmiConfig._internal.chains.setState(chains) + wagmiConfig._internal.connectors.setState(() => + [ + ...connectors, + ...(wagmiConfig._internal.mipd + ?.getProviders() + .map(wagmiConfig._internal.connectors.providerDetailToConnector) ?? []), + ].map(wagmiConfig._internal.connectors.setup) + ) + reconnect(wagmiConfig) +} diff --git a/packages/wallet-provider-evm/tsconfig.json b/packages/wallet-provider-evm/tsconfig.json new file mode 100644 index 000000000..8e1598c91 --- /dev/null +++ b/packages/wallet-provider-evm/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "declaration": true, + "sourceMap": true, + "outDir": "dist/esm", + "rootDir": "./src", + "module": "ESNext", + "moduleResolution": "Bundler" + }, + "include": ["./src/**/*", "./src/**/*.json"] +} diff --git a/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx index b250b19f0..f5b7ed068 100644 --- a/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx +++ b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx @@ -10,7 +10,7 @@ import { type FC, type PropsWithChildren, useContext } from 'react' import { MVMBaseProvider } from './MVMBaseProvider.js' interface MVMProviderProps { - forceInternalWalletManagement?: boolean + walletConfig?: any // TODO: WidgetWalletConfig type } export function useInMVMContext(): boolean { @@ -19,9 +19,12 @@ export function useInMVMContext(): boolean { } export const MVMProvider: FC> = ({ - forceInternalWalletManagement, + walletConfig, children, }) => { + const forceInternalWalletManagement = + walletConfig?.forceInternalWalletManagement + const inSuiContext = useInMVMContext() if (inSuiContext && !forceInternalWalletManagement) { diff --git a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx index dd7c351f1..0614c484a 100644 --- a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx +++ b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx @@ -4,7 +4,7 @@ import { type FC, type PropsWithChildren, useContext } from 'react' import { SVMBaseProvider } from './SVMBaseProvider.js' interface SVMProviderProps { - forceInternalWalletManagement?: boolean + walletConfig?: any // TODO: WidgetWalletConfig type } export function useInSVMContext(): boolean { @@ -13,9 +13,12 @@ export function useInSVMContext(): boolean { } export const SVMProvider: FC> = ({ - forceInternalWalletManagement, + walletConfig, children, }) => { + const forceInternalWalletManagement = + walletConfig?.forceInternalWalletManagement + const inSVMContext = useInSVMContext() if (inSVMContext && !forceInternalWalletManagement) { diff --git a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx index f1be67886..0b1bb949a 100644 --- a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx +++ b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx @@ -11,7 +11,7 @@ import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' import { UTXOBaseProvider } from './UTXOBaseProvider.js' interface UTXOProviderProps { - forceInternalWalletManagement?: boolean + walletConfig?: any // TODO: WidgetWalletConfig type } export function useInUTXOContext(): boolean { @@ -21,9 +21,12 @@ export function useInUTXOContext(): boolean { } export const UTXOProvider: FC> = ({ - forceInternalWalletManagement, + walletConfig, children, }) => { + const forceInternalWalletManagement = + walletConfig?.forceInternalWalletManagement + const inUTXOContext = useInUTXOContext() if (inUTXOContext && !forceInternalWalletManagement) { diff --git a/packages/wallet-provider/src/contexts/EVMContext.ts b/packages/wallet-provider/src/contexts/EVMContext.ts new file mode 100644 index 000000000..32ac41d04 --- /dev/null +++ b/packages/wallet-provider/src/contexts/EVMContext.ts @@ -0,0 +1,7 @@ +import { createContext, useContext } from 'react' + +export const EVMContext = createContext(null) + +export const useEVMContext = () => { + return useContext(EVMContext) +} diff --git a/packages/wallet-provider/src/index.ts b/packages/wallet-provider/src/index.ts index d4fd6bba8..641f2adb1 100644 --- a/packages/wallet-provider/src/index.ts +++ b/packages/wallet-provider/src/index.ts @@ -1,3 +1,4 @@ +export { EVMContext, useEVMContext } from './contexts/EVMContext.js' export { MVMContext, useMVMContext } from './contexts/MVMContext.js' export { SVMContext, useSVMContext } from './contexts/SVMContext.js' export { UTXOContext, useUTXOContext } from './contexts/UTXOContext.js' diff --git a/packages/widget-playground/package.json b/packages/widget-playground/package.json index edb0fafa0..d84b75782 100644 --- a/packages/widget-playground/package.json +++ b/packages/widget-playground/package.json @@ -32,6 +32,7 @@ "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.12.10", "@lifi/wallet-management": "workspace:*", + "@lifi/wallet-provider-evm": "workspace:*", "@lifi/wallet-provider-mvm": "workspace:*", "@lifi/wallet-provider-utxo": "workspace:*", "@lifi/wallet-provider-svm": "workspace:*", diff --git a/packages/widget/package.json b/packages/widget/package.json index 82c4a0512..5c10254b7 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -84,6 +84,7 @@ "peerDependencies": { "@bigmi/react": ">=0.5.2", "@solana/wallet-adapter-react": ">=0.15.35", + "@lifi/wallet-provider-evm": "workspace:^", "@lifi/wallet-provider-mvm": "workspace:^", "@lifi/wallet-provider-svm": "workspace:^", "@lifi/wallet-provider-utxo": "workspace:^", diff --git a/packages/widget/src/hooks/useInternalWalletProvider.ts b/packages/widget/src/hooks/useInternalWalletProvider.ts deleted file mode 100644 index 11e74cb25..000000000 --- a/packages/widget/src/hooks/useInternalWalletProvider.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js' - -export function useInternalWalletProvider(hasExternalContext: boolean) { - const { walletConfig } = useWidgetConfig() - return walletConfig?.forceInternalWalletManagement || !hasExternalContext -} diff --git a/packages/widget/src/providers/WalletProvider/EVMExternalContext.ts b/packages/widget/src/providers/WalletProvider/EVMExternalContext.ts deleted file mode 100644 index 9bacfd1d5..000000000 --- a/packages/widget/src/providers/WalletProvider/EVMExternalContext.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createContext } from 'react' - -export const EVMExternalContext = createContext(false) diff --git a/packages/widget/src/providers/WalletProvider/EVMProvider.tsx b/packages/widget/src/providers/WalletProvider/EVMProvider.tsx deleted file mode 100644 index 032f8651e..000000000 --- a/packages/widget/src/providers/WalletProvider/EVMProvider.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { ChainType } from '@lifi/sdk' -import { type FC, type PropsWithChildren, useContext } from 'react' -import { WagmiContext } from 'wagmi' -import { useInternalWalletProvider } from '../../hooks/useInternalWalletProvider.js' -import { isItemAllowed } from '../../utils/item.js' -import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' -import { EVMBaseProvider } from './EVMBaseProvider.js' -import { EVMExternalContext } from './EVMExternalContext.js' - -function useInWagmiContext(): boolean { - const { chains } = useWidgetConfig() - const context = useContext(WagmiContext) - - return Boolean(context) && isItemAllowed(ChainType.EVM, chains?.types) -} - -export const EVMProvider: FC = ({ children }) => { - const inWagmiContext = useInWagmiContext() - const useInternalWallet = useInternalWalletProvider(inWagmiContext) - - return useInternalWallet ? ( - {children} - ) : ( - - {children} - - ) -} diff --git a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx index b99a67054..201e012a2 100644 --- a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx +++ b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx @@ -1,22 +1,19 @@ import type { SDKProvider } from '@lifi/sdk' import { ChainType, config, EVM, Solana, Sui, UTXO } from '@lifi/sdk' import { + useEVMContext, useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' import type { SignerWalletAdapter } from '@solana/wallet-adapter-base' import { useEffect } from 'react' -import { useConfig as useWagmiConfig } from 'wagmi' -import { - getConnectorClient as getWagmiConnectorClient, - switchChain, -} from 'wagmi/actions' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' export const SDKProviders = () => { const { sdkConfig } = useWidgetConfig() - const wagmiConfig = useWagmiConfig() + const { walletClient: evmWalletClient, switchChain: evmSwitchChain } = + useEVMContext() const { walletClient: utxoWalletClient } = useUTXOContext() const { currentWallet: svmWallet } = useSVMContext() const { currentWallet: suiWallet } = useMVMContext() @@ -39,11 +36,8 @@ export const SDKProviders = () => { if (!hasConfiguredEVMProvider) { providers.push( EVM({ - getWalletClient: () => getWagmiConnectorClient(wagmiConfig), - switchChain: async (chainId: number) => { - const chain = await switchChain(wagmiConfig, { chainId }) - return getWagmiConnectorClient(wagmiConfig, { chainId: chain.id }) - }, + getWalletClient: () => evmWalletClient, + switchChain: evmSwitchChain, }) ) } @@ -77,7 +71,8 @@ export const SDKProviders = () => { }, [ suiWallet, sdkConfig?.providers, - wagmiConfig, + evmWalletClient, + evmSwitchChain, svmWallet?.adapter, utxoWalletClient, ]) diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index f2784b1c7..68ddf6974 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -1,35 +1,26 @@ import type { WalletManagementConfig } from '@lifi/wallet-management' import { WalletManagementProvider } from '@lifi/wallet-management' +import { EVMProvider } from '@lifi/wallet-provider-evm' import { MVMProvider } from '@lifi/wallet-provider-mvm' import { SVMProvider } from '@lifi/wallet-provider-svm' import { UTXOProvider } from '@lifi/wallet-provider-utxo' import { type FC, type PropsWithChildren, useMemo } from 'react' import { useTranslation } from 'react-i18next' +import { useAvailableChains } from '../../hooks/useAvailableChains.js' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' -import { EVMProvider } from './EVMProvider.js' import { SDKProviders } from './SDKProviders.js' import { useExternalWalletProvider } from './useExternalWalletProvider.js' export const WalletProvider: FC = ({ children }) => { const { walletConfig } = useWidgetConfig() + const { chains } = useAvailableChains() // TODO: isItemAllowed(ChainType.SVM, chains?.types) - should we check it? return ( - - - - + // TODO: pass as props to WalletProvider + + + + {children} diff --git a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts index 186ec94c1..f4d0d618c 100644 --- a/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts +++ b/packages/widget/src/providers/WalletProvider/useExternalWalletProvider.ts @@ -1,12 +1,12 @@ import { ChainType } from '@lifi/sdk' import { + useEVMContext, useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' -import { useContext, useMemo } from 'react' +import { useMemo } from 'react' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' -import { EVMExternalContext } from './EVMExternalContext.js' interface ExternalWalletProvider { useExternalWalletProvidersOnly: boolean @@ -23,7 +23,7 @@ const internalChainTypes = [ export function useExternalWalletProvider(): ExternalWalletProvider { const { walletConfig } = useWidgetConfig() - const hasExternalEVMContext = useContext(EVMExternalContext) + const { isExternalContext: hasExternalEVMContext } = useEVMContext() const { isExternalContext: hasExternalSVMContext } = useSVMContext() const { isExternalContext: hasExternalUTXOContext } = useUTXOContext() const { isExternalContext: hasExternalSuiContext } = useMVMContext() diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e66e0ddd..ae8fabcfe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1025,9 +1025,6 @@ importers: '@bigmi/client': specifier: ^0.5.3 version: 0.5.3(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) - '@bigmi/core': - specifier: ^0.5.3 - version: 0.5.3(@types/react@19.1.13)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@bigmi/react': specifier: '>=0.5.0' version: 0.5.3(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) @@ -1114,6 +1111,28 @@ importers: specifier: ^5.9.2 version: 5.9.2 + packages/wallet-provider-evm: + dependencies: + '@lifi/sdk': + specifier: ^3.12.10 + version: 3.12.10(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) + '@lifi/wallet-provider': + specifier: workspace:* + version: link:../wallet-provider + viem: + specifier: ^2.37.7 + version: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + wagmi: + specifier: '>=2.16.0' + version: 2.17.4(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) + devDependencies: + react: + specifier: ^19.1.1 + version: 19.1.1 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + packages/wallet-provider-mvm: dependencies: '@lifi/wallet-provider': @@ -1125,9 +1144,6 @@ importers: '@mysten/sui': specifier: ^1.37.3 version: 1.38.0(typescript@5.9.2) - '@mysten/wallet-standard': - specifier: ^0.16.11 - version: 0.16.14(typescript@5.9.2) devDependencies: react: specifier: ^19.1.1 @@ -1185,9 +1201,6 @@ importers: packages/widget: dependencies: - '@bigmi/client': - specifier: ^0.5.3 - version: 0.5.3(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@bigmi/core': specifier: ^0.5.3 version: 0.5.3(@types/react@19.1.13)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) @@ -1209,6 +1222,9 @@ importers: '@lifi/wallet-provider': specifier: workspace:^ version: link:../wallet-provider + '@lifi/wallet-provider-evm': + specifier: workspace:^ + version: link:../wallet-provider-evm '@lifi/wallet-provider-mvm': specifier: workspace:^ version: link:../wallet-provider-mvm @@ -1388,6 +1404,9 @@ importers: '@lifi/wallet-management': specifier: workspace:* version: link:../wallet-management + '@lifi/wallet-provider-evm': + specifier: workspace:* + version: link:../wallet-provider-evm '@lifi/wallet-provider-mvm': specifier: workspace:* version: link:../wallet-provider-mvm @@ -1415,9 +1434,6 @@ importers: '@mui/system': specifier: ^7.3.2 version: 7.3.2(@emotion/react@11.14.0(@types/react@19.1.13)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(react@19.1.1) - '@mysten/dapp-kit': - specifier: ^0.18.0 - version: 0.18.0(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) '@reown/appkit': specifier: ^1.8.7 version: 1.8.7(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@types/react@19.1.13)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -22897,7 +22913,7 @@ snapshots: '@scure/bip32@1.7.0': dependencies: - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 @@ -27726,6 +27742,11 @@ snapshots: typescript: 5.9.2 zod: 4.1.11 + abitype@1.1.1(typescript@5.9.2)(zod@3.22.4): + optionalDependencies: + typescript: 5.9.2 + zod: 3.22.4 + abitype@1.1.1(typescript@5.9.2)(zod@3.25.76): optionalDependencies: typescript: 5.9.2 @@ -33704,7 +33725,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.9.2)(zod@3.25.76) + abitype: 1.1.1(typescript@5.9.2)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.2 @@ -33719,7 +33740,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@3.22.4) + abitype: 1.1.1(typescript@5.9.2)(zod@3.22.4) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.2 @@ -33734,7 +33755,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) + abitype: 1.1.1(typescript@5.9.2)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.2 @@ -33749,7 +33770,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@4.1.11) + abitype: 1.1.1(typescript@5.9.2)(zod@4.1.11) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.2 From 9f1684d2dedb8049d8b830bdb8ada34e3eba6d6b Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Mon, 29 Sep 2025 07:26:16 +0100 Subject: [PATCH 09/24] refactor: cleanup deps from widget pt1 --- packages/wallet-management/package.json | 1 - .../src/providers/EVMProvider.tsx | 2 + packages/wallet-provider-mvm/package.json | 2 +- .../src/providers/MVMProvider.tsx | 2 + packages/wallet-provider-svm/package.json | 3 +- .../src/providers/SVMProvider.tsx | 2 + packages/wallet-provider-utxo/package.json | 11 ++-- .../src/providers/UTXOProvider.tsx | 2 + packages/wallet-provider/package.json | 4 +- .../src/hooks/useChainTypeFromAddress.ts | 38 ++++++++++++ packages/wallet-provider/src/index.ts | 1 + packages/widget-playground/package.json | 1 - packages/widget/package.json | 6 -- .../SendToWallet/SendToWalletButton.tsx | 11 ++-- .../widget/src/hooks/useAddressValidation.ts | 3 +- packages/widget/src/hooks/useRoutes.ts | 3 +- .../src/hooks/useToAddressAutoPopulate.ts | 4 +- packages/widget/src/hooks/useTokens.ts | 14 +++-- .../providers/WalletProvider/SDKProviders.tsx | 3 +- packages/widget/src/types/widget.ts | 1 + packages/widget/src/utils/chainType.ts | 25 +------- pnpm-lock.yaml | 62 +++++-------------- 22 files changed, 98 insertions(+), 103 deletions(-) create mode 100644 packages/wallet-provider/src/hooks/useChainTypeFromAddress.ts diff --git a/packages/wallet-management/package.json b/packages/wallet-management/package.json index b452d576c..916f4c269 100644 --- a/packages/wallet-management/package.json +++ b/packages/wallet-management/package.json @@ -74,7 +74,6 @@ "typescript": "^5.9.2" }, "peerDependencies": { - "@bigmi/react": ">=0.5.0", "@tanstack/react-query": ">=5.87.0", "react": ">=18", "react-dom": ">=18", diff --git a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx index 5b41530bd..15cebe1b7 100644 --- a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx +++ b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx @@ -1,6 +1,7 @@ import type { ExtendedChain } from '@lifi/sdk' import { EVMContext } from '@lifi/wallet-provider' import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' +import { isAddress as isEVMAddress } from 'viem' import { type Connector, useAccount, @@ -87,6 +88,7 @@ const CaptureEVMValues: FC< // isConnected: connected, connect: handleConnect, disconnect: handleDisconnect, + isValidAddress: isEVMAddress, isExternalContext, switchChain: async (chainId: number) => { const chain = await switchChain(config, { chainId }) diff --git a/packages/wallet-provider-mvm/package.json b/packages/wallet-provider-mvm/package.json index d41b5e945..88995394b 100644 --- a/packages/wallet-provider-mvm/package.json +++ b/packages/wallet-provider-mvm/package.json @@ -5,7 +5,7 @@ "main": "./src/index.ts", "types": "./src/index.d.ts", "dependencies": { - "@mysten/sui": "^1.37.3" + "@mysten/sui": "^1.38.0" }, "peerDependencies": { "@mysten/dapp-kit": "^0.17.4", diff --git a/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx index f5b7ed068..5cd635b47 100644 --- a/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx +++ b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx @@ -6,6 +6,7 @@ import { useDisconnectWallet, useWallets, } from '@mysten/dapp-kit' +import { isValidSuiAddress } from '@mysten/sui/utils' import { type FC, type PropsWithChildren, useContext } from 'react' import { MVMBaseProvider } from './MVMBaseProvider.js' @@ -60,6 +61,7 @@ const CaptureMVMValues: FC< connectionStatus, connect, disconnect, + isValidAddress: isValidSuiAddress, isExternalContext, }} > diff --git a/packages/wallet-provider-svm/package.json b/packages/wallet-provider-svm/package.json index 5ba6316fa..5de6e9e9e 100644 --- a/packages/wallet-provider-svm/package.json +++ b/packages/wallet-provider-svm/package.json @@ -7,7 +7,8 @@ "dependencies": { "@solana/wallet-adapter-base": "^0.9.27", "@solana/wallet-adapter-coinbase": "^0.1.23", - "@solana/web3.js": "^1.98.4" + "@solana/web3.js": "^1.98.4", + "@lifi/sdk": "^3.12.11" }, "peerDependencies": { "@solana/wallet-adapter-react": "^0.15.39", diff --git a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx index 0614c484a..4a9b573ed 100644 --- a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx +++ b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx @@ -1,3 +1,4 @@ +import { isSVMAddress } from '@lifi/sdk' import { SVMContext } from '@lifi/wallet-provider' import { ConnectionContext, useWallet } from '@solana/wallet-adapter-react' import { type FC, type PropsWithChildren, useContext } from 'react' @@ -58,6 +59,7 @@ const CaptureSVMValues: FC< isConnected: connected, connect, disconnect, + isValidAddress: isSVMAddress, isExternalContext, }} > diff --git a/packages/wallet-provider-utxo/package.json b/packages/wallet-provider-utxo/package.json index adf6c03d0..77816d335 100644 --- a/packages/wallet-provider-utxo/package.json +++ b/packages/wallet-provider-utxo/package.json @@ -4,12 +4,13 @@ "type": "module", "main": "./src/index.ts", "types": "./src/index.d.ts", - "dependencies": {}, + "dependencies": { + "@bigmi/react": "^0.5.3", + "@bigmi/client": "^0.5.3", + "@bigmi/core": "^0.5.3" + }, "peerDependencies": { - "@lifi/wallet-provider": "workspace:*", - "@bigmi/react": ">=0.5.2", - "@bigmi/client": ">=0.5.2", - "@bigmi/core": ">=0.5.2" + "@lifi/wallet-provider": "workspace:*" }, "devDependencies": { "react": "^19.1.1", diff --git a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx index 0b1bb949a..fe5709a25 100644 --- a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx +++ b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx @@ -5,6 +5,7 @@ import { getAccount, getConnectorClient as getBigmiConnectorClient, } from '@bigmi/client' +import { isUTXOAddress } from '@bigmi/core' import { BigmiContext, useAccount, useConfig, useConnect } from '@bigmi/react' import { UTXOContext } from '@lifi/wallet-provider' import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' @@ -79,6 +80,7 @@ const CaptureUTXOValues: FC< // isConnected: connected, connect: handleConnect, disconnect: handleDisconnect, + isValidAddress: isUTXOAddress, isExternalContext, }} > diff --git a/packages/wallet-provider/package.json b/packages/wallet-provider/package.json index 375953130..b02ecd512 100644 --- a/packages/wallet-provider/package.json +++ b/packages/wallet-provider/package.json @@ -4,7 +4,9 @@ "type": "module", "main": "./src/index.ts", "types": "./src/index.d.ts", - "dependencies": {}, + "dependencies": { + "@lifi/sdk": "^3.12.11" + }, "devDependencies": { "react": "^19.1.1", "typescript": "^5.9.2" diff --git a/packages/wallet-provider/src/hooks/useChainTypeFromAddress.ts b/packages/wallet-provider/src/hooks/useChainTypeFromAddress.ts new file mode 100644 index 000000000..c26cdb4da --- /dev/null +++ b/packages/wallet-provider/src/hooks/useChainTypeFromAddress.ts @@ -0,0 +1,38 @@ +import { ChainType } from '@lifi/sdk' +import { useCallback } from 'react' +import { useEVMContext } from '../contexts/EVMContext.js' +import { useMVMContext } from '../contexts/MVMContext.js' +import { useSVMContext } from '../contexts/SVMContext.js' +import { useUTXOContext } from '../contexts/UTXOContext.js' + +export const useChainTypeFromAddress = () => { + const { isValidAddress: isValidEVMAddress } = useEVMContext() + const { isValidAddress: isValidSVMAddress } = useSVMContext() + const { isValidAddress: isValidUTXOAddress } = useUTXOContext() + const { isValidAddress: isValidSuiAddress } = useMVMContext() + + const getChainTypeFromAddress = useCallback( + (address: string): ChainType | undefined => { + if (isValidEVMAddress(address)) { + return ChainType.EVM + } + if (isValidSVMAddress(address)) { + return ChainType.SVM + } + if (isValidUTXOAddress(address)) { + return ChainType.UTXO + } + if (isValidSuiAddress(address)) { + return ChainType.MVM + } + //[ChainType.TVM]: () => false, + }, + [ + isValidEVMAddress, + isValidSVMAddress, + isValidUTXOAddress, + isValidSuiAddress, + ] + ) + return { getChainTypeFromAddress } +} diff --git a/packages/wallet-provider/src/index.ts b/packages/wallet-provider/src/index.ts index 641f2adb1..be3ef4fee 100644 --- a/packages/wallet-provider/src/index.ts +++ b/packages/wallet-provider/src/index.ts @@ -2,3 +2,4 @@ export { EVMContext, useEVMContext } from './contexts/EVMContext.js' export { MVMContext, useMVMContext } from './contexts/MVMContext.js' export { SVMContext, useSVMContext } from './contexts/SVMContext.js' export { UTXOContext, useUTXOContext } from './contexts/UTXOContext.js' +export { useChainTypeFromAddress } from './hooks/useChainTypeFromAddress.js' diff --git a/packages/widget-playground/package.json b/packages/widget-playground/package.json index 2f04ca66f..7cd62d9d1 100644 --- a/packages/widget-playground/package.json +++ b/packages/widget-playground/package.json @@ -27,7 +27,6 @@ "./widget-config": "./src/defaultWidgetConfig.ts" }, "dependencies": { - "@bigmi/react": "^0.5.3", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.12.11", diff --git a/packages/widget/package.json b/packages/widget/package.json index 4a3ebc2b7..72c81fab6 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -49,7 +49,6 @@ "lifi" ], "dependencies": { - "@bigmi/core": "^0.5.3", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.12.11", @@ -58,9 +57,6 @@ "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", "@mui/system": "^7.3.2", - "@mysten/sui": "^1.38.0", - "@solana/wallet-adapter-base": "^0.9.27", - "@solana/web3.js": "^1.98.4", "@tanstack/react-virtual": "^3.13.12", "i18next": "^25.5.2", "microdiff": "^1.5.0", @@ -82,8 +78,6 @@ "vitest": "^3.2.4" }, "peerDependencies": { - "@bigmi/react": ">=0.5.2", - "@solana/wallet-adapter-react": ">=0.15.35", "@lifi/wallet-provider-evm": "workspace:^", "@lifi/wallet-provider-mvm": "workspace:^", "@lifi/wallet-provider-svm": "workspace:^", diff --git a/packages/widget/src/components/SendToWallet/SendToWalletButton.tsx b/packages/widget/src/components/SendToWallet/SendToWalletButton.tsx index e59fd94ff..89dff8ab2 100644 --- a/packages/widget/src/components/SendToWallet/SendToWalletButton.tsx +++ b/packages/widget/src/components/SendToWallet/SendToWalletButton.tsx @@ -1,4 +1,5 @@ import { useAccount } from '@lifi/wallet-management' +import { useChainTypeFromAddress } from '@lifi/wallet-provider' import CloseRounded from '@mui/icons-material/CloseRounded' import { Box, Collapse } from '@mui/material' import { type MouseEventHandler, useEffect, useRef } from 'react' @@ -12,10 +13,7 @@ import { useFieldActions } from '../../stores/form/useFieldActions.js' import { useFieldValues } from '../../stores/form/useFieldValues.js' import { useSendToWalletStore } from '../../stores/settings/useSendToWalletStore.js' import { DisabledUI, HiddenUI } from '../../types/widget.js' -import { - defaultChainIdsByType, - getChainTypeFromAddress, -} from '../../utils/chainType.js' +import { defaultChainIdsByType } from '../../utils/chainType.js' import { navigationRoutes } from '../../utils/navigationRoutes.js' import { shortenAddress } from '../../utils/wallet.js' import { AccountAvatar } from '../Avatar/AccountAvatar.js' @@ -47,6 +45,7 @@ export const SendToWalletButton: React.FC = (props) => { const { setSelectedBookmark } = useBookmarkActions() const { accounts } = useAccount() const { requiredToAddress } = useToAddressRequirements() + const { getChainTypeFromAddress } = useChainTypeFromAddress() const disabledToAddress = disabledUI?.includes(DisabledUI.ToAddress) const hiddenToAddress = hiddenUI?.includes(HiddenUI.ToAddress) @@ -73,7 +72,9 @@ export const SendToWalletButton: React.FC = (props) => { : matchingConnectedAccount ? matchingConnectedAccount.chainId : chainType - ? defaultChainIdsByType[chainType] + ? defaultChainIdsByType[ + chainType as keyof typeof defaultChainIdsByType + ] : undefined const isConnectedAccount = diff --git a/packages/widget/src/hooks/useAddressValidation.ts b/packages/widget/src/hooks/useAddressValidation.ts index 6fda50af4..7c68512b6 100644 --- a/packages/widget/src/hooks/useAddressValidation.ts +++ b/packages/widget/src/hooks/useAddressValidation.ts @@ -1,8 +1,8 @@ import type { Chain, ChainType } from '@lifi/sdk' import { getNameServiceAddress } from '@lifi/sdk' +import { useChainTypeFromAddress } from '@lifi/wallet-provider' import { useMutation } from '@tanstack/react-query' import { useTranslation } from 'react-i18next' -import { getChainTypeFromAddress } from '../utils/chainType.js' export enum AddressType { Address = 0, @@ -29,6 +29,7 @@ type InvalidResponse = { export const useAddressValidation = () => { const { t } = useTranslation() + const { getChainTypeFromAddress } = useChainTypeFromAddress() const { mutateAsync: validateAddress, isPending: isValidating } = useMutation( { diff --git a/packages/widget/src/hooks/useRoutes.ts b/packages/widget/src/hooks/useRoutes.ts index a076ab8b6..f0354f325 100644 --- a/packages/widget/src/hooks/useRoutes.ts +++ b/packages/widget/src/hooks/useRoutes.ts @@ -9,6 +9,7 @@ import { LiFiErrorCode, } from '@lifi/sdk' import { useAccount } from '@lifi/wallet-management' +import { useChainTypeFromAddress } from '@lifi/wallet-provider' import { useQuery, useQueryClient } from '@tanstack/react-query' import { useCallback, useMemo } from 'react' import { parseUnits } from 'viem' @@ -19,7 +20,6 @@ import { useSetExecutableRoute } from '../stores/routes/useSetExecutableRoute.js import { useSettings } from '../stores/settings/useSettings.js' import { defaultSlippage } from '../stores/settings/useSettingsStore.js' import { WidgetEvent } from '../types/events.js' -import { getChainTypeFromAddress } from '../utils/chainType.js' import { getQueryKey } from '../utils/queries.js' import { useChain } from './useChain.js' import { useDebouncedWatch } from './useDebouncedWatch.js' @@ -93,6 +93,7 @@ export const useRoutes = ({ observableRoute }: RoutesProps = {}) => { const { chain: toChain } = useChain(toChainId) const { enabled: enabledRefuel, fromAmount: gasRecommendationFromAmount } = useGasRefuel() + const { getChainTypeFromAddress } = useChainTypeFromAddress() const { account } = useAccount({ chainType: fromChain?.chainType }) const { isBatchingSupported, isBatchingSupportedLoading } = diff --git a/packages/widget/src/hooks/useToAddressAutoPopulate.ts b/packages/widget/src/hooks/useToAddressAutoPopulate.ts index 817f9c4df..c37302d70 100644 --- a/packages/widget/src/hooks/useToAddressAutoPopulate.ts +++ b/packages/widget/src/hooks/useToAddressAutoPopulate.ts @@ -1,10 +1,10 @@ import { useAccount } from '@lifi/wallet-management' +import { useChainTypeFromAddress } from '@lifi/wallet-provider' import { useCallback } from 'react' import { useBookmarkActions } from '../stores/bookmarks/useBookmarkActions.js' import type { FormType } from '../stores/form/types.js' import { useFieldActions } from '../stores/form/useFieldActions.js' import { useSendToWalletActions } from '../stores/settings/useSendToWalletStore.js' -import { getChainTypeFromAddress } from '../utils/chainType.js' import { useAvailableChains } from './useAvailableChains.js' type UpdateToAddressArgs = { @@ -24,6 +24,7 @@ export const useToAddressAutoPopulate = () => { const { setSelectedBookmark } = useBookmarkActions() const { getChainById } = useAvailableChains() const { accounts } = useAccount() + const { getChainTypeFromAddress } = useChainTypeFromAddress() return useCallback( ({ @@ -90,6 +91,7 @@ export const useToAddressAutoPopulate = () => { setFieldValue, setSelectedBookmark, setSendToWallet, + getChainTypeFromAddress, ] ) } diff --git a/packages/widget/src/hooks/useTokens.ts b/packages/widget/src/hooks/useTokens.ts index c54a9f0c4..2baee359c 100644 --- a/packages/widget/src/hooks/useTokens.ts +++ b/packages/widget/src/hooks/useTokens.ts @@ -4,14 +4,12 @@ import { getTokens, type TokensExtendedResponse, } from '@lifi/sdk' +import { useChainTypeFromAddress } from '@lifi/wallet-provider' import { useQuery, useQueryClient } from '@tanstack/react-query' import { useMemo } from 'react' import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js' import type { FormType } from '../stores/form/types.js' -import { - defaultChainIdsByType, - getChainTypeFromAddress, -} from '../utils/chainType.js' +import { defaultChainIdsByType } from '../utils/chainType.js' import { isItemAllowed } from '../utils/item.js' import { getQueryKey } from '../utils/queries.js' import { filterAllowedTokens } from '../utils/token.js' @@ -77,6 +75,7 @@ export const useTokens = ( * if any of the tokens are not already in the cache. */ const useBackgroundTokenSearch = (search?: string, chainId?: number) => { const { chains: chainsConfig, keyPrefix } = useWidgetConfig() + const { getChainTypeFromAddress } = useChainTypeFromAddress() const queryClient = useQueryClient() const { isLoading: isSearchLoading } = useQuery({ @@ -104,8 +103,11 @@ const useBackgroundTokenSearch = (search?: string, chainId?: number) => { let _chainId = chainId if (!_chainId) { const chainType = getChainTypeFromAddress(searchQuery) - if (chainType) { - _chainId = defaultChainIdsByType[chainType] + if (chainType && chainType in defaultChainIdsByType) { + _chainId = + defaultChainIdsByType[ + chainType as keyof typeof defaultChainIdsByType + ] } } diff --git a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx index 201e012a2..9fbf3287b 100644 --- a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx +++ b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx @@ -6,7 +6,6 @@ import { useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' -import type { SignerWalletAdapter } from '@solana/wallet-adapter-base' import { useEffect } from 'react' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' @@ -45,7 +44,7 @@ export const SDKProviders = () => { providers.push( Solana({ async getWalletAdapter() { - return svmWallet?.adapter as SignerWalletAdapter + return svmWallet?.adapter }, }) ) diff --git a/packages/widget/src/types/widget.ts b/packages/widget/src/types/widget.ts index 9bb491103..361178aff 100644 --- a/packages/widget/src/types/widget.ts +++ b/packages/widget/src/types/widget.ts @@ -136,6 +136,7 @@ export type DefaultUI = { navigationHeaderTitleNoWrap?: boolean } +// TODO: move EVM-related config somewhere else? export interface WidgetWalletConfig { onConnect?(args?: WalletMenuOpenArgs): void walletConnect?: WalletConnectParameters diff --git a/packages/widget/src/utils/chainType.ts b/packages/widget/src/utils/chainType.ts index ea6de6eae..58402ff72 100644 --- a/packages/widget/src/utils/chainType.ts +++ b/packages/widget/src/utils/chainType.ts @@ -1,27 +1,4 @@ -import { isUTXOAddress } from '@bigmi/core' -import { ChainId, ChainType, isSVMAddress } from '@lifi/sdk' -import { isValidSuiAddress } from '@mysten/sui/utils' // TODO: move to @lifi/sdk -import { isAddress as isEVMAddress } from 'viem' - -const chainTypeAddressValidation = { - [ChainType.EVM]: isEVMAddress, - [ChainType.SVM]: isSVMAddress, - [ChainType.MVM]: isValidSuiAddress, - [ChainType.UTXO]: isUTXOAddress, - [ChainType.TVM]: () => false, -} - -export const getChainTypeFromAddress = ( - address: string -): ChainType | undefined => { - for (const chainType in chainTypeAddressValidation) { - const isChainType = - chainTypeAddressValidation[chainType as ChainType](address) - if (isChainType) { - return chainType as ChainType - } - } -} +import { ChainId, ChainType } from '@lifi/sdk' export const defaultChainIdsByType = { [ChainType.EVM]: ChainId.ETH, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee696c30d..5209c06d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1025,9 +1025,6 @@ importers: '@bigmi/client': specifier: ^0.5.3 version: 0.5.3(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) - '@bigmi/react': - specifier: '>=0.5.0' - version: 0.5.3(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@emotion/react': specifier: ^11.14.0 version: 11.14.0(@types/react@19.1.13)(react@19.1.1) @@ -1103,6 +1100,10 @@ importers: version: 5.9.2 packages/wallet-provider: + dependencies: + '@lifi/sdk': + specifier: ^3.12.11 + version: 3.12.11(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) devDependencies: react: specifier: ^19.1.1 @@ -1142,7 +1143,7 @@ importers: specifier: ^0.17.4 version: 0.17.7(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) '@mysten/sui': - specifier: ^1.37.3 + specifier: ^1.38.0 version: 1.38.0(typescript@5.9.2) devDependencies: react: @@ -1154,6 +1155,9 @@ importers: packages/wallet-provider-svm: dependencies: + '@lifi/sdk': + specifier: ^3.12.11 + version: 3.12.11(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) '@lifi/wallet-provider': specifier: workspace:* version: link:../wallet-provider @@ -1180,13 +1184,13 @@ importers: packages/wallet-provider-utxo: dependencies: '@bigmi/client': - specifier: '>=0.5.2' + specifier: ^0.5.3 version: 0.5.3(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@bigmi/core': - specifier: '>=0.5.2' + specifier: ^0.5.3 version: 0.5.3(@types/react@19.1.13)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@bigmi/react': - specifier: '>=0.5.2' + specifier: ^0.5.3 version: 0.5.3(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@lifi/wallet-provider': specifier: workspace:* @@ -1201,12 +1205,6 @@ importers: packages/widget: dependencies: - '@bigmi/core': - specifier: ^0.5.3 - version: 0.5.3(@types/react@19.1.13)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) - '@bigmi/react': - specifier: '>=0.5.2' - version: 0.5.3(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@emotion/react': specifier: ^11.14.0 version: 11.14.0(@types/react@19.1.13)(react@19.1.1) @@ -1243,18 +1241,6 @@ importers: '@mui/system': specifier: ^7.3.2 version: 7.3.2(@emotion/react@11.14.0(@types/react@19.1.13)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(react@19.1.1) - '@mysten/sui': - specifier: ^1.38.0 - version: 1.38.0(typescript@5.9.2) - '@solana/wallet-adapter-base': - specifier: ^0.9.27 - version: 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-react': - specifier: '>=0.15.35' - version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) '@tanstack/react-query': specifier: '>=5.87.0' version: 5.90.2(react@19.1.1) @@ -1389,9 +1375,6 @@ importers: packages/widget-playground: dependencies: - '@bigmi/react': - specifier: ^0.5.3 - version: 0.5.3(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) '@emotion/react': specifier: ^11.14.0 version: 11.14.0(@types/react@19.1.13)(react@19.1.1) @@ -25420,7 +25403,7 @@ snapshots: '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) '@walletconnect/ethereum-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@types/react@19.1.13)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' porto: 0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)) @@ -25702,7 +25685,7 @@ snapshots: '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) '@walletconnect/ethereum-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@types/react@19.1.13)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' porto: 0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)) @@ -25863,21 +25846,6 @@ snapshots: - react - use-sync-external-store - '@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': - dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.9.2) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.0(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) - optionalDependencies: - '@tanstack/query-core': 5.90.2 - typescript: 5.9.2 - transitivePeerDependencies: - - '@types/react' - - immer - - react - - use-sync-external-store - '@wallet-standard/app@1.0.1': dependencies: '@wallet-standard/base': 1.1.0 @@ -35073,7 +35041,7 @@ snapshots: porto@0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)): dependencies: - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) hono: 4.9.8 idb-keyval: 6.2.2 mipd: 0.0.7(typescript@5.9.2) @@ -35093,7 +35061,7 @@ snapshots: porto@0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)): dependencies: - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) hono: 4.9.8 idb-keyval: 6.2.2 mipd: 0.0.7(typescript@5.9.2) From 7799485592ed88518582f87db254a0d1d721a4ab Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Mon, 29 Sep 2025 10:20:24 +0100 Subject: [PATCH 10/24] refactor: remove evm duplicates --- examples/connectkit/package.json | 2 +- .../src/providers/WalletProvider.tsx | 2 +- examples/dynamic/package.json | 2 +- .../dynamic/src/providers/WalletProvider.tsx | 2 +- examples/privy-ethers/package.json | 2 +- .../src/providers/SyncedWalletProvider.tsx | 2 +- examples/privy/package.json | 2 +- .../src/providers/SyncedWalletProvider.tsx | 2 +- examples/rainbowkit/package.json | 2 +- .../src/providers/WalletProvider.tsx | 2 +- examples/vite/package.json | 2 +- .../vite/src/providers/WalletProvider.tsx | 4 +- knip.json | 2 +- packages/wallet-management/package.json | 3 +- .../src/components/EVMListItemButton.tsx | 2 +- .../src/config/baseAccount.ts | 7 --- .../wallet-management/src/config/coinbase.ts | 7 --- .../wallet-management/src/config/metaMask.ts | 13 ----- .../src/config/walletConnect.ts | 5 -- .../src/connectors/baseAccount.ts | 7 --- .../src/connectors/coinbase.ts | 12 ----- .../src/connectors/metaMask.ts | 7 --- .../wallet-management/src/connectors/porto.ts | 6 --- .../wallet-management/src/connectors/types.ts | 6 --- .../wallet-management/src/connectors/utils.ts | 13 ----- .../src/connectors/walletConnect.ts | 20 ------- .../wallet-management/src/hooks/useAccount.ts | 2 +- .../src/hooks/useCombinedWallets.ts | 22 ++++---- packages/wallet-management/src/index.ts | 8 --- .../wallet-management/src/syncWagmiConfig.ts | 25 --------- .../src/types/walletConnector.ts | 2 +- .../src/useSyncWagmiConfig.ts | 34 ------------ .../src/utils/convertExtendedChain.ts | 53 ------------------- .../src/utils/isWalletInstalled.ts | 1 + packages/wallet-provider-evm/src/index.ts | 16 ++++++ .../ReownWalletProvider.tsx | 2 +- pnpm-lock.yaml | 37 +++++++------ 37 files changed, 69 insertions(+), 269 deletions(-) delete mode 100644 packages/wallet-management/src/config/baseAccount.ts delete mode 100644 packages/wallet-management/src/config/coinbase.ts delete mode 100644 packages/wallet-management/src/config/metaMask.ts delete mode 100644 packages/wallet-management/src/config/walletConnect.ts delete mode 100644 packages/wallet-management/src/connectors/baseAccount.ts delete mode 100644 packages/wallet-management/src/connectors/coinbase.ts delete mode 100644 packages/wallet-management/src/connectors/metaMask.ts delete mode 100644 packages/wallet-management/src/connectors/porto.ts delete mode 100644 packages/wallet-management/src/connectors/types.ts delete mode 100644 packages/wallet-management/src/connectors/utils.ts delete mode 100644 packages/wallet-management/src/connectors/walletConnect.ts delete mode 100644 packages/wallet-management/src/syncWagmiConfig.ts delete mode 100644 packages/wallet-management/src/useSyncWagmiConfig.ts delete mode 100644 packages/wallet-management/src/utils/convertExtendedChain.ts diff --git a/examples/connectkit/package.json b/examples/connectkit/package.json index 9f1528c44..a69a1319d 100644 --- a/examples/connectkit/package.json +++ b/examples/connectkit/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "@lifi/wallet-management": "^3.17.2", + "@lifi/wallet-provider-evm": "workspace:^", "@lifi/widget": "^3.32.1", "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", diff --git a/examples/connectkit/src/providers/WalletProvider.tsx b/examples/connectkit/src/providers/WalletProvider.tsx index 95049cfb1..d696585da 100644 --- a/examples/connectkit/src/providers/WalletProvider.tsx +++ b/examples/connectkit/src/providers/WalletProvider.tsx @@ -1,4 +1,4 @@ -import { useSyncWagmiConfig } from '@lifi/wallet-management' +import { useSyncWagmiConfig } from '@lifi/wallet-provider-evm' import { ChainType, useAvailableChains } from '@lifi/widget' import { ConnectKitProvider, getDefaultConfig } from 'connectkit' import type { FC, PropsWithChildren } from 'react' diff --git a/examples/dynamic/package.json b/examples/dynamic/package.json index e2edb7a1a..fc26a6cf5 100644 --- a/examples/dynamic/package.json +++ b/examples/dynamic/package.json @@ -20,7 +20,7 @@ "@dynamic-labs/solana-core": "^4.32.1", "@dynamic-labs/wagmi-connector": "^4.32.1", "@lifi/sdk": "^3.12.11", - "@lifi/wallet-management": "workspace:^", + "@lifi/wallet-provider-evm": "workspace:^", "@lifi/widget": "workspace:^", "@mui/material": "^7.3.2", "@solana/wallet-adapter-base": "^0.9.27", diff --git a/examples/dynamic/src/providers/WalletProvider.tsx b/examples/dynamic/src/providers/WalletProvider.tsx index 098e59332..151096de8 100644 --- a/examples/dynamic/src/providers/WalletProvider.tsx +++ b/examples/dynamic/src/providers/WalletProvider.tsx @@ -8,7 +8,7 @@ import { convertExtendedChain, isExtendedChain, useSyncWagmiConfig, -} from '@lifi/wallet-management' +} from '@lifi/wallet-provider-evm' import { ChainType, type ExtendedChain, useAvailableChains } from '@lifi/widget' import { type FC, type PropsWithChildren, useRef } from 'react' import { type Chain, mainnet } from 'viem/chains' diff --git a/examples/privy-ethers/package.json b/examples/privy-ethers/package.json index cc5a3dd21..fcb4a7deb 100644 --- a/examples/privy-ethers/package.json +++ b/examples/privy-ethers/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "@lifi/wallet-management": "^3.17.2", + "@lifi/wallet-provider-evm": "workspace:^", "@lifi/widget": "^3.32.1", "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", diff --git a/examples/privy-ethers/src/providers/SyncedWalletProvider.tsx b/examples/privy-ethers/src/providers/SyncedWalletProvider.tsx index 48f13a4b5..1c399167c 100644 --- a/examples/privy-ethers/src/providers/SyncedWalletProvider.tsx +++ b/examples/privy-ethers/src/providers/SyncedWalletProvider.tsx @@ -2,7 +2,7 @@ import { convertExtendedChain, isExtendedChain, useSyncWagmiConfig, -} from '@lifi/wallet-management' +} from '@lifi/wallet-provider-evm' import { useAvailableChains } from '@lifi/widget' import { PrivyProvider } from '@privy-io/react-auth' import { WagmiProvider } from '@privy-io/wagmi' diff --git a/examples/privy/package.json b/examples/privy/package.json index 8cd4bbef7..42b182c76 100644 --- a/examples/privy/package.json +++ b/examples/privy/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "@lifi/wallet-management": "^3.17.2", + "@lifi/wallet-provider-evm": "workspace:^", "@lifi/widget": "^3.32.1", "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", diff --git a/examples/privy/src/providers/SyncedWalletProvider.tsx b/examples/privy/src/providers/SyncedWalletProvider.tsx index ed133700c..e7fd5ead8 100644 --- a/examples/privy/src/providers/SyncedWalletProvider.tsx +++ b/examples/privy/src/providers/SyncedWalletProvider.tsx @@ -2,7 +2,7 @@ import { convertExtendedChain, isExtendedChain, useSyncWagmiConfig, -} from '@lifi/wallet-management' +} from '@lifi/wallet-provider-evm' import { useAvailableChains } from '@lifi/widget' import { PrivyProvider } from '@privy-io/react-auth' import { SmartWalletsProvider } from '@privy-io/react-auth/smart-wallets' diff --git a/examples/rainbowkit/package.json b/examples/rainbowkit/package.json index ddf5473f6..8df014a2b 100644 --- a/examples/rainbowkit/package.json +++ b/examples/rainbowkit/package.json @@ -9,7 +9,7 @@ "preview": "vite preview" }, "dependencies": { - "@lifi/wallet-management": "^3.17.2", + "@lifi/wallet-provider-evm": "workspace:^", "@lifi/widget": "^3.32.1", "@rainbow-me/rainbowkit": "^2.2.8", "@tanstack/react-query": "^5.90.1", diff --git a/examples/rainbowkit/src/providers/WalletProvider.tsx b/examples/rainbowkit/src/providers/WalletProvider.tsx index 768ce34ba..ec2decb2b 100644 --- a/examples/rainbowkit/src/providers/WalletProvider.tsx +++ b/examples/rainbowkit/src/providers/WalletProvider.tsx @@ -1,4 +1,4 @@ -import { useSyncWagmiConfig } from '@lifi/wallet-management' +import { useSyncWagmiConfig } from '@lifi/wallet-provider-evm' import { useAvailableChains } from '@lifi/widget' import { RainbowKitProvider } from '@rainbow-me/rainbowkit' import type { FC, PropsWithChildren } from 'react' diff --git a/examples/vite/package.json b/examples/vite/package.json index 97aa109fe..a29480a26 100644 --- a/examples/vite/package.json +++ b/examples/vite/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@lifi/sdk": "^3.12.11", - "@lifi/wallet-management": "^3.17.2", + "@lifi/wallet-provider-evm": "workspace:^", "@lifi/widget": "^3.32.1", "@mui/material": "^7.3.2", "@tanstack/react-query": "^5.90.1", diff --git a/examples/vite/src/providers/WalletProvider.tsx b/examples/vite/src/providers/WalletProvider.tsx index d1d30ddb8..751304ebb 100644 --- a/examples/vite/src/providers/WalletProvider.tsx +++ b/examples/vite/src/providers/WalletProvider.tsx @@ -1,4 +1,4 @@ -import { useSyncWagmiConfig } from '@lifi/wallet-management' +import { useSyncWagmiConfig } from '@lifi/wallet-provider-evm' import { useAvailableChains } from '@lifi/widget' import { injected, walletConnect } from '@wagmi/connectors' import { type FC, type PropsWithChildren, useRef } from 'react' @@ -13,7 +13,7 @@ const connectors = [injected(), walletConnect({ projectId })] export const WalletProvider: FC = ({ children }) => { const { chains } = useAvailableChains() - const wagmi = useRef() + const wagmi = useRef(null) if (!wagmi.current) { wagmi.current = createConfig({ diff --git a/knip.json b/knip.json index 9737bdc2c..e6c0f0dce 100644 --- a/knip.json +++ b/knip.json @@ -1,4 +1,4 @@ { "ignore": ["examples/**", "packages/widget-embedded/**", "scripts/**"], - "ignoreDependencies": ["@mui/system", "csstype"] + "ignoreDependencies": ["@mui/system", "csstype", "@lifi/wallet-management"] } diff --git a/packages/wallet-management/package.json b/packages/wallet-management/package.json index 916f4c269..cca7254b0 100644 --- a/packages/wallet-management/package.json +++ b/packages/wallet-management/package.json @@ -63,7 +63,8 @@ "react-i18next": "^16.0.0", "use-sync-external-store": "^1.5.0", "viem": "^2.37.7", - "zustand": "^5.0.8" + "zustand": "^5.0.8", + "@lifi/wallet-provider-evm": "workspace:^" }, "devDependencies": { "@types/use-sync-external-store": "^1.5.0", diff --git a/packages/wallet-management/src/components/EVMListItemButton.tsx b/packages/wallet-management/src/components/EVMListItemButton.tsx index 07ef72138..d7e13f43a 100644 --- a/packages/wallet-management/src/components/EVMListItemButton.tsx +++ b/packages/wallet-management/src/components/EVMListItemButton.tsx @@ -1,7 +1,7 @@ import { ChainType } from '@lifi/sdk' import { useEVMContext } from '@lifi/wallet-provider' +import type { CreateConnectorFnExtended } from '@lifi/wallet-provider-evm' import type { Connector } from 'wagmi' -import type { CreateConnectorFnExtended } from '../connectors/types.js' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' import { getChainTypeIcon } from '../icons.js' diff --git a/packages/wallet-management/src/config/baseAccount.ts b/packages/wallet-management/src/config/baseAccount.ts deleted file mode 100644 index 5139c3c72..000000000 --- a/packages/wallet-management/src/config/baseAccount.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { BaseAccountParameters } from 'wagmi/connectors' -import { lifiLogoUrl } from '../icons.js' - -export const defaultBaseAccountConfig: BaseAccountParameters = { - appName: 'LI.FI', - appLogoUrl: lifiLogoUrl, -} diff --git a/packages/wallet-management/src/config/coinbase.ts b/packages/wallet-management/src/config/coinbase.ts deleted file mode 100644 index 67b52db58..000000000 --- a/packages/wallet-management/src/config/coinbase.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { CoinbaseWalletParameters } from 'wagmi/connectors' -import { lifiLogoUrl } from '../icons.js' - -export const defaultCoinbaseConfig: CoinbaseWalletParameters = { - appName: 'LI.FI', - appLogoUrl: lifiLogoUrl, -} diff --git a/packages/wallet-management/src/config/metaMask.ts b/packages/wallet-management/src/config/metaMask.ts deleted file mode 100644 index a015e36db..000000000 --- a/packages/wallet-management/src/config/metaMask.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { MetaMaskParameters } from 'wagmi/connectors' -import { lifiLogoUrl } from '../icons.js' - -export const defaultMetaMaskConfig: MetaMaskParameters = { - dappMetadata: { - name: 'LI.FI', - url: - typeof window !== 'undefined' - ? (window as any)?.location.href - : 'https://li.fi/', - iconUrl: lifiLogoUrl, - }, -} diff --git a/packages/wallet-management/src/config/walletConnect.ts b/packages/wallet-management/src/config/walletConnect.ts deleted file mode 100644 index 8b3a8558f..000000000 --- a/packages/wallet-management/src/config/walletConnect.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { WalletConnectParameters } from 'wagmi/connectors' - -export const defaultWalletConnectConfig: WalletConnectParameters = { - projectId: '5432e3507d41270bee46b7b85bbc2ef8', -} diff --git a/packages/wallet-management/src/connectors/baseAccount.ts b/packages/wallet-management/src/connectors/baseAccount.ts deleted file mode 100644 index 1c4502aaa..000000000 --- a/packages/wallet-management/src/connectors/baseAccount.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { BaseAccountParameters } from 'wagmi/connectors' -import { baseAccount } from 'wagmi/connectors' -import { extendConnector } from './utils.js' - -export const createBaseAccountConnector = /*#__PURE__*/ ( - params: BaseAccountParameters -) => extendConnector(baseAccount(params), 'baseAccount', 'Base Account') diff --git a/packages/wallet-management/src/connectors/coinbase.ts b/packages/wallet-management/src/connectors/coinbase.ts deleted file mode 100644 index 0804e7d12..000000000 --- a/packages/wallet-management/src/connectors/coinbase.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { CoinbaseWalletParameters } from 'wagmi/connectors' -import { coinbaseWallet } from 'wagmi/connectors' -import { extendConnector } from './utils.js' - -export const createCoinbaseConnector = /*#__PURE__*/ ( - params: CoinbaseWalletParameters -) => - extendConnector( - coinbaseWallet(params), - 'coinbaseWalletSDK', - 'Coinbase Wallet' - ) diff --git a/packages/wallet-management/src/connectors/metaMask.ts b/packages/wallet-management/src/connectors/metaMask.ts deleted file mode 100644 index 7cd230e9a..000000000 --- a/packages/wallet-management/src/connectors/metaMask.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { MetaMaskParameters } from 'wagmi/connectors' -import { metaMask } from 'wagmi/connectors' -import { extendConnector } from './utils.js' - -export const createMetaMaskConnector = /*#__PURE__*/ ( - params: MetaMaskParameters -) => extendConnector(metaMask(params), 'metaMaskSDK', 'MetaMask') diff --git a/packages/wallet-management/src/connectors/porto.ts b/packages/wallet-management/src/connectors/porto.ts deleted file mode 100644 index fa14ce02e..000000000 --- a/packages/wallet-management/src/connectors/porto.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type PortoParameters, porto } from 'wagmi/connectors' -import { extendConnector } from './utils.js' - -export const createPortoConnector = /*#__PURE__*/ ( - params?: Partial -) => extendConnector(porto(params), 'xyz.ithaca.porto', 'Porto') diff --git a/packages/wallet-management/src/connectors/types.ts b/packages/wallet-management/src/connectors/types.ts deleted file mode 100644 index 1a5b8787c..000000000 --- a/packages/wallet-management/src/connectors/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { CreateConnectorFn } from 'wagmi' - -export interface CreateConnectorFnExtended extends CreateConnectorFn { - id: string - displayName: string -} diff --git a/packages/wallet-management/src/connectors/utils.ts b/packages/wallet-management/src/connectors/utils.ts deleted file mode 100644 index e6c7364f8..000000000 --- a/packages/wallet-management/src/connectors/utils.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { CreateConnectorFn } from 'wagmi' -import type { CreateConnectorFnExtended } from './types.js' - -export const extendConnector = ( - connector: CreateConnectorFn, - id: string, - name: string -): CreateConnectorFnExtended => { - const extendedConnector = connector as CreateConnectorFnExtended - extendedConnector.id = id - extendedConnector.displayName = name - return extendedConnector -} diff --git a/packages/wallet-management/src/connectors/walletConnect.ts b/packages/wallet-management/src/connectors/walletConnect.ts deleted file mode 100644 index 5aa440dad..000000000 --- a/packages/wallet-management/src/connectors/walletConnect.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { WalletConnectParameters } from 'wagmi/connectors' -import { walletConnect } from 'wagmi/connectors' -import { extendConnector } from './utils.js' - -export const createWalletConnectConnector = /*#__PURE__*/ ( - params: WalletConnectParameters -) => - extendConnector( - walletConnect({ - showQrModal: true, - qrModalOptions: { - themeVariables: { - '--wcm-z-index': '3000', - }, - }, - ...params, - }), - 'walletConnect', - 'WalletConnect' - ) diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index c7407a317..f704e65cd 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -6,12 +6,12 @@ import { useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' +import type { CreateConnectorFnExtended } from '@lifi/wallet-provider-evm' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import type { WalletAdapter } from '@solana/wallet-adapter-base' import { useMemo } from 'react' import type { Connector } from 'wagmi' import { create } from 'zustand' -import type { CreateConnectorFnExtended } from '../connectors/types.js' export interface AccountBase< CT extends ChainType, diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index ddc86de9a..bc78fa184 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -6,22 +6,24 @@ import { useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' +import { + type CreateConnectorFnExtended, + createBaseAccountConnector, + createCoinbaseConnector, + createMetaMaskConnector, + createPortoConnector, + createWalletConnectConnector, + defaultBaseAccountConfig, + defaultCoinbaseConfig, + defaultMetaMaskConfig, + defaultWalletConnectConfig, +} from '@lifi/wallet-provider-evm' import type { Theme } from '@mui/material' import { useMediaQuery } from '@mui/material' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import { WalletReadyState } from '@solana/wallet-adapter-base' import { useEffect, useState } from 'react' import type { Connector } from 'wagmi' -import { defaultBaseAccountConfig } from '../config/baseAccount.js' -import { defaultCoinbaseConfig } from '../config/coinbase.js' -import { defaultMetaMaskConfig } from '../config/metaMask.js' -import { defaultWalletConnectConfig } from '../config/walletConnect.js' -import { createBaseAccountConnector } from '../connectors/baseAccount.js' -import { createCoinbaseConnector } from '../connectors/coinbase.js' -import { createMetaMaskConnector } from '../connectors/metaMask.js' -import { createPortoConnector } from '../connectors/porto.js' -import type { CreateConnectorFnExtended } from '../connectors/types.js' -import { createWalletConnectConnector } from '../connectors/walletConnect.js' import { useWalletManagementConfig } from '../providers/WalletManagementProvider/WalletManagementContext.js' import type { WalletConnector } from '../types/walletConnector.js' import { getConnectorIcon } from '../utils/getConnectorIcon.js' diff --git a/packages/wallet-management/src/index.ts b/packages/wallet-management/src/index.ts index b99d262b4..730149f44 100644 --- a/packages/wallet-management/src/index.ts +++ b/packages/wallet-management/src/index.ts @@ -1,10 +1,5 @@ import type {} from '@mui/material/themeCssVarsAugmentation' -export * from './connectors/coinbase.js' -export * from './connectors/metaMask.js' -export * from './connectors/types.js' -export * from './connectors/utils.js' -export * from './connectors/walletConnect.js' export * from './hooks/useAccount.js' export * from './hooks/useAccountDisconnect.js' export * from './hooks/useWalletManagementEvents.js' @@ -13,12 +8,9 @@ export * from './providers/WalletManagementProvider/types.js' export * from './providers/WalletManagementProvider/WalletManagementProvider.js' export type { WalletMenuOpenArgs } from './providers/WalletMenuProvider/types.js' export * from './providers/WalletMenuProvider/WalletMenuContext.js' -export * from './syncWagmiConfig.js' export * from './types/events.js' export * from './types/walletConfig.js' export * from './types/walletConnector.js' -export * from './useSyncWagmiConfig.js' -export * from './utils/convertExtendedChain.js' export * from './utils/getConnectorIcon.js' export * from './utils/getWalletPriority.js' export * from './utils/isWalletInstalled.js' diff --git a/packages/wallet-management/src/syncWagmiConfig.ts b/packages/wallet-management/src/syncWagmiConfig.ts deleted file mode 100644 index 49b82819e..000000000 --- a/packages/wallet-management/src/syncWagmiConfig.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { Chain } from 'viem' -import { mainnet } from 'viem/chains' -import type { Config, CreateConnectorFn } from 'wagmi' -import { reconnect } from 'wagmi/actions' - -export const syncWagmiConfig = async ( - wagmiConfig: Config, - connectors: CreateConnectorFn[], - chains: readonly [Chain, ...Chain[]] -) => { - const _mainnet = chains.find((chain) => chain.id === mainnet.id) - if (_mainnet) { - _mainnet.contracts = { ...mainnet.contracts, ..._mainnet.contracts } - } - wagmiConfig._internal.chains.setState(chains) - wagmiConfig._internal.connectors.setState(() => - [ - ...connectors, - ...(wagmiConfig._internal.mipd - ?.getProviders() - .map(wagmiConfig._internal.connectors.providerDetailToConnector) ?? []), - ].map(wagmiConfig._internal.connectors.setup) - ) - reconnect(wagmiConfig) -} diff --git a/packages/wallet-management/src/types/walletConnector.ts b/packages/wallet-management/src/types/walletConnector.ts index 87ab13b9b..a1c1dad4b 100644 --- a/packages/wallet-management/src/types/walletConnector.ts +++ b/packages/wallet-management/src/types/walletConnector.ts @@ -1,8 +1,8 @@ import type { Connector as BigmiConnector } from '@bigmi/client' +import type { CreateConnectorFnExtended } from '@lifi/wallet-provider-evm' import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import type { WalletAdapter } from '@solana/wallet-adapter-base' import type { Connector } from 'wagmi' -import type { CreateConnectorFnExtended } from '../connectors/types.js' export type WalletConnector = | Connector diff --git a/packages/wallet-management/src/useSyncWagmiConfig.ts b/packages/wallet-management/src/useSyncWagmiConfig.ts deleted file mode 100644 index 1781a8ad1..000000000 --- a/packages/wallet-management/src/useSyncWagmiConfig.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { ChainType, type ExtendedChain } from '@lifi/sdk' -import { useEffect, useMemo } from 'react' -import type { Chain } from 'viem' -import type { Config, CreateConnectorFn } from 'wagmi' -import { syncWagmiConfig } from './syncWagmiConfig.js' -import { - convertExtendedChain, - isExtendedChain, -} from './utils/convertExtendedChain.js' - -export const useSyncWagmiConfig = ( - wagmiConfig: Config, - connectors: CreateConnectorFn[], - chains?: (ExtendedChain | Chain)[] -) => { - const _chains = useMemo(() => { - const mappedChains = chains - ?.map((chain) => - isExtendedChain(chain) - ? chain.chainType === ChainType.EVM - ? convertExtendedChain(chain) - : undefined - : chain - ) - .filter(Boolean) as [Chain, ...Chain[]] - return mappedChains - }, [chains]) - - useEffect(() => { - if (_chains?.length) { - syncWagmiConfig(wagmiConfig, connectors, _chains) - } - }, [_chains, connectors, wagmiConfig]) -} diff --git a/packages/wallet-management/src/utils/convertExtendedChain.ts b/packages/wallet-management/src/utils/convertExtendedChain.ts deleted file mode 100644 index a28cf26ae..000000000 --- a/packages/wallet-management/src/utils/convertExtendedChain.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { ExtendedChain } from '@lifi/sdk' -import type { Address, Chain } from 'viem' - -type ChainBlockExplorer = { - name: string - url: string -} - -type ChainBlockExplorers = { - [key: string]: ChainBlockExplorer - default: ChainBlockExplorer -} - -export const convertExtendedChain = (chain: ExtendedChain): Chain => ({ - ...chain, - ...chain.metamask, - blockExplorers: chain.metamask.blockExplorerUrls.reduce( - (blockExplorers, blockExplorer, index) => { - blockExplorers[index === 0 ? 'default' : `${index}`] = { - name: blockExplorer, - url: blockExplorer, - } - return blockExplorers - }, - {} as ChainBlockExplorers - ), - name: chain.metamask.chainName, - rpcUrls: { - default: { http: chain.metamask.rpcUrls }, - public: { http: chain.metamask.rpcUrls }, - }, - contracts: { - ...(chain.multicallAddress - ? { multicall3: { address: chain.multicallAddress as Address } } - : undefined), - }, -}) - -export function isExtendedChain(chain: any): chain is ExtendedChain { - return ( - typeof chain === 'object' && - chain !== null && - 'key' in chain && - 'chainType' in chain && - 'coin' in chain && - 'mainnet' in chain && - 'logoURI' in chain && - typeof chain.metamask === 'object' && - chain.metamask !== null && - typeof chain.nativeToken === 'object' && - chain.nativeToken !== null - ) -} diff --git a/packages/wallet-management/src/utils/isWalletInstalled.ts b/packages/wallet-management/src/utils/isWalletInstalled.ts index b63369322..aa52b3959 100644 --- a/packages/wallet-management/src/utils/isWalletInstalled.ts +++ b/packages/wallet-management/src/utils/isWalletInstalled.ts @@ -1,3 +1,4 @@ +// TODO: split/move to wallet provider? export const isWalletInstalled = (id: string): boolean => { const anyWindow = typeof window !== 'undefined' ? (window as any) : undefined switch (id) { diff --git a/packages/wallet-provider-evm/src/index.ts b/packages/wallet-provider-evm/src/index.ts index ca2fdab95..8bbe6e86e 100644 --- a/packages/wallet-provider-evm/src/index.ts +++ b/packages/wallet-provider-evm/src/index.ts @@ -1 +1,17 @@ +// TODO: remove config and connectors exports after wallet-management migration +export { defaultBaseAccountConfig } from './config/baseAccount.js' +export { defaultCoinbaseConfig } from './config/coinbase.js' +export { defaultMetaMaskConfig } from './config/metaMask.js' +export { defaultWalletConnectConfig } from './config/walletConnect.js' +export { createBaseAccountConnector } from './connectors/baseAccount.js' +export { createCoinbaseConnector } from './connectors/coinbase.js' +export { createMetaMaskConnector } from './connectors/metaMask.js' +export { createPortoConnector } from './connectors/porto.js' +export { createWalletConnectConnector } from './connectors/walletConnect.js' +export { useSyncWagmiConfig } from './hooks/useSyncWagmiConfig.js' export { EVMProvider, useInEVMContext } from './providers/EVMProvider.js' +export type { CreateConnectorFnExtended } from './types/connectors.js' +export { + convertExtendedChain, + isExtendedChain, +} from './utils/convertExtendedChain.js' diff --git a/packages/widget-playground/src/providers/ExternalWalletProvider/ReownWalletProvider.tsx b/packages/widget-playground/src/providers/ExternalWalletProvider/ReownWalletProvider.tsx index 05da7c379..85fe1a027 100644 --- a/packages/widget-playground/src/providers/ExternalWalletProvider/ReownWalletProvider.tsx +++ b/packages/widget-playground/src/providers/ExternalWalletProvider/ReownWalletProvider.tsx @@ -1,4 +1,4 @@ -import { useSyncWagmiConfig } from '@lifi/wallet-management' +import { useSyncWagmiConfig } from '@lifi/wallet-provider-evm' import { ChainType, type ExtendedChain } from '@lifi/widget' import { mainnet, solana } from '@reown/appkit/networks' import { type AppKit, createAppKit } from '@reown/appkit/react' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5209c06d8..1aa10c880 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,9 +54,9 @@ importers: examples/connectkit: dependencies: - '@lifi/wallet-management': - specifier: ^3.17.2 - version: 3.17.3(8031cacce17e9ce0c32f162e9c5745c8) + '@lifi/wallet-provider-evm': + specifier: workspace:^ + version: link:../../packages/wallet-provider-evm '@lifi/widget': specifier: ^3.32.1 version: 3.32.2(0524ffbbd6d74938d196cfef8d8244a7) @@ -206,9 +206,9 @@ importers: '@lifi/sdk': specifier: ^3.12.11 version: 3.12.11(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - '@lifi/wallet-management': + '@lifi/wallet-provider-evm': specifier: workspace:^ - version: link:../../packages/wallet-management + version: link:../../packages/wallet-provider-evm '@lifi/widget': specifier: workspace:^ version: link:../../packages/widget @@ -439,9 +439,9 @@ importers: examples/privy: dependencies: - '@lifi/wallet-management': - specifier: ^3.17.2 - version: 3.17.3(f6b0439c9c3b16edb139c3e118f03df8) + '@lifi/wallet-provider-evm': + specifier: workspace:^ + version: link:../../packages/wallet-provider-evm '@lifi/widget': specifier: ^3.32.1 version: 3.32.2(e8bc8b72758e9e2fe75db6dbcd64f116) @@ -518,9 +518,9 @@ importers: examples/privy-ethers: dependencies: - '@lifi/wallet-management': - specifier: ^3.17.2 - version: 3.17.3(f6b0439c9c3b16edb139c3e118f03df8) + '@lifi/wallet-provider-evm': + specifier: workspace:^ + version: link:../../packages/wallet-provider-evm '@lifi/widget': specifier: ^3.32.1 version: 3.32.2(e8bc8b72758e9e2fe75db6dbcd64f116) @@ -606,9 +606,9 @@ importers: examples/rainbowkit: dependencies: - '@lifi/wallet-management': - specifier: ^3.17.2 - version: 3.17.3(8031cacce17e9ce0c32f162e9c5745c8) + '@lifi/wallet-provider-evm': + specifier: workspace:^ + version: link:../../packages/wallet-provider-evm '@lifi/widget': specifier: ^3.32.1 version: 3.32.2(0524ffbbd6d74938d196cfef8d8244a7) @@ -884,9 +884,9 @@ importers: '@lifi/sdk': specifier: ^3.12.11 version: 3.12.11(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) - '@lifi/wallet-management': - specifier: ^3.17.2 - version: 3.17.3(a2ca9e182250a54f4d435254f51dfe69) + '@lifi/wallet-provider-evm': + specifier: workspace:^ + version: link:../../packages/wallet-provider-evm '@lifi/widget': specifier: ^3.32.1 version: 3.32.2(467571cf5824666290eeb3364b20f2f6) @@ -1037,6 +1037,9 @@ importers: '@lifi/wallet-provider': specifier: workspace:* version: link:../wallet-provider + '@lifi/wallet-provider-evm': + specifier: workspace:^ + version: link:../wallet-provider-evm '@mui/icons-material': specifier: ^7.3.2 version: 7.3.2(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.13)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.13)(react@19.1.1) From 48ae246dff49044434665c23b9dc3234f78cdb87 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Mon, 29 Sep 2025 14:53:20 +0100 Subject: [PATCH 11/24] refactor: remove useAccount deps --- .../wallet-management/src/hooks/useAccount.ts | 151 ++++-------------- .../src/hooks/useAccountDisconnect.ts | 2 +- packages/wallet-management/src/index.ts | 1 + .../src/providers/EVMProvider.tsx | 9 +- packages/wallet-provider-mvm/package.json | 3 +- .../src/providers/MVMProvider.tsx | 26 ++- .../src/providers/SVMProvider.tsx | 26 ++- packages/wallet-provider-utxo/package.json | 3 +- .../src/providers/UTXOProvider.tsx | 15 +- packages/wallet-provider/src/index.ts | 1 + packages/wallet-provider/src/types.ts | 32 ++++ .../SendToWallet/ConnectedWalletsPage.tsx | 3 +- pnpm-lock.yaml | 6 + 13 files changed, 142 insertions(+), 136 deletions(-) create mode 100644 packages/wallet-provider/src/types.ts diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index f704e65cd..af00daad8 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -1,47 +1,14 @@ -import type { Connector as BigmiConnector } from '@bigmi/client' -import { ChainId, ChainType } from '@lifi/sdk' +import { ChainType } from '@lifi/sdk' import { + type Account, useEVMContext, useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' -import type { CreateConnectorFnExtended } from '@lifi/wallet-provider-evm' -import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' -import type { WalletAdapter } from '@solana/wallet-adapter-base' import { useMemo } from 'react' -import type { Connector } from 'wagmi' import { create } from 'zustand' -export interface AccountBase< - CT extends ChainType, - WalletConnector = undefined, -> { - address?: string - addresses?: readonly string[] - chainId?: number - chainType: CT - connector?: WalletConnector - isConnected: boolean - isConnecting: boolean - isDisconnected: boolean - isReconnecting: boolean - status: 'connected' | 'reconnecting' | 'connecting' | 'disconnected' -} - -export type EVMAccount = AccountBase -export type SVMAccount = AccountBase -export type UTXOAccount = AccountBase -export type MVMAccount = AccountBase -export type DefaultAccount = AccountBase - -export type Account = - | EVMAccount - | SVMAccount - | UTXOAccount - | MVMAccount - | DefaultAccount - export interface AccountResult { account: Account /** @@ -54,7 +21,7 @@ interface UseAccountArgs { chainType?: ChainType } -const defaultAccount: AccountBase = { +const defaultAccount: Account = { chainType: ChainType.EVM, isConnected: false, isConnecting: false, @@ -63,17 +30,17 @@ const defaultAccount: AccountBase = { status: 'disconnected', } -export type LastConnectedAccount = - | WalletAdapter - | Connector - | BigmiConnector - | CreateConnectorFnExtended - | WalletWithRequiredFeatures - | null +// export type LastConnectedAccount = +// | WalletAdapter +// | Connector +// | BigmiConnector +// | CreateConnectorFnExtended +// | WalletWithRequiredFeatures +// | null interface LastConnectedAccountStore { - lastConnectedAccount: LastConnectedAccount - setLastConnectedAccount: (account: LastConnectedAccount) => void + lastConnectedAccount: any + setLastConnectedAccount: (account: any) => void } export const useLastConnectedAccount = create( @@ -89,65 +56,15 @@ export const useLastConnectedAccount = create( * @returns - Account result */ export const useAccount = (args?: UseAccountArgs): AccountResult => { - const { currentWallet: evmWallet } = useEVMContext() - const { currentWallet: utxoWallet } = useUTXOContext() - const { currentWallet: svmWallet } = useSVMContext() - const { currentWallet: suiWallet, connectionStatus } = useMVMContext() + const { account: evmAccount } = useEVMContext() + const { account: utxoAccount } = useUTXOContext() + const { account: svmAccount } = useSVMContext() + const { account: suiAccount } = useMVMContext() const { lastConnectedAccount } = useLastConnectedAccount() // biome-ignore lint/correctness/useExhaustiveDependencies: run only when wallet changes return useMemo(() => { - const svm: Account = svmWallet?.adapter.publicKey - ? { - address: svmWallet?.adapter.publicKey.toString(), - chainId: ChainId.SOL, - chainType: ChainType.SVM, - connector: svmWallet?.adapter, - isConnected: Boolean(svmWallet?.adapter.publicKey), - isConnecting: false, - isReconnecting: false, - isDisconnected: !svmWallet, - status: 'connected', - } - : { - chainType: ChainType.SVM, - isConnected: false, - isConnecting: false, - isReconnecting: false, - isDisconnected: true, - status: 'disconnected', - } - const sui: Account = - suiWallet?.accounts?.length && connectionStatus === 'connected' - ? { - address: suiWallet?.accounts[0].address, - chainId: ChainId.SUI, - chainType: ChainType.MVM, - connector: suiWallet, - isConnected: connectionStatus === 'connected', - isConnecting: false, - isReconnecting: false, - isDisconnected: !suiWallet, - status: connectionStatus, - } - : { - chainType: ChainType.MVM, - isConnected: false, - isConnecting: false, - isReconnecting: false, - isDisconnected: true, - status: 'disconnected', - } - const evm: Account = { ...evmWallet, chainType: ChainType.EVM } - const utxo: Account = { - ...utxoWallet, - - chainType: ChainType.UTXO, - chainId: ChainId.BTC, - address: utxoWallet.account?.address, - addresses: utxoWallet.accounts?.map((account: any) => account.address), - } - const accounts = [evm, svm, utxo, sui] + const accounts = [evmAccount, svmAccount, utxoAccount, suiAccount] const connectedAccounts = accounts.filter( (account) => account.isConnected && account.address ) @@ -167,12 +84,10 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { const selectedAccount = lastConnectedAccount ? connectedAccounts.find((account) => { const connectorIdMatch = - (lastConnectedAccount as Connector)?.id === - (account.connector as Connector)?.id + lastConnectedAccount?.id === account.connector?.id const connectorNameMatch = - !(lastConnectedAccount as Connector)?.id && - (lastConnectedAccount as WalletAdapter)?.name === - account.connector?.name + !lastConnectedAccount?.id && + lastConnectedAccount?.name === account.connector?.name return connectorIdMatch || connectorNameMatch }) || connectedAccounts[0] : connectedAccounts[0] @@ -183,20 +98,20 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { accounts: connectedAccounts, } }, [ - svmWallet?.adapter.publicKey, - evmWallet.connector?.uid, - evmWallet.connector?.id, - evmWallet.status, - evmWallet.address, - evmWallet.chainId, - utxoWallet.connector?.uid, - utxoWallet.connector?.id, - utxoWallet.status, - utxoWallet.account?.address, - utxoWallet.chainId, + svmAccount.address, + evmAccount.connector?.uid, + evmAccount.connector?.id, + evmAccount.status, + evmAccount.address, + evmAccount.chainId, + utxoAccount.connector?.uid, + utxoAccount.connector?.id, + utxoAccount.status, + utxoAccount.address, + utxoAccount.chainId, + suiAccount?.address, + suiAccount.status, args?.chainType, lastConnectedAccount, - suiWallet?.accounts?.length, - connectionStatus, ]) } diff --git a/packages/wallet-management/src/hooks/useAccountDisconnect.ts b/packages/wallet-management/src/hooks/useAccountDisconnect.ts index d090ae665..b1e3fdf36 100644 --- a/packages/wallet-management/src/hooks/useAccountDisconnect.ts +++ b/packages/wallet-management/src/hooks/useAccountDisconnect.ts @@ -1,11 +1,11 @@ import { ChainType } from '@lifi/sdk' import { + type Account, useEVMContext, useMVMContext, useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' -import type { Account } from './useAccount.js' export const useAccountDisconnect = () => { const { disconnect: evmDisconnect } = useEVMContext() diff --git a/packages/wallet-management/src/index.ts b/packages/wallet-management/src/index.ts index 730149f44..e36e83173 100644 --- a/packages/wallet-management/src/index.ts +++ b/packages/wallet-management/src/index.ts @@ -1,5 +1,6 @@ import type {} from '@mui/material/themeCssVarsAugmentation' +export type { Account } from '@lifi/wallet-provider' export * from './hooks/useAccount.js' export * from './hooks/useAccountDisconnect.js' export * from './hooks/useWalletManagementEvents.js' diff --git a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx index 15cebe1b7..868a066b0 100644 --- a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx +++ b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx @@ -1,4 +1,5 @@ import type { ExtendedChain } from '@lifi/sdk' +import { ChainType } from '@lifi/sdk' import { EVMContext } from '@lifi/wallet-provider' import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' import { isAddress as isEVMAddress } from 'viem' @@ -59,7 +60,7 @@ const CaptureEVMValues: FC< PropsWithChildren<{ isExternalContext: boolean }> > = ({ children, isExternalContext }) => { const config = useConfig() - const account = useAccount() + const currentWallet = useAccount() const { connectors } = useConnect() const handleConnect = useCallback( @@ -78,14 +79,14 @@ const CaptureEVMValues: FC< } }, [config]) + const account = { ...currentWallet, chainType: ChainType.EVM } + return ( = ({ children, isExternalContext }) => { const bigmiConfig = useConfig() const { connectors: bigmiConnectors } = useConnect() - const bigmiAccount = useAccount() + const currentWallet = useAccount() + + const account = { + ...currentWallet, + chainType: ChainType.UTXO, + chainId: ChainId.BTC, + address: currentWallet.account?.address, + addresses: currentWallet.accounts?.map((account: any) => account.address), + } const handleConnect = useCallback( async (connector: Connector) => { @@ -75,9 +84,7 @@ const CaptureUTXOValues: FC< value={{ walletClient: getBigmiConnectorClient(bigmiConfig), wallets: bigmiConnectors, - currentWallet: bigmiAccount, - // connectionStatus, - // isConnected: connected, + account, connect: handleConnect, disconnect: handleDisconnect, isValidAddress: isUTXOAddress, diff --git a/packages/wallet-provider/src/index.ts b/packages/wallet-provider/src/index.ts index be3ef4fee..c2804433c 100644 --- a/packages/wallet-provider/src/index.ts +++ b/packages/wallet-provider/src/index.ts @@ -3,3 +3,4 @@ export { MVMContext, useMVMContext } from './contexts/MVMContext.js' export { SVMContext, useSVMContext } from './contexts/SVMContext.js' export { UTXOContext, useUTXOContext } from './contexts/UTXOContext.js' export { useChainTypeFromAddress } from './hooks/useChainTypeFromAddress.js' +export type { Account } from './types.js' diff --git a/packages/wallet-provider/src/types.ts b/packages/wallet-provider/src/types.ts new file mode 100644 index 000000000..e19a6a27f --- /dev/null +++ b/packages/wallet-provider/src/types.ts @@ -0,0 +1,32 @@ +import type { ChainType } from '@lifi/sdk' + +interface AccountBase { + address?: string + addresses?: readonly string[] + chainId?: number + chainType: CT + connector?: WalletConnector + isConnected: boolean + isConnecting: boolean + isDisconnected: boolean + isReconnecting: boolean + status: 'connected' | 'reconnecting' | 'connecting' | 'disconnected' + // TODO: might be missing for some chain types + name?: string +} + +// TODO: Add types for each chain type +// export type EVMAccount = AccountBase +// export type SVMAccount = AccountBase +// export type UTXOAccount = AccountBase +// export type MVMAccount = AccountBase +// export type DefaultAccount = AccountBase + +export type Account = AccountBase + +// export type Account = +// | EVMAccount +// | SVMAccount +// | UTXOAccount +// | MVMAccount +// | DefaultAccount diff --git a/packages/widget/src/pages/SendToWallet/ConnectedWalletsPage.tsx b/packages/widget/src/pages/SendToWallet/ConnectedWalletsPage.tsx index ffdba2c79..94207efb9 100644 --- a/packages/widget/src/pages/SendToWallet/ConnectedWalletsPage.tsx +++ b/packages/widget/src/pages/SendToWallet/ConnectedWalletsPage.tsx @@ -1,5 +1,4 @@ -import type { Account } from '@lifi/wallet-management' -import { useAccount } from '@lifi/wallet-management' +import { type Account, useAccount } from '@lifi/wallet-management' import ContentCopyRounded from '@mui/icons-material/ContentCopyRounded' import MoreHoriz from '@mui/icons-material/MoreHoriz' import OpenInNewRounded from '@mui/icons-material/OpenInNewRounded' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1aa10c880..cd5bc79e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1139,6 +1139,9 @@ importers: packages/wallet-provider-mvm: dependencies: + '@lifi/sdk': + specifier: ^3.12.11 + version: 3.12.11(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) '@lifi/wallet-provider': specifier: workspace:* version: link:../wallet-provider @@ -1195,6 +1198,9 @@ importers: '@bigmi/react': specifier: ^0.5.3 version: 0.5.3(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1)) + '@lifi/sdk': + specifier: ^3.12.11 + version: 3.12.11(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.1.13)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) '@lifi/wallet-provider': specifier: workspace:* version: link:../wallet-provider From 0300472e83da048beeb1b2724ef9777d792eb2a4 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Fri, 3 Oct 2025 15:51:43 +0100 Subject: [PATCH 12/24] refactor: remove deps from wallet management --- packages/wallet-management/package.json | 8 +- .../src/components/EVMListItemButton.tsx | 16 +- .../src/components/SVMListItemButton.tsx | 6 +- .../src/components/SuiListItemButton.tsx | 3 +- .../src/components/UTXOListItemButton.tsx | 12 +- .../src/components/WalletMenuContent.tsx | 12 +- .../wallet-management/src/components/types.ts | 4 +- .../wallet-management/src/hooks/useAccount.ts | 4 +- .../src/hooks/useCombinedWallets.ts | 288 +++++------------- packages/wallet-management/src/index.ts | 3 +- .../src/types/walletConfig.ts | 1 + .../src/types/walletConnector.ts | 13 +- .../src/utils/getConnectorIcon.ts | 14 +- .../src/utils/isWalletInstalled.ts | 55 ---- .../src/providers/EVMProvider.tsx | 140 ++++++++- .../src/utils/createDefaultWagmiConfig.ts | 3 +- .../src/providers/MVMProvider.tsx | 3 +- .../src/providers/SVMProvider.tsx | 26 +- .../src/providers/UTXOProvider.tsx | 27 +- packages/wallet-provider/src/index.ts | 1 + .../src/utils/isWalletInstalled.ts | 0 pnpm-lock.yaml | 18 -- 22 files changed, 282 insertions(+), 375 deletions(-) delete mode 100644 packages/wallet-management/src/utils/isWalletInstalled.ts rename packages/{wallet-provider-evm => wallet-provider}/src/utils/isWalletInstalled.ts (100%) diff --git a/packages/wallet-management/package.json b/packages/wallet-management/package.json index d918b9c1e..cb56e833b 100644 --- a/packages/wallet-management/package.json +++ b/packages/wallet-management/package.json @@ -48,23 +48,17 @@ "lifi" ], "dependencies": { - "@bigmi/client": "^0.5.4", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.12.12", "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", "@mui/system": "^7.3.2", - "@mysten/wallet-standard": "^0.17.0", - "@solana/wallet-adapter-base": "^0.9.27", - "@solana/web3.js": "^1.98.4", "i18next": "^25.5.2", "mitt": "^3.0.1", "react-i18next": "^16.0.0", "use-sync-external-store": "^1.5.0", - "viem": "^2.37.9", - "zustand": "^5.0.8", - "@lifi/wallet-provider-evm": "workspace:^" + "zustand": "^5.0.8" }, "devDependencies": { "@types/use-sync-external-store": "^1.5.0", diff --git a/packages/wallet-management/src/components/EVMListItemButton.tsx b/packages/wallet-management/src/components/EVMListItemButton.tsx index d7e13f43a..05f872cf6 100644 --- a/packages/wallet-management/src/components/EVMListItemButton.tsx +++ b/packages/wallet-management/src/components/EVMListItemButton.tsx @@ -1,7 +1,5 @@ import { ChainType } from '@lifi/sdk' -import { useEVMContext } from '@lifi/wallet-provider' -import type { CreateConnectorFnExtended } from '@lifi/wallet-provider-evm' -import type { Connector } from 'wagmi' +import { isWalletInstalled, useEVMContext } from '@lifi/wallet-provider' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' import { getChainTypeIcon } from '../icons.js' @@ -9,12 +7,11 @@ import { WalletManagementEvent } from '../types/events.js' import { WalletTagType } from '../types/walletTagType.js' import { createWalletConnectElement } from '../utils/elements.js' import { getConnectorIcon } from '../utils/getConnectorIcon.js' -import { isWalletInstalled } from '../utils/isWalletInstalled.js' import { CardListItemButton } from './CardListItemButton.js' import type { WalletListItemButtonProps } from './types.js' interface EVMListItemButtonProps extends WalletListItemButtonProps { - connector: CreateConnectorFnExtended | Connector + connector: any } export const EVMListItemButton = ({ @@ -30,8 +27,7 @@ export const EVMListItemButton = ({ const { connect, disconnect } = useEVMContext() const { setLastConnectedAccount } = useLastConnectedAccount() - const connectorName = - (connector as CreateConnectorFnExtended).displayName || connector.name + const connectorName = connector.displayName || connector.name const connectorDisplayName: string = ecosystemSelection ? 'Ethereum' : connectorName @@ -43,9 +39,9 @@ export const EVMListItemButton = ({ } try { - const identityCheckPassed = isWalletInstalled((connector as Connector).id) + const identityCheckPassed = isWalletInstalled(connector.id) if (!identityCheckPassed) { - onNotInstalled?.(connector as Connector) + onNotInstalled?.(connector) return } if (connector.id === 'walletConnect') { @@ -75,7 +71,7 @@ export const EVMListItemButton = ({ icon={ ecosystemSelection ? getChainTypeIcon(ChainType.EVM) - : (getConnectorIcon(connector as Connector) ?? '') + : (getConnectorIcon(connector) ?? '') } onClick={handleEVMConnect} title={connectorDisplayName} diff --git a/packages/wallet-management/src/components/SVMListItemButton.tsx b/packages/wallet-management/src/components/SVMListItemButton.tsx index 347cc1248..7dc9e657b 100644 --- a/packages/wallet-management/src/components/SVMListItemButton.tsx +++ b/packages/wallet-management/src/components/SVMListItemButton.tsx @@ -1,7 +1,5 @@ import { ChainId, ChainType } from '@lifi/sdk' import { useSVMContext } from '@lifi/wallet-provider' -import type { WalletAdapter } from '@solana/wallet-adapter-base' -import type { PublicKey } from '@solana/web3.js' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' import { getChainTypeIcon } from '../icons.js' @@ -11,7 +9,7 @@ import { CardListItemButton } from './CardListItemButton.js' import type { WalletListItemButtonProps } from './types.js' interface SVMListItemButtonProps extends WalletListItemButtonProps { - walletAdapter: WalletAdapter + walletAdapter: any } export const SVMListItemButton = ({ @@ -43,7 +41,7 @@ export const SVMListItemButton = ({ await disconnect() } connect(walletAdapter.name) - walletAdapter.once('connect', (publicKey: PublicKey) => { + walletAdapter.once('connect', (publicKey: any) => { setLastConnectedAccount(walletAdapter) emitter.emit(WalletManagementEvent.WalletConnected, { address: publicKey?.toString(), diff --git a/packages/wallet-management/src/components/SuiListItemButton.tsx b/packages/wallet-management/src/components/SuiListItemButton.tsx index 7d5aedceb..7e3df9f24 100644 --- a/packages/wallet-management/src/components/SuiListItemButton.tsx +++ b/packages/wallet-management/src/components/SuiListItemButton.tsx @@ -1,6 +1,5 @@ import { ChainId, ChainType } from '@lifi/sdk' import { useMVMContext } from '@lifi/wallet-provider' -import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' import { getChainTypeIcon } from '../icons.js' @@ -10,7 +9,7 @@ import { CardListItemButton } from './CardListItemButton.js' import type { WalletListItemButtonProps } from './types.js' interface SuiListItemButtonProps extends WalletListItemButtonProps { - wallet: WalletWithRequiredFeatures + wallet: any } export const SuiListItemButton = ({ diff --git a/packages/wallet-management/src/components/UTXOListItemButton.tsx b/packages/wallet-management/src/components/UTXOListItemButton.tsx index 3911d3913..fd2ac3987 100644 --- a/packages/wallet-management/src/components/UTXOListItemButton.tsx +++ b/packages/wallet-management/src/components/UTXOListItemButton.tsx @@ -1,18 +1,16 @@ -import type { Connector } from '@bigmi/client' import { ChainId, ChainType } from '@lifi/sdk' -import { useUTXOContext } from '@lifi/wallet-provider' +import { isWalletInstalled, useUTXOContext } from '@lifi/wallet-provider' import { useLastConnectedAccount } from '../hooks/useAccount.js' import { useWalletManagementEvents } from '../hooks/useWalletManagementEvents.js' import { getChainTypeIcon } from '../icons.js' import { WalletManagementEvent } from '../types/events.js' import { WalletTagType } from '../types/walletTagType.js' import { getConnectorIcon } from '../utils/getConnectorIcon.js' -import { isWalletInstalled } from '../utils/isWalletInstalled.js' import { CardListItemButton } from './CardListItemButton.js' import type { WalletListItemButtonProps } from './types.js' interface UTXOListItemButtonProps extends WalletListItemButtonProps { - connector: Connector + connector: any } export const UTXOListItemButton = ({ @@ -40,9 +38,9 @@ export const UTXOListItemButton = ({ } try { - const identityCheckPassed = isWalletInstalled((connector as Connector).id) + const identityCheckPassed = isWalletInstalled(connector.id) if (!identityCheckPassed) { - onNotInstalled?.(connector as Connector) + onNotInstalled?.(connector) return } onConnecting?.() @@ -69,7 +67,7 @@ export const UTXOListItemButton = ({ icon={ ecosystemSelection ? getChainTypeIcon(ChainType.UTXO) - : (getConnectorIcon(connector as Connector) ?? '') + : (getConnectorIcon(connector) ?? '') } onClick={handleUTXOConnect} title={connectorDisplayName} diff --git a/packages/wallet-management/src/components/WalletMenuContent.tsx b/packages/wallet-management/src/components/WalletMenuContent.tsx index 811ff3044..7c9e2e180 100644 --- a/packages/wallet-management/src/components/WalletMenuContent.tsx +++ b/packages/wallet-management/src/components/WalletMenuContent.tsx @@ -1,4 +1,3 @@ -import type { Connector as BigmiConnector } from '@bigmi/client' import { ChainType } from '@lifi/sdk' import ArrowBack from '@mui/icons-material/ArrowBack' import Close from '@mui/icons-material/Close' @@ -12,11 +11,8 @@ import { List, Typography, } from '@mui/material' -import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' -import type { WalletAdapter } from '@solana/wallet-adapter-base' import { useMemo, useReducer, useRef } from 'react' import { useTranslation } from 'react-i18next' -import type { Connector } from 'wagmi' import { useAccount } from '../hooks/useAccount.js' import type { CombinedWallet } from '../hooks/useCombinedWallets.js' import { useCombinedWallets } from '../hooks/useCombinedWallets.js' @@ -175,7 +171,7 @@ export const WalletMenuContent: React.FC = ({ key={key} ecosystemSelection={ecosystemSelection} tagType={tagType} - connector={connector as BigmiConnector} + connector={connector} onConnected={onClose} onConnecting={() => handleConnecting(id)} onError={(error) => handleError(id, error)} @@ -187,7 +183,7 @@ export const WalletMenuContent: React.FC = ({ key={key} ecosystemSelection={ecosystemSelection} tagType={tagType} - connector={connector as Connector} + connector={connector} onConnected={onClose} onConnecting={() => handleConnecting(id)} onError={(error) => handleError(id, error)} @@ -199,7 +195,7 @@ export const WalletMenuContent: React.FC = ({ key={key} ecosystemSelection={ecosystemSelection} tagType={tagType} - walletAdapter={connector as WalletAdapter} + walletAdapter={connector} onConnected={onClose} onConnecting={() => handleConnecting(id)} onError={(error) => handleError(id, error)} @@ -211,7 +207,7 @@ export const WalletMenuContent: React.FC = ({ key={key} ecosystemSelection={ecosystemSelection} tagType={tagType} - wallet={connector as WalletWithRequiredFeatures} + wallet={connector} onConnected={onClose} onConnecting={() => handleConnecting(id)} onError={(error) => handleError(id, error)} diff --git a/packages/wallet-management/src/components/types.ts b/packages/wallet-management/src/components/types.ts index 1ebe01aea..006a12114 100644 --- a/packages/wallet-management/src/components/types.ts +++ b/packages/wallet-management/src/components/types.ts @@ -1,11 +1,9 @@ -import type { Connector as BigmiConnector } from '@bigmi/client' -import type { Connector } from 'wagmi' import type { WalletTagType } from '../types/walletTagType.js' export interface WalletListItemButtonProps { ecosystemSelection?: boolean tagType?: WalletTagType - onNotInstalled?(connector: Connector | BigmiConnector): void + onNotInstalled?(connector: any): void onConnected?(): void onConnecting?(): void onError?(error: unknown): void diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index af00daad8..7b8ab30af 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -64,7 +64,9 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { // biome-ignore lint/correctness/useExhaustiveDependencies: run only when wallet changes return useMemo(() => { - const accounts = [evmAccount, svmAccount, utxoAccount, suiAccount] + const accounts = [evmAccount, svmAccount, utxoAccount, suiAccount].filter( + Boolean + ) const connectedAccounts = accounts.filter( (account) => account.isConnected && account.address ) diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index bc78fa184..0063694fc 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -1,4 +1,3 @@ -import type { Connector as BigmiConnector } from '@bigmi/client' import { ChainType } from '@lifi/sdk' import { useEVMContext, @@ -6,29 +5,13 @@ import { useSVMContext, useUTXOContext, } from '@lifi/wallet-provider' -import { - type CreateConnectorFnExtended, - createBaseAccountConnector, - createCoinbaseConnector, - createMetaMaskConnector, - createPortoConnector, - createWalletConnectConnector, - defaultBaseAccountConfig, - defaultCoinbaseConfig, - defaultMetaMaskConfig, - defaultWalletConnectConfig, -} from '@lifi/wallet-provider-evm' import type { Theme } from '@mui/material' import { useMediaQuery } from '@mui/material' -import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' -import { WalletReadyState } from '@solana/wallet-adapter-base' -import { useEffect, useState } from 'react' -import type { Connector } from 'wagmi' +import { useMemo } from 'react' import { useWalletManagementConfig } from '../providers/WalletManagementProvider/WalletManagementContext.js' import type { WalletConnector } from '../types/walletConnector.js' import { getConnectorIcon } from '../utils/getConnectorIcon.js' import { getWalletPriority } from '../utils/getWalletPriority.js' -import { isWalletInstalled } from '../utils/isWalletInstalled.js' type CombinedWalletConnector = { connector: WalletConnector @@ -42,47 +25,40 @@ export type CombinedWallet = { connectors: CombinedWalletConnector[] } -type CombinedWallets = { - installedWallets: CombinedWallet[] - notDetectedWallets: CombinedWallet[] -} - const normalizeName = (name: string) => name.split(' ')[0].toLowerCase().trim() const combineWalletLists = ( - utxoConnectorList: BigmiConnector[], - evmConnectorList: (CreateConnectorFnExtended | Connector)[], - svmWalletList: any[], // TODO: this is Wallet type from @solana/wallet-adapter-react - suiWalletList: WalletWithRequiredFeatures[], + evmConnectorList: any[], + utxoConnectorList: any[], + svmWalletList: any[], + mvmWalletList: any[], walletEcosystemsOrder?: Record ): CombinedWallet[] => { const walletMap = new Map() - utxoConnectorList.forEach((utxo) => { - const utxoName = utxo.name - const normalizedName = normalizeName(utxoName) + evmConnectorList.forEach((evm) => { + const evmName = evm?.displayName || evm?.name + const normalizedName = normalizeName(evmName) const existing = walletMap.get(normalizedName) || { - id: utxo.id, - name: utxoName, - icon: getConnectorIcon(utxo as BigmiConnector), + id: evm.id, + name: evmName, + icon: getConnectorIcon(evm), connectors: [] as CombinedWalletConnector[], } - existing.connectors.push({ connector: utxo, chainType: ChainType.UTXO }) + existing.connectors.push({ connector: evm, chainType: ChainType.EVM }) walletMap.set(normalizedName, existing) }) - evmConnectorList.forEach((evm) => { - const evmName = - (evm as CreateConnectorFnExtended)?.displayName || - (evm as Connector)?.name - const normalizedName = normalizeName(evmName) + utxoConnectorList.forEach((utxo) => { + const utxoName = utxo.name + const normalizedName = normalizeName(utxoName) const existing = walletMap.get(normalizedName) || { - id: evm.id, - name: evmName, - icon: getConnectorIcon(evm as Connector), + id: utxo.id, + name: utxoName, + icon: getConnectorIcon(utxo), connectors: [] as CombinedWalletConnector[], } - existing.connectors.push({ connector: evm, chainType: ChainType.EVM }) + existing.connectors.push({ connector: utxo, chainType: ChainType.UTXO }) walletMap.set(normalizedName, existing) }) @@ -101,7 +77,7 @@ const combineWalletLists = ( walletMap.set(normalizedName, existing) }) - suiWalletList.forEach((sui) => { + mvmWalletList.forEach((sui) => { const normalizedName = normalizeName(sui.name) const existing = walletMap.get(normalizedName) || { id: sui.name, @@ -135,190 +111,66 @@ const combineWalletLists = ( export const useCombinedWallets = () => { const walletConfig = useWalletManagementConfig() - const { wallets: wagmiConnectors } = useEVMContext() - const { wallets: bigmiConnectors } = useUTXOContext() - const { wallets: solanaWallets } = useSVMContext() - const { wallets: suiWallets } = useMVMContext() - const [combinedWallets, setCombinedWallets] = useState( - () => { - return { - installedWallets: [], - notDetectedWallets: [], - } - } - ) + const { + installedWallets: installedEVMWallets, + nonDetectedWallets: nonDetectedEVMWallets, + } = useEVMContext() + const { + installedWallets: installedUTXOWallets, + nonDetectedWallets: nonDetectedUTXOWallets, + } = useUTXOContext() + const { + installedWallets: installedSVMWallets, + nonDetectedWallets: nonDetectedSVMWallets, + } = useSVMContext() + const { + installedWallets: installedMVMWallets, + nonDetectedWallets: nonDetectedMVMWallets, + } = useMVMContext() const isDesktopView = useMediaQuery((theme: Theme) => theme.breakpoints.up('sm') ) - useEffect(() => { - ;(async () => { - let evmConnectors: any[] = Array.from( - wagmiConnectors - // Remove duplicate connectors - ).filter( - (connector: any, index: number, self: any) => - index === self.findIndex((c: any) => c.id === connector.id) - ) - - // Check if Safe connector exists and can get a provider - const safeConnector = evmConnectors.find( - (connector) => connector.id === 'safe' - ) as Connector | undefined - let shouldFilterOutSafeConnector = false - - if (safeConnector) { - try { - const provider = await safeConnector.getProvider() - // If no provider is available, we should filter out the Safe connector - if (!provider) { - shouldFilterOutSafeConnector = true - } - } catch { - // If getting provider fails, filter out the Safe connector - shouldFilterOutSafeConnector = true - } - } - - if (shouldFilterOutSafeConnector) { - evmConnectors = evmConnectors.filter( - (connector) => connector.id !== 'safe' - ) - } - - // Ensure standard connectors are included - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('walletconnect') - ) - ) { - evmConnectors.unshift( - createWalletConnectConnector( - walletConfig?.walletConnect ?? defaultWalletConnectConfig - ) - ) - } - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('coinbase') - ) - ) { - evmConnectors.unshift( - createCoinbaseConnector( - walletConfig?.coinbase ?? defaultCoinbaseConfig - ) - ) - } - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('metamask') - ) - ) { - evmConnectors.unshift( - createMetaMaskConnector( - walletConfig?.metaMask ?? defaultMetaMaskConfig - ) - ) - } - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('baseaccount') - ) - ) { - evmConnectors.unshift( - createBaseAccountConnector( - walletConfig?.baseAccount ?? defaultBaseAccountConfig - ) + const combinedWallets = useMemo(() => { + const includeEcosystem = (chainType: ChainType) => + !walletConfig.enabledChainTypes || + walletConfig.enabledChainTypes.includes(chainType) + + const installedCombinedWallets = combineWalletLists( + includeEcosystem(ChainType.EVM) ? installedEVMWallets : [], + includeEcosystem(ChainType.UTXO) ? installedUTXOWallets : [], + includeEcosystem(ChainType.SVM) ? installedSVMWallets : [], + includeEcosystem(ChainType.MVM) ? installedMVMWallets : [], + walletConfig.walletEcosystemsOrder + ) + + const notDetectedCombinedWallets = isDesktopView + ? combineWalletLists( + nonDetectedEVMWallets, + nonDetectedUTXOWallets, + nonDetectedSVMWallets, + nonDetectedMVMWallets ) - } - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('porto') - ) - ) { - evmConnectors.unshift(createPortoConnector(walletConfig?.porto)) - } - - const includeEcosystem = (chainType: ChainType) => - !walletConfig.enabledChainTypes || - walletConfig.enabledChainTypes.includes(chainType) - - const installedUTXOConnectors = includeEcosystem(ChainType.UTXO) - ? bigmiConnectors.filter((connector: any) => { - const isInstalled = isWalletInstalled(connector.id) - return isInstalled - }) - : [] - - const installedEVMConnectors = includeEcosystem(ChainType.EVM) - ? evmConnectors.filter((connector) => { - const isInstalled = isWalletInstalled(connector.id) - return isInstalled - }) - : [] - - const installedSVMWallets = includeEcosystem(ChainType.SVM) - ? solanaWallets.filter((wallet: any) => { - const isInstalled = - wallet.adapter.readyState === WalletReadyState.Installed || - wallet.adapter.readyState === WalletReadyState.Loadable - return isInstalled - }) - : [] - - const installedSuiWallets = includeEcosystem(ChainType.MVM) - ? suiWallets - : [] + : [] - const installedCombinedWallets = combineWalletLists( - installedUTXOConnectors, - installedEVMConnectors, - installedSVMWallets, - installedSuiWallets, - walletConfig.walletEcosystemsOrder - ) + installedCombinedWallets.sort(walletComparator) + notDetectedCombinedWallets.sort(walletComparator) - const notDetectedUTXOConnectors = bigmiConnectors.filter( - (connector: any) => { - const isInstalled = isWalletInstalled(connector.id) - return !isInstalled && isDesktopView - } - ) - - const notDetectedEVMConnectors = evmConnectors.filter((connector) => { - const isInstalled = isWalletInstalled(connector.id) - return !isInstalled && isDesktopView - }) - - const notDetectedSVMWallets = solanaWallets.filter((wallet: any) => { - const isInstalled = - wallet.adapter.readyState === WalletReadyState.Installed || - wallet.adapter.readyState === WalletReadyState.Loadable - return !isInstalled && isDesktopView - }) - - const notDetectedCombinedWallets = combineWalletLists( - notDetectedUTXOConnectors, - notDetectedEVMConnectors, - notDetectedSVMWallets, - [] - ) - - installedCombinedWallets.sort(walletComparator) - notDetectedCombinedWallets.sort(walletComparator) - - setCombinedWallets({ - installedWallets: installedCombinedWallets, - notDetectedWallets: notDetectedCombinedWallets, - }) - })() + return { + installedWallets: installedCombinedWallets, + notDetectedWallets: notDetectedCombinedWallets, + } }, [ - bigmiConnectors, + installedEVMWallets, + installedUTXOWallets, + installedSVMWallets, + installedMVMWallets, + nonDetectedUTXOWallets, + nonDetectedEVMWallets, + nonDetectedSVMWallets, + nonDetectedMVMWallets, isDesktopView, - solanaWallets, - suiWallets, - wagmiConnectors, walletConfig, ]) diff --git a/packages/wallet-management/src/index.ts b/packages/wallet-management/src/index.ts index e36e83173..5d437549a 100644 --- a/packages/wallet-management/src/index.ts +++ b/packages/wallet-management/src/index.ts @@ -1,6 +1,6 @@ import type {} from '@mui/material/themeCssVarsAugmentation' -export type { Account } from '@lifi/wallet-provider' +export type { Account } from '@lifi/wallet-provider' // TODO: export * from './hooks/useAccount.js' export * from './hooks/useAccountDisconnect.js' export * from './hooks/useWalletManagementEvents.js' @@ -14,4 +14,3 @@ export * from './types/walletConfig.js' export * from './types/walletConnector.js' export * from './utils/getConnectorIcon.js' export * from './utils/getWalletPriority.js' -export * from './utils/isWalletInstalled.js' diff --git a/packages/wallet-management/src/types/walletConfig.ts b/packages/wallet-management/src/types/walletConfig.ts index 7e3359070..093cb07cc 100644 --- a/packages/wallet-management/src/types/walletConfig.ts +++ b/packages/wallet-management/src/types/walletConfig.ts @@ -6,6 +6,7 @@ import type { WalletConnectParameters, } from 'wagmi/connectors' +// TODO: wagmi dependency left export interface WalletConfig { walletConnect?: WalletConnectParameters coinbase?: CoinbaseWalletParameters diff --git a/packages/wallet-management/src/types/walletConnector.ts b/packages/wallet-management/src/types/walletConnector.ts index a1c1dad4b..f57892491 100644 --- a/packages/wallet-management/src/types/walletConnector.ts +++ b/packages/wallet-management/src/types/walletConnector.ts @@ -1,12 +1 @@ -import type { Connector as BigmiConnector } from '@bigmi/client' -import type { CreateConnectorFnExtended } from '@lifi/wallet-provider-evm' -import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' -import type { WalletAdapter } from '@solana/wallet-adapter-base' -import type { Connector } from 'wagmi' - -export type WalletConnector = - | Connector - | WalletAdapter - | BigmiConnector - | CreateConnectorFnExtended - | WalletWithRequiredFeatures +export type WalletConnector = any // TODO: diff --git a/packages/wallet-management/src/utils/getConnectorIcon.ts b/packages/wallet-management/src/utils/getConnectorIcon.ts index 3a6bf4860..48e13b01b 100644 --- a/packages/wallet-management/src/utils/getConnectorIcon.ts +++ b/packages/wallet-management/src/utils/getConnectorIcon.ts @@ -1,17 +1,7 @@ -import type { Connector as BigmiConnector } from '@bigmi/client' -import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' -import type { WalletAdapter } from '@solana/wallet-adapter-base' -import type { Connector } from 'wagmi' import { getWalletIcon } from '../icons.js' -export const getConnectorIcon = ( - connector?: - | Connector - | WalletAdapter - | BigmiConnector - | WalletWithRequiredFeatures -) => { - const connectorId = (connector as Connector)?.id +export const getConnectorIcon = (connector?: any) => { + const connectorId = connector?.id return connectorId ? getWalletIcon(connectorId) || connector?.icon diff --git a/packages/wallet-management/src/utils/isWalletInstalled.ts b/packages/wallet-management/src/utils/isWalletInstalled.ts deleted file mode 100644 index aa52b3959..000000000 --- a/packages/wallet-management/src/utils/isWalletInstalled.ts +++ /dev/null @@ -1,55 +0,0 @@ -// TODO: split/move to wallet provider? -export const isWalletInstalled = (id: string): boolean => { - const anyWindow = typeof window !== 'undefined' ? (window as any) : undefined - switch (id) { - case 'metaMask': - return ( - anyWindow?.ethereum?.isMetaMask || - anyWindow?.ethereum?.providers?.some( - (provider: any) => provider.isMetaMask - ) - ) - case 'coinbase': - return ( - // Coinbase Browser doesn't inject itself automatically - // We should not consider Coinbase Browser as installed wallet so we can fallback to Coinbase SDK - (anyWindow?.ethereum?.isCoinbaseWallet && - !anyWindow?.ethereum?.isCoinbaseBrowser) || - anyWindow?.coinbaseWalletExtension?.isCoinbaseWallet || - anyWindow?.ethereum?.providers?.some( - (provider: any) => provider.isCoinbaseWallet - ) - ) - case 'app.phantom.bitcoin': - return anyWindow.phantom?.bitcoin?.isPhantom - case 'com.okex.wallet.bitcoin': - return anyWindow.okxwallet?.bitcoin?.isOkxWallet - case 'XverseProviders.BitcoinProvider': - return anyWindow.XverseProviders?.BitcoinProvider - case 'unisat': - return ( - anyWindow.unisat && - !anyWindow.unisat?.isBinance && - !anyWindow.unisat?.isBitKeep - ) - case 'io.xdefi': - return anyWindow.xfi - case 'so.onekey.app.wallet.bitcoin': - return anyWindow.$onekey?.btc - case 'LeatherProvider': - return anyWindow.LeatherProvider - case 'bitget': - return anyWindow.bitkeep?.unisat || anyWindow.unisat?.isBitKeep - case 'OylProvider': - return anyWindow.oyl - case 'binance': - return anyWindow.binancew3w?.bitcoin || anyWindow.unisat?.isBinance - case 'app.magiceden.bitcoin': - return anyWindow?.magicEden?.bitcoin?.isMagicEden - default: - /** - * Return true if the wallet is not in the list of explicitly supported or self-injected wallet - */ - return true - } -} diff --git a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx index 868a066b0..bd5833c4c 100644 --- a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx +++ b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx @@ -1,7 +1,15 @@ import type { ExtendedChain } from '@lifi/sdk' import { ChainType } from '@lifi/sdk' -import { EVMContext } from '@lifi/wallet-provider' -import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' +import { EVMContext, isWalletInstalled } from '@lifi/wallet-provider' +import { + type FC, + type PropsWithChildren, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from 'react' import { isAddress as isEVMAddress } from 'viem' import { type Connector, @@ -17,6 +25,15 @@ import { getConnectorClient, switchChain, } from 'wagmi/actions' +import { defaultBaseAccountConfig } from '../config/baseAccount.js' +import { defaultCoinbaseConfig } from '../config/coinbase.js' +import { defaultMetaMaskConfig } from '../config/metaMask.js' +import { defaultWalletConnectConfig } from '../config/walletConnect.js' +import { createBaseAccountConnector } from '../connectors/baseAccount.js' +import { createCoinbaseConnector } from '../connectors/coinbase.js' +import { createMetaMaskConnector } from '../connectors/metaMask.js' +import { createPortoConnector } from '../connectors/porto.js' +import { createWalletConnectConnector } from '../connectors/walletConnect.js' import { EVMBaseProvider } from './EVMBaseProvider.js' interface EVMProviderProps { @@ -49,7 +66,10 @@ export const EVMProvider: FC> = ({ return ( - + {children} @@ -57,11 +77,104 @@ export const EVMProvider: FC> = ({ } const CaptureEVMValues: FC< - PropsWithChildren<{ isExternalContext: boolean }> -> = ({ children, isExternalContext }) => { + PropsWithChildren<{ isExternalContext: boolean; walletConfig?: any }> +> = ({ children, isExternalContext, walletConfig }) => { const config = useConfig() const currentWallet = useAccount() - const { connectors } = useConnect() + const { connectors: wagmiConnectors } = useConnect() + const [connectors, setConnectors] = useState([]) + + useEffect(() => { + ;(async () => { + let evmConnectors: any[] = Array.from( + wagmiConnectors + // Remove duplicate connectors + ).filter( + (connector: any, index: number, self: any) => + index === self.findIndex((c: any) => c.id === connector.id) + ) + + // Check if Safe connector exists and can get a provider + const safeConnector = evmConnectors.find( + (connector) => connector.id === 'safe' + ) as Connector | undefined + let shouldFilterOutSafeConnector = false + + if (safeConnector) { + try { + const provider = await safeConnector.getProvider() + // If no provider is available, we should filter out the Safe connector + if (!provider) { + shouldFilterOutSafeConnector = true + } + } catch { + // If getting provider fails, filter out the Safe connector + shouldFilterOutSafeConnector = true + } + } + + if (shouldFilterOutSafeConnector) { + evmConnectors = evmConnectors.filter( + (connector) => connector.id !== 'safe' + ) + } + + // Ensure standard connectors are included + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('walletconnect') + ) + ) { + evmConnectors.unshift( + createWalletConnectConnector( + walletConfig?.walletConnect ?? defaultWalletConnectConfig + ) + ) + } + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('coinbase') + ) + ) { + evmConnectors.unshift( + createCoinbaseConnector( + walletConfig?.coinbase ?? defaultCoinbaseConfig + ) + ) + } + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('metamask') + ) + ) { + evmConnectors.unshift( + createMetaMaskConnector( + walletConfig?.metaMask ?? defaultMetaMaskConfig + ) + ) + } + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('baseaccount') + ) + ) { + evmConnectors.unshift( + createBaseAccountConnector( + walletConfig?.baseAccount ?? defaultBaseAccountConfig + ) + ) + } + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('porto') + ) + ) { + evmConnectors.unshift(createPortoConnector(walletConfig?.porto)) + } + + setConnectors(evmConnectors) + })() + }, [wagmiConnectors, walletConfig]) const handleConnect = useCallback( async (connector: Connector) => { @@ -81,12 +194,25 @@ const CaptureEVMValues: FC< const account = { ...currentWallet, chainType: ChainType.EVM } + const installedWallets = useMemo( + () => + connectors.filter((connector: any) => isWalletInstalled(connector.id)), + [connectors] + ) + + const nonDetectedWallets = useMemo( + () => + connectors.filter((connector: any) => !isWalletInstalled(connector.id)), + [connectors] + ) + return ( + wallets.filter( + (wallet: any) => + wallet.adapter.readyState === WalletReadyState.Installed || + wallet.adapter.readyState === WalletReadyState.Loadable + ), + [wallets] + ) + + const nonDetectedWallets = useMemo( + () => + wallets.filter( + (wallet: any) => + wallet.adapter.readyState !== WalletReadyState.Installed && + wallet.adapter.readyState !== WalletReadyState.Loadable + ), + [wallets] + ) + return ( > = ({ children, isExternalContext }) => { const bigmiConfig = useConfig() - const { connectors: bigmiConnectors } = useConnect() + const { connectors } = useConnect() const currentWallet = useAccount() const account = { @@ -79,12 +85,25 @@ const CaptureUTXOValues: FC< } }, [bigmiConfig]) + const installedWallets = useMemo( + () => + connectors.filter((connector: any) => isWalletInstalled(connector.id)), + [connectors] + ) + + const nonDetectedWallets = useMemo( + () => + connectors.filter((connector: any) => !isWalletInstalled(connector.id)), + [connectors] + ) + return ( =5.87.0' version: 5.90.2(react@19.1.1) @@ -1073,9 +1058,6 @@ importers: use-sync-external-store: specifier: ^1.5.0 version: 1.5.0(react@19.1.1) - viem: - specifier: ^2.37.9 - version: 2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) wagmi: specifier: '>=2.16.0' version: 2.17.5(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) From 1fcaa8d7bec3b978638d562ab2e8ca832cb595dc Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Fri, 3 Oct 2025 17:39:11 +0100 Subject: [PATCH 13/24] refactor: more updates for wallet management --- packages/wallet-management/package.json | 1 - .../src/components/EVMListItemButton.tsx | 6 +- ...stItemButton.tsx => MVMListItemButton.tsx} | 25 ++++--- .../src/components/SVMListItemButton.tsx | 23 +++--- .../src/components/UTXOListItemButton.tsx | 6 +- .../src/components/WalletMenuContent.tsx | 73 +++++++------------ .../wallet-management/src/components/types.ts | 3 +- .../wallet-management/src/hooks/useAccount.ts | 5 +- .../src/hooks/useCombinedWallets.ts | 1 + packages/wallet-management/src/index.ts | 1 - .../WalletManagementProvider/types.ts | 3 +- .../src/types/walletConfig.ts | 16 ---- .../src/types/walletConnector.ts | 2 +- .../src/utils/getConnectorIcon.ts | 3 +- .../WalletProvider/WalletProvider.tsx | 8 +- packages/widget/src/types/widget.ts | 2 +- pnpm-lock.yaml | 28 +++++-- 17 files changed, 85 insertions(+), 121 deletions(-) rename packages/wallet-management/src/components/{SuiListItemButton.tsx => MVMListItemButton.tsx} (80%) delete mode 100644 packages/wallet-management/src/types/walletConfig.ts diff --git a/packages/wallet-management/package.json b/packages/wallet-management/package.json index cb56e833b..000b9915c 100644 --- a/packages/wallet-management/package.json +++ b/packages/wallet-management/package.json @@ -72,7 +72,6 @@ "@tanstack/react-query": ">=5.87.0", "react": ">=18", "react-dom": ">=18", - "wagmi": ">=2.16.0", "@lifi/wallet-provider": "workspace:*" }, "files": [ diff --git a/packages/wallet-management/src/components/EVMListItemButton.tsx b/packages/wallet-management/src/components/EVMListItemButton.tsx index 05f872cf6..1c8233d11 100644 --- a/packages/wallet-management/src/components/EVMListItemButton.tsx +++ b/packages/wallet-management/src/components/EVMListItemButton.tsx @@ -10,10 +10,6 @@ import { getConnectorIcon } from '../utils/getConnectorIcon.js' import { CardListItemButton } from './CardListItemButton.js' import type { WalletListItemButtonProps } from './types.js' -interface EVMListItemButtonProps extends WalletListItemButtonProps { - connector: any -} - export const EVMListItemButton = ({ ecosystemSelection, connector, @@ -22,7 +18,7 @@ export const EVMListItemButton = ({ onConnected, onConnecting, onError, -}: EVMListItemButtonProps) => { +}: WalletListItemButtonProps) => { const emitter = useWalletManagementEvents() const { connect, disconnect } = useEVMContext() const { setLastConnectedAccount } = useLastConnectedAccount() diff --git a/packages/wallet-management/src/components/SuiListItemButton.tsx b/packages/wallet-management/src/components/MVMListItemButton.tsx similarity index 80% rename from packages/wallet-management/src/components/SuiListItemButton.tsx rename to packages/wallet-management/src/components/MVMListItemButton.tsx index 7e3df9f24..e47d44608 100644 --- a/packages/wallet-management/src/components/SuiListItemButton.tsx +++ b/packages/wallet-management/src/components/MVMListItemButton.tsx @@ -8,24 +8,22 @@ import { WalletTagType } from '../types/walletTagType.js' import { CardListItemButton } from './CardListItemButton.js' import type { WalletListItemButtonProps } from './types.js' -interface SuiListItemButtonProps extends WalletListItemButtonProps { - wallet: any -} - -export const SuiListItemButton = ({ +export const MVMListItemButton = ({ ecosystemSelection, - wallet, + connector, tagType, onConnected, onConnecting, onError, -}: SuiListItemButtonProps) => { +}: WalletListItemButtonProps) => { const emitter = useWalletManagementEvents() const { connect } = useMVMContext() const { setLastConnectedAccount } = useLastConnectedAccount() - const connectorName = wallet.name - const connectorDisplayName: string = ecosystemSelection ? 'Sui' : wallet.name + const connectorName = connector.name + const connectorDisplayName: string = ecosystemSelection + ? 'Sui' + : connector.name const connectWallet = async () => { if (tagType === WalletTagType.Connected) { @@ -36,10 +34,11 @@ export const SuiListItemButton = ({ try { onConnecting?.() await connect( - { wallet }, + { wallet: connector }, { onSuccess: (standardConnectOutput: any) => { - setLastConnectedAccount(wallet) + // TODO: Add type + setLastConnectedAccount(connector) emitter.emit(WalletManagementEvent.WalletConnected, { address: standardConnectOutput.accounts[0].address, chainId: ChainId.SOL, @@ -59,7 +58,9 @@ export const SuiListItemButton = ({ return ( { +}: WalletListItemButtonProps) => { const emitter = useWalletManagementEvents() const { connect, disconnect, isConnected } = useSVMContext() const { setLastConnectedAccount } = useLastConnectedAccount() - const connectorName = walletAdapter.name + const connectorName = connector.name const connectorDisplayName: string = ecosystemSelection ? 'Solana' - : walletAdapter.name + : connector.name const connectWallet = async () => { if (tagType === WalletTagType.Connected) { @@ -40,9 +36,10 @@ export const SVMListItemButton = ({ if (isConnected) { await disconnect() } - connect(walletAdapter.name) - walletAdapter.once('connect', (publicKey: any) => { - setLastConnectedAccount(walletAdapter) + connect(connector.name) + connector.once('connect', (publicKey: any) => { + // TODO: Add type + setLastConnectedAccount(connector) emitter.emit(WalletManagementEvent.WalletConnected, { address: publicKey?.toString(), chainId: ChainId.SOL, @@ -61,9 +58,7 @@ export const SVMListItemButton = ({ { +}: WalletListItemButtonProps) => { const emitter = useWalletManagementEvents() const { connect, disconnect } = useUTXOContext() const { setLastConnectedAccount } = useLastConnectedAccount() diff --git a/packages/wallet-management/src/components/WalletMenuContent.tsx b/packages/wallet-management/src/components/WalletMenuContent.tsx index 7c9e2e180..c990b93d2 100644 --- a/packages/wallet-management/src/components/WalletMenuContent.tsx +++ b/packages/wallet-management/src/components/WalletMenuContent.tsx @@ -25,8 +25,9 @@ import { getSortedByTags } from '../utils/getSortedByTags.js' import { getConnectorTagType, getWalletTagType } from '../utils/walletTags.js' import { CardListItemButton } from './CardListItemButton.js' import { EVMListItemButton } from './EVMListItemButton.js' -import { SuiListItemButton } from './SuiListItemButton.js' +import { MVMListItemButton } from './MVMListItemButton.js' import { SVMListItemButton } from './SVMListItemButton.js' +import type { WalletListItemButtonProps } from './types.js' import { UTXOListItemButton } from './UTXOListItemButton.js' import { WalletInfoDisplay } from './WalletInfoDisplay.js' import { WalletMenuContentEmpty } from './WalletMenuContentEmpty.js' @@ -164,58 +165,34 @@ export const WalletMenuContent: React.FC = ({ ) => { const key = `${name}${ecosystemSelection ? `-${chainType}` : ''}` + let ListItemButtonComponent: React.FC | null = + null switch (chainType) { - case ChainType.UTXO: - return ( - handleConnecting(id)} - onError={(error) => handleError(id, error)} - /> - ) case ChainType.EVM: - return ( - handleConnecting(id)} - onError={(error) => handleError(id, error)} - /> - ) + ListItemButtonComponent = EVMListItemButton + break + case ChainType.UTXO: + ListItemButtonComponent = UTXOListItemButton + break case ChainType.SVM: - return ( - handleConnecting(id)} - onError={(error) => handleError(id, error)} - /> - ) + ListItemButtonComponent = SVMListItemButton + break case ChainType.MVM: - return ( - handleConnecting(id)} - onError={(error) => handleError(id, error)} - /> - ) - default: - return null + ListItemButtonComponent = MVMListItemButton + break } + + return ListItemButtonComponent ? ( + handleConnecting(id)} + onError={(error) => handleError(id, error)} + /> + ) : null } const selectedWalletConnectors = useMemo(() => { diff --git a/packages/wallet-management/src/components/types.ts b/packages/wallet-management/src/components/types.ts index 006a12114..348e6da56 100644 --- a/packages/wallet-management/src/components/types.ts +++ b/packages/wallet-management/src/components/types.ts @@ -3,7 +3,8 @@ import type { WalletTagType } from '../types/walletTagType.js' export interface WalletListItemButtonProps { ecosystemSelection?: boolean tagType?: WalletTagType - onNotInstalled?(connector: any): void + connector: any // TODO: Add type + onNotInstalled?(connector: any): void // TODO: Add type onConnected?(): void onConnecting?(): void onError?(error: unknown): void diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index 7b8ab30af..d9e273f87 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -38,6 +38,7 @@ const defaultAccount: Account = { // | WalletWithRequiredFeatures // | null +// TODO: Add types interface LastConnectedAccountStore { lastConnectedAccount: any setLastConnectedAccount: (account: any) => void @@ -64,9 +65,7 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { // biome-ignore lint/correctness/useExhaustiveDependencies: run only when wallet changes return useMemo(() => { - const accounts = [evmAccount, svmAccount, utxoAccount, suiAccount].filter( - Boolean - ) + const accounts = [evmAccount, svmAccount, utxoAccount, suiAccount] const connectedAccounts = accounts.filter( (account) => account.isConnected && account.address ) diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 0063694fc..18c5c6355 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -27,6 +27,7 @@ export type CombinedWallet = { const normalizeName = (name: string) => name.split(' ')[0].toLowerCase().trim() +// TODO: Add types const combineWalletLists = ( evmConnectorList: any[], utxoConnectorList: any[], diff --git a/packages/wallet-management/src/index.ts b/packages/wallet-management/src/index.ts index 5d437549a..b7e2772ba 100644 --- a/packages/wallet-management/src/index.ts +++ b/packages/wallet-management/src/index.ts @@ -10,7 +10,6 @@ export * from './providers/WalletManagementProvider/WalletManagementProvider.js' export type { WalletMenuOpenArgs } from './providers/WalletMenuProvider/types.js' export * from './providers/WalletMenuProvider/WalletMenuContext.js' export * from './types/events.js' -export * from './types/walletConfig.js' export * from './types/walletConnector.js' export * from './utils/getConnectorIcon.js' export * from './utils/getWalletPriority.js' diff --git a/packages/wallet-management/src/providers/WalletManagementProvider/types.ts b/packages/wallet-management/src/providers/WalletManagementProvider/types.ts index f6c5e0e5d..4bd10f2cd 100644 --- a/packages/wallet-management/src/providers/WalletManagementProvider/types.ts +++ b/packages/wallet-management/src/providers/WalletManagementProvider/types.ts @@ -1,8 +1,7 @@ import type { ChainType } from '@lifi/sdk' -import type { WalletConfig } from '../../types/walletConfig.js' import type { LanguageKey } from '../I18nProvider/types.js' -export interface WalletManagementConfig extends WalletConfig { +export interface WalletManagementConfig { locale?: LanguageKey enabledChainTypes?: ChainType[] walletEcosystemsOrder?: Record diff --git a/packages/wallet-management/src/types/walletConfig.ts b/packages/wallet-management/src/types/walletConfig.ts deleted file mode 100644 index 093cb07cc..000000000 --- a/packages/wallet-management/src/types/walletConfig.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { - BaseAccountParameters, - CoinbaseWalletParameters, - MetaMaskParameters, - PortoParameters, - WalletConnectParameters, -} from 'wagmi/connectors' - -// TODO: wagmi dependency left -export interface WalletConfig { - walletConnect?: WalletConnectParameters - coinbase?: CoinbaseWalletParameters - metaMask?: MetaMaskParameters - baseAccount?: BaseAccountParameters - porto?: Partial -} diff --git a/packages/wallet-management/src/types/walletConnector.ts b/packages/wallet-management/src/types/walletConnector.ts index f57892491..136d3a3bd 100644 --- a/packages/wallet-management/src/types/walletConnector.ts +++ b/packages/wallet-management/src/types/walletConnector.ts @@ -1 +1 @@ -export type WalletConnector = any // TODO: +export type WalletConnector = any // TODO: Add type diff --git a/packages/wallet-management/src/utils/getConnectorIcon.ts b/packages/wallet-management/src/utils/getConnectorIcon.ts index 48e13b01b..6fa6e61dc 100644 --- a/packages/wallet-management/src/utils/getConnectorIcon.ts +++ b/packages/wallet-management/src/utils/getConnectorIcon.ts @@ -1,6 +1,7 @@ import { getWalletIcon } from '../icons.js' +import type { WalletConnector } from '../types/walletConnector.js' -export const getConnectorIcon = (connector?: any) => { +export const getConnectorIcon = (connector?: WalletConnector) => { const connectorId = connector?.id return connectorId diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index 68ddf6974..98ebd9736 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -39,9 +39,13 @@ const WalletMenuProvider: FC = ({ children }) => { return { locale: i18n.resolvedLanguage as never, enabledChainTypes: internalChainTypes, - ...walletConfig, + walletEcosystemsOrder: walletConfig?.walletEcosystemsOrder, } - }, [i18n.resolvedLanguage, internalChainTypes, walletConfig]) + }, [ + i18n.resolvedLanguage, + internalChainTypes, + walletConfig?.walletEcosystemsOrder, + ]) return ( diff --git a/packages/widget/src/types/widget.ts b/packages/widget/src/types/widget.ts index 361178aff..dbcebf992 100644 --- a/packages/widget/src/types/widget.ts +++ b/packages/widget/src/types/widget.ts @@ -136,8 +136,8 @@ export type DefaultUI = { navigationHeaderTitleNoWrap?: boolean } -// TODO: move EVM-related config somewhere else? export interface WidgetWalletConfig { + walletEcosystemsOrder?: Record onConnect?(args?: WalletMenuOpenArgs): void walletConnect?: WalletConnectParameters coinbase?: CoinbaseWalletParameters diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05de8f77a..5a2d13e5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1058,9 +1058,6 @@ importers: use-sync-external-store: specifier: ^1.5.0 version: 1.5.0(react@19.1.1) - wagmi: - specifier: '>=2.16.0' - version: 2.17.5(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) zustand: specifier: ^5.0.8 version: 5.0.8(@types/react@19.1.16)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) @@ -25237,7 +25234,7 @@ snapshots: '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) '@walletconnect/ethereum-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' porto: 0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)) @@ -25566,7 +25563,7 @@ snapshots: '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) '@walletconnect/ethereum-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' porto: 0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)) @@ -25688,7 +25685,7 @@ snapshots: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.3) viem: 2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.0(@types/react@19.1.16)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) + zustand: 5.0.0(@types/react@19.1.16)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) optionalDependencies: '@tanstack/query-core': 5.90.2 typescript: 5.9.3 @@ -25713,6 +25710,21 @@ snapshots: - react - use-sync-external-store + '@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.9.3) + viem: 2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) + zustand: 5.0.0(@types/react@19.1.16)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) + optionalDependencies: + '@tanstack/query-core': 5.90.2 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + '@wallet-standard/app@1.0.1': dependencies: '@wallet-standard/base': 1.1.0 @@ -34886,7 +34898,7 @@ snapshots: porto@0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)): dependencies: - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) hono: 4.9.9 idb-keyval: 6.2.2 mipd: 0.0.7(typescript@5.9.3) @@ -34906,7 +34918,7 @@ snapshots: porto@0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)): dependencies: - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) hono: 4.9.9 idb-keyval: 6.2.2 mipd: 0.0.7(typescript@5.9.3) From eade8ac4d2b5793d3d681542ad99b2a9411f2d40 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Mon, 6 Oct 2025 00:12:53 +0100 Subject: [PATCH 14/24] refactor: types --- knip.json | 2 +- .../src/components/EVMListItemButton.tsx | 19 +- .../src/components/MVMListItemButton.tsx | 30 ++-- .../src/components/SVMListItemButton.tsx | 10 +- .../src/components/UTXOListItemButton.tsx | 19 +- .../src/components/WalletMenuContent.tsx | 4 +- .../wallet-management/src/components/types.ts | 5 +- .../wallet-management/src/hooks/useAccount.ts | 42 ++--- .../src/hooks/useCombinedWallets.ts | 32 ++-- packages/wallet-management/src/index.ts | 2 - .../src/types/walletConnector.ts | 1 - .../src/utils/getConnectorIcon.ts | 2 +- .../src/utils/getConnectorId.ts | 2 +- packages/wallet-provider-evm/src/index.ts | 10 -- .../src/providers/EVMProvider.tsx | 39 ++-- .../src/utils/createDefaultWagmiConfig.ts | 1 + packages/wallet-provider-mvm/package.json | 5 +- .../src/providers/MVMBaseProvider.tsx | 17 +- .../src/providers/MVMProvider.tsx | 51 ++++-- packages/wallet-provider-svm/package.json | 2 +- .../src/providers/SVMProvider.tsx | 88 ++++++--- packages/wallet-provider-utxo/package.json | 6 +- .../src/providers/UTXOBaseProvider.tsx | 2 +- .../src/providers/UTXOProvider.tsx | 49 +++-- .../createDefaultBigmiConfig.ts | 0 .../src/contexts/EVMContext.ts | 8 +- .../src/contexts/MVMContext.ts | 8 +- .../src/contexts/SVMContext.ts | 8 +- .../src/contexts/UTXOContext.ts | 8 +- .../src/contexts/defaultContextValue.ts | 14 ++ .../src/hooks/useChainTypeFromAddress.ts | 7 +- packages/wallet-provider/src/index.ts | 2 +- packages/wallet-provider/src/types.ts | 53 ++++-- packages/widget-playground/package.json | 3 +- .../src/defaultWidgetConfig.ts | 11 +- packages/widget/package.json | 4 - .../src/components/Avatar/AccountAvatar.tsx | 2 +- .../Header/DisconnectIconButton.tsx | 3 +- .../src/components/Header/WalletHeader.tsx | 2 +- .../SendToWallet/SendToWalletButton.tsx | 4 +- packages/widget/src/hooks/useTokens.ts | 5 +- .../SendToWallet/ConnectedWalletsPage.tsx | 3 +- .../providers/WalletProvider/SDKProviders.tsx | 55 ++---- .../WalletProvider/WalletProvider.tsx | 35 ++-- packages/widget/src/types/widget.ts | 19 +- pnpm-lock.yaml | 168 +++--------------- 46 files changed, 423 insertions(+), 439 deletions(-) delete mode 100644 packages/wallet-management/src/types/walletConnector.ts rename packages/wallet-provider-utxo/src/{providers => utils}/createDefaultBigmiConfig.ts (100%) create mode 100644 packages/wallet-provider/src/contexts/defaultContextValue.ts diff --git a/knip.json b/knip.json index e6c0f0dce..9737bdc2c 100644 --- a/knip.json +++ b/knip.json @@ -1,4 +1,4 @@ { "ignore": ["examples/**", "packages/widget-embedded/**", "scripts/**"], - "ignoreDependencies": ["@mui/system", "csstype", "@lifi/wallet-management"] + "ignoreDependencies": ["@mui/system", "csstype"] } diff --git a/packages/wallet-management/src/components/EVMListItemButton.tsx b/packages/wallet-management/src/components/EVMListItemButton.tsx index 1c8233d11..8d4f2d3a1 100644 --- a/packages/wallet-management/src/components/EVMListItemButton.tsx +++ b/packages/wallet-management/src/components/EVMListItemButton.tsx @@ -35,7 +35,7 @@ export const EVMListItemButton = ({ } try { - const identityCheckPassed = isWalletInstalled(connector.id) + const identityCheckPassed = isWalletInstalled(connector.id ?? '') if (!identityCheckPassed) { onNotInstalled?.(connector) return @@ -46,14 +46,15 @@ export const EVMListItemButton = ({ onConnecting?.() // Disconnect currently connected EVM wallet (if any) await disconnect() - const data = await connect(connector) - setLastConnectedAccount(connector) - emitter.emit(WalletManagementEvent.WalletConnected, { - address: data.accounts[0], - chainId: data.chainId, - chainType: ChainType.EVM, - connectorId: connector.id, - connectorName: connectorName, + await connect(connector, (address: string, chainId: number) => { + setLastConnectedAccount(connector) + emitter.emit(WalletManagementEvent.WalletConnected, { + address: address, + chainId: chainId, + chainType: ChainType.EVM, + connectorId: connector.id ?? '', + connectorName: connectorName, + }) }) onConnected?.() } catch (error) { diff --git a/packages/wallet-management/src/components/MVMListItemButton.tsx b/packages/wallet-management/src/components/MVMListItemButton.tsx index e47d44608..3e4fc67c4 100644 --- a/packages/wallet-management/src/components/MVMListItemButton.tsx +++ b/packages/wallet-management/src/components/MVMListItemButton.tsx @@ -33,22 +33,16 @@ export const MVMListItemButton = ({ try { onConnecting?.() - await connect( - { wallet: connector }, - { - onSuccess: (standardConnectOutput: any) => { - // TODO: Add type - setLastConnectedAccount(connector) - emitter.emit(WalletManagementEvent.WalletConnected, { - address: standardConnectOutput.accounts[0].address, - chainId: ChainId.SOL, - chainType: ChainType.SVM, - connectorId: connectorName, - connectorName: connectorName, - }) - }, - } - ) + await connect(connector, (address: string) => { + setLastConnectedAccount(connector) + emitter.emit(WalletManagementEvent.WalletConnected, { + address: address, + chainId: ChainId.SOL, + chainType: ChainType.SVM, + connectorId: connectorName, + connectorName: connectorName, + }) + }) onConnected?.() } catch (error) { onError?.(error) @@ -59,7 +53,9 @@ export const MVMListItemButton = ({ { - // TODO: Add type + await connect(connector, (address: string) => { setLastConnectedAccount(connector) emitter.emit(WalletManagementEvent.WalletConnected, { - address: publicKey?.toString(), + address: address, chainId: ChainId.SOL, chainType: ChainType.SVM, connectorId: connectorName, @@ -58,7 +56,9 @@ export const SVMListItemButton = ({ { + setLastConnectedAccount(connector) + emitter.emit(WalletManagementEvent.WalletConnected, { + address: address, + chainId: ChainId.BTC, + chainType: ChainType.UTXO, + connectorId: connector.id ?? '', + connectorName: connectorName, + }) }) onConnected?.() } catch (error) { diff --git a/packages/wallet-management/src/components/WalletMenuContent.tsx b/packages/wallet-management/src/components/WalletMenuContent.tsx index c990b93d2..e6cccbee9 100644 --- a/packages/wallet-management/src/components/WalletMenuContent.tsx +++ b/packages/wallet-management/src/components/WalletMenuContent.tsx @@ -1,4 +1,5 @@ import { ChainType } from '@lifi/sdk' +import type { WalletConnector } from '@lifi/wallet-provider' import ArrowBack from '@mui/icons-material/ArrowBack' import Close from '@mui/icons-material/Close' import { @@ -17,7 +18,6 @@ import { useAccount } from '../hooks/useAccount.js' import type { CombinedWallet } from '../hooks/useCombinedWallets.js' import { useCombinedWallets } from '../hooks/useCombinedWallets.js' import type { WalletMenuOpenArgs } from '../providers/WalletMenuProvider/types.js' -import type { WalletConnector } from '../types/walletConnector.js' import type { WalletTagType } from '../types/walletTagType.js' import { ElementId } from '../utils/elements.js' import { getConnectorId } from '../utils/getConnectorId.js' @@ -293,7 +293,7 @@ export const WalletMenuContent: React.FC = ({ return ( handleMultiEcosystem(id)} + onClick={() => handleMultiEcosystem(id ?? name)} title={name} icon={icon ?? ''} tagType={tagType} diff --git a/packages/wallet-management/src/components/types.ts b/packages/wallet-management/src/components/types.ts index 348e6da56..82ab52788 100644 --- a/packages/wallet-management/src/components/types.ts +++ b/packages/wallet-management/src/components/types.ts @@ -1,10 +1,11 @@ +import type { WalletConnector } from '@lifi/wallet-provider' import type { WalletTagType } from '../types/walletTagType.js' export interface WalletListItemButtonProps { ecosystemSelection?: boolean tagType?: WalletTagType - connector: any // TODO: Add type - onNotInstalled?(connector: any): void // TODO: Add type + connector: WalletConnector + onNotInstalled?(connector: WalletConnector): void onConnected?(): void onConnecting?(): void onError?(error: unknown): void diff --git a/packages/wallet-management/src/hooks/useAccount.ts b/packages/wallet-management/src/hooks/useAccount.ts index d9e273f87..2fbc01551 100644 --- a/packages/wallet-management/src/hooks/useAccount.ts +++ b/packages/wallet-management/src/hooks/useAccount.ts @@ -5,6 +5,7 @@ import { useMVMContext, useSVMContext, useUTXOContext, + type WalletConnector, } from '@lifi/wallet-provider' import { useMemo } from 'react' import { create } from 'zustand' @@ -30,18 +31,9 @@ const defaultAccount: Account = { status: 'disconnected', } -// export type LastConnectedAccount = -// | WalletAdapter -// | Connector -// | BigmiConnector -// | CreateConnectorFnExtended -// | WalletWithRequiredFeatures -// | null - -// TODO: Add types interface LastConnectedAccountStore { - lastConnectedAccount: any - setLastConnectedAccount: (account: any) => void + lastConnectedAccount: WalletConnector | null + setLastConnectedAccount: (account: WalletConnector | null) => void } export const useLastConnectedAccount = create( @@ -65,7 +57,9 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { // biome-ignore lint/correctness/useExhaustiveDependencies: run only when wallet changes return useMemo(() => { - const accounts = [evmAccount, svmAccount, utxoAccount, suiAccount] + const accounts = [evmAccount, svmAccount, utxoAccount, suiAccount].filter( + (account) => account !== null + ) const connectedAccounts = accounts.filter( (account) => account.isConnected && account.address ) @@ -99,19 +93,19 @@ export const useAccount = (args?: UseAccountArgs): AccountResult => { accounts: connectedAccounts, } }, [ - svmAccount.address, - evmAccount.connector?.uid, - evmAccount.connector?.id, - evmAccount.status, - evmAccount.address, - evmAccount.chainId, - utxoAccount.connector?.uid, - utxoAccount.connector?.id, - utxoAccount.status, - utxoAccount.address, - utxoAccount.chainId, + svmAccount?.address, + evmAccount?.connector?.uid, + evmAccount?.connector?.id, + evmAccount?.status, + evmAccount?.address, + evmAccount?.chainId, + utxoAccount?.connector?.uid, + utxoAccount?.connector?.id, + utxoAccount?.status, + utxoAccount?.address, + utxoAccount?.chainId, suiAccount?.address, - suiAccount.status, + suiAccount?.status, args?.chainType, lastConnectedAccount, ]) diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 18c5c6355..02f5b641d 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -4,12 +4,12 @@ import { useMVMContext, useSVMContext, useUTXOContext, + type WalletConnector, } from '@lifi/wallet-provider' import type { Theme } from '@mui/material' import { useMediaQuery } from '@mui/material' import { useMemo } from 'react' import { useWalletManagementConfig } from '../providers/WalletManagementProvider/WalletManagementContext.js' -import type { WalletConnector } from '../types/walletConnector.js' import { getConnectorIcon } from '../utils/getConnectorIcon.js' import { getWalletPriority } from '../utils/getWalletPriority.js' @@ -19,7 +19,7 @@ type CombinedWalletConnector = { } export type CombinedWallet = { - id: string + id?: string name: string icon?: string connectors: CombinedWalletConnector[] @@ -27,12 +27,11 @@ export type CombinedWallet = { const normalizeName = (name: string) => name.split(' ')[0].toLowerCase().trim() -// TODO: Add types const combineWalletLists = ( - evmConnectorList: any[], - utxoConnectorList: any[], - svmWalletList: any[], - mvmWalletList: any[], + evmConnectorList: WalletConnector[], + utxoConnectorList: WalletConnector[], + svmWalletList: WalletConnector[], + mvmWalletList: WalletConnector[], walletEcosystemsOrder?: Record ): CombinedWallet[] => { const walletMap = new Map() @@ -64,15 +63,15 @@ const combineWalletLists = ( }) svmWalletList.forEach((svm) => { - const normalizedName = normalizeName(svm.adapter.name) + const normalizedName = normalizeName(svm.name) const existing = walletMap.get(normalizedName) || { - id: svm.adapter.name, - name: svm.adapter.name, - icon: svm.adapter.icon, + id: svm.name, + name: svm.name, + icon: svm.icon, connectors: [] as CombinedWalletConnector[], } existing.connectors.push({ - connector: svm.adapter, + connector: svm, chainType: ChainType.SVM, }) walletMap.set(normalizedName, existing) @@ -180,14 +179,17 @@ export const useCombinedWallets = () => { // Ensure the walletComparator function is updated to handle CombinedWallet const walletComparator = (a: CombinedWallet, b: CombinedWallet) => { - const priorityA = getWalletPriority(a.id) - const priorityB = getWalletPriority(b.id) + const idA = a.id ?? a.name + const idB = b.id ?? b.name + + const priorityA = getWalletPriority(idA) + const priorityB = getWalletPriority(idB) if (priorityA !== priorityB) { return priorityA - priorityB } - return a.id?.localeCompare(b.id) + return idA.localeCompare(idB) } const walletEcosystemsComparator = ( diff --git a/packages/wallet-management/src/index.ts b/packages/wallet-management/src/index.ts index b7e2772ba..f1f58a66a 100644 --- a/packages/wallet-management/src/index.ts +++ b/packages/wallet-management/src/index.ts @@ -1,6 +1,5 @@ import type {} from '@mui/material/themeCssVarsAugmentation' -export type { Account } from '@lifi/wallet-provider' // TODO: export * from './hooks/useAccount.js' export * from './hooks/useAccountDisconnect.js' export * from './hooks/useWalletManagementEvents.js' @@ -10,6 +9,5 @@ export * from './providers/WalletManagementProvider/WalletManagementProvider.js' export type { WalletMenuOpenArgs } from './providers/WalletMenuProvider/types.js' export * from './providers/WalletMenuProvider/WalletMenuContext.js' export * from './types/events.js' -export * from './types/walletConnector.js' export * from './utils/getConnectorIcon.js' export * from './utils/getWalletPriority.js' diff --git a/packages/wallet-management/src/types/walletConnector.ts b/packages/wallet-management/src/types/walletConnector.ts deleted file mode 100644 index 136d3a3bd..000000000 --- a/packages/wallet-management/src/types/walletConnector.ts +++ /dev/null @@ -1 +0,0 @@ -export type WalletConnector = any // TODO: Add type diff --git a/packages/wallet-management/src/utils/getConnectorIcon.ts b/packages/wallet-management/src/utils/getConnectorIcon.ts index 6fa6e61dc..107c2beb0 100644 --- a/packages/wallet-management/src/utils/getConnectorIcon.ts +++ b/packages/wallet-management/src/utils/getConnectorIcon.ts @@ -1,5 +1,5 @@ +import type { WalletConnector } from '@lifi/wallet-provider' import { getWalletIcon } from '../icons.js' -import type { WalletConnector } from '../types/walletConnector.js' export const getConnectorIcon = (connector?: WalletConnector) => { const connectorId = connector?.id diff --git a/packages/wallet-management/src/utils/getConnectorId.ts b/packages/wallet-management/src/utils/getConnectorId.ts index d98563527..1b55f199e 100644 --- a/packages/wallet-management/src/utils/getConnectorId.ts +++ b/packages/wallet-management/src/utils/getConnectorId.ts @@ -1,5 +1,5 @@ import type { ChainType } from '@lifi/sdk' -import type { WalletConnector } from '../types/walletConnector.js' +import type { WalletConnector } from '@lifi/wallet-provider' export const getConnectorId = ( connector?: WalletConnector, diff --git a/packages/wallet-provider-evm/src/index.ts b/packages/wallet-provider-evm/src/index.ts index 8bbe6e86e..da35d3b32 100644 --- a/packages/wallet-provider-evm/src/index.ts +++ b/packages/wallet-provider-evm/src/index.ts @@ -1,13 +1,3 @@ -// TODO: remove config and connectors exports after wallet-management migration -export { defaultBaseAccountConfig } from './config/baseAccount.js' -export { defaultCoinbaseConfig } from './config/coinbase.js' -export { defaultMetaMaskConfig } from './config/metaMask.js' -export { defaultWalletConnectConfig } from './config/walletConnect.js' -export { createBaseAccountConnector } from './connectors/baseAccount.js' -export { createCoinbaseConnector } from './connectors/coinbase.js' -export { createMetaMaskConnector } from './connectors/metaMask.js' -export { createPortoConnector } from './connectors/porto.js' -export { createWalletConnectConnector } from './connectors/walletConnect.js' export { useSyncWagmiConfig } from './hooks/useSyncWagmiConfig.js' export { EVMProvider, useInEVMContext } from './providers/EVMProvider.js' export type { CreateConnectorFnExtended } from './types/connectors.js' diff --git a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx index bd5833c4c..8580bc7db 100644 --- a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx +++ b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx @@ -1,6 +1,10 @@ -import type { ExtendedChain } from '@lifi/sdk' -import { ChainType } from '@lifi/sdk' -import { EVMContext, isWalletInstalled } from '@lifi/wallet-provider' +import { ChainType, EVM } from '@lifi/sdk' +import { + EVMContext, + isWalletInstalled, + type WalletConnector, + type WalletProviderProps, +} from '@lifi/wallet-provider' import { type FC, type PropsWithChildren, @@ -36,17 +40,12 @@ import { createPortoConnector } from '../connectors/porto.js' import { createWalletConnectConnector } from '../connectors/walletConnect.js' import { EVMBaseProvider } from './EVMBaseProvider.js' -interface EVMProviderProps { - walletConfig?: any // TODO: WidgetWalletConfig type - chains?: ExtendedChain[] -} - export function useInEVMContext(): boolean { const context = useContext(WagmiContext) return Boolean(context) } -export const EVMProvider: FC> = ({ +export const EVMProvider: FC> = ({ walletConfig, chains, children, @@ -177,8 +176,12 @@ const CaptureEVMValues: FC< }, [wagmiConnectors, walletConfig]) const handleConnect = useCallback( - async (connector: Connector) => { - return await connect(config, { connector }) + async ( + connector: WalletConnector, + onSuccess?: (address: string, chainId: number) => void + ) => { + const data = await connect(config, { connector: connector as Connector }) + onSuccess?.(data.accounts[0], data.chainId) }, [config] ) @@ -209,7 +212,15 @@ const CaptureEVMValues: FC< return ( getConnectorClient(config), + switchChain: async (chainId: number) => { + const chain = await switchChain(config, { chainId }) + return getConnectorClient(config, { chainId: chain.id }) + }, + }), account, installedWallets, nonDetectedWallets, @@ -217,10 +228,6 @@ const CaptureEVMValues: FC< disconnect: handleDisconnect, isValidAddress: isEVMAddress, isExternalContext, - switchChain: async (chainId: number) => { - const chain = await switchChain(config, { chainId }) - return getConnectorClient(config, { chainId: chain.id }) - }, }} > {children} diff --git a/packages/wallet-provider-evm/src/utils/createDefaultWagmiConfig.ts b/packages/wallet-provider-evm/src/utils/createDefaultWagmiConfig.ts index 06d3c9cf4..7d5a2d6a5 100644 --- a/packages/wallet-provider-evm/src/utils/createDefaultWagmiConfig.ts +++ b/packages/wallet-provider-evm/src/utils/createDefaultWagmiConfig.ts @@ -16,6 +16,7 @@ import { createCoinbaseConnector } from '../connectors/coinbase.js' import { createMetaMaskConnector } from '../connectors/metaMask.js' import { createPortoConnector } from '../connectors/porto.js' import { createWalletConnectConnector } from '../connectors/walletConnect.js' + export interface DefaultWagmiConfigProps { walletConnect?: WalletConnectParameters coinbase?: CoinbaseWalletParameters diff --git a/packages/wallet-provider-mvm/package.json b/packages/wallet-provider-mvm/package.json index 51770305a..f081aeb80 100644 --- a/packages/wallet-provider-mvm/package.json +++ b/packages/wallet-provider-mvm/package.json @@ -6,10 +6,11 @@ "types": "./src/index.d.ts", "dependencies": { "@mysten/sui": "^1.38.0", - "@lifi/sdk": "^3.12.11" + "@lifi/sdk": "^3.12.11", + "@mysten/wallet-standard": "^0.17.0" }, "peerDependencies": { - "@mysten/dapp-kit": "^0.17.4", + "@mysten/dapp-kit": ">=0.18.0", "@lifi/wallet-provider": "workspace:*" }, "devDependencies": { diff --git a/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx b/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx index 750ad208f..e7b92bb54 100644 --- a/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx +++ b/packages/wallet-provider-mvm/src/providers/MVMBaseProvider.tsx @@ -1,3 +1,4 @@ +import { ChainId, type ExtendedChain } from '@lifi/sdk' import { createNetworkConfig, SuiClientProvider, @@ -6,14 +7,20 @@ import { import { getFullnodeUrl } from '@mysten/sui/client' import { type FC, type PropsWithChildren, useMemo } from 'react' -export const MVMBaseProvider: FC = ({ children }) => { +interface MVMBaseProviderProps { + chains?: ExtendedChain[] +} + +export const MVMBaseProvider: FC> = ({ + chains, + children, +}) => { const config = useMemo(() => { + const sui = chains?.find((chain) => chain.id === ChainId.SUI) return createNetworkConfig({ - // TODO: original: mainnet: { url: sui?.metamask?.rpcUrls[0] ?? getFullnodeUrl('mainnet') }, - // sui chain: from useAvailableChains() - mainnet: { url: getFullnodeUrl('mainnet') }, + mainnet: { url: sui?.metamask?.rpcUrls[0] ?? getFullnodeUrl('mainnet') }, }) - }, []) + }, [chains]) return ( diff --git a/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx index 64b7230fa..7f1392c29 100644 --- a/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx +++ b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx @@ -1,5 +1,10 @@ -import { ChainId, ChainType } from '@lifi/sdk' -import { MVMContext } from '@lifi/wallet-provider' +import { ChainId, ChainType, Sui } from '@lifi/sdk' +import { + type Account, + MVMContext, + type WalletConnector, + type WalletProviderProps, +} from '@lifi/wallet-provider' import { SuiClientContext, useConnectWallet, @@ -8,20 +13,18 @@ import { useWallets, } from '@mysten/dapp-kit' import { isValidSuiAddress } from '@mysten/sui/utils' -import { type FC, type PropsWithChildren, useContext } from 'react' +import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' +import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' import { MVMBaseProvider } from './MVMBaseProvider.js' -interface MVMProviderProps { - walletConfig?: any // TODO: WidgetWalletConfig type -} - export function useInMVMContext(): boolean { const context = useContext(SuiClientContext) return Boolean(context) } -export const MVMProvider: FC> = ({ +export const MVMProvider: FC> = ({ walletConfig, + chains, children, }) => { const forceInternalWalletManagement = @@ -38,7 +41,7 @@ export const MVMProvider: FC> = ({ } return ( - + {children} @@ -76,13 +79,35 @@ const CaptureMVMValues: FC< status: 'disconnected', } + const handleConnect = useCallback( + async ( + connector: WalletConnector, + onSuccess?: (address: string, chainId: number) => void + ) => { + await connect( + { wallet: connector as unknown as WalletWithRequiredFeatures }, + { + onSuccess: (standardConnectOutput) => { + onSuccess?.(standardConnectOutput.accounts[0].address, ChainId.SUI) + }, + } + ) + }, + [connect] + ) + return ( currentWallet!, + }), + isConnected: account.isConnected, + installedWallets: wallets as WalletConnector[], + nonDetectedWallets: [] as WalletConnector[], + connect: handleConnect, disconnect, isValidAddress: isValidSuiAddress, isExternalContext, diff --git a/packages/wallet-provider-svm/package.json b/packages/wallet-provider-svm/package.json index 5de6e9e9e..5df49c115 100644 --- a/packages/wallet-provider-svm/package.json +++ b/packages/wallet-provider-svm/package.json @@ -11,7 +11,7 @@ "@lifi/sdk": "^3.12.11" }, "peerDependencies": { - "@solana/wallet-adapter-react": "^0.15.39", + "@solana/wallet-adapter-react": ">=0.15.35", "@lifi/wallet-provider": "workspace:*" }, "devDependencies": { diff --git a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx index d464fe9f7..97af9eeed 100644 --- a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx +++ b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx @@ -1,20 +1,36 @@ -import { ChainId, ChainType, isSVMAddress } from '@lifi/sdk' -import { SVMContext } from '@lifi/wallet-provider' -import { WalletReadyState } from '@solana/wallet-adapter-base' -import { ConnectionContext, useWallet } from '@solana/wallet-adapter-react' -import { type FC, type PropsWithChildren, useContext, useMemo } from 'react' +import { ChainId, ChainType, isSVMAddress, Solana } from '@lifi/sdk' +import { + type Account, + SVMContext, + type WalletConnector, + type WalletProviderProps, +} from '@lifi/wallet-provider' +import { + type Adapter, + type SignerWalletAdapter, + WalletReadyState, +} from '@solana/wallet-adapter-base' +import { + ConnectionContext, + useWallet, + type Wallet, +} from '@solana/wallet-adapter-react' +import type { PublicKey } from '@solana/web3.js' +import { + type FC, + type PropsWithChildren, + useCallback, + useContext, + useMemo, +} from 'react' import { SVMBaseProvider } from './SVMBaseProvider.js' -interface SVMProviderProps { - walletConfig?: any // TODO: WidgetWalletConfig type -} - export function useInSVMContext(): boolean { const context = useContext(ConnectionContext) return Boolean(context?.connection) } -export const SVMProvider: FC> = ({ +export const SVMProvider: FC> = ({ walletConfig, children, }) => { @@ -74,32 +90,56 @@ const CaptureSVMValues: FC< const installedWallets = useMemo( () => - wallets.filter( - (wallet: any) => - wallet.adapter.readyState === WalletReadyState.Installed || - wallet.adapter.readyState === WalletReadyState.Loadable - ), + wallets + .filter( + (wallet: Wallet) => + wallet.adapter.readyState === WalletReadyState.Installed || + wallet.adapter.readyState === WalletReadyState.Loadable + ) + .map((wallet: Wallet) => wallet.adapter), [wallets] ) const nonDetectedWallets = useMemo( () => - wallets.filter( - (wallet: any) => - wallet.adapter.readyState !== WalletReadyState.Installed && - wallet.adapter.readyState !== WalletReadyState.Loadable - ), + wallets + .filter( + (wallet: Wallet) => + wallet.adapter.readyState !== WalletReadyState.Installed && + wallet.adapter.readyState !== WalletReadyState.Loadable + ) + .map((wallet: Wallet) => wallet.adapter), [wallets] ) + const handleConnect = useCallback( + async ( + connector: WalletConnector, + onSuccess?: (address: string, chainId: number) => void + ) => { + const adapter = connector as unknown as Adapter + connect(adapter.name) + adapter.once('connect', (publicKey: PublicKey) => { + onSuccess?.(publicKey?.toString(), ChainId.SOL) + }) + }, + [connect] + ) + return ( =0.5.0", "@lifi/wallet-provider": "workspace:*" }, "devDependencies": { diff --git a/packages/wallet-provider-utxo/src/providers/UTXOBaseProvider.tsx b/packages/wallet-provider-utxo/src/providers/UTXOBaseProvider.tsx index 5a60375d6..7694e68e3 100644 --- a/packages/wallet-provider-utxo/src/providers/UTXOBaseProvider.tsx +++ b/packages/wallet-provider-utxo/src/providers/UTXOBaseProvider.tsx @@ -4,7 +4,7 @@ import { type FC, type PropsWithChildren, useRef } from 'react' import { createDefaultBigmiConfig, type DefaultBigmiConfigResult, -} from './createDefaultBigmiConfig.js' +} from '../utils/createDefaultBigmiConfig.js' export const UTXOBaseProvider: FC = ({ children }) => { const bigmi = useRef(null) diff --git a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx index c0d3319d1..8ed8f9b58 100644 --- a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx +++ b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx @@ -7,8 +7,13 @@ import { } from '@bigmi/client' import { isUTXOAddress } from '@bigmi/core' import { BigmiContext, useAccount, useConfig, useConnect } from '@bigmi/react' -import { ChainId, ChainType } from '@lifi/sdk' -import { isWalletInstalled, UTXOContext } from '@lifi/wallet-provider' +import { ChainId, ChainType, UTXO } from '@lifi/sdk' +import { + isWalletInstalled, + UTXOContext, + type WalletConnector, + type WalletProviderProps, +} from '@lifi/wallet-provider' import { type FC, type PropsWithChildren, @@ -18,17 +23,13 @@ import { } from 'react' import { UTXOBaseProvider } from './UTXOBaseProvider.js' -interface UTXOProviderProps { - walletConfig?: any // TODO: WidgetWalletConfig type -} - export function useInUTXOContext(): boolean { const context = useContext(BigmiContext) return Boolean(context) } -export const UTXOProvider: FC> = ({ +export const UTXOProvider: FC> = ({ walletConfig, children, }) => { @@ -69,13 +70,6 @@ const CaptureUTXOValues: FC< addresses: currentWallet.accounts?.map((account: any) => account.address), } - const handleConnect = useCallback( - async (connector: Connector) => { - return await connect(bigmiConfig, { connector }) - }, - [bigmiConfig] - ) - const handleDisconnect = useCallback(async () => { const connectedAccount = getAccount(bigmiConfig) if (connectedAccount.connector) { @@ -87,21 +81,42 @@ const CaptureUTXOValues: FC< const installedWallets = useMemo( () => - connectors.filter((connector: any) => isWalletInstalled(connector.id)), + connectors.filter((connector: Connector) => + isWalletInstalled(connector.id) + ), [connectors] ) const nonDetectedWallets = useMemo( () => - connectors.filter((connector: any) => !isWalletInstalled(connector.id)), + connectors.filter( + (connector: Connector) => !isWalletInstalled(connector.id) + ), [connectors] ) + const handleConnect = useCallback( + async ( + connector: WalletConnector, + onSuccess?: (address: string, chainId: number) => void + ) => { + const data = await connect(bigmiConfig, { + connector: connector as Connector, + }) + onSuccess?.(data.accounts[0].address, ChainId.BTC) + }, + [bigmiConfig] + ) + return ( getBigmiConnectorClient(bigmiConfig), + }), account, + isConnected: account.isConnected, installedWallets, nonDetectedWallets, connect: handleConnect, diff --git a/packages/wallet-provider-utxo/src/providers/createDefaultBigmiConfig.ts b/packages/wallet-provider-utxo/src/utils/createDefaultBigmiConfig.ts similarity index 100% rename from packages/wallet-provider-utxo/src/providers/createDefaultBigmiConfig.ts rename to packages/wallet-provider-utxo/src/utils/createDefaultBigmiConfig.ts diff --git a/packages/wallet-provider/src/contexts/EVMContext.ts b/packages/wallet-provider/src/contexts/EVMContext.ts index 32ac41d04..1c95419cd 100644 --- a/packages/wallet-provider/src/contexts/EVMContext.ts +++ b/packages/wallet-provider/src/contexts/EVMContext.ts @@ -1,7 +1,11 @@ import { createContext, useContext } from 'react' +import type { WalletProviderContext } from '../types.js' +import { defaultContextValue } from './defaultContextValue.js' -export const EVMContext = createContext(null) +export const EVMContext = + createContext(defaultContextValue) export const useEVMContext = () => { - return useContext(EVMContext) + const context = useContext(EVMContext) + return context || defaultContextValue } diff --git a/packages/wallet-provider/src/contexts/MVMContext.ts b/packages/wallet-provider/src/contexts/MVMContext.ts index f0ed932a6..2ef4c8ba3 100644 --- a/packages/wallet-provider/src/contexts/MVMContext.ts +++ b/packages/wallet-provider/src/contexts/MVMContext.ts @@ -1,7 +1,11 @@ import { createContext, useContext } from 'react' +import type { WalletProviderContext } from '../types.js' +import { defaultContextValue } from './defaultContextValue.js' -export const MVMContext = createContext(null) +export const MVMContext = + createContext(defaultContextValue) export const useMVMContext = () => { - return useContext(MVMContext) + const context = useContext(MVMContext) + return context || defaultContextValue } diff --git a/packages/wallet-provider/src/contexts/SVMContext.ts b/packages/wallet-provider/src/contexts/SVMContext.ts index cee227812..97ba46e52 100644 --- a/packages/wallet-provider/src/contexts/SVMContext.ts +++ b/packages/wallet-provider/src/contexts/SVMContext.ts @@ -1,7 +1,11 @@ import { createContext, useContext } from 'react' +import type { WalletProviderContext } from '../types.js' +import { defaultContextValue } from './defaultContextValue.js' -export const SVMContext = createContext(null) +export const SVMContext = + createContext(defaultContextValue) export const useSVMContext = () => { - return useContext(SVMContext) + const context = useContext(SVMContext) + return context || defaultContextValue } diff --git a/packages/wallet-provider/src/contexts/UTXOContext.ts b/packages/wallet-provider/src/contexts/UTXOContext.ts index f71fd307f..d9388d619 100644 --- a/packages/wallet-provider/src/contexts/UTXOContext.ts +++ b/packages/wallet-provider/src/contexts/UTXOContext.ts @@ -1,7 +1,11 @@ import { createContext, useContext } from 'react' +import type { WalletProviderContext } from '../types.js' +import { defaultContextValue } from './defaultContextValue.js' -export const UTXOContext = createContext(null) +export const UTXOContext = + createContext(defaultContextValue) export const useUTXOContext = () => { - return useContext(UTXOContext) + const context = useContext(UTXOContext) + return context || defaultContextValue } diff --git a/packages/wallet-provider/src/contexts/defaultContextValue.ts b/packages/wallet-provider/src/contexts/defaultContextValue.ts new file mode 100644 index 000000000..350895415 --- /dev/null +++ b/packages/wallet-provider/src/contexts/defaultContextValue.ts @@ -0,0 +1,14 @@ +import type { WalletProviderContext } from '../types.js' + +export const defaultContextValue: WalletProviderContext = { + isEnabled: false, + isExternalContext: false, + isConnected: false, + account: null, + sdkProvider: null, + installedWallets: [], + nonDetectedWallets: [], + isValidAddress: () => false, + connect: async () => {}, + disconnect: async () => {}, +} diff --git a/packages/wallet-provider/src/hooks/useChainTypeFromAddress.ts b/packages/wallet-provider/src/hooks/useChainTypeFromAddress.ts index c26cdb4da..c19166fd3 100644 --- a/packages/wallet-provider/src/hooks/useChainTypeFromAddress.ts +++ b/packages/wallet-provider/src/hooks/useChainTypeFromAddress.ts @@ -9,7 +9,7 @@ export const useChainTypeFromAddress = () => { const { isValidAddress: isValidEVMAddress } = useEVMContext() const { isValidAddress: isValidSVMAddress } = useSVMContext() const { isValidAddress: isValidUTXOAddress } = useUTXOContext() - const { isValidAddress: isValidSuiAddress } = useMVMContext() + const { isValidAddress: isValidMVMAddress } = useMVMContext() const getChainTypeFromAddress = useCallback( (address: string): ChainType | undefined => { @@ -22,16 +22,15 @@ export const useChainTypeFromAddress = () => { if (isValidUTXOAddress(address)) { return ChainType.UTXO } - if (isValidSuiAddress(address)) { + if (isValidMVMAddress(address)) { return ChainType.MVM } - //[ChainType.TVM]: () => false, }, [ isValidEVMAddress, isValidSVMAddress, isValidUTXOAddress, - isValidSuiAddress, + isValidMVMAddress, ] ) return { getChainTypeFromAddress } diff --git a/packages/wallet-provider/src/index.ts b/packages/wallet-provider/src/index.ts index 6b14335bc..ea18b1abe 100644 --- a/packages/wallet-provider/src/index.ts +++ b/packages/wallet-provider/src/index.ts @@ -3,5 +3,5 @@ export { MVMContext, useMVMContext } from './contexts/MVMContext.js' export { SVMContext, useSVMContext } from './contexts/SVMContext.js' export { UTXOContext, useUTXOContext } from './contexts/UTXOContext.js' export { useChainTypeFromAddress } from './hooks/useChainTypeFromAddress.js' -export type { Account } from './types.js' +export type { Account, WalletConnector, WalletProviderProps } from './types.js' export { isWalletInstalled } from './utils/isWalletInstalled.js' diff --git a/packages/wallet-provider/src/types.ts b/packages/wallet-provider/src/types.ts index e19a6a27f..b788b4f8a 100644 --- a/packages/wallet-provider/src/types.ts +++ b/packages/wallet-provider/src/types.ts @@ -1,32 +1,49 @@ -import type { ChainType } from '@lifi/sdk' +import type { ChainType, ExtendedChain, SDKProvider } from '@lifi/sdk' -interface AccountBase { +export type WalletConnector = { + id?: string + uid?: string + name: string + displayName?: string + icon?: string +} + +export interface Account { + id?: string + name?: string address?: string addresses?: readonly string[] chainId?: number - chainType: CT + chainType: ChainType connector?: WalletConnector isConnected: boolean isConnecting: boolean isDisconnected: boolean isReconnecting: boolean status: 'connected' | 'reconnecting' | 'connecting' | 'disconnected' - // TODO: might be missing for some chain types - name?: string } -// TODO: Add types for each chain type -// export type EVMAccount = AccountBase -// export type SVMAccount = AccountBase -// export type UTXOAccount = AccountBase -// export type MVMAccount = AccountBase -// export type DefaultAccount = AccountBase +export type WalletProviderContext = { + isEnabled: boolean + isExternalContext: boolean + isConnected: boolean + account: Account | null + sdkProvider: SDKProvider | null + installedWallets: WalletConnector[] + nonDetectedWallets: WalletConnector[] + isValidAddress: (address: string) => boolean + connect: ( + connector: WalletConnector, + onSuccess?: (address: string, chainId: number) => void + ) => Promise + disconnect: () => Promise +} -export type Account = AccountBase +interface WidgetWalletConfig { + forceInternalWalletManagement?: boolean +} -// export type Account = -// | EVMAccount -// | SVMAccount -// | UTXOAccount -// | MVMAccount -// | DefaultAccount +export interface WalletProviderProps { + walletConfig?: WidgetWalletConfig + chains: ExtendedChain[] +} diff --git a/packages/widget-playground/package.json b/packages/widget-playground/package.json index bd86ec24b..e732ff1ba 100644 --- a/packages/widget-playground/package.json +++ b/packages/widget-playground/package.json @@ -27,10 +27,10 @@ "./widget-config": "./src/defaultWidgetConfig.ts" }, "dependencies": { + "@bigmi/react": "^0.5.4", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@lifi/sdk": "^3.12.12", - "@lifi/wallet-management": "workspace:*", "@lifi/wallet-provider-evm": "workspace:*", "@lifi/wallet-provider-mvm": "workspace:*", "@lifi/wallet-provider-utxo": "workspace:*", @@ -41,6 +41,7 @@ "@mui/lab": "7.0.0-beta.17", "@mui/material": "^7.3.2", "@mui/system": "^7.3.2", + "@mysten/dapp-kit": "^0.18.0", "@reown/appkit": "^1.8.8", "@reown/appkit-adapter-solana": "^1.8.8", "@reown/appkit-adapter-wagmi": "^1.8.8", diff --git a/packages/widget-playground/src/defaultWidgetConfig.ts b/packages/widget-playground/src/defaultWidgetConfig.ts index 32f120567..de6efadf0 100644 --- a/packages/widget-playground/src/defaultWidgetConfig.ts +++ b/packages/widget-playground/src/defaultWidgetConfig.ts @@ -1,4 +1,8 @@ import { ChainId } from '@lifi/sdk' +import { EVMProvider } from '@lifi/wallet-provider-evm' +import { MVMProvider } from '@lifi/wallet-provider-mvm' +import { SVMProvider } from '@lifi/wallet-provider-svm' +import { UTXOProvider } from '@lifi/wallet-provider-utxo' import type { WidgetConfig } from '@lifi/widget' export const widgetBaseConfig: WidgetConfig = { @@ -54,9 +58,10 @@ export const widgetBaseConfig: WidgetConfig = { // navigationHeaderTitleNoWrap: false, // }, // slippage: 0.003, - // walletConfig: { - // usePartialWalletManagement: true, - // }, + walletConfig: { + // usePartialWalletManagement: true, + walletProviders: [EVMProvider, MVMProvider, SVMProvider, UTXOProvider], + }, sdkConfig: { apiUrl: 'https://li.quest/v1', rpcUrls: { diff --git a/packages/widget/package.json b/packages/widget/package.json index a7ab519f9..7a0e2dc1e 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -78,10 +78,6 @@ "vitest": "^3.2.4" }, "peerDependencies": { - "@lifi/wallet-provider-evm": "workspace:^", - "@lifi/wallet-provider-mvm": "workspace:^", - "@lifi/wallet-provider-svm": "workspace:^", - "@lifi/wallet-provider-utxo": "workspace:^", "@tanstack/react-query": ">=5.87.0", "react": ">=18", "react-dom": ">=18", diff --git a/packages/widget/src/components/Avatar/AccountAvatar.tsx b/packages/widget/src/components/Avatar/AccountAvatar.tsx index 01b58a6e3..26b724526 100644 --- a/packages/widget/src/components/Avatar/AccountAvatar.tsx +++ b/packages/widget/src/components/Avatar/AccountAvatar.tsx @@ -1,5 +1,5 @@ -import type { Account } from '@lifi/wallet-management' import { getConnectorIcon } from '@lifi/wallet-management' +import type { Account } from '@lifi/wallet-provider' import Wallet from '@mui/icons-material/Wallet' import { Badge } from '@mui/material' import { useChain } from '../../hooks/useChain.js' diff --git a/packages/widget/src/components/Header/DisconnectIconButton.tsx b/packages/widget/src/components/Header/DisconnectIconButton.tsx index 42bc3c704..12e3c8434 100644 --- a/packages/widget/src/components/Header/DisconnectIconButton.tsx +++ b/packages/widget/src/components/Header/DisconnectIconButton.tsx @@ -1,4 +1,5 @@ -import { type Account, useAccountDisconnect } from '@lifi/wallet-management' +import { useAccountDisconnect } from '@lifi/wallet-management' +import type { Account } from '@lifi/wallet-provider' import PowerSettingsNewRounded from '@mui/icons-material/PowerSettingsNewRounded' import { IconButton } from '@mui/material' diff --git a/packages/widget/src/components/Header/WalletHeader.tsx b/packages/widget/src/components/Header/WalletHeader.tsx index 6902c851b..bb37e00c3 100644 --- a/packages/widget/src/components/Header/WalletHeader.tsx +++ b/packages/widget/src/components/Header/WalletHeader.tsx @@ -1,9 +1,9 @@ -import type { Account } from '@lifi/wallet-management' import { getConnectorIcon, useAccount, useWalletMenu, } from '@lifi/wallet-management' +import type { Account } from '@lifi/wallet-provider' import ExpandMore from '@mui/icons-material/ExpandMore' import Wallet from '@mui/icons-material/Wallet' import { Avatar, Badge } from '@mui/material' diff --git a/packages/widget/src/components/SendToWallet/SendToWalletButton.tsx b/packages/widget/src/components/SendToWallet/SendToWalletButton.tsx index 89dff8ab2..3261cc6a9 100644 --- a/packages/widget/src/components/SendToWallet/SendToWalletButton.tsx +++ b/packages/widget/src/components/SendToWallet/SendToWalletButton.tsx @@ -72,9 +72,7 @@ export const SendToWalletButton: React.FC = (props) => { : matchingConnectedAccount ? matchingConnectedAccount.chainId : chainType - ? defaultChainIdsByType[ - chainType as keyof typeof defaultChainIdsByType - ] + ? defaultChainIdsByType[chainType] : undefined const isConnectedAccount = diff --git a/packages/widget/src/hooks/useTokens.ts b/packages/widget/src/hooks/useTokens.ts index 2baee359c..0fd27246a 100644 --- a/packages/widget/src/hooks/useTokens.ts +++ b/packages/widget/src/hooks/useTokens.ts @@ -104,10 +104,7 @@ const useBackgroundTokenSearch = (search?: string, chainId?: number) => { if (!_chainId) { const chainType = getChainTypeFromAddress(searchQuery) if (chainType && chainType in defaultChainIdsByType) { - _chainId = - defaultChainIdsByType[ - chainType as keyof typeof defaultChainIdsByType - ] + _chainId = defaultChainIdsByType[chainType] } } diff --git a/packages/widget/src/pages/SendToWallet/ConnectedWalletsPage.tsx b/packages/widget/src/pages/SendToWallet/ConnectedWalletsPage.tsx index 94207efb9..9e68d0de0 100644 --- a/packages/widget/src/pages/SendToWallet/ConnectedWalletsPage.tsx +++ b/packages/widget/src/pages/SendToWallet/ConnectedWalletsPage.tsx @@ -1,4 +1,5 @@ -import { type Account, useAccount } from '@lifi/wallet-management' +import { useAccount } from '@lifi/wallet-management' +import type { Account } from '@lifi/wallet-provider' import ContentCopyRounded from '@mui/icons-material/ContentCopyRounded' import MoreHoriz from '@mui/icons-material/MoreHoriz' import OpenInNewRounded from '@mui/icons-material/OpenInNewRounded' diff --git a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx index 9fbf3287b..bcfb40107 100644 --- a/packages/widget/src/providers/WalletProvider/SDKProviders.tsx +++ b/packages/widget/src/providers/WalletProvider/SDKProviders.tsx @@ -1,5 +1,5 @@ import type { SDKProvider } from '@lifi/sdk' -import { ChainType, config, EVM, Solana, Sui, UTXO } from '@lifi/sdk' +import { ChainType, config } from '@lifi/sdk' import { useEVMContext, useMVMContext, @@ -11,11 +11,10 @@ import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' export const SDKProviders = () => { const { sdkConfig } = useWidgetConfig() - const { walletClient: evmWalletClient, switchChain: evmSwitchChain } = - useEVMContext() - const { walletClient: utxoWalletClient } = useUTXOContext() - const { currentWallet: svmWallet } = useSVMContext() - const { currentWallet: suiWallet } = useMVMContext() + const { sdkProvider: evmSDKProvider } = useEVMContext() + const { sdkProvider: utxoSDKProvider } = useUTXOContext() + const { sdkProvider: svmSDKProvider } = useSVMContext() + const { sdkProvider: suiSDKProvider } = useMVMContext() useEffect(() => { // Configure SDK Providers @@ -32,48 +31,28 @@ export const SDKProviders = () => { const hasConfiguredSuiProvider = sdkConfig?.providers?.some( (provider) => provider.type === ChainType.MVM ) - if (!hasConfiguredEVMProvider) { - providers.push( - EVM({ - getWalletClient: () => evmWalletClient, - switchChain: evmSwitchChain, - }) - ) + if (!hasConfiguredEVMProvider && evmSDKProvider) { + providers.push(evmSDKProvider) } - if (!hasConfiguredSVMProvider) { - providers.push( - Solana({ - async getWalletAdapter() { - return svmWallet?.adapter - }, - }) - ) + if (!hasConfiguredSVMProvider && svmSDKProvider) { + providers.push(svmSDKProvider) } - if (!hasConfiguredUTXOProvider) { - providers.push( - UTXO({ - getWalletClient: () => utxoWalletClient, - }) - ) + if (!hasConfiguredUTXOProvider && utxoSDKProvider) { + providers.push(utxoSDKProvider) } - if (!hasConfiguredSuiProvider) { - providers.push( - Sui({ - getWallet: async () => suiWallet!, - }) - ) + if (!hasConfiguredSuiProvider && suiSDKProvider) { + providers.push(suiSDKProvider) } if (sdkConfig?.providers?.length) { providers.push(...sdkConfig.providers) } config.setProviders(providers) }, [ - suiWallet, sdkConfig?.providers, - evmWalletClient, - evmSwitchChain, - svmWallet?.adapter, - utxoWalletClient, + evmSDKProvider, + svmSDKProvider, + utxoSDKProvider, + suiSDKProvider, ]) return null diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index 98ebd9736..4a761ed44 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -1,9 +1,5 @@ import type { WalletManagementConfig } from '@lifi/wallet-management' import { WalletManagementProvider } from '@lifi/wallet-management' -import { EVMProvider } from '@lifi/wallet-provider-evm' -import { MVMProvider } from '@lifi/wallet-provider-mvm' -import { SVMProvider } from '@lifi/wallet-provider-svm' -import { UTXOProvider } from '@lifi/wallet-provider-utxo' import { type FC, type PropsWithChildren, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useAvailableChains } from '../../hooks/useAvailableChains.js' @@ -11,23 +7,26 @@ import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' import { SDKProviders } from './SDKProviders.js' import { useExternalWalletProvider } from './useExternalWalletProvider.js' -export const WalletProvider: FC = ({ children }) => { +export const WalletProvider = ({ children }: PropsWithChildren) => { const { walletConfig } = useWidgetConfig() const { chains } = useAvailableChains() - // TODO: isItemAllowed(ChainType.SVM, chains?.types) - should we check it? - return ( - // TODO: pass as props to WalletProvider - - - - - - {children} - - - - + + let WidgetWithWalletProviders = ( + <> + + {children} + ) + + for (const ProviderComponent of walletConfig?.walletProviders || []) { + WidgetWithWalletProviders = ( + + {WidgetWithWalletProviders} + + ) + } + + return WidgetWithWalletProviders } const WalletMenuProvider: FC = ({ children }) => { diff --git a/packages/widget/src/types/widget.ts b/packages/widget/src/types/widget.ts index dbcebf992..f166d70b6 100644 --- a/packages/widget/src/types/widget.ts +++ b/packages/widget/src/types/widget.ts @@ -12,6 +12,7 @@ import type { Token, } from '@lifi/sdk' import type { WalletMenuOpenArgs } from '@lifi/wallet-management' +import type { WalletProviderProps } from '@lifi/wallet-provider' import type { Components, PaletteMode, @@ -21,7 +22,13 @@ import type { Theme, } from '@mui/material' import type { TypographyVariantsOptions } from '@mui/material/styles' -import type { CSSProperties, FC, ReactNode, RefObject } from 'react' +import type { + CSSProperties, + FC, + PropsWithChildren, + ReactNode, + RefObject, +} from 'react' import type { BaseAccountParameters, CoinbaseWalletParameters, @@ -136,14 +143,18 @@ export type DefaultUI = { navigationHeaderTitleNoWrap?: boolean } -export interface WidgetWalletConfig { - walletEcosystemsOrder?: Record - onConnect?(args?: WalletMenuOpenArgs): void +interface EVMWalletConfig { walletConnect?: WalletConnectParameters coinbase?: CoinbaseWalletParameters metaMask?: MetaMaskParameters baseAccount?: BaseAccountParameters porto?: Partial +} + +export interface WidgetWalletConfig extends EVMWalletConfig { + walletProviders?: FC>[] + walletEcosystemsOrder?: Record + onConnect?(args?: WalletMenuOpenArgs): void /** * Determines whether the widget should provide partial wallet management functionality. * diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a2d13e5e..5886a69d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1125,11 +1125,14 @@ importers: specifier: workspace:* version: link:../wallet-provider '@mysten/dapp-kit': - specifier: ^0.17.4 - version: 0.17.7(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3) + specifier: '>=0.18.0' + version: 0.18.0(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3) '@mysten/sui': specifier: ^1.38.0 version: 1.38.0(typescript@5.9.3) + '@mysten/wallet-standard': + specifier: ^0.17.0 + version: 0.17.0(typescript@5.9.3) devDependencies: react: specifier: ^19.1.1 @@ -1153,7 +1156,7 @@ importers: specifier: ^0.1.23 version: 0.1.23(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-react': - specifier: ^0.15.39 + specifier: '>=0.15.35' version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10))(react@19.1.1) '@solana/web3.js': specifier: ^1.98.4 @@ -1169,13 +1172,13 @@ importers: packages/wallet-provider-utxo: dependencies: '@bigmi/client': - specifier: ^0.5.3 + specifier: ^0.5.4 version: 0.5.4(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1)) '@bigmi/core': - specifier: ^0.5.3 + specifier: ^0.5.4 version: 0.5.4(@types/react@19.1.16)(bs58@6.0.0)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1)) '@bigmi/react': - specifier: ^0.5.3 + specifier: '>=0.5.0' version: 0.5.4(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1)) '@lifi/sdk': specifier: ^3.12.11 @@ -1208,18 +1211,6 @@ importers: '@lifi/wallet-provider': specifier: workspace:^ version: link:../wallet-provider - '@lifi/wallet-provider-evm': - specifier: workspace:^ - version: link:../wallet-provider-evm - '@lifi/wallet-provider-mvm': - specifier: workspace:^ - version: link:../wallet-provider-mvm - '@lifi/wallet-provider-svm': - specifier: workspace:^ - version: link:../wallet-provider-svm - '@lifi/wallet-provider-utxo': - specifier: workspace:^ - version: link:../wallet-provider-utxo '@mui/icons-material': specifier: ^7.3.2 version: 7.3.2(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.16)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.16)(react@19.1.1))(@types/react@19.1.16)(react@19.1.1))(@types/react@19.1.16)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.16)(react@19.1.1) @@ -1363,6 +1354,9 @@ importers: packages/widget-playground: dependencies: + '@bigmi/react': + specifier: ^0.5.4 + version: 0.5.4(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bs58@6.0.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1)) '@emotion/react': specifier: ^11.14.0 version: 11.14.0(@types/react@19.1.16)(react@19.1.1) @@ -1372,9 +1366,6 @@ importers: '@lifi/sdk': specifier: ^3.12.12 version: 3.12.12(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.3)(utf-8-validate@5.0.10))(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - '@lifi/wallet-management': - specifier: workspace:* - version: link:../wallet-management '@lifi/wallet-provider-evm': specifier: workspace:* version: link:../wallet-provider-evm @@ -1405,6 +1396,9 @@ importers: '@mui/system': specifier: ^7.3.2 version: 7.3.2(@emotion/react@11.14.0(@types/react@19.1.16)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.16)(react@19.1.1))(@types/react@19.1.16)(react@19.1.1))(@types/react@19.1.16)(react@19.1.1) + '@mysten/dapp-kit': + specifier: ^0.18.0 + version: 0.18.0(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3) '@reown/appkit': specifier: ^1.8.8 version: 1.8.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -3744,27 +3738,15 @@ packages: '@mysten/bcs@1.5.0': resolution: {integrity: sha512-v39dm5oNfKYMAf2CVI+L0OaJiG9RVXsjqPM4BwTKcHNCZOvr35IIewGtXtWXsI67SQU2TRq8lhQzeibdiC/CNg==} - '@mysten/bcs@1.7.0': - resolution: {integrity: sha512-8zE2Jzj2ai55RlVXx2pEMbbq+X3vB+uPGBvZr0F79IdTwuwcu4QdFG3PT/zHsytsvATkn+z0f2YDWhM5916u2A==} - '@mysten/bcs@1.8.0': resolution: {integrity: sha512-bDoLN1nN+XPONsvpNyNyqYHndM3PKWS419GLeRnbLoWyNm4bnyD1X4luEpJLLDq400hBuXiCan4RWjofvyTUIQ==} - '@mysten/dapp-kit@0.17.7': - resolution: {integrity: sha512-meLhrdxk3de7pzPnIyCMCRuiTfjvZpbUJ3/WBY1qmuvvY49wsnBrCFqjOUapa0eZP5GlMLKPOAVj+cQa7xyg7A==} - peerDependencies: - '@tanstack/react-query': ^5.0.0 - react: '*' - '@mysten/dapp-kit@0.18.0': resolution: {integrity: sha512-Cxnp2yzqD4RPBc1qRnNrSZCceIVANHKzl2Mgc66e6ICNdRKdIBcDuYFjtaVlVUe2vR/ewCBIGcaQA+BeFH2xnw==} peerDependencies: '@tanstack/react-query': ^5.0.0 react: '*' - '@mysten/slush-wallet@0.1.24': - resolution: {integrity: sha512-3hNYK8odHuajJAuR+t3Hm2LJ6YeDEP7To2msaFHUEOn4FCRJEograCf5h5gDYouBxEcrjEEwNVjP03hk01Gy8w==} - '@mysten/slush-wallet@0.2.0': resolution: {integrity: sha512-2tvTRN1D2n/7XX62oK98VTShhquaHYLysw4tTWAGxIK0Ax6zLc+CPO9cVbgRLjGEmQm2ZN/X3wZVBRUly9GXnA==} @@ -3772,32 +3754,19 @@ packages: resolution: {integrity: sha512-lmJJLM7eMrxM6Qpr6cdLr07UBXlxCM7SJjfcDO7NGrqZTx7/3TD2QhhRpDx0fS2tODxrNwQxCoHPApLVPjokIA==} engines: {node: '>=18'} - '@mysten/sui@1.37.6': - resolution: {integrity: sha512-7ut5tWuXx9OIE+DQ2D5hd22UB8j8K4/F2Lx3R8Ej/JMwkm6cpgbF5FKNu0vYqehxiFEktMnq2YzzajxmlFHNPw==} - engines: {node: '>=18'} - '@mysten/sui@1.38.0': resolution: {integrity: sha512-tH6V4BJsYi5d97MOiLoOhyldrYxkm/cu8dYV52asqh1i88HrSVMbPAJ9sVoeWN2Ju+QsJ/Go4ldSjdCkaBCyJQ==} engines: {node: '>=18'} - '@mysten/utils@0.1.1': - resolution: {integrity: sha512-jvhJC6/2la1QHltukQXzfyTZ+VVHxe187JjPx+mEXRUWyAo6jCSdioOQJIfaGu4K4i+37KeiydXRwV/bq/7UJQ==} - '@mysten/utils@0.2.0': resolution: {integrity: sha512-CM6kJcJHX365cK6aXfFRLBiuyXc5WSBHQ43t94jqlCAIRw8umgNcTb5EnEA9n31wPAQgLDGgbG/rCUISCTJ66w==} '@mysten/wallet-standard@0.13.29': resolution: {integrity: sha512-NR9I3HprticwT3HRPQ36VojV5Gjp+S/iJYdib3qLVrSiCOQjoilmYzA53pDu/rFDSrljskgV/0fAj9ynF9nVFg==} - '@mysten/wallet-standard@0.16.14': - resolution: {integrity: sha512-LJoDQUD+217RdRbkQLiKYYjkNtN6GhGpIN/X3wboUf3w5pdvBc4k/vS1Yi6GFv5xbgl/ge7wzC4Ac+h3orY2oQ==} - '@mysten/wallet-standard@0.17.0': resolution: {integrity: sha512-UQ6tvqQ/lDKZhQm2d3ajky/xl+NgpYpNXYIpWfYGOLvGe4GyK6GHysMNHsRpFa+xA2yVa6w3nWO2RQ8WIy7ivA==} - '@mysten/window-wallet-core@0.0.6': - resolution: {integrity: sha512-uYjdUVok0pAaMGMxAdZfmW+2SCXgdQok9YtKmno5Tj8zlRQGv9Qet7EuCnDcBKquSbtqid3yhug7fcD+t8/KmA==} - '@mysten/window-wallet-core@0.1.0': resolution: {integrity: sha512-QVFthpAv+HJBqoLjsE6gZylE28lrzEd/C68S5tyOCpRV6T3O+P3LCcFmNkLK8gNM6DJNHc/GZgM3f4rTNGOfAQ==} @@ -18816,42 +18785,11 @@ snapshots: dependencies: '@scure/base': 1.2.6 - '@mysten/bcs@1.7.0': - dependencies: - '@mysten/utils': 0.1.1 - '@scure/base': 1.2.6 - '@mysten/bcs@1.8.0': dependencies: '@mysten/utils': 0.2.0 '@scure/base': 1.2.6 - '@mysten/dapp-kit@0.17.7(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.3)': - dependencies: - '@mysten/slush-wallet': 0.1.24(typescript@5.9.3) - '@mysten/sui': 1.37.6(typescript@5.9.3) - '@mysten/utils': 0.1.1 - '@mysten/wallet-standard': 0.16.14(typescript@5.9.3) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.16)(react@19.1.1) - '@tanstack/react-query': 5.90.2(react@19.1.1) - '@vanilla-extract/css': 1.17.4(babel-plugin-macros@3.1.0) - '@vanilla-extract/dynamic': 2.1.5 - '@vanilla-extract/recipes': 0.5.7(@vanilla-extract/css@1.17.4(babel-plugin-macros@3.1.0)) - clsx: 2.1.1 - react: 19.1.1 - zustand: 4.5.7(@types/react@19.1.16)(react@19.1.1) - transitivePeerDependencies: - - '@gql.tada/svelte-support' - - '@gql.tada/vue-support' - - '@types/react' - - '@types/react-dom' - - babel-plugin-macros - - immer - - react-dom - - typescript - '@mysten/dapp-kit@0.18.0(@tanstack/react-query@5.90.2(react@18.3.1))(@types/react-dom@18.3.7(@types/react@19.1.16))(@types/react@19.1.16)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: '@mysten/slush-wallet': 0.2.0(typescript@5.9.3) @@ -18904,19 +18842,6 @@ snapshots: - react-dom - typescript - '@mysten/slush-wallet@0.1.24(typescript@5.9.3)': - dependencies: - '@mysten/sui': 1.37.6(typescript@5.9.3) - '@mysten/utils': 0.1.1 - '@mysten/wallet-standard': 0.16.14(typescript@5.9.3) - '@mysten/window-wallet-core': 0.0.6 - mitt: 3.0.1 - valibot: 0.36.0 - transitivePeerDependencies: - - '@gql.tada/svelte-support' - - '@gql.tada/vue-support' - - typescript - '@mysten/slush-wallet@0.2.0(typescript@5.9.3)': dependencies: '@mysten/sui': 1.38.0(typescript@5.9.3) @@ -18948,25 +18873,6 @@ snapshots: - '@gql.tada/vue-support' - typescript - '@mysten/sui@1.37.6(typescript@5.9.3)': - dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) - '@mysten/bcs': 1.7.0 - '@mysten/utils': 0.1.1 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - gql.tada: 1.8.13(graphql@16.11.0)(typescript@5.9.3) - graphql: 16.11.0 - poseidon-lite: 0.2.1 - valibot: 0.36.0 - transitivePeerDependencies: - - '@gql.tada/svelte-support' - - '@gql.tada/vue-support' - - typescript - '@mysten/sui@1.38.0(typescript@5.9.3)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.11.0) @@ -18986,10 +18892,6 @@ snapshots: - '@gql.tada/vue-support' - typescript - '@mysten/utils@0.1.1': - dependencies: - '@scure/base': 1.2.6 - '@mysten/utils@0.2.0': dependencies: '@scure/base': 1.2.6 @@ -19003,15 +18905,6 @@ snapshots: - '@gql.tada/vue-support' - typescript - '@mysten/wallet-standard@0.16.14(typescript@5.9.3)': - dependencies: - '@mysten/sui': 1.37.6(typescript@5.9.3) - '@wallet-standard/core': 1.1.1 - transitivePeerDependencies: - - '@gql.tada/svelte-support' - - '@gql.tada/vue-support' - - typescript - '@mysten/wallet-standard@0.17.0(typescript@5.9.3)': dependencies: '@mysten/sui': 1.38.0(typescript@5.9.3) @@ -19021,12 +18914,6 @@ snapshots: - '@gql.tada/vue-support' - typescript - '@mysten/window-wallet-core@0.0.6': - dependencies: - '@mysten/utils': 0.1.1 - jose: 6.1.0 - valibot: 0.36.0 - '@mysten/window-wallet-core@0.1.0': dependencies: '@mysten/utils': 0.2.0 @@ -25234,7 +25121,7 @@ snapshots: '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) '@walletconnect/ethereum-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' porto: 0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)) @@ -25563,7 +25450,7 @@ snapshots: '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) '@walletconnect/ethereum-provider': 2.21.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' porto: 0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)) @@ -25685,7 +25572,7 @@ snapshots: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.3) viem: 2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.0(@types/react@19.1.16)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + zustand: 5.0.0(@types/react@19.1.16)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) optionalDependencies: '@tanstack/query-core': 5.90.2 typescript: 5.9.3 @@ -25710,21 +25597,6 @@ snapshots: - react - use-sync-external-store - '@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))': - dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.9.3) - viem: 2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.0(@types/react@19.1.16)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) - optionalDependencies: - '@tanstack/query-core': 5.90.2 - typescript: 5.9.3 - transitivePeerDependencies: - - '@types/react' - - immer - - react - - use-sync-external-store - '@wallet-standard/app@1.0.1': dependencies: '@wallet-standard/base': 1.1.0 @@ -34898,7 +34770,7 @@ snapshots: porto@0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)): dependencies: - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) hono: 4.9.9 idb-keyval: 6.2.2 mipd: 0.0.7(typescript@5.9.3) @@ -34918,7 +34790,7 @@ snapshots: porto@0.2.19(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(@wagmi/core@2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)))(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.81.4(@babel/core@7.28.4)(@types/react@19.1.16)(bufferutil@4.0.9)(react@19.1.1)(utf-8-validate@5.0.10)))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.16)(bufferutil@4.0.9)(db0@0.3.2)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)): dependencies: - '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.5.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.2(@tanstack/query-core@5.90.2)(@types/react@19.1.16)(react@19.1.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.9(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.11)) hono: 4.9.9 idb-keyval: 6.2.2 mipd: 0.0.7(typescript@5.9.3) From 56a8203b7d3f374550334d6b3f0f6acb947c740f Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Mon, 6 Oct 2025 11:22:55 +0100 Subject: [PATCH 15/24] fix: pass wallet providers not via config --- packages/widget-embedded/package.json | 4 ++++ packages/widget-embedded/src/App.tsx | 10 ++++++++++ .../src/components/Widget/WidgetView.tsx | 10 ++++++++++ .../widget-playground/src/defaultWidgetConfig.ts | 11 +++-------- packages/widget/src/App.tsx | 12 ++++++++++-- packages/widget/src/AppProvider.tsx | 15 ++++++++------- .../providers/WalletProvider/WalletProvider.tsx | 8 ++++++-- packages/widget/src/types/widget.ts | 8 ++++++-- pnpm-lock.yaml | 12 ++++++++++++ 9 files changed, 69 insertions(+), 21 deletions(-) diff --git a/packages/widget-embedded/package.json b/packages/widget-embedded/package.json index 2c75c7979..4f4da3a03 100644 --- a/packages/widget-embedded/package.json +++ b/packages/widget-embedded/package.json @@ -15,6 +15,10 @@ "dependencies": { "@lifi/sdk": "^3.12.12", "@lifi/wallet-management": "workspace:*", + "@lifi/wallet-provider-evm": "workspace:*", + "@lifi/wallet-provider-mvm": "workspace:*", + "@lifi/wallet-provider-svm": "workspace:*", + "@lifi/wallet-provider-utxo": "workspace:*", "@lifi/widget": "workspace:*", "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", diff --git a/packages/widget-embedded/src/App.tsx b/packages/widget-embedded/src/App.tsx index dafe26d38..dc1dd05f7 100644 --- a/packages/widget-embedded/src/App.tsx +++ b/packages/widget-embedded/src/App.tsx @@ -1,3 +1,7 @@ +import { EVMProvider } from '@lifi/wallet-provider-evm' +import { MVMProvider } from '@lifi/wallet-provider-mvm' +import { SVMProvider } from '@lifi/wallet-provider-svm' +import { UTXOProvider } from '@lifi/wallet-provider-utxo' import { LiFiWidget } from '@lifi/widget' import { Box, CssBaseline } from '@mui/material' import type { NFTNetwork } from './components/NFTOpenSea/index.js' @@ -27,6 +31,12 @@ export const App = () => { }} > ) : null} {isSkeletonShown ? : null} diff --git a/packages/widget-playground/src/defaultWidgetConfig.ts b/packages/widget-playground/src/defaultWidgetConfig.ts index de6efadf0..72f990dde 100644 --- a/packages/widget-playground/src/defaultWidgetConfig.ts +++ b/packages/widget-playground/src/defaultWidgetConfig.ts @@ -1,8 +1,4 @@ import { ChainId } from '@lifi/sdk' -import { EVMProvider } from '@lifi/wallet-provider-evm' -import { MVMProvider } from '@lifi/wallet-provider-mvm' -import { SVMProvider } from '@lifi/wallet-provider-svm' -import { UTXOProvider } from '@lifi/wallet-provider-utxo' import type { WidgetConfig } from '@lifi/widget' export const widgetBaseConfig: WidgetConfig = { @@ -58,10 +54,9 @@ export const widgetBaseConfig: WidgetConfig = { // navigationHeaderTitleNoWrap: false, // }, // slippage: 0.003, - walletConfig: { - // usePartialWalletManagement: true, - walletProviders: [EVMProvider, MVMProvider, SVMProvider, UTXOProvider], - }, + // walletConfig: { + // usePartialWalletManagement: true, + // }, sdkConfig: { apiUrl: 'https://li.quest/v1', rpcUrls: { diff --git a/packages/widget/src/App.tsx b/packages/widget/src/App.tsx index e6cc4ff7e..1822abd71 100644 --- a/packages/widget/src/App.tsx +++ b/packages/widget/src/App.tsx @@ -23,7 +23,11 @@ export const App = forwardRef((props, ref) => { if (config.variant === 'drawer') { return ( - + ((props, ref) => { } return ( - + ) diff --git a/packages/widget/src/AppProvider.tsx b/packages/widget/src/AppProvider.tsx index acbdd545d..d7a70b720 100644 --- a/packages/widget/src/AppProvider.tsx +++ b/packages/widget/src/AppProvider.tsx @@ -16,19 +16,20 @@ import { } from './providers/WidgetProvider/WidgetProvider.js' import { URLSearchParamsBuilder } from './stores/form/URLSearchParamsBuilder.js' import { StoreProvider } from './stores/StoreProvider.js' -import type { WidgetConfigProps } from './types/widget.js' +import type { + WidgetConfigProps, + WidgetWalletProvidersProps, +} from './types/widget.js' -export const AppProvider: React.FC> = ({ - children, - config, - formRef, -}) => { +export const AppProvider: React.FC< + PropsWithChildren +> = ({ children, config, formRef, walletProviders }) => { return ( - + {children} diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index 4a761ed44..a0326d030 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -3,11 +3,15 @@ import { WalletManagementProvider } from '@lifi/wallet-management' import { type FC, type PropsWithChildren, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useAvailableChains } from '../../hooks/useAvailableChains.js' +import type { WidgetWalletProvidersProps } from '../../types/widget.js' import { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js' import { SDKProviders } from './SDKProviders.js' import { useExternalWalletProvider } from './useExternalWalletProvider.js' -export const WalletProvider = ({ children }: PropsWithChildren) => { +export const WalletProvider = ({ + children, + walletProviders, +}: PropsWithChildren) => { const { walletConfig } = useWidgetConfig() const { chains } = useAvailableChains() @@ -18,7 +22,7 @@ export const WalletProvider = ({ children }: PropsWithChildren) => { ) - for (const ProviderComponent of walletConfig?.walletProviders || []) { + for (const ProviderComponent of walletProviders) { WidgetWithWalletProviders = ( {WidgetWithWalletProviders} diff --git a/packages/widget/src/types/widget.ts b/packages/widget/src/types/widget.ts index f166d70b6..a079455e9 100644 --- a/packages/widget/src/types/widget.ts +++ b/packages/widget/src/types/widget.ts @@ -152,7 +152,6 @@ interface EVMWalletConfig { } export interface WidgetWalletConfig extends EVMWalletConfig { - walletProviders?: FC>[] walletEcosystemsOrder?: Record onConnect?(args?: WalletMenuOpenArgs): void /** @@ -396,6 +395,10 @@ export interface FormRefProps { formRef?: FormRef } +export interface WidgetWalletProvidersProps { + walletProviders: FC>[] +} + export interface WidgetConfigProps extends FormRefProps { config: WidgetConfig } @@ -407,7 +410,8 @@ export interface WidgetConfigPartialProps { export type WidgetProps = WidgetDrawerProps & WidgetConfig & WidgetConfigPartialProps & - FormRefProps + FormRefProps & + WidgetWalletProvidersProps export interface WidgetDrawerProps extends WidgetConfigPartialProps { elementRef?: RefObject diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5886a69d7..d77925773 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1287,6 +1287,18 @@ importers: '@lifi/wallet-management': specifier: workspace:* version: link:../wallet-management + '@lifi/wallet-provider-evm': + specifier: workspace:* + version: link:../wallet-provider-evm + '@lifi/wallet-provider-mvm': + specifier: workspace:* + version: link:../wallet-provider-mvm + '@lifi/wallet-provider-svm': + specifier: workspace:* + version: link:../wallet-provider-svm + '@lifi/wallet-provider-utxo': + specifier: workspace:* + version: link:../wallet-provider-utxo '@lifi/widget': specifier: workspace:* version: link:../widget From b81e110a2d079dd2047a96d1d9ea832b5f25b5a3 Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Mon, 6 Oct 2025 14:35:23 +0100 Subject: [PATCH 16/24] refactor: reduce deps on WalletConnector --- .../src/components/EVMListItemButton.tsx | 27 ++- .../src/components/MVMListItemButton.tsx | 7 +- .../src/components/SVMListItemButton.tsx | 7 +- .../src/components/UTXOListItemButton.tsx | 13 +- .../src/components/WalletMenuContent.tsx | 2 +- .../src/hooks/useCombinedWallets.ts | 46 +--- packages/wallet-provider-evm/src/index.ts | 1 - .../src/providers/CaptureEVMValues.tsx | 196 +++++++++++++++ .../src/providers/EVMBaseProvider.tsx | 15 +- .../src/providers/EVMProvider.tsx | 224 ++---------------- packages/wallet-provider-evm/src/types.ts | 21 ++ .../src/types/connectors.ts | 6 - .../src/utils/extendConnector.ts | 2 +- .../src/providers/CaptureMVMValues.tsx | 92 +++++++ .../src/providers/MVMProvider.tsx | 95 +------- .../src/providers/CaptureSVMValues.tsx | 99 ++++++++ .../src/providers/SVMProvider.tsx | 128 +--------- .../src/providers/CaptureUTXOValues.tsx | 87 +++++++ .../src/providers/UTXOProvider.tsx | 107 +-------- .../src/contexts/defaultContextValue.ts | 1 - packages/wallet-provider/src/types.ts | 12 +- .../WalletProvider/WalletProvider.tsx | 7 +- 22 files changed, 577 insertions(+), 618 deletions(-) create mode 100644 packages/wallet-provider-evm/src/providers/CaptureEVMValues.tsx create mode 100644 packages/wallet-provider-evm/src/types.ts delete mode 100644 packages/wallet-provider-evm/src/types/connectors.ts create mode 100644 packages/wallet-provider-mvm/src/providers/CaptureMVMValues.tsx create mode 100644 packages/wallet-provider-svm/src/providers/CaptureSVMValues.tsx create mode 100644 packages/wallet-provider-utxo/src/providers/CaptureUTXOValues.tsx diff --git a/packages/wallet-management/src/components/EVMListItemButton.tsx b/packages/wallet-management/src/components/EVMListItemButton.tsx index 8d4f2d3a1..4f65cd090 100644 --- a/packages/wallet-management/src/components/EVMListItemButton.tsx +++ b/packages/wallet-management/src/components/EVMListItemButton.tsx @@ -35,7 +35,9 @@ export const EVMListItemButton = ({ } try { - const identityCheckPassed = isWalletInstalled(connector.id ?? '') + const identityCheckPassed = isWalletInstalled( + connector.id ?? connector.name + ) if (!identityCheckPassed) { onNotInstalled?.(connector) return @@ -46,16 +48,19 @@ export const EVMListItemButton = ({ onConnecting?.() // Disconnect currently connected EVM wallet (if any) await disconnect() - await connect(connector, (address: string, chainId: number) => { - setLastConnectedAccount(connector) - emitter.emit(WalletManagementEvent.WalletConnected, { - address: address, - chainId: chainId, - chainType: ChainType.EVM, - connectorId: connector.id ?? '', - connectorName: connectorName, - }) - }) + await connect( + connector.id ?? connector.name, + (address: string, chainId: number) => { + setLastConnectedAccount(connector) + emitter.emit(WalletManagementEvent.WalletConnected, { + address: address, + chainId: chainId, + chainType: ChainType.EVM, + connectorId: connector.id ?? connectorName, + connectorName: connectorName, + }) + } + ) onConnected?.() } catch (error) { onError?.(error) diff --git a/packages/wallet-management/src/components/MVMListItemButton.tsx b/packages/wallet-management/src/components/MVMListItemButton.tsx index 3e4fc67c4..9ad29ef10 100644 --- a/packages/wallet-management/src/components/MVMListItemButton.tsx +++ b/packages/wallet-management/src/components/MVMListItemButton.tsx @@ -20,7 +20,6 @@ export const MVMListItemButton = ({ const { connect } = useMVMContext() const { setLastConnectedAccount } = useLastConnectedAccount() - const connectorName = connector.name const connectorDisplayName: string = ecosystemSelection ? 'Sui' : connector.name @@ -33,14 +32,14 @@ export const MVMListItemButton = ({ try { onConnecting?.() - await connect(connector, (address: string) => { + await connect(connector.id ?? connector.name, (address: string) => { setLastConnectedAccount(connector) emitter.emit(WalletManagementEvent.WalletConnected, { address: address, chainId: ChainId.SOL, chainType: ChainType.SVM, - connectorId: connectorName, - connectorName: connectorName, + connectorId: connector.id ?? connector.name, + connectorName: connector.name, }) }) onConnected?.() diff --git a/packages/wallet-management/src/components/SVMListItemButton.tsx b/packages/wallet-management/src/components/SVMListItemButton.tsx index 3a7dc62e6..517e9c60c 100644 --- a/packages/wallet-management/src/components/SVMListItemButton.tsx +++ b/packages/wallet-management/src/components/SVMListItemButton.tsx @@ -20,7 +20,6 @@ export const SVMListItemButton = ({ const { connect, disconnect, isConnected } = useSVMContext() const { setLastConnectedAccount } = useLastConnectedAccount() - const connectorName = connector.name const connectorDisplayName: string = ecosystemSelection ? 'Solana' : connector.name @@ -36,14 +35,14 @@ export const SVMListItemButton = ({ if (isConnected) { await disconnect() } - await connect(connector, (address: string) => { + await connect(connector.id ?? connector.name, (address: string) => { setLastConnectedAccount(connector) emitter.emit(WalletManagementEvent.WalletConnected, { address: address, chainId: ChainId.SOL, chainType: ChainType.SVM, - connectorId: connectorName, - connectorName: connectorName, + connectorId: connector.id ?? connector.name, + connectorName: connector.name, }) }) onConnected?.() diff --git a/packages/wallet-management/src/components/UTXOListItemButton.tsx b/packages/wallet-management/src/components/UTXOListItemButton.tsx index 51d23eb8a..eb819e3f5 100644 --- a/packages/wallet-management/src/components/UTXOListItemButton.tsx +++ b/packages/wallet-management/src/components/UTXOListItemButton.tsx @@ -22,10 +22,9 @@ export const UTXOListItemButton = ({ const { connect, disconnect } = useUTXOContext() const { setLastConnectedAccount } = useLastConnectedAccount() - const connectorName = connector.name const connectorDisplayName: string = ecosystemSelection ? 'Bitcoin' - : connectorName + : connector.name const handleUTXOConnect = async () => { if (tagType === WalletTagType.Connected) { @@ -34,7 +33,9 @@ export const UTXOListItemButton = ({ } try { - const identityCheckPassed = isWalletInstalled(connector.id ?? '') + const identityCheckPassed = isWalletInstalled( + connector.id ?? connector.name + ) if (!identityCheckPassed) { onNotInstalled?.(connector) return @@ -42,14 +43,14 @@ export const UTXOListItemButton = ({ onConnecting?.() // Disconnect currently connected UTXO wallet (if any) await disconnect() - await connect(connector, (address: string) => { + await connect(connector.id ?? connector.name, (address: string) => { setLastConnectedAccount(connector) emitter.emit(WalletManagementEvent.WalletConnected, { address: address, chainId: ChainId.BTC, chainType: ChainType.UTXO, - connectorId: connector.id ?? '', - connectorName: connectorName, + connectorId: connector.id ?? connector.name, + connectorName: connector.name, }) }) onConnected?.() diff --git a/packages/wallet-management/src/components/WalletMenuContent.tsx b/packages/wallet-management/src/components/WalletMenuContent.tsx index e6cccbee9..d2722b350 100644 --- a/packages/wallet-management/src/components/WalletMenuContent.tsx +++ b/packages/wallet-management/src/components/WalletMenuContent.tsx @@ -71,7 +71,7 @@ export const WalletMenuContent: React.FC = ({ walletChainArgs, }) => { const { t } = useTranslation() - const { installedWallets } = useCombinedWallets() + const installedWallets = useCombinedWallets() const selectedWalletRef = useRef(null) const { accounts } = useAccount() diff --git a/packages/wallet-management/src/hooks/useCombinedWallets.ts b/packages/wallet-management/src/hooks/useCombinedWallets.ts index 02f5b641d..07d878e58 100644 --- a/packages/wallet-management/src/hooks/useCombinedWallets.ts +++ b/packages/wallet-management/src/hooks/useCombinedWallets.ts @@ -6,8 +6,6 @@ import { useUTXOContext, type WalletConnector, } from '@lifi/wallet-provider' -import type { Theme } from '@mui/material' -import { useMediaQuery } from '@mui/material' import { useMemo } from 'react' import { useWalletManagementConfig } from '../providers/WalletManagementProvider/WalletManagementContext.js' import { getConnectorIcon } from '../utils/getConnectorIcon.js' @@ -111,26 +109,10 @@ const combineWalletLists = ( export const useCombinedWallets = () => { const walletConfig = useWalletManagementConfig() - const { - installedWallets: installedEVMWallets, - nonDetectedWallets: nonDetectedEVMWallets, - } = useEVMContext() - const { - installedWallets: installedUTXOWallets, - nonDetectedWallets: nonDetectedUTXOWallets, - } = useUTXOContext() - const { - installedWallets: installedSVMWallets, - nonDetectedWallets: nonDetectedSVMWallets, - } = useSVMContext() - const { - installedWallets: installedMVMWallets, - nonDetectedWallets: nonDetectedMVMWallets, - } = useMVMContext() - - const isDesktopView = useMediaQuery((theme: Theme) => - theme.breakpoints.up('sm') - ) + const { installedWallets: installedEVMWallets } = useEVMContext() + const { installedWallets: installedUTXOWallets } = useUTXOContext() + const { installedWallets: installedSVMWallets } = useSVMContext() + const { installedWallets: installedMVMWallets } = useMVMContext() const combinedWallets = useMemo(() => { const includeEcosystem = (chainType: ChainType) => @@ -145,32 +127,14 @@ export const useCombinedWallets = () => { walletConfig.walletEcosystemsOrder ) - const notDetectedCombinedWallets = isDesktopView - ? combineWalletLists( - nonDetectedEVMWallets, - nonDetectedUTXOWallets, - nonDetectedSVMWallets, - nonDetectedMVMWallets - ) - : [] - installedCombinedWallets.sort(walletComparator) - notDetectedCombinedWallets.sort(walletComparator) - return { - installedWallets: installedCombinedWallets, - notDetectedWallets: notDetectedCombinedWallets, - } + return installedCombinedWallets }, [ installedEVMWallets, installedUTXOWallets, installedSVMWallets, installedMVMWallets, - nonDetectedUTXOWallets, - nonDetectedEVMWallets, - nonDetectedSVMWallets, - nonDetectedMVMWallets, - isDesktopView, walletConfig, ]) diff --git a/packages/wallet-provider-evm/src/index.ts b/packages/wallet-provider-evm/src/index.ts index da35d3b32..7c8ed4c04 100644 --- a/packages/wallet-provider-evm/src/index.ts +++ b/packages/wallet-provider-evm/src/index.ts @@ -1,6 +1,5 @@ export { useSyncWagmiConfig } from './hooks/useSyncWagmiConfig.js' export { EVMProvider, useInEVMContext } from './providers/EVMProvider.js' -export type { CreateConnectorFnExtended } from './types/connectors.js' export { convertExtendedChain, isExtendedChain, diff --git a/packages/wallet-provider-evm/src/providers/CaptureEVMValues.tsx b/packages/wallet-provider-evm/src/providers/CaptureEVMValues.tsx new file mode 100644 index 000000000..e32ada8aa --- /dev/null +++ b/packages/wallet-provider-evm/src/providers/CaptureEVMValues.tsx @@ -0,0 +1,196 @@ +import { ChainType, EVM } from '@lifi/sdk' +import { EVMContext, isWalletInstalled } from '@lifi/wallet-provider' +import { + type FC, + type PropsWithChildren, + useCallback, + useEffect, + useMemo, + useState, +} from 'react' +import { isAddress as isEVMAddress } from 'viem' +import { type Connector, useAccount, useConfig, useConnect } from 'wagmi' +import { + connect, + disconnect, + getAccount, + getConnectorClient, + switchChain, +} from 'wagmi/actions' +import { defaultBaseAccountConfig } from '../config/baseAccount.js' +import { defaultCoinbaseConfig } from '../config/coinbase.js' +import { defaultMetaMaskConfig } from '../config/metaMask.js' +import { defaultWalletConnectConfig } from '../config/walletConnect.js' +import { createBaseAccountConnector } from '../connectors/baseAccount.js' +import { createCoinbaseConnector } from '../connectors/coinbase.js' +import { createMetaMaskConnector } from '../connectors/metaMask.js' +import { createPortoConnector } from '../connectors/porto.js' +import { createWalletConnectConnector } from '../connectors/walletConnect.js' +import type { CreateConnectorFnExtended, EVMWalletConfig } from '../types.js' + +interface CaptureEVMValuesProps { + isExternalContext: boolean + config?: EVMWalletConfig +} + +export const CaptureEVMValues: FC> = ({ + children, + isExternalContext, + config, +}) => { + const wagmiConfig = useConfig() + const currentWallet = useAccount() + const { connectors: wagmiConnectors } = useConnect() + const [connectors, setConnectors] = useState< + (CreateConnectorFnExtended | Connector)[] + >([]) + + useEffect(() => { + ;(async () => { + let evmConnectors: (CreateConnectorFnExtended | Connector)[] = Array.from( + wagmiConnectors + // Remove duplicate connectors + ).filter( + (connector, index, self) => + index === self.findIndex((c) => c.id === connector.id) + ) + + // Check if Safe connector exists and can get a provider + const safeConnector = evmConnectors.find( + (connector) => connector.id === 'safe' + ) as Connector | undefined + let shouldFilterOutSafeConnector = false + + if (safeConnector) { + try { + const provider = await safeConnector.getProvider() + // If no provider is available, we should filter out the Safe connector + if (!provider) { + shouldFilterOutSafeConnector = true + } + } catch { + // If getting provider fails, filter out the Safe connector + shouldFilterOutSafeConnector = true + } + } + + if (shouldFilterOutSafeConnector) { + evmConnectors = evmConnectors.filter( + (connector) => connector.id !== 'safe' + ) + } + + // Ensure standard connectors are included + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('walletconnect') + ) + ) { + evmConnectors.unshift( + createWalletConnectConnector( + config?.walletConnect ?? defaultWalletConnectConfig + ) + ) + } + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('coinbase') + ) + ) { + evmConnectors.unshift( + createCoinbaseConnector(config?.coinbase ?? defaultCoinbaseConfig) + ) + } + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('metamask') + ) + ) { + evmConnectors.unshift( + createMetaMaskConnector(config?.metaMask ?? defaultMetaMaskConfig) + ) + } + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('baseaccount') + ) + ) { + evmConnectors.unshift( + createBaseAccountConnector( + config?.baseAccount ?? defaultBaseAccountConfig + ) + ) + } + if ( + !evmConnectors.some((connector) => + connector.id.toLowerCase().includes('porto') + ) + ) { + evmConnectors.unshift(createPortoConnector(config?.porto)) + } + + setConnectors(evmConnectors) + })() + }, [wagmiConnectors, config]) + + const installedWallets = useMemo( + () => + connectors.filter((connector: Connector | CreateConnectorFnExtended) => + isWalletInstalled(connector.id) + ), + [connectors] + ) + + const handleConnect = useCallback( + async ( + connectorIdOrName: string, + onSuccess?: (address: string, chainId: number) => void + ) => { + const connector = connectors.find( + (connector) => (connector.id ?? connector.name) === connectorIdOrName + ) + if (connector) { + const data = await connect(wagmiConfig, { + connector: connector as Connector, + }) + onSuccess?.(data.accounts[0], data.chainId) + } + }, + [wagmiConfig, connectors] + ) + + const handleDisconnect = useCallback(async () => { + const connectedAccount = getAccount(wagmiConfig) + if (connectedAccount.connector) { + await disconnect(wagmiConfig, { + connector: connectedAccount.connector, + }) + } + }, [wagmiConfig]) + + const account = { ...currentWallet, chainType: ChainType.EVM } + + return ( + getConnectorClient(wagmiConfig), + switchChain: async (chainId: number) => { + const chain = await switchChain(wagmiConfig, { chainId }) + return getConnectorClient(wagmiConfig, { chainId: chain.id }) + }, + }), + account, + installedWallets, + connect: handleConnect, + disconnect: handleDisconnect, + isValidAddress: isEVMAddress, + isExternalContext, + }} + > + {children} + + ) +} diff --git a/packages/wallet-provider-evm/src/providers/EVMBaseProvider.tsx b/packages/wallet-provider-evm/src/providers/EVMBaseProvider.tsx index 7f8951b06..01ef400a8 100644 --- a/packages/wallet-provider-evm/src/providers/EVMBaseProvider.tsx +++ b/packages/wallet-provider-evm/src/providers/EVMBaseProvider.tsx @@ -6,30 +6,31 @@ import { defaultCoinbaseConfig } from '../config/coinbase.js' import { defaultMetaMaskConfig } from '../config/metaMask.js' import { defaultWalletConnectConfig } from '../config/walletConnect.js' import { useSyncWagmiConfig } from '../hooks/useSyncWagmiConfig.js' +import type { EVMWalletConfig } from '../types.js' import { createDefaultWagmiConfig, type DefaultWagmiConfigResult, } from '../utils/createDefaultWagmiConfig.js' interface EVMBaseProviderProps { - walletConfig?: any // TODO: WidgetWalletConfig type + config?: EVMWalletConfig chains?: ExtendedChain[] } export const EVMBaseProvider: FC> = ({ chains, - walletConfig, + config, children, }) => { const wagmi = useRef(null) if (!wagmi.current) { wagmi.current = createDefaultWagmiConfig({ - coinbase: walletConfig?.coinbase ?? defaultCoinbaseConfig, - metaMask: walletConfig?.metaMask ?? defaultMetaMaskConfig, - walletConnect: walletConfig?.walletConnect ?? defaultWalletConnectConfig, - baseAccount: walletConfig?.baseAccount ?? defaultBaseAccountConfig, - porto: walletConfig?.porto, + coinbase: config?.coinbase ?? defaultCoinbaseConfig, + metaMask: config?.metaMask ?? defaultMetaMaskConfig, + walletConnect: config?.walletConnect ?? defaultWalletConnectConfig, + baseAccount: config?.baseAccount ?? defaultBaseAccountConfig, + porto: config?.porto, wagmiConfig: { ssr: true, }, diff --git a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx index 8580bc7db..6c66536d7 100644 --- a/packages/wallet-provider-evm/src/providers/EVMProvider.tsx +++ b/packages/wallet-provider-evm/src/providers/EVMProvider.tsx @@ -1,58 +1,25 @@ -import { ChainType, EVM } from '@lifi/sdk' -import { - EVMContext, - isWalletInstalled, - type WalletConnector, - type WalletProviderProps, -} from '@lifi/wallet-provider' -import { - type FC, - type PropsWithChildren, - useCallback, - useContext, - useEffect, - useMemo, - useState, -} from 'react' -import { isAddress as isEVMAddress } from 'viem' -import { - type Connector, - useAccount, - useConfig, - useConnect, - WagmiContext, -} from 'wagmi' -import { - connect, - disconnect, - getAccount, - getConnectorClient, - switchChain, -} from 'wagmi/actions' -import { defaultBaseAccountConfig } from '../config/baseAccount.js' -import { defaultCoinbaseConfig } from '../config/coinbase.js' -import { defaultMetaMaskConfig } from '../config/metaMask.js' -import { defaultWalletConnectConfig } from '../config/walletConnect.js' -import { createBaseAccountConnector } from '../connectors/baseAccount.js' -import { createCoinbaseConnector } from '../connectors/coinbase.js' -import { createMetaMaskConnector } from '../connectors/metaMask.js' -import { createPortoConnector } from '../connectors/porto.js' -import { createWalletConnectConnector } from '../connectors/walletConnect.js' +import type { WalletProviderProps } from '@lifi/wallet-provider' +import { type FC, type PropsWithChildren, useContext } from 'react' +import { WagmiContext } from 'wagmi' +import type { EVMWalletConfig } from '../types.js' +import { CaptureEVMValues } from './CaptureEVMValues.js' import { EVMBaseProvider } from './EVMBaseProvider.js' +interface EVMProviderProps extends WalletProviderProps { + config?: EVMWalletConfig +} + export function useInEVMContext(): boolean { const context = useContext(WagmiContext) return Boolean(context) } -export const EVMProvider: FC> = ({ - walletConfig, +export const EVMProvider: FC> = ({ + forceInternalWalletManagement, chains, + config, children, }) => { - const forceInternalWalletManagement = - walletConfig?.forceInternalWalletManagement - const inEVMContext = useInEVMContext() if (inEVMContext && !forceInternalWalletManagement) { @@ -64,173 +31,10 @@ export const EVMProvider: FC> = ({ } return ( - - + + {children} ) } - -const CaptureEVMValues: FC< - PropsWithChildren<{ isExternalContext: boolean; walletConfig?: any }> -> = ({ children, isExternalContext, walletConfig }) => { - const config = useConfig() - const currentWallet = useAccount() - const { connectors: wagmiConnectors } = useConnect() - const [connectors, setConnectors] = useState([]) - - useEffect(() => { - ;(async () => { - let evmConnectors: any[] = Array.from( - wagmiConnectors - // Remove duplicate connectors - ).filter( - (connector: any, index: number, self: any) => - index === self.findIndex((c: any) => c.id === connector.id) - ) - - // Check if Safe connector exists and can get a provider - const safeConnector = evmConnectors.find( - (connector) => connector.id === 'safe' - ) as Connector | undefined - let shouldFilterOutSafeConnector = false - - if (safeConnector) { - try { - const provider = await safeConnector.getProvider() - // If no provider is available, we should filter out the Safe connector - if (!provider) { - shouldFilterOutSafeConnector = true - } - } catch { - // If getting provider fails, filter out the Safe connector - shouldFilterOutSafeConnector = true - } - } - - if (shouldFilterOutSafeConnector) { - evmConnectors = evmConnectors.filter( - (connector) => connector.id !== 'safe' - ) - } - - // Ensure standard connectors are included - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('walletconnect') - ) - ) { - evmConnectors.unshift( - createWalletConnectConnector( - walletConfig?.walletConnect ?? defaultWalletConnectConfig - ) - ) - } - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('coinbase') - ) - ) { - evmConnectors.unshift( - createCoinbaseConnector( - walletConfig?.coinbase ?? defaultCoinbaseConfig - ) - ) - } - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('metamask') - ) - ) { - evmConnectors.unshift( - createMetaMaskConnector( - walletConfig?.metaMask ?? defaultMetaMaskConfig - ) - ) - } - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('baseaccount') - ) - ) { - evmConnectors.unshift( - createBaseAccountConnector( - walletConfig?.baseAccount ?? defaultBaseAccountConfig - ) - ) - } - if ( - !evmConnectors.some((connector) => - connector.id.toLowerCase().includes('porto') - ) - ) { - evmConnectors.unshift(createPortoConnector(walletConfig?.porto)) - } - - setConnectors(evmConnectors) - })() - }, [wagmiConnectors, walletConfig]) - - const handleConnect = useCallback( - async ( - connector: WalletConnector, - onSuccess?: (address: string, chainId: number) => void - ) => { - const data = await connect(config, { connector: connector as Connector }) - onSuccess?.(data.accounts[0], data.chainId) - }, - [config] - ) - - const handleDisconnect = useCallback(async () => { - const connectedAccount = getAccount(config) - if (connectedAccount.connector) { - await disconnect(config, { - connector: connectedAccount.connector, - }) - } - }, [config]) - - const account = { ...currentWallet, chainType: ChainType.EVM } - - const installedWallets = useMemo( - () => - connectors.filter((connector: any) => isWalletInstalled(connector.id)), - [connectors] - ) - - const nonDetectedWallets = useMemo( - () => - connectors.filter((connector: any) => !isWalletInstalled(connector.id)), - [connectors] - ) - - return ( - getConnectorClient(config), - switchChain: async (chainId: number) => { - const chain = await switchChain(config, { chainId }) - return getConnectorClient(config, { chainId: chain.id }) - }, - }), - account, - installedWallets, - nonDetectedWallets, - connect: handleConnect, - disconnect: handleDisconnect, - isValidAddress: isEVMAddress, - isExternalContext, - }} - > - {children} - - ) -} diff --git a/packages/wallet-provider-evm/src/types.ts b/packages/wallet-provider-evm/src/types.ts new file mode 100644 index 000000000..f527730db --- /dev/null +++ b/packages/wallet-provider-evm/src/types.ts @@ -0,0 +1,21 @@ +import type { CreateConnectorFn } from 'wagmi' +import type { + BaseAccountParameters, + CoinbaseWalletParameters, + MetaMaskParameters, + PortoParameters, + WalletConnectParameters, +} from 'wagmi/connectors' + +export interface CreateConnectorFnExtended extends CreateConnectorFn { + id: string + displayName: string +} + +export interface EVMWalletConfig { + walletConnect?: WalletConnectParameters + coinbase?: CoinbaseWalletParameters + metaMask?: MetaMaskParameters + baseAccount?: BaseAccountParameters + porto?: Partial +} diff --git a/packages/wallet-provider-evm/src/types/connectors.ts b/packages/wallet-provider-evm/src/types/connectors.ts deleted file mode 100644 index 1a5b8787c..000000000 --- a/packages/wallet-provider-evm/src/types/connectors.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { CreateConnectorFn } from 'wagmi' - -export interface CreateConnectorFnExtended extends CreateConnectorFn { - id: string - displayName: string -} diff --git a/packages/wallet-provider-evm/src/utils/extendConnector.ts b/packages/wallet-provider-evm/src/utils/extendConnector.ts index 3b84eb696..75f9b096a 100644 --- a/packages/wallet-provider-evm/src/utils/extendConnector.ts +++ b/packages/wallet-provider-evm/src/utils/extendConnector.ts @@ -1,5 +1,5 @@ import type { CreateConnectorFn } from 'wagmi' -import type { CreateConnectorFnExtended } from '../types/connectors.js' +import type { CreateConnectorFnExtended } from '../types.js' export const extendConnector = ( connector: CreateConnectorFn, diff --git a/packages/wallet-provider-mvm/src/providers/CaptureMVMValues.tsx b/packages/wallet-provider-mvm/src/providers/CaptureMVMValues.tsx new file mode 100644 index 000000000..d222bf8b1 --- /dev/null +++ b/packages/wallet-provider-mvm/src/providers/CaptureMVMValues.tsx @@ -0,0 +1,92 @@ +import { ChainId, ChainType, Sui } from '@lifi/sdk' +import { type Account, MVMContext } from '@lifi/wallet-provider' +import { + useConnectWallet, + useCurrentWallet, + useDisconnectWallet, + useWallets, +} from '@mysten/dapp-kit' +import { isValidSuiAddress } from '@mysten/sui/utils' +import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' +import { type FC, type PropsWithChildren, useCallback } from 'react' + +interface CaptureMVMValuesProps { + isExternalContext: boolean +} + +export const CaptureMVMValues: FC> = ({ + children, + isExternalContext, +}) => { + const wallets = useWallets() + const { currentWallet, connectionStatus } = useCurrentWallet() + const { mutateAsync: disconnect } = useDisconnectWallet() + const { mutateAsync: connect } = useConnectWallet() + + const account = + currentWallet?.accounts?.length && connectionStatus === 'connected' + ? { + address: currentWallet?.accounts[0].address, + chainId: ChainId.SUI, + chainType: ChainType.MVM, + connector: currentWallet, + isConnected: connectionStatus === 'connected', + isConnecting: false, + isReconnecting: false, + isDisconnected: !currentWallet, + status: connectionStatus, + } + : { + chainType: ChainType.MVM, + isConnected: false, + isConnecting: false, + isReconnecting: false, + isDisconnected: true, + status: 'disconnected', + } + + const handleConnect = useCallback( + async ( + connectorIdOrName: string, + onSuccess?: (address: string, chainId: number) => void + ) => { + const connector = wallets.find( + (wallet) => (wallet.id ?? wallet.name) === connectorIdOrName + ) + if (connector) { + await connect( + { wallet: connector as WalletWithRequiredFeatures }, + { + onSuccess: (standardConnectOutput) => { + onSuccess?.( + standardConnectOutput.accounts[0].address, + ChainId.SUI + ) + }, + } + ) + } + }, + [connect, wallets] + ) + + return ( + currentWallet!, + }), + isConnected: account.isConnected, + installedWallets: wallets, + connect: handleConnect, + disconnect, + isValidAddress: isValidSuiAddress, + isExternalContext, + }} + > + {children} + + ) +} diff --git a/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx index 7f1392c29..412cec65d 100644 --- a/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx +++ b/packages/wallet-provider-mvm/src/providers/MVMProvider.tsx @@ -1,20 +1,7 @@ -import { ChainId, ChainType, Sui } from '@lifi/sdk' -import { - type Account, - MVMContext, - type WalletConnector, - type WalletProviderProps, -} from '@lifi/wallet-provider' -import { - SuiClientContext, - useConnectWallet, - useCurrentWallet, - useDisconnectWallet, - useWallets, -} from '@mysten/dapp-kit' -import { isValidSuiAddress } from '@mysten/sui/utils' -import type { WalletWithRequiredFeatures } from '@mysten/wallet-standard' -import { type FC, type PropsWithChildren, useCallback, useContext } from 'react' +import type { WalletProviderProps } from '@lifi/wallet-provider' +import { SuiClientContext } from '@mysten/dapp-kit' +import { type FC, type PropsWithChildren, useContext } from 'react' +import { CaptureMVMValues } from './CaptureMVMValues.js' import { MVMBaseProvider } from './MVMBaseProvider.js' export function useInMVMContext(): boolean { @@ -23,13 +10,10 @@ export function useInMVMContext(): boolean { } export const MVMProvider: FC> = ({ - walletConfig, + forceInternalWalletManagement, chains, children, }) => { - const forceInternalWalletManagement = - walletConfig?.forceInternalWalletManagement - const inSuiContext = useInMVMContext() if (inSuiContext && !forceInternalWalletManagement) { @@ -48,72 +32,3 @@ export const MVMProvider: FC> = ({ ) } - -const CaptureMVMValues: FC< - PropsWithChildren<{ isExternalContext: boolean }> -> = ({ children, isExternalContext }) => { - const wallets = useWallets() - const { currentWallet, connectionStatus } = useCurrentWallet() - const { mutateAsync: disconnect } = useDisconnectWallet() - const { mutateAsync: connect } = useConnectWallet() - - const account = - currentWallet?.accounts?.length && connectionStatus === 'connected' - ? { - address: currentWallet?.accounts[0].address, - chainId: ChainId.SUI, - chainType: ChainType.MVM, - connector: currentWallet, - isConnected: connectionStatus === 'connected', - isConnecting: false, - isReconnecting: false, - isDisconnected: !currentWallet, - status: connectionStatus, - } - : { - chainType: ChainType.MVM, - isConnected: false, - isConnecting: false, - isReconnecting: false, - isDisconnected: true, - status: 'disconnected', - } - - const handleConnect = useCallback( - async ( - connector: WalletConnector, - onSuccess?: (address: string, chainId: number) => void - ) => { - await connect( - { wallet: connector as unknown as WalletWithRequiredFeatures }, - { - onSuccess: (standardConnectOutput) => { - onSuccess?.(standardConnectOutput.accounts[0].address, ChainId.SUI) - }, - } - ) - }, - [connect] - ) - - return ( - currentWallet!, - }), - isConnected: account.isConnected, - installedWallets: wallets as WalletConnector[], - nonDetectedWallets: [] as WalletConnector[], - connect: handleConnect, - disconnect, - isValidAddress: isValidSuiAddress, - isExternalContext, - }} - > - {children} - - ) -} diff --git a/packages/wallet-provider-svm/src/providers/CaptureSVMValues.tsx b/packages/wallet-provider-svm/src/providers/CaptureSVMValues.tsx new file mode 100644 index 000000000..b60f0fd2c --- /dev/null +++ b/packages/wallet-provider-svm/src/providers/CaptureSVMValues.tsx @@ -0,0 +1,99 @@ +import { ChainId, ChainType, isSVMAddress, Solana } from '@lifi/sdk' +import { type Account, SVMContext } from '@lifi/wallet-provider' +import { + type SignerWalletAdapter, + WalletReadyState, +} from '@solana/wallet-adapter-base' +import { useWallet, type Wallet } from '@solana/wallet-adapter-react' +import type { PublicKey } from '@solana/web3.js' +import { type FC, type PropsWithChildren, useCallback, useMemo } from 'react' + +interface CaptureSVMValuesProps { + isExternalContext: boolean +} + +export const CaptureSVMValues: FC> = ({ + children, + isExternalContext, +}) => { + const { + wallets, + wallet: currentWallet, + select: connect, // We use autoConnect on wallet selection + disconnect, + connected, + } = useWallet() + + const account = currentWallet?.adapter.publicKey + ? { + address: currentWallet?.adapter.publicKey.toString(), + chainId: ChainId.SOL, + chainType: ChainType.SVM, + connector: currentWallet?.adapter, + isConnected: Boolean(currentWallet?.adapter.publicKey) && connected, + isConnecting: false, + isReconnecting: false, + isDisconnected: !currentWallet, + status: 'connected', + } + : { + chainType: ChainType.SVM, + isConnected: false, + isConnecting: false, + isReconnecting: false, + isDisconnected: true, + status: 'disconnected', + } + + const installedWallets = useMemo( + () => + wallets + .filter( + (wallet: Wallet) => + wallet.adapter.readyState === WalletReadyState.Installed || + wallet.adapter.readyState === WalletReadyState.Loadable + ) + .map((wallet: Wallet) => wallet.adapter), + [wallets] + ) + + const handleConnect = useCallback( + async ( + connectorIdOrName: string, + onSuccess?: (address: string, chainId: number) => void + ) => { + const adapter = wallets.find( + (wallet) => wallet.adapter.name === connectorIdOrName + )?.adapter + if (adapter) { + connect(adapter.name) + adapter.once('connect', (publicKey: PublicKey) => { + onSuccess?.(publicKey?.toString(), ChainId.SOL) + }) + } + }, + [connect, wallets] + ) + + return ( + + {children} + + ) +} diff --git a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx index 97af9eeed..e53c83f59 100644 --- a/packages/wallet-provider-svm/src/providers/SVMProvider.tsx +++ b/packages/wallet-provider-svm/src/providers/SVMProvider.tsx @@ -1,28 +1,7 @@ -import { ChainId, ChainType, isSVMAddress, Solana } from '@lifi/sdk' -import { - type Account, - SVMContext, - type WalletConnector, - type WalletProviderProps, -} from '@lifi/wallet-provider' -import { - type Adapter, - type SignerWalletAdapter, - WalletReadyState, -} from '@solana/wallet-adapter-base' -import { - ConnectionContext, - useWallet, - type Wallet, -} from '@solana/wallet-adapter-react' -import type { PublicKey } from '@solana/web3.js' -import { - type FC, - type PropsWithChildren, - useCallback, - useContext, - useMemo, -} from 'react' +import type { WalletProviderProps } from '@lifi/wallet-provider' +import { ConnectionContext } from '@solana/wallet-adapter-react' +import { type FC, type PropsWithChildren, useContext } from 'react' +import { CaptureSVMValues } from './CaptureSVMValues.js' import { SVMBaseProvider } from './SVMBaseProvider.js' export function useInSVMContext(): boolean { @@ -31,12 +10,9 @@ export function useInSVMContext(): boolean { } export const SVMProvider: FC> = ({ - walletConfig, + forceInternalWalletManagement, children, }) => { - const forceInternalWalletManagement = - walletConfig?.forceInternalWalletManagement - const inSVMContext = useInSVMContext() if (inSVMContext && !forceInternalWalletManagement) { @@ -55,97 +31,3 @@ export const SVMProvider: FC> = ({ ) } - -const CaptureSVMValues: FC< - PropsWithChildren<{ isExternalContext: boolean }> -> = ({ children, isExternalContext }) => { - const { - wallets, - wallet: currentWallet, - select: connect, // We use autoConnect on wallet selection - disconnect, - connected, - } = useWallet() - - const account = currentWallet?.adapter.publicKey - ? { - address: currentWallet?.adapter.publicKey.toString(), - chainId: ChainId.SOL, - chainType: ChainType.SVM, - connector: currentWallet?.adapter, - isConnected: Boolean(currentWallet?.adapter.publicKey), - isConnecting: false, - isReconnecting: false, - isDisconnected: !currentWallet, - status: 'connected', - } - : { - chainType: ChainType.SVM, - isConnected: false, - isConnecting: false, - isReconnecting: false, - isDisconnected: true, - status: 'disconnected', - } - - const installedWallets = useMemo( - () => - wallets - .filter( - (wallet: Wallet) => - wallet.adapter.readyState === WalletReadyState.Installed || - wallet.adapter.readyState === WalletReadyState.Loadable - ) - .map((wallet: Wallet) => wallet.adapter), - [wallets] - ) - - const nonDetectedWallets = useMemo( - () => - wallets - .filter( - (wallet: Wallet) => - wallet.adapter.readyState !== WalletReadyState.Installed && - wallet.adapter.readyState !== WalletReadyState.Loadable - ) - .map((wallet: Wallet) => wallet.adapter), - [wallets] - ) - - const handleConnect = useCallback( - async ( - connector: WalletConnector, - onSuccess?: (address: string, chainId: number) => void - ) => { - const adapter = connector as unknown as Adapter - connect(adapter.name) - adapter.once('connect', (publicKey: PublicKey) => { - onSuccess?.(publicKey?.toString(), ChainId.SOL) - }) - }, - [connect] - ) - - return ( - - {children} - - ) -} diff --git a/packages/wallet-provider-utxo/src/providers/CaptureUTXOValues.tsx b/packages/wallet-provider-utxo/src/providers/CaptureUTXOValues.tsx new file mode 100644 index 000000000..461b14c76 --- /dev/null +++ b/packages/wallet-provider-utxo/src/providers/CaptureUTXOValues.tsx @@ -0,0 +1,87 @@ +import { + type Connector, + connect, + disconnect, + getAccount, + getConnectorClient as getBigmiConnectorClient, +} from '@bigmi/client' +import { isUTXOAddress } from '@bigmi/core' +import { useAccount, useConfig, useConnect } from '@bigmi/react' +import { ChainId, ChainType, UTXO } from '@lifi/sdk' +import { isWalletInstalled, UTXOContext } from '@lifi/wallet-provider' +import { type FC, type PropsWithChildren, useCallback, useMemo } from 'react' + +interface CaptureUTXOValuesProps { + isExternalContext: boolean +} + +export const CaptureUTXOValues: FC< + PropsWithChildren +> = ({ children, isExternalContext }) => { + const bigmiConfig = useConfig() + const { connectors } = useConnect() + const currentWallet = useAccount() + + const account = { + ...currentWallet, + chainType: ChainType.UTXO, + chainId: ChainId.BTC, + address: currentWallet.account?.address, + addresses: currentWallet.accounts?.map((account) => account.address), + } + + const handleDisconnect = useCallback(async () => { + const connectedAccount = getAccount(bigmiConfig) + if (connectedAccount.connector) { + await disconnect(bigmiConfig, { + connector: connectedAccount.connector, + }) + } + }, [bigmiConfig]) + + const installedWallets = useMemo( + () => + connectors.filter((connector: Connector) => + isWalletInstalled(connector.id) + ), + [connectors] + ) + + const handleConnect = useCallback( + async ( + connectorIdOrName: string, + onSuccess?: (address: string, chainId: number) => void + ) => { + const connector = connectors.find( + (connector) => (connector.id ?? connector.name) === connectorIdOrName + ) + if (connector) { + const data = await connect(bigmiConfig, { + connector: connector as Connector, + }) + onSuccess?.(data.accounts[0].address, ChainId.BTC) + } + }, + [bigmiConfig, connectors] + ) + + return ( + getBigmiConnectorClient(bigmiConfig), + }), + account, + isConnected: account.isConnected, + installedWallets, + connect: handleConnect, + disconnect: handleDisconnect, + isValidAddress: isUTXOAddress, + isExternalContext, + }} + > + {children} + + ) +} diff --git a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx index 8ed8f9b58..d7b97f02f 100644 --- a/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx +++ b/packages/wallet-provider-utxo/src/providers/UTXOProvider.tsx @@ -1,26 +1,7 @@ -import { - type Connector, - connect, - disconnect, - getAccount, - getConnectorClient as getBigmiConnectorClient, -} from '@bigmi/client' -import { isUTXOAddress } from '@bigmi/core' -import { BigmiContext, useAccount, useConfig, useConnect } from '@bigmi/react' -import { ChainId, ChainType, UTXO } from '@lifi/sdk' -import { - isWalletInstalled, - UTXOContext, - type WalletConnector, - type WalletProviderProps, -} from '@lifi/wallet-provider' -import { - type FC, - type PropsWithChildren, - useCallback, - useContext, - useMemo, -} from 'react' +import { BigmiContext } from '@bigmi/react' +import type { WalletProviderProps } from '@lifi/wallet-provider' +import { type FC, type PropsWithChildren, useContext } from 'react' +import { CaptureUTXOValues } from './CaptureUTXOValues.js' import { UTXOBaseProvider } from './UTXOBaseProvider.js' export function useInUTXOContext(): boolean { @@ -30,12 +11,9 @@ export function useInUTXOContext(): boolean { } export const UTXOProvider: FC> = ({ - walletConfig, + forceInternalWalletManagement, children, }) => { - const forceInternalWalletManagement = - walletConfig?.forceInternalWalletManagement - const inUTXOContext = useInUTXOContext() if (inUTXOContext && !forceInternalWalletManagement) { @@ -54,78 +32,3 @@ export const UTXOProvider: FC> = ({ ) } - -const CaptureUTXOValues: FC< - PropsWithChildren<{ isExternalContext: boolean }> -> = ({ children, isExternalContext }) => { - const bigmiConfig = useConfig() - const { connectors } = useConnect() - const currentWallet = useAccount() - - const account = { - ...currentWallet, - chainType: ChainType.UTXO, - chainId: ChainId.BTC, - address: currentWallet.account?.address, - addresses: currentWallet.accounts?.map((account: any) => account.address), - } - - const handleDisconnect = useCallback(async () => { - const connectedAccount = getAccount(bigmiConfig) - if (connectedAccount.connector) { - await disconnect(bigmiConfig, { - connector: connectedAccount.connector, - }) - } - }, [bigmiConfig]) - - const installedWallets = useMemo( - () => - connectors.filter((connector: Connector) => - isWalletInstalled(connector.id) - ), - [connectors] - ) - - const nonDetectedWallets = useMemo( - () => - connectors.filter( - (connector: Connector) => !isWalletInstalled(connector.id) - ), - [connectors] - ) - - const handleConnect = useCallback( - async ( - connector: WalletConnector, - onSuccess?: (address: string, chainId: number) => void - ) => { - const data = await connect(bigmiConfig, { - connector: connector as Connector, - }) - onSuccess?.(data.accounts[0].address, ChainId.BTC) - }, - [bigmiConfig] - ) - - return ( - getBigmiConnectorClient(bigmiConfig), - }), - account, - isConnected: account.isConnected, - installedWallets, - nonDetectedWallets, - connect: handleConnect, - disconnect: handleDisconnect, - isValidAddress: isUTXOAddress, - isExternalContext, - }} - > - {children} - - ) -} diff --git a/packages/wallet-provider/src/contexts/defaultContextValue.ts b/packages/wallet-provider/src/contexts/defaultContextValue.ts index 350895415..e083741a8 100644 --- a/packages/wallet-provider/src/contexts/defaultContextValue.ts +++ b/packages/wallet-provider/src/contexts/defaultContextValue.ts @@ -7,7 +7,6 @@ export const defaultContextValue: WalletProviderContext = { account: null, sdkProvider: null, installedWallets: [], - nonDetectedWallets: [], isValidAddress: () => false, connect: async () => {}, disconnect: async () => {}, diff --git a/packages/wallet-provider/src/types.ts b/packages/wallet-provider/src/types.ts index b788b4f8a..035473862 100644 --- a/packages/wallet-provider/src/types.ts +++ b/packages/wallet-provider/src/types.ts @@ -1,9 +1,9 @@ import type { ChainType, ExtendedChain, SDKProvider } from '@lifi/sdk' export type WalletConnector = { + name: string id?: string uid?: string - name: string displayName?: string icon?: string } @@ -30,20 +30,14 @@ export type WalletProviderContext = { account: Account | null sdkProvider: SDKProvider | null installedWallets: WalletConnector[] - nonDetectedWallets: WalletConnector[] isValidAddress: (address: string) => boolean connect: ( - connector: WalletConnector, + connectorIdOrName: string, onSuccess?: (address: string, chainId: number) => void ) => Promise disconnect: () => Promise } - -interface WidgetWalletConfig { - forceInternalWalletManagement?: boolean -} - export interface WalletProviderProps { - walletConfig?: WidgetWalletConfig + forceInternalWalletManagement?: boolean chains: ExtendedChain[] } diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index a0326d030..6fa139bc3 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -24,7 +24,12 @@ export const WalletProvider = ({ for (const ProviderComponent of walletProviders) { WidgetWithWalletProviders = ( - + {WidgetWithWalletProviders} ) From 39e28d5d080d30587f724363204e0033aa9ab42b Mon Sep 17 00:00:00 2001 From: Lizaveta Miasayedava Date: Tue, 7 Oct 2025 07:37:58 +0100 Subject: [PATCH 17/24] feat: update examples --- examples/connectkit/package.json | 6 +- examples/connectkit/src/App.tsx | 2 + examples/deposit-flow/package.json | 1 + examples/deposit-flow/src/App.tsx | 2 + examples/dynamic/package.json | 2 + examples/dynamic/src/App.tsx | 4 + .../components/DynamicWidget.tsx | 9 +- .../nextjs-page-router/components/Widget.tsx | 7 +- examples/nextjs-page-router/package.json | 3 +- examples/nextjs/components/DynamicWidget.tsx | 9 +- examples/nextjs/components/Widget.tsx | 7 +- examples/nextjs/package.json | 3 +- .../components/DynamicWidget.tsx | 9 +- .../components/Widget.tsx | 7 +- examples/nextjs14-page-router/package.json | 3 +- .../nextjs14/components/DynamicWidget.tsx | 9 +- examples/nextjs14/components/Widget.tsx | 7 +- examples/nextjs14/package.json | 3 +- examples/nuxt/components/WidgetContainer.vue | 2 + examples/nuxt/package.json | 3 +- examples/privy-ethers/package.json | 3 +- examples/privy-ethers/src/App.tsx | 17 +- examples/privy/package.json | 3 +- examples/privy/src/App.tsx | 3 + examples/rainbowkit/package.json | 2 +- examples/rainbowkit/src/App.tsx | 2 + .../app/components/LiFiWidget.tsx | 2 + examples/react-router-7/package.json | 3 +- examples/remix/app/components/LiFiWidget.tsx | 7 +- examples/remix/package.json | 3 +- examples/reown/package.json | 7 +- examples/reown/src/App.tsx | 4 + examples/svelte/package.json | 1 + examples/svelte/src/lib/LiFiWidget.svelte | 2 + examples/vite/package.json | 4 +- examples/vite/src/App.tsx | 2 + examples/vue/package.json | 3 +- examples/vue/src/components/Widget.vue | 2 + examples/zustand-widget-config/package.json | 1 + .../src/components/WidgetView.tsx | 9 +- packages/wallet-provider-svm/package.json | 3 +- packages/widget-playground-next/package.json | 4 + .../src/app/WidgetNextView.tsx | 10 + pnpm-lock.yaml | 3255 ++++------------- 44 files changed, 848 insertions(+), 2602 deletions(-) diff --git a/examples/connectkit/package.json b/examples/connectkit/package.json index d901e8e1e..9bb54a28e 100644 --- a/examples/connectkit/package.json +++ b/examples/connectkit/package.json @@ -11,12 +11,8 @@ }, "dependencies": { "@lifi/wallet-provider-evm": "workspace:^", - "@lifi/widget": "^3.32.2", - "@mui/icons-material": "7.3.2", + "@lifi/widget": "workspace:^", "@mui/material": "7.3.2", - "@solana/wallet-adapter-base": "^0.9.27", - "@solana/wallet-adapter-react": "^0.15.39", - "@solana/web3.js": "^1.98.4", "@tanstack/react-query": "^5.90.1", "connectkit": "^1.9.1", "mitt": "^3.0.1", diff --git a/examples/connectkit/src/App.tsx b/examples/connectkit/src/App.tsx index 740623e03..c26ea29b2 100644 --- a/examples/connectkit/src/App.tsx +++ b/examples/connectkit/src/App.tsx @@ -1,3 +1,4 @@ +import { EVMProvider } from '@lifi/wallet-provider-evm' import { LiFiWidget } from '@lifi/widget' import { QueryClientProvider } from '@tanstack/react-query' import { WalletHeader } from './components/WalletHeader' @@ -20,6 +21,7 @@ function App() { }, }, }} + walletProviders={[EVMProvider]} /> diff --git a/examples/deposit-flow/package.json b/examples/deposit-flow/package.json index 9217542f4..7f4f79896 100644 --- a/examples/deposit-flow/package.json +++ b/examples/deposit-flow/package.json @@ -12,6 +12,7 @@ "dependencies": { "@lifi/sdk": "^3.12.13", "@lifi/widget": "workspace:^", + "@lifi/wallet-provider-evm": "workspace:^", "@mui/material": "7.3.2", "@tanstack/react-query": "^5.90.1", "events": "^3.3.0", diff --git a/examples/deposit-flow/src/App.tsx b/examples/deposit-flow/src/App.tsx index 4888e834b..cca572834 100644 --- a/examples/deposit-flow/src/App.tsx +++ b/examples/deposit-flow/src/App.tsx @@ -1,3 +1,4 @@ +import { EVMProvider } from '@lifi/wallet-provider-evm' import type { ContractCall, WidgetConfig } from '@lifi/widget' import { ChainType, @@ -60,6 +61,7 @@ export function App() { contractTool={contractTool} config={widgetConfig} integrator={widgetConfig.integrator} + walletProviders={[EVMProvider]} /> ) } diff --git a/examples/dynamic/package.json b/examples/dynamic/package.json index 7b784a1f2..8dd275f10 100644 --- a/examples/dynamic/package.json +++ b/examples/dynamic/package.json @@ -22,6 +22,8 @@ "@lifi/sdk": "^3.12.13", "@lifi/wallet-management": "workspace:^", "@lifi/wallet-provider-evm": "workspace:^", + "@lifi/wallet-provider-svm": "workspace:^", + "@lifi/wallet-provider-utxo": "workspace:^", "@lifi/widget": "workspace:^", "@mui/material": "7.3.2", "@solana/wallet-adapter-base": "^0.9.27", diff --git a/examples/dynamic/src/App.tsx b/examples/dynamic/src/App.tsx index 6584294d6..4cd360444 100644 --- a/examples/dynamic/src/App.tsx +++ b/examples/dynamic/src/App.tsx @@ -3,6 +3,9 @@ import { useIsLoggedIn, useReinitialize, } from '@dynamic-labs/sdk-react-core' +import { EVMProvider } from '@lifi/wallet-provider-evm' +import { SVMProvider } from '@lifi/wallet-provider-svm' +import { UTXOProvider } from '@lifi/wallet-provider-utxo' import { ChainId, LiFiWidget } from '@lifi/widget' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { WalletHeader } from './components/WalletHeader' @@ -53,6 +56,7 @@ export function Main() { }, }, }} + walletProviders={[EVMProvider, SVMProvider, UTXOProvider]} /> ) diff --git a/examples/nextjs-page-router/components/DynamicWidget.tsx b/examples/nextjs-page-router/components/DynamicWidget.tsx index 2175cc7e1..db64e022e 100644 --- a/examples/nextjs-page-router/components/DynamicWidget.tsx +++ b/examples/nextjs-page-router/components/DynamicWidget.tsx @@ -1,3 +1,4 @@ +import { EVMProvider } from '@lifi/wallet-provider-evm' import type { WidgetConfig } from '@lifi/widget' import { LiFiWidget } from '@lifi/widget' @@ -12,5 +13,11 @@ export default function DynamicWidget() { }, } as Partial - return + return ( + + ) } diff --git a/examples/nextjs-page-router/components/Widget.tsx b/examples/nextjs-page-router/components/Widget.tsx index 354d619e8..eab5ea66e 100644 --- a/examples/nextjs-page-router/components/Widget.tsx +++ b/examples/nextjs-page-router/components/Widget.tsx @@ -1,5 +1,6 @@ 'use client' +import { EVMProvider } from '@lifi/wallet-provider-evm' import type { WidgetConfig } from '@lifi/widget' import { LiFiWidget } from '@lifi/widget' import type { ReactNode } from 'react' @@ -13,7 +14,11 @@ interface WidgetProps { export function Widget({ config, fallback }: WidgetProps) { return ( - + ) } diff --git a/examples/nextjs-page-router/package.json b/examples/nextjs-page-router/package.json index 922a1461b..7173105aa 100644 --- a/examples/nextjs-page-router/package.json +++ b/examples/nextjs-page-router/package.json @@ -8,7 +8,8 @@ "start": "next start" }, "dependencies": { - "@lifi/widget": "^3.32.2", + "@lifi/widget": "workspace:^", + "@lifi/wallet-provider-evm": "workspace:^", "next": "^15.5.4", "react": "^19.2.0", "react-dom": "^19.2.0" diff --git a/examples/nextjs/components/DynamicWidget.tsx b/examples/nextjs/components/DynamicWidget.tsx index 2175cc7e1..db64e022e 100644 --- a/examples/nextjs/components/DynamicWidget.tsx +++ b/examples/nextjs/components/DynamicWidget.tsx @@ -1,3 +1,4 @@ +import { EVMProvider } from '@lifi/wallet-provider-evm' import type { WidgetConfig } from '@lifi/widget' import { LiFiWidget } from '@lifi/widget' @@ -12,5 +13,11 @@ export default function DynamicWidget() { }, } as Partial - return + return ( + + ) } diff --git a/examples/nextjs/components/Widget.tsx b/examples/nextjs/components/Widget.tsx index 84086d540..7283e0e9a 100644 --- a/examples/nextjs/components/Widget.tsx +++ b/examples/nextjs/components/Widget.tsx @@ -1,5 +1,6 @@ 'use client' +import { EVMProvider } from '@lifi/wallet-provider-evm' import type { WidgetConfig } from '@lifi/widget' import { LiFiWidget, WidgetSkeleton } from '@lifi/widget' import { ClientOnly } from './ClientOnly' @@ -17,7 +18,11 @@ export function Widget() { return ( }> - + ) } diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index b23d9f2d3..2d324ede3 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -12,7 +12,8 @@ }, "dependencies": { "@lifi/sdk": "^3.12.13", - "@lifi/widget": "^3.32.2", + "@lifi/widget": "workspace:^", + "@lifi/wallet-provider-evm": "workspace:^", "@mui/material-nextjs": "7.3.2", "next": "^15.5.4", "react": "^19.2.0", diff --git a/examples/nextjs14-page-router/components/DynamicWidget.tsx b/examples/nextjs14-page-router/components/DynamicWidget.tsx index 2175cc7e1..db64e022e 100644 --- a/examples/nextjs14-page-router/components/DynamicWidget.tsx +++ b/examples/nextjs14-page-router/components/DynamicWidget.tsx @@ -1,3 +1,4 @@ +import { EVMProvider } from '@lifi/wallet-provider-evm' import type { WidgetConfig } from '@lifi/widget' import { LiFiWidget } from '@lifi/widget' @@ -12,5 +13,11 @@ export default function DynamicWidget() { }, } as Partial - return + return ( + + ) } diff --git a/examples/nextjs14-page-router/components/Widget.tsx b/examples/nextjs14-page-router/components/Widget.tsx index 354d619e8..eab5ea66e 100644 --- a/examples/nextjs14-page-router/components/Widget.tsx +++ b/examples/nextjs14-page-router/components/Widget.tsx @@ -1,5 +1,6 @@ 'use client' +import { EVMProvider } from '@lifi/wallet-provider-evm' import type { WidgetConfig } from '@lifi/widget' import { LiFiWidget } from '@lifi/widget' import type { ReactNode } from 'react' @@ -13,7 +14,11 @@ interface WidgetProps { export function Widget({ config, fallback }: WidgetProps) { return ( - + ) } diff --git a/examples/nextjs14-page-router/package.json b/examples/nextjs14-page-router/package.json index 48ecfb4a3..230319805 100644 --- a/examples/nextjs14-page-router/package.json +++ b/examples/nextjs14-page-router/package.json @@ -9,7 +9,8 @@ "lint": "next lint" }, "dependencies": { - "@lifi/widget": "^3.32.2", + "@lifi/widget": "workspace:^", + "@lifi/wallet-provider-evm": "workspace:^", "next": "15.5.4", "react": "^19.2.0", "react-dom": "^19.2.0" diff --git a/examples/nextjs14/components/DynamicWidget.tsx b/examples/nextjs14/components/DynamicWidget.tsx index 2175cc7e1..db64e022e 100644 --- a/examples/nextjs14/components/DynamicWidget.tsx +++ b/examples/nextjs14/components/DynamicWidget.tsx @@ -1,3 +1,4 @@ +import { EVMProvider } from '@lifi/wallet-provider-evm' import type { WidgetConfig } from '@lifi/widget' import { LiFiWidget } from '@lifi/widget' @@ -12,5 +13,11 @@ export default function DynamicWidget() { }, } as Partial - return + return ( + + ) } diff --git a/examples/nextjs14/components/Widget.tsx b/examples/nextjs14/components/Widget.tsx index 84086d540..7283e0e9a 100644 --- a/examples/nextjs14/components/Widget.tsx +++ b/examples/nextjs14/components/Widget.tsx @@ -1,5 +1,6 @@ 'use client' +import { EVMProvider } from '@lifi/wallet-provider-evm' import type { WidgetConfig } from '@lifi/widget' import { LiFiWidget, WidgetSkeleton } from '@lifi/widget' import { ClientOnly } from './ClientOnly' @@ -17,7 +18,11 @@ export function Widget() { return ( }> - + ) } diff --git a/examples/nextjs14/package.json b/examples/nextjs14/package.json index 0075f9e45..88b9745dc 100644 --- a/examples/nextjs14/package.json +++ b/examples/nextjs14/package.json @@ -10,7 +10,8 @@ }, "dependencies": { "@lifi/sdk": "^3.12.13", - "@lifi/widget": "^3.32.2", + "@lifi/widget": "workspace:^", + "@lifi/wallet-provider-evm": "workspace:^", "@mui/material-nextjs": "7.3.2", "next": "15.5.4", "react": "^19.2.0", diff --git a/examples/nuxt/components/WidgetContainer.vue b/examples/nuxt/components/WidgetContainer.vue index ed7fef131..f3f898661 100644 --- a/examples/nuxt/components/WidgetContainer.vue +++ b/examples/nuxt/components/WidgetContainer.vue @@ -5,6 +5,7 @@ @@ -14,6 +15,7 @@ import ReactAdapter from './ReactAdapter.svelte' }, }} integrator="svelte-example" + walletProviders={[EVMProvider]} />