From af88109e0596b068d524a9e97dce6eb7f15c0605 Mon Sep 17 00:00:00 2001 From: Eugene Chybisov Date: Tue, 24 Mar 2026 16:55:07 +0100 Subject: [PATCH 1/4] refactor: improve wallet provider context and SDK client integration --- .../providers/WalletManagementProviders.tsx | 12 ++- .../WalletMenuProvider/WalletMenuContext.ts | 2 +- .../src/providers/WalletMenuProvider/types.ts | 2 +- .../src/providers/BitcoinProvider.tsx | 6 +- .../src/providers/BitcoinProviderValues.tsx | 56 +++++++---- .../src/providers/EthereumProvider.tsx | 6 +- .../src/providers/EthereumProviderValues.tsx | 59 ++++++++---- .../src/providers/SolanaProvider.tsx | 3 +- .../src/providers/SolanaProviderValues.tsx | 96 +++++++++++-------- .../src/providers/SuiBaseProvider.tsx | 10 +- .../src/providers/SuiProvider.tsx | 10 +- .../src/providers/SuiProviderValues.tsx | 88 ++++++++++------- .../src/hooks/useSDKProviders.ts | 14 +-- packages/widget-provider/src/types.ts | 1 + packages/widget/src/AppProvider.tsx | 3 - .../src/providers/SDKClientProvider.tsx | 39 +++++--- .../WalletProvider/WalletProvider.tsx | 33 +++++-- 17 files changed, 280 insertions(+), 160 deletions(-) diff --git a/packages/wallet-management/src/providers/WalletManagementProviders.tsx b/packages/wallet-management/src/providers/WalletManagementProviders.tsx index b731890cc..ad66658cf 100644 --- a/packages/wallet-management/src/providers/WalletManagementProviders.tsx +++ b/packages/wallet-management/src/providers/WalletManagementProviders.tsx @@ -1,6 +1,9 @@ import type { ExtendedChain } from '@lifi/sdk' import type { WidgetProviderProps } from '@lifi/widget-provider' import { type PropsWithChildren, type ReactNode, useMemo, useRef } from 'react' + +const EMPTY_CHAINS: ExtendedChain[] = [] + import type { WalletManagementProviderProps } from './WalletManagementProvider/types.js' import { WalletManagementProvider } from './WalletManagementProvider/WalletManagementProvider.js' @@ -13,6 +16,7 @@ export interface WalletManagementProvidersProps providers?: WidgetProvider[] chains?: ExtendedChain[] forceInternalWalletManagement?: boolean + isExternalContext?: boolean } export const WalletManagementProviders = ({ @@ -20,6 +24,7 @@ export const WalletManagementProviders = ({ providers, chains, forceInternalWalletManagement, + isExternalContext, children, }: PropsWithChildren) => { const prevProvidersRef = useRef(providers) @@ -49,11 +54,12 @@ export const WalletManagementProviders = ({ } return memoizedProviders.reduceRight( - (acc, ProviderComponent) => ( + (acc, ProviderComponent, index) => ( {acc} diff --git a/packages/wallet-management/src/providers/WalletMenuProvider/WalletMenuContext.ts b/packages/wallet-management/src/providers/WalletMenuProvider/WalletMenuContext.ts index aa8482399..127108d4f 100644 --- a/packages/wallet-management/src/providers/WalletMenuProvider/WalletMenuContext.ts +++ b/packages/wallet-management/src/providers/WalletMenuProvider/WalletMenuContext.ts @@ -5,7 +5,7 @@ import type { } from './types.js' export const WalletMenuContext = createContext<_WalletMenuContext>({ - isWalletMenuOpen: () => {}, + isWalletMenuOpen: () => false, toggleWalletMenu: () => {}, openWalletMenu: (_?: WalletMenuOpenArgs) => {}, closeWalletMenu: () => {}, diff --git a/packages/wallet-management/src/providers/WalletMenuProvider/types.ts b/packages/wallet-management/src/providers/WalletMenuProvider/types.ts index 730bb6986..a47bb40ef 100644 --- a/packages/wallet-management/src/providers/WalletMenuProvider/types.ts +++ b/packages/wallet-management/src/providers/WalletMenuProvider/types.ts @@ -6,7 +6,7 @@ export interface WalletMenuOpenArgs { } export interface WalletMenuContext { - isWalletMenuOpen(): void + isWalletMenuOpen(): boolean toggleWalletMenu(): void openWalletMenu(args?: WalletMenuOpenArgs): void closeWalletMenu(): void diff --git a/packages/widget-provider-bitcoin/src/providers/BitcoinProvider.tsx b/packages/widget-provider-bitcoin/src/providers/BitcoinProvider.tsx index 8882ae7e9..918c78e15 100644 --- a/packages/widget-provider-bitcoin/src/providers/BitcoinProvider.tsx +++ b/packages/widget-provider-bitcoin/src/providers/BitcoinProvider.tsx @@ -12,13 +12,15 @@ function useInBitcoinContext(): boolean { const BitcoinWidgetProvider = ({ forceInternalWalletManagement, + isExternalContext = false, children, }: PropsWithChildren) => { const inBitcoinContext = useInBitcoinContext() + const effectiveIsExternal = isExternalContext || inBitcoinContext if (inBitcoinContext && !forceInternalWalletManagement) { return ( - + {children} ) @@ -26,7 +28,7 @@ const BitcoinWidgetProvider = ({ return ( - + {children} diff --git a/packages/widget-provider-bitcoin/src/providers/BitcoinProviderValues.tsx b/packages/widget-provider-bitcoin/src/providers/BitcoinProviderValues.tsx index ebc6d0087..7682e677c 100644 --- a/packages/widget-provider-bitcoin/src/providers/BitcoinProviderValues.tsx +++ b/packages/widget-provider-bitcoin/src/providers/BitcoinProviderValues.tsx @@ -22,13 +22,16 @@ export const BitcoinProviderValues: FC< 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 account = useMemo( + () => ({ + ...currentWallet, + chainType: ChainType.UTXO, + chainId: ChainId.BTC, + address: currentWallet.account?.address, + addresses: currentWallet.accounts?.map((account) => account.address), + }), + [currentWallet] + ) const isConnected = account.isConnected @@ -60,7 +63,9 @@ export const BitcoinProviderValues: FC< const data = await connect(bigmiConfig, { connector: connector as Connector, }) - onSuccess?.(data.accounts[0].address, ChainId.BTC) + if (data.accounts.length > 0) { + onSuccess?.(data.accounts[0].address, ChainId.BTC) + } } }, [bigmiConfig, connectors] @@ -75,19 +80,30 @@ export const BitcoinProviderValues: FC< } }, [bigmiConfig]) + const contextValue = useMemo( + () => ({ + isEnabled: true, + account, + sdkProvider, + installedWallets, + isConnected, + isExternalContext, + connect: handleConnect, + disconnect: handleDisconnect, + }), + [ + account, + sdkProvider, + installedWallets, + isConnected, + isExternalContext, + handleConnect, + handleDisconnect, + ] + ) + return ( - + {children} ) diff --git a/packages/widget-provider-ethereum/src/providers/EthereumProvider.tsx b/packages/widget-provider-ethereum/src/providers/EthereumProvider.tsx index 204e34146..bdb82d355 100644 --- a/packages/widget-provider-ethereum/src/providers/EthereumProvider.tsx +++ b/packages/widget-provider-ethereum/src/providers/EthereumProvider.tsx @@ -16,16 +16,18 @@ function useInEthereumContext(): boolean { const EthereumWidgetProvider = ({ forceInternalWalletManagement, + isExternalContext = false, chains, config, children, }: PropsWithChildren) => { const inEthereumContext = useInEthereumContext() + const effectiveIsExternal = isExternalContext || inEthereumContext if (inEthereumContext && !forceInternalWalletManagement) { return ( {children} @@ -36,7 +38,7 @@ const EthereumWidgetProvider = ({ return ( {children} diff --git a/packages/widget-provider-ethereum/src/providers/EthereumProviderValues.tsx b/packages/widget-provider-ethereum/src/providers/EthereumProviderValues.tsx index 1e83c9c6b..926c79870 100644 --- a/packages/widget-provider-ethereum/src/providers/EthereumProviderValues.tsx +++ b/packages/widget-provider-ethereum/src/providers/EthereumProviderValues.tsx @@ -161,7 +161,10 @@ export const EthereumProviderValues: FC< })() }, [wagmiConnectors, config]) - const account = { ...currentWallet, chainType: ChainType.EVM } + const account = useMemo( + () => ({ ...currentWallet, chainType: ChainType.EVM }), + [currentWallet] + ) const isConnected = account.isConnected @@ -199,7 +202,9 @@ export const EthereumProviderValues: FC< const data = await connect(wagmiConfig, { connector: connector as Connector, }) - onSuccess?.(data.accounts[0], data.chainId) + if (data.accounts.length > 0) { + onSuccess?.(data.accounts[0], data.chainId) + } } }, [wagmiConfig, connectors] @@ -232,25 +237,39 @@ export const EthereumProviderValues: FC< [wagmiConfig] ) + const contextValue = useMemo( + () => ({ + isEnabled: true, + account, + sdkProvider, + installedWallets, + isConnected, + isExternalContext, + connect: handleConnect, + disconnect: handleDisconnect, + getBytecode: handleGetBytecode, + getTransactionCount: handleGetTransactionCount, + isGaslessStep, + isBatchingSupported, + isDelegationDesignatorCode, + disableMessageSigning: config?.disableMessageSigning, + }), + [ + account, + sdkProvider, + installedWallets, + isConnected, + isExternalContext, + handleConnect, + handleDisconnect, + handleGetBytecode, + handleGetTransactionCount, + config?.disableMessageSigning, + ] + ) + return ( - + {children} ) diff --git a/packages/widget-provider-solana/src/providers/SolanaProvider.tsx b/packages/widget-provider-solana/src/providers/SolanaProvider.tsx index c5b04c2b1..c86c18ede 100644 --- a/packages/widget-provider-solana/src/providers/SolanaProvider.tsx +++ b/packages/widget-provider-solana/src/providers/SolanaProvider.tsx @@ -4,9 +4,10 @@ import { SolanaProviderValues } from './SolanaProviderValues.js' const SolanaWidgetProvider = ({ children, + isExternalContext = false, }: PropsWithChildren) => { return ( - + {children} ) diff --git a/packages/widget-provider-solana/src/providers/SolanaProviderValues.tsx b/packages/widget-provider-solana/src/providers/SolanaProviderValues.tsx index 646a0b38a..8902fe57c 100644 --- a/packages/widget-provider-solana/src/providers/SolanaProviderValues.tsx +++ b/packages/widget-provider-solana/src/providers/SolanaProviderValues.tsx @@ -22,33 +22,38 @@ export const SolanaProviderValues: FC< const { address: accountAddress } = useWalletAccount() - const connector = currentWallet - ? { - name: currentWallet.name, - icon: currentWallet.icon, - } - : undefined + const connector = useMemo( + () => + currentWallet + ? { name: currentWallet.name, icon: currentWallet.icon } + : undefined, + [currentWallet] + ) - const account = accountAddress - ? { - address: accountAddress, - chainId: ChainId.SOL, - chainType: ChainType.SVM, - connector, - isConnected: connected, - isConnecting: false, - isReconnecting: false, - isDisconnected: false, - status: 'connected' as const, - } - : { - chainType: ChainType.SVM, - isConnected: false, - isConnecting: false, - isReconnecting: false, - isDisconnected: true, - status: 'disconnected' as const, - } + const account = useMemo( + () => + accountAddress + ? { + address: accountAddress, + chainId: ChainId.SOL, + chainType: ChainType.SVM, + connector, + isConnected: connected, + isConnecting: false, + isReconnecting: false, + isDisconnected: false, + status: 'connected' as const, + } + : { + chainType: ChainType.SVM, + isConnected: false, + isConnecting: false, + isReconnecting: false, + isDisconnected: true, + status: 'disconnected' as const, + }, + [accountAddress, connected, connector] + ) const isConnected = account.isConnected @@ -96,19 +101,34 @@ export const SolanaProviderValues: FC< [connect] ) + const handleDisconnect = useCallback(async () => { + await disconnect() + }, [disconnect]) + + const contextValue = useMemo( + () => ({ + isEnabled: true, + account, + sdkProvider, + installedWallets, + isConnected, + isExternalContext, + connect: handleConnect, + disconnect: handleDisconnect, + }), + [ + account, + sdkProvider, + installedWallets, + isConnected, + isExternalContext, + handleConnect, + handleDisconnect, + ] + ) + return ( - + {children} ) diff --git a/packages/widget-provider-sui/src/providers/SuiBaseProvider.tsx b/packages/widget-provider-sui/src/providers/SuiBaseProvider.tsx index c508f114e..466c6cba2 100644 --- a/packages/widget-provider-sui/src/providers/SuiBaseProvider.tsx +++ b/packages/widget-provider-sui/src/providers/SuiBaseProvider.tsx @@ -11,15 +11,15 @@ import { SuiProviderValues } from './SuiProviderValues.js' interface SuiBaseProviderProps { chains?: ExtendedChain[] - namePrefix?: string + isExternalContext?: boolean } export const SuiBaseProvider: FC> = ({ chains, children, - namePrefix, + isExternalContext = false, }) => { - const storageKey = `${namePrefix || 'li.fi'}-sui-dapp-kit` + const storageKey = 'li.fi-sui-dapp-kit' const dappKit = useRef(null) if (!dappKit.current) { @@ -33,14 +33,14 @@ export const SuiBaseProvider: FC> = ({ sui?.metamask?.rpcUrls[0] ?? getJsonRpcFullnodeUrl('mainnet'), }), autoConnect: true, - storage: localStorage, + storage: typeof window !== 'undefined' ? localStorage : undefined, storageKey, }) } return ( - + {children} diff --git a/packages/widget-provider-sui/src/providers/SuiProvider.tsx b/packages/widget-provider-sui/src/providers/SuiProvider.tsx index b6d35d196..c8fa1279c 100644 --- a/packages/widget-provider-sui/src/providers/SuiProvider.tsx +++ b/packages/widget-provider-sui/src/providers/SuiProvider.tsx @@ -11,20 +11,26 @@ function useInSuiContext(): boolean { const SuiWidgetProvider = ({ forceInternalWalletManagement, + isExternalContext = false, chains, children, }: PropsWithChildren) => { const inSuiContext = useInSuiContext() + const effectiveIsExternal = isExternalContext || inSuiContext if (inSuiContext && !forceInternalWalletManagement) { return ( - + {children} ) } - return {children} + return ( + + {children} + + ) } export const SuiProvider = () => { diff --git a/packages/widget-provider-sui/src/providers/SuiProviderValues.tsx b/packages/widget-provider-sui/src/providers/SuiProviderValues.tsx index 5f0545823..0807874f2 100644 --- a/packages/widget-provider-sui/src/providers/SuiProviderValues.tsx +++ b/packages/widget-provider-sui/src/providers/SuiProviderValues.tsx @@ -23,29 +23,32 @@ export const SuiProviderValues: FC< const currentWallet = useCurrentWallet() const { status: connectionStatus, isConnected } = useWalletConnection() - const account = - currentWallet?.accounts?.length && connectionStatus === 'connected' - ? { - address: currentWallet?.accounts[0].address, - chainId: ChainId.SUI, - chainType: ChainType.MVM, - connector: currentWallet, - isConnected: isConnected, - isConnecting: false, - isReconnecting: false, - isDisconnected: !currentWallet, - status: connectionStatus, - } - : { - chainType: ChainType.MVM, - isConnected: false, - isConnecting: false, - isReconnecting: false, - isDisconnected: true, - status: 'disconnected' as const, - } + const account = useMemo( + () => + currentWallet?.accounts?.length && connectionStatus === 'connected' + ? { + address: currentWallet?.accounts[0].address, + chainId: ChainId.SUI, + chainType: ChainType.MVM, + connector: currentWallet, + isConnected: isConnected, + isConnecting: false, + isReconnecting: false, + isDisconnected: !currentWallet, + status: connectionStatus, + } + : { + chainType: ChainType.MVM, + isConnected: false, + isConnecting: false, + isReconnecting: false, + isDisconnected: true, + status: 'disconnected' as const, + }, + [currentWallet, connectionStatus, isConnected] + ) - const installedWallets = wallets + const installedWallets = useMemo(() => wallets, [wallets]) const sdkProvider = useMemo( () => @@ -74,20 +77,33 @@ export const SuiProviderValues: FC< [connect, wallets] ) + const handleDisconnect = useCallback(async () => { + await disconnect() + }, [disconnect]) + + const contextValue = useMemo( + () => ({ + isEnabled: true, + account, + sdkProvider, + installedWallets, + isConnected, + isExternalContext, + connect: handleConnect, + disconnect: handleDisconnect, + }), + [ + account, + sdkProvider, + installedWallets, + isConnected, + isExternalContext, + handleConnect, + handleDisconnect, + ] + ) + return ( - - {children} - + {children} ) } diff --git a/packages/widget-provider/src/hooks/useSDKProviders.ts b/packages/widget-provider/src/hooks/useSDKProviders.ts index 30d5920de..e22fe7b7a 100644 --- a/packages/widget-provider/src/hooks/useSDKProviders.ts +++ b/packages/widget-provider/src/hooks/useSDKProviders.ts @@ -1,4 +1,5 @@ import type { SDKProvider } from '@lifi/sdk' +import { useMemo } from 'react' import { useBitcoinContext } from '../contexts/BitcoinContext' import { useEthereumContext } from '../contexts/EthereumContext' import { useSolanaContext } from '../contexts/SolanaContext' @@ -10,10 +11,11 @@ export const useSDKProviders = () => { const { sdkProvider: svmSDKProvider } = useSolanaContext() const { sdkProvider: suiSDKProvider } = useSuiContext() - return [ - evmSDKProvider, - utxoSDKProvider, - svmSDKProvider, - suiSDKProvider, - ].filter(Boolean) as SDKProvider[] + return useMemo( + () => + [evmSDKProvider, utxoSDKProvider, svmSDKProvider, suiSDKProvider].filter( + Boolean + ) as SDKProvider[], + [evmSDKProvider, utxoSDKProvider, svmSDKProvider, suiSDKProvider] + ) } diff --git a/packages/widget-provider/src/types.ts b/packages/widget-provider/src/types.ts index e0223f38d..615b268f7 100644 --- a/packages/widget-provider/src/types.ts +++ b/packages/widget-provider/src/types.ts @@ -76,5 +76,6 @@ export type EthereumProviderContext = WidgetProviderContext & { export interface WidgetProviderProps { forceInternalWalletManagement?: boolean + isExternalContext?: boolean chains: ExtendedChain[] } diff --git a/packages/widget/src/AppProvider.tsx b/packages/widget/src/AppProvider.tsx index 153cc5e47..e4488c67e 100644 --- a/packages/widget/src/AppProvider.tsx +++ b/packages/widget/src/AppProvider.tsx @@ -14,9 +14,6 @@ export const AppProvider: React.FC> = ({ config, formRef, }) => { - if (!config.providers?.length && process.env.NODE_ENV === 'development') { - console.warn('No widget providers specified') - } return ( diff --git a/packages/widget/src/providers/SDKClientProvider.tsx b/packages/widget/src/providers/SDKClientProvider.tsx index 36e6814ab..688a55c67 100644 --- a/packages/widget/src/providers/SDKClientProvider.tsx +++ b/packages/widget/src/providers/SDKClientProvider.tsx @@ -13,25 +13,42 @@ const SDKClientContext = createContext({} as SDKClient) export const useSDKClient = () => useContext(SDKClientContext) export const SDKClientProvider = ({ children }: PropsWithChildren) => { - const widgetConfig = useWidgetConfig() + const { + sdkConfig, + apiKey, + integrator, + feeConfig, + fee, + referrer, + routePriority, + slippage, + } = useWidgetConfig() const client: SDKClient = useMemo(() => { return createClient({ - ...widgetConfig.sdkConfig, - apiKey: widgetConfig.apiKey, - integrator: widgetConfig.integrator ?? window?.location.hostname, + ...sdkConfig, + apiKey, + integrator: integrator ?? window?.location.hostname, routeOptions: { - fee: widgetConfig.feeConfig?.fee || widgetConfig.fee, - referrer: widgetConfig.referrer, - order: widgetConfig.routePriority, - slippage: widgetConfig.slippage, - ...widgetConfig.sdkConfig?.routeOptions, + fee: feeConfig?.fee || fee, + referrer, + order: routePriority, + slippage, + ...sdkConfig?.routeOptions, }, disableVersionCheck: true, widgetVersion: version, - // debug: true, }) - }, [widgetConfig]) + }, [ + sdkConfig, + apiKey, + integrator, + feeConfig, + fee, + referrer, + routePriority, + slippage, + ]) return ( diff --git a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx index 26423b4da..3e8497dad 100644 --- a/packages/widget/src/providers/WalletProvider/WalletProvider.tsx +++ b/packages/widget/src/providers/WalletProvider/WalletProvider.tsx @@ -1,6 +1,6 @@ import { WalletManagementProviders } from '@lifi/wallet-management' import type { WidgetProviderProps } from '@lifi/widget-provider' -import type { FC, PropsWithChildren, ReactNode } from 'react' +import { type FC, type PropsWithChildren, type ReactNode, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useAvailableChains } from '../../hooks/useAvailableChains.js' import { useInitializeSDKProviders } from '../../hooks/useInitializeSDKProviders.js' @@ -21,17 +21,32 @@ export const WalletProvider = ({ const { useExternalWalletProvidersOnly, internalChainTypes } = useExternalWalletProvider() - // If all chain types are already managed externally (host app set up providers), - // skip re-composing — the contexts are already populated above us. + if ( + !providers.length && + !useExternalWalletProvidersOnly && + process.env.NODE_ENV === 'development' + ) { + console.warn('No widget providers specified') + } + const effectiveProviders = useExternalWalletProvidersOnly ? [] : providers + const walletManagementConfig = useMemo( + () => ({ + locale: i18n.resolvedLanguage as never, + enabledChainTypes: internalChainTypes, + walletEcosystemsOrder: walletConfig?.walletEcosystemsOrder, + }), + [ + i18n.resolvedLanguage, + internalChainTypes, + walletConfig?.walletEcosystemsOrder, + ] + ) + return ( = ({ children }) => { useInitializeSDKProviders() - return <>{children} + return children } From 608e3290857076745b8a986ea37c5ab40af07586 Mon Sep 17 00:00:00 2001 From: Eugene Chybisov Date: Tue, 24 Mar 2026 17:02:03 +0100 Subject: [PATCH 2/4] chore(release): 4.0.0-beta.3 --- lerna-debug.log | 128 ++++++++++++++++++ package.json | 2 +- packages/wallet-management/package.json | 2 +- packages/widget-light/package.json | 2 +- packages/widget-light/src/config/version.ts | 2 +- packages/widget-provider-bitcoin/package.json | 2 +- .../widget-provider-ethereum/package.json | 2 +- packages/widget-provider-solana/package.json | 2 +- packages/widget-provider-sui/package.json | 2 +- packages/widget-provider/package.json | 2 +- packages/widget/package.json | 2 +- packages/widget/src/config/version.ts | 2 +- 12 files changed, 139 insertions(+), 11 deletions(-) create mode 100644 lerna-debug.log diff --git a/lerna-debug.log b/lerna-debug.log new file mode 100644 index 000000000..165ae0633 --- /dev/null +++ b/lerna-debug.log @@ -0,0 +1,128 @@ +0 silly argv { +0 silly argv _: [ 'version' ], +0 silly argv changelog: false, +0 silly argv push: false, +0 silly argv 'git-tag-version': false, +0 silly argv gitTagVersion: false, +0 silly argv private: false, +0 silly argv preid: 'beta', +0 silly argv lernaVersion: '9.0.7', +0 silly argv '$0': 'node_modules/lerna/dist/cli.js' +0 silly argv } +1 notice cli v9.0.7 +2 verbose packageConfigs Explicit "packages" configuration found in lerna.json. Resolving packages using the configured glob(s): ["packages/*"] +3 verbose rootPath /Users/eugene/Projects/widget +4 info versioning independent +5 notice FYI git repository validation has been skipped, please ensure your version bumps are correct +6 silly hasTags +7 verbose hasTags true +8 silly git-describe.sync "v4.0.0-beta.2-2-gaf88109e-dirty" => {"lastTagName":"v4.0.0-beta.2","lastVersion":"v4.0.0-beta.2","refCount":"2","sha":"af88109e","isDirty":true} +9 info Looking for changed packages since v4.0.0-beta.2 +10 info ignoring diff in paths matching [ '**/*.md' ] +11 silly checking diff packages/wallet-management +12 silly found diff in packages/wallet-management/package.json +12 silly found diff in packages/wallet-management/src/providers/WalletManagementProviders.tsx +12 silly found diff in packages/wallet-management/src/providers/WalletMenuProvider/WalletMenuContext.ts +12 silly found diff in packages/wallet-management/src/providers/WalletMenuProvider/types.ts +13 verbose filtered diff [ +13 verbose filtered diff 'packages/wallet-management/package.json', +13 verbose filtered diff 'packages/wallet-management/src/providers/WalletManagementProviders.tsx', +13 verbose filtered diff 'packages/wallet-management/src/providers/WalletMenuProvider/WalletMenuContext.ts', +13 verbose filtered diff 'packages/wallet-management/src/providers/WalletMenuProvider/types.ts' +13 verbose filtered diff ] +14 silly checking diff packages/widget +15 silly found diff in packages/widget/package.json +15 silly found diff in packages/widget/src/AppProvider.tsx +15 silly found diff in packages/widget/src/providers/SDKClientProvider.tsx +15 silly found diff in packages/widget/src/providers/WalletProvider/WalletProvider.tsx +16 verbose filtered diff [ +16 verbose filtered diff 'packages/widget/package.json', +16 verbose filtered diff 'packages/widget/src/AppProvider.tsx', +16 verbose filtered diff 'packages/widget/src/providers/SDKClientProvider.tsx', +16 verbose filtered diff 'packages/widget/src/providers/WalletProvider/WalletProvider.tsx' +16 verbose filtered diff ] +17 silly checking diff packages/widget-embedded +18 silly found diff in packages/widget-embedded/package.json +19 verbose filtered diff [ 'packages/widget-embedded/package.json' ] +20 silly checking diff packages/widget-light +21 silly found diff in packages/widget-light/package.json +22 verbose filtered diff [ 'packages/widget-light/package.json' ] +23 silly checking diff packages/widget-playground +24 silly found diff in packages/widget-playground/package.json +25 verbose filtered diff [ 'packages/widget-playground/package.json' ] +26 silly checking diff packages/widget-playground-next +27 silly found diff in packages/widget-playground-next/package.json +28 verbose filtered diff [ 'packages/widget-playground-next/package.json' ] +29 silly checking diff packages/widget-playground-vite +30 silly found diff in packages/widget-playground-vite/package.json +31 verbose filtered diff [ 'packages/widget-playground-vite/package.json' ] +32 silly checking diff packages/widget-provider +33 silly found diff in packages/widget-provider/package.json +33 silly found diff in packages/widget-provider/src/hooks/useSDKProviders.ts +33 silly found diff in packages/widget-provider/src/types.ts +34 verbose filtered diff [ +34 verbose filtered diff 'packages/widget-provider/package.json', +34 verbose filtered diff 'packages/widget-provider/src/hooks/useSDKProviders.ts', +34 verbose filtered diff 'packages/widget-provider/src/types.ts' +34 verbose filtered diff ] +35 silly checking diff packages/widget-provider-bitcoin +36 silly found diff in packages/widget-provider-bitcoin/package.json +36 silly found diff in packages/widget-provider-bitcoin/src/providers/BitcoinProvider.tsx +36 silly found diff in packages/widget-provider-bitcoin/src/providers/BitcoinProviderValues.tsx +37 verbose filtered diff [ +37 verbose filtered diff 'packages/widget-provider-bitcoin/package.json', +37 verbose filtered diff 'packages/widget-provider-bitcoin/src/providers/BitcoinProvider.tsx', +37 verbose filtered diff 'packages/widget-provider-bitcoin/src/providers/BitcoinProviderValues.tsx' +37 verbose filtered diff ] +38 silly checking diff packages/widget-provider-ethereum +39 silly found diff in packages/widget-provider-ethereum/package.json +39 silly found diff in packages/widget-provider-ethereum/src/providers/EthereumProvider.tsx +39 silly found diff in packages/widget-provider-ethereum/src/providers/EthereumProviderValues.tsx +40 verbose filtered diff [ +40 verbose filtered diff 'packages/widget-provider-ethereum/package.json', +40 verbose filtered diff 'packages/widget-provider-ethereum/src/providers/EthereumProvider.tsx', +40 verbose filtered diff 'packages/widget-provider-ethereum/src/providers/EthereumProviderValues.tsx' +40 verbose filtered diff ] +41 silly checking diff packages/widget-provider-solana +42 silly found diff in packages/widget-provider-solana/package.json +42 silly found diff in packages/widget-provider-solana/src/providers/SolanaProvider.tsx +42 silly found diff in packages/widget-provider-solana/src/providers/SolanaProviderValues.tsx +43 verbose filtered diff [ +43 verbose filtered diff 'packages/widget-provider-solana/package.json', +43 verbose filtered diff 'packages/widget-provider-solana/src/providers/SolanaProvider.tsx', +43 verbose filtered diff 'packages/widget-provider-solana/src/providers/SolanaProviderValues.tsx' +43 verbose filtered diff ] +44 silly checking diff packages/widget-provider-sui +45 silly found diff in packages/widget-provider-sui/package.json +45 silly found diff in packages/widget-provider-sui/src/providers/SuiBaseProvider.tsx +45 silly found diff in packages/widget-provider-sui/src/providers/SuiProvider.tsx +45 silly found diff in packages/widget-provider-sui/src/providers/SuiProviderValues.tsx +46 verbose filtered diff [ +46 verbose filtered diff 'packages/widget-provider-sui/package.json', +46 verbose filtered diff 'packages/widget-provider-sui/src/providers/SuiBaseProvider.tsx', +46 verbose filtered diff 'packages/widget-provider-sui/src/providers/SuiProvider.tsx', +46 verbose filtered diff 'packages/widget-provider-sui/src/providers/SuiProviderValues.tsx' +46 verbose filtered diff ] +47 verbose updated @lifi/wallet-management +48 verbose updated @lifi/widget +49 verbose updated @lifi/widget-embedded +50 verbose updated @lifi/widget-light +51 verbose updated @lifi/widget-playground +52 verbose updated @lifi/widget-playground-next +53 verbose updated @lifi/widget-playground-vite +54 verbose updated @lifi/widget-provider +55 verbose updated @lifi/widget-provider-bitcoin +56 verbose updated @lifi/widget-provider-ethereum +57 verbose updated @lifi/widget-provider-solana +58 verbose updated @lifi/widget-provider-sui +59 warn version Skipping working tree validation, proceed at your own risk +60 error ExitPromptError: User force closed the prompt with SIGINT +60 error at Interface.sigint (/Users/eugene/Projects/widget/node_modules/.pnpm/@inquirer+core@10.3.2_@types+node@25.5.0/node_modules/@inquirer/core/dist/commonjs/lib/create-prompt.js:101:37) +60 error at Interface.emit (node:events:508:28) +60 error at [_ttyWrite] [as _ttyWrite] (node:internal/readline/interface:1327:18) +60 error at ReadStream.onkeypress (node:internal/readline/interface:284:20) +60 error at ReadStream.emit (node:events:520:35) +60 error at emitKeys (node:internal/readline/utils:371:14) +60 error at emitKeys.next () +60 error at ReadStream.onData (node:internal/readline/emitKeypressEvents:64:36) +60 error at ReadStream.emit (node:events:508:28) diff --git a/package.json b/package.json index 382746fe4..330b5cef5 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "4.0.0-beta.2", + "version": "4.0.0-beta.3", "private": true, "sideEffects": false, "type": "module", diff --git a/packages/wallet-management/package.json b/packages/wallet-management/package.json index 578e6b9ed..e0c467ed9 100644 --- a/packages/wallet-management/package.json +++ b/packages/wallet-management/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/wallet-management", - "version": "4.0.0-beta.1", + "version": "4.0.0-beta.3", "description": "LI.FI Wallet Management solution.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-light/package.json b/packages/widget-light/package.json index 79fdad8dc..f505ed5dc 100644 --- a/packages/widget-light/package.json +++ b/packages/widget-light/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-light", - "version": "4.0.0-beta.1", + "version": "4.0.0-beta.3", "description": "LI.FI Widget Light - a lightweight version of the LI.FI Widget for cross-chain bridging and swapping.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-light/src/config/version.ts b/packages/widget-light/src/config/version.ts index 9d0faf4d0..307cdc808 100644 --- a/packages/widget-light/src/config/version.ts +++ b/packages/widget-light/src/config/version.ts @@ -1,2 +1,2 @@ export const name = '@lifi/widget-light' -export const version = '4.0.0-beta.1' +export const version = '4.0.0-beta.3' diff --git a/packages/widget-provider-bitcoin/package.json b/packages/widget-provider-bitcoin/package.json index 31f82a73f..67aff6895 100644 --- a/packages/widget-provider-bitcoin/package.json +++ b/packages/widget-provider-bitcoin/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider-bitcoin", - "version": "4.0.0-beta.2", + "version": "4.0.0-beta.3", "description": "LI.FI Widget Provider for Bitcoin blockchain integration.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-provider-ethereum/package.json b/packages/widget-provider-ethereum/package.json index bd6238edf..db2bc45c8 100644 --- a/packages/widget-provider-ethereum/package.json +++ b/packages/widget-provider-ethereum/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider-ethereum", - "version": "4.0.0-beta.2", + "version": "4.0.0-beta.3", "description": "LI.FI Widget Provider for Ethereum blockchain integration.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-provider-solana/package.json b/packages/widget-provider-solana/package.json index dbdbc53ff..e423bbb9e 100644 --- a/packages/widget-provider-solana/package.json +++ b/packages/widget-provider-solana/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider-solana", - "version": "4.0.0-beta.1", + "version": "4.0.0-beta.3", "description": "LI.FI Widget Provider for Solana blockchain integration.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-provider-sui/package.json b/packages/widget-provider-sui/package.json index ce0b2f9b0..02dac6fe2 100644 --- a/packages/widget-provider-sui/package.json +++ b/packages/widget-provider-sui/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider-sui", - "version": "4.0.0-beta.1", + "version": "4.0.0-beta.3", "description": "LI.FI Widget Provider for Sui blockchain integration.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-provider/package.json b/packages/widget-provider/package.json index c5caaf206..3274d8630 100644 --- a/packages/widget-provider/package.json +++ b/packages/widget-provider/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider", - "version": "4.0.0-beta.1", + "version": "4.0.0-beta.3", "description": "LI.FI Widget Provider - base provider package for blockchain integrations.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget/package.json b/packages/widget/package.json index 023c0bad0..d5724bdf1 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget", - "version": "4.0.0-beta.1", + "version": "4.0.0-beta.3", "description": "LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget/src/config/version.ts b/packages/widget/src/config/version.ts index c19eb0fd1..545e2314a 100644 --- a/packages/widget/src/config/version.ts +++ b/packages/widget/src/config/version.ts @@ -1,2 +1,2 @@ export const name = '@lifi/widget' -export const version = '4.0.0-beta.1' +export const version = '4.0.0-beta.3' From f3c1f3c357f87eb8e2383fe2eadd40da9bdb70be Mon Sep 17 00:00:00 2001 From: Eugene Chybisov Date: Tue, 24 Mar 2026 17:41:43 +0100 Subject: [PATCH 3/4] fix: add optional chaining to wallet installation checks --- .../src/utils/isWalletInstalled.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/widget-provider/src/utils/isWalletInstalled.ts b/packages/widget-provider/src/utils/isWalletInstalled.ts index f8c193fd1..a571ada38 100644 --- a/packages/widget-provider/src/utils/isWalletInstalled.ts +++ b/packages/widget-provider/src/utils/isWalletInstalled.ts @@ -20,29 +20,29 @@ export const isWalletInstalled = (id: string): boolean => { ) ) case 'app.phantom.bitcoin': - return anyWindow.phantom?.bitcoin?.isPhantom + return anyWindow?.phantom?.bitcoin?.isPhantom case 'com.okex.wallet.bitcoin': - return anyWindow.okxwallet?.bitcoin?.isOkxWallet + return anyWindow?.okxwallet?.bitcoin?.isOkxWallet case 'XverseProviders.BitcoinProvider': - return anyWindow.XverseProviders?.BitcoinProvider + return anyWindow?.XverseProviders?.BitcoinProvider case 'unisat': return ( - anyWindow.unisat && - !anyWindow.unisat?.isBinance && - !anyWindow.unisat?.isBitKeep + anyWindow?.unisat && + !anyWindow?.unisat?.isBinance && + !anyWindow?.unisat?.isBitKeep ) case 'io.xdefi': - return anyWindow.xfi + return anyWindow?.xfi case 'so.onekey.app.wallet.bitcoin': - return anyWindow.$onekey?.btc + return anyWindow?.$onekey?.btc case 'LeatherProvider': - return anyWindow.LeatherProvider + return anyWindow?.LeatherProvider case 'bitget': - return anyWindow.bitkeep?.unisat || anyWindow.unisat?.isBitKeep + return anyWindow?.bitkeep?.unisat || anyWindow?.unisat?.isBitKeep case 'OylProvider': - return anyWindow.oyl + return anyWindow?.oyl case 'binance': - return anyWindow.binancew3w?.bitcoin || anyWindow.unisat?.isBinance + return anyWindow?.binancew3w?.bitcoin || anyWindow?.unisat?.isBinance case 'app.magiceden.bitcoin': return anyWindow?.magicEden?.bitcoin?.isMagicEden case 'unhosted.bitcoin': From 0f4e89ca34d48ddc288138aa5479cbfd4a604430 Mon Sep 17 00:00:00 2001 From: Eugene Chybisov Date: Tue, 24 Mar 2026 17:43:09 +0100 Subject: [PATCH 4/4] chore(release): 4.0.0-beta.4 --- package.json | 2 +- packages/wallet-management/package.json | 2 +- packages/widget-provider-bitcoin/package.json | 2 +- packages/widget-provider-ethereum/package.json | 2 +- packages/widget-provider-solana/package.json | 2 +- packages/widget-provider-sui/package.json | 2 +- packages/widget-provider/package.json | 2 +- packages/widget/package.json | 2 +- packages/widget/src/config/version.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 330b5cef5..0d8e29c04 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "4.0.0-beta.3", + "version": "4.0.0-beta.4", "private": true, "sideEffects": false, "type": "module", diff --git a/packages/wallet-management/package.json b/packages/wallet-management/package.json index e0c467ed9..ff8e1f035 100644 --- a/packages/wallet-management/package.json +++ b/packages/wallet-management/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/wallet-management", - "version": "4.0.0-beta.3", + "version": "4.0.0-beta.4", "description": "LI.FI Wallet Management solution.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-provider-bitcoin/package.json b/packages/widget-provider-bitcoin/package.json index 67aff6895..4e36e5301 100644 --- a/packages/widget-provider-bitcoin/package.json +++ b/packages/widget-provider-bitcoin/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider-bitcoin", - "version": "4.0.0-beta.3", + "version": "4.0.0-beta.4", "description": "LI.FI Widget Provider for Bitcoin blockchain integration.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-provider-ethereum/package.json b/packages/widget-provider-ethereum/package.json index db2bc45c8..c778852e8 100644 --- a/packages/widget-provider-ethereum/package.json +++ b/packages/widget-provider-ethereum/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider-ethereum", - "version": "4.0.0-beta.3", + "version": "4.0.0-beta.4", "description": "LI.FI Widget Provider for Ethereum blockchain integration.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-provider-solana/package.json b/packages/widget-provider-solana/package.json index e423bbb9e..eb1383e4e 100644 --- a/packages/widget-provider-solana/package.json +++ b/packages/widget-provider-solana/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider-solana", - "version": "4.0.0-beta.3", + "version": "4.0.0-beta.4", "description": "LI.FI Widget Provider for Solana blockchain integration.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-provider-sui/package.json b/packages/widget-provider-sui/package.json index 02dac6fe2..b9275805c 100644 --- a/packages/widget-provider-sui/package.json +++ b/packages/widget-provider-sui/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider-sui", - "version": "4.0.0-beta.3", + "version": "4.0.0-beta.4", "description": "LI.FI Widget Provider for Sui blockchain integration.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget-provider/package.json b/packages/widget-provider/package.json index 3274d8630..c417fe2ed 100644 --- a/packages/widget-provider/package.json +++ b/packages/widget-provider/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget-provider", - "version": "4.0.0-beta.3", + "version": "4.0.0-beta.4", "description": "LI.FI Widget Provider - base provider package for blockchain integrations.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget/package.json b/packages/widget/package.json index d5724bdf1..6c91b380b 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -1,6 +1,6 @@ { "name": "@lifi/widget", - "version": "4.0.0-beta.3", + "version": "4.0.0-beta.4", "description": "LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.", "type": "module", "main": "./src/index.ts", diff --git a/packages/widget/src/config/version.ts b/packages/widget/src/config/version.ts index 545e2314a..d8d86e73c 100644 --- a/packages/widget/src/config/version.ts +++ b/packages/widget/src/config/version.ts @@ -1,2 +1,2 @@ export const name = '@lifi/widget' -export const version = '4.0.0-beta.3' +export const version = '4.0.0-beta.4'