Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/privy/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"@mui/material": "^7.3.6",
"@privy-io/react-auth": "^2.25.0",
"@privy-io/wagmi": "^1.0.6",
"@solana/kit": "^3.0.3",
"@solana/kit": "^5.1.0",
"@solana/wallet-adapter-base": "^0.9.27",
"@solana/wallet-adapter-react": "^0.15.39",
"@solana/web3.js": "^1.98.4",
Expand Down
16 changes: 14 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,20 @@
"miniflare>zod": "3.22.3",
"miniflare>zod-validation-error": "3.0.3",
"zod": ">=4.1.11",
"@reown/appkit": ">=1.8.15"
"@reown/appkit": ">=1.8.15",
"@lifi/sdk": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk",
"@lifi/sdk-provider-bitcoin": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk-provider-bitcoin",
"@lifi/sdk-provider-ethereum": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk-provider-ethereum",
"@lifi/sdk-provider-solana": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk-provider-solana",
"@lifi/sdk-provider-sui": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk-provider-sui"
}
},
"packageManager": "pnpm@10.26.0+sha512.3b3f6c725ebe712506c0ab1ad4133cf86b1f4b687effce62a9b38b4d72e3954242e643190fc51fa1642949c735f403debd44f5cb0edd657abe63a8b6a7e1e402"
"packageManager": "pnpm@10.26.0+sha512.3b3f6c725ebe712506c0ab1ad4133cf86b1f4b687effce62a9b38b4d72e3954242e643190fc51fa1642949c735f403debd44f5cb0edd657abe63a8b6a7e1e402",
"dependencies": {
"@lifi/sdk": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk",
"@lifi/sdk-provider-bitcoin": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk-provider-bitcoin",
"@lifi/sdk-provider-ethereum": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk-provider-ethereum",
"@lifi/sdk-provider-solana": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk-provider-solana",
"@lifi/sdk-provider-sui": "link:../../../Library/pnpm/global/5/node_modules/@lifi/sdk-provider-sui"
}
}
3 changes: 0 additions & 3 deletions packages/widget-playground/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@
"@reown/appkit-adapter-solana": "^1.8.15",
"@reown/appkit-adapter-wagmi": "^1.8.15",
"@reown/appkit-common": "^1.8.15",
"@solana/wallet-adapter-base": "^0.9.27",
"@solana/wallet-adapter-react": "^0.15.39",
"@solana/web3.js": "^1.98.4",
"csstype": "^3.2.3",
"lodash.isequal": "^4.5.0",
"microdiff": "^1.5.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export function ReownWalletProvider({
projectId: EVMWalletConnectId,
ssr: false,
})
const solanaAdapter = new SolanaAdapter()
const solanaAdapter = new SolanaAdapter({ registerWalletStandard: true })

const appKit = createAppKit({
adapters: [wagmiAdapter, solanaAdapter],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,46 +1,20 @@
import { useSolanaWalletStandard } from '@lifi/widget-provider-solana'
import { useAppKitProvider } from '@reown/appkit/react'
import type { Provider as SolanaWalletProvider } from '@reown/appkit-adapter-solana'
import type { Adapter, WalletName } from '@solana/wallet-adapter-base'
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base'
import {
ConnectionProvider,
useWallet,
WalletProvider,
} from '@solana/wallet-adapter-react'
import { clusterApiUrl } from '@solana/web3.js'
import { type FC, type PropsWithChildren, useEffect } from 'react'

const endpoint = clusterApiUrl(WalletAdapterNetwork.Mainnet)
const wallets: Adapter[] = []

const SolanaConnectedWalletKey = 'li.fi-widget-recent-wallet'

export const SolanaProvider: FC<PropsWithChildren> = ({ children }) => {
return (
<ConnectionProvider endpoint={endpoint}>
<WalletProvider
wallets={wallets}
localStorageKey={SolanaConnectedWalletKey}
autoConnect
>
<SolanaReownHandler />
{children}
</WalletProvider>
</ConnectionProvider>
)
}

const SolanaReownHandler: FC = () => {
const { walletProvider: solanaProvider } =
useAppKitProvider<SolanaWalletProvider>('solana')
const { disconnect, select } = useWallet()
const { disconnect, select } = useSolanaWalletStandard()

useEffect(() => {
if (solanaProvider?.name) {
select(solanaProvider.name as WalletName)
select(solanaProvider.name)
}
return () => {
disconnect()
}
}, [disconnect, select, solanaProvider?.name])
return null
}, [solanaProvider?.name, select, disconnect])
return children
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,41 @@
import { getChainsFromConfig, type SDKBaseConfig } from '@lifi/sdk'
import { createClient, getChains } from '@lifi/sdk'
import { useQuery } from '@tanstack/react-query'
import type { FC, PropsWithChildren } from 'react'
import { useMemo } from 'react'
import { useConfig } from '../../store/widgetConfig/useConfig.js'
import { ReownWalletProvider } from './ReownWalletProvider.js'
import { WidgetWalletConfigUpdater } from './WidgetWalletConfigUpdater.js'

export const WalletProvider: FC<PropsWithChildren> = ({ children }) => {
const { config } = useConfig()

const sdkClient = useMemo(() => {
if (!config?.sdkConfig || !config.integrator) {
return null
}
return createClient({
...config.sdkConfig,
integrator: config.integrator,
apiKey: config.apiKey,
})
}, [config?.sdkConfig, config?.integrator, config?.apiKey])

const { data: chains, isLoading } = useQuery({
queryKey: ['chains'] as const,
queryKey: ['chains', config?.integrator] as const,
queryFn: async () => {
return await getChainsFromConfig({
...config?.sdkConfig,
integrator: 'li.fi-playground',
} as SDKBaseConfig)
if (!sdkClient) {
return []
}
return await getChains(sdkClient)
},
enabled: !!sdkClient,
refetchInterval: 300_000,
staleTime: 300_000,
retry: false,
})

if (!chains?.length || isLoading) {
return null
return children
}

return (
Expand Down
10 changes: 6 additions & 4 deletions packages/widget-provider-solana/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,14 @@
"@lifi/sdk": "4.0.0-alpha.4",
"@lifi/sdk-provider-solana": "^4.0.0-alpha.4",
"@lifi/widget-provider": "workspace:*",
"@solana/wallet-adapter-base": "^0.9.27",
"@solana/wallet-adapter-coinbase": "^0.1.23",
"@solana/web3.js": "^1.98.4"
"@solana/kit": "^5.1.0",
"@solana/wallet-standard-features": "^1.3.0",
"@wallet-standard/app": "^1.1.0",
"@wallet-standard/base": "^1.1.0",
"@wallet-standard/features": "^1.1.0",
"zustand": "^5.0.9"
},
"peerDependencies": {
"@solana/wallet-adapter-react": ">=0.15.39",
"bs58": ">=4.0.1"
},
"devDependencies": {
Expand Down
53 changes: 53 additions & 0 deletions packages/widget-provider-solana/src/hooks/useWalletAccount.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { useSolanaWalletStandard } from '../wallet-standard/useSolanaWalletStandard.js'
import type { AccountInfo } from '../wallet-standard/wallet-standard-client.js'

export interface UseWalletAccountReturn {
/** Currently selected account address */
address: string | null
/** All available accounts from connected wallet */
accounts: AccountInfo[]
/** Currently selected account full info */
account: AccountInfo | null
/** Switch to a different account */
selectAccount: (address: string) => Promise<void>
}

/**
* Hook to access wallet account information
*
* @example
* ```tsx
* function AccountSelector() {
* const { address, accounts, selectAccount } = useWalletAccount()
*
* if (!address) return null
*
* return (
* <div>
* <p>Current: {address}</p>
* {accounts.length > 1 && (
* <select value={address} onChange={(e) => selectAccount(e.target.value)}>
* {accounts.map(acc => (
* <option key={acc.address} value={acc.address}>
* {acc.address.slice(0, 8)}...
* </option>
* ))}
* </select>
* )}
* </div>
* )
* }
* ```
*/
export function useWalletAccount(): UseWalletAccountReturn {
const { accounts, selectAccount, selectedAccount } = useSolanaWalletStandard()

return {
address: selectedAccount,
accounts,
account: selectedAccount
? accounts.find((acc) => acc.address === selectedAccount) || null
: null,
selectAccount,
}
}
8 changes: 8 additions & 0 deletions packages/widget-provider-solana/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
export {
type UseWalletAccountReturn,
useWalletAccount,
} from './hooks/useWalletAccount'
export { SolanaProvider } from './providers/SolanaProvider.js'
export {
type SolanaWalletStandardState,
useSolanaWalletStandard,
} from './wallet-standard/useSolanaWalletStandard'

This file was deleted.

29 changes: 6 additions & 23 deletions packages/widget-provider-solana/src/providers/SolanaProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,34 +1,17 @@
import type { WidgetProviderProps } from '@lifi/widget-provider'
import { ConnectionContext } from '@solana/wallet-adapter-react'
import { type PropsWithChildren, useContext } from 'react'
import { SolanaBaseProvider } from './SolanaBaseProvider'
import type { PropsWithChildren } from 'react'
import { useSolanaWalletStandard } from '../wallet-standard/useSolanaWalletStandard'
import { SolanaProviderValues } from './SolanaProviderValues'

function useInSolanaContext(): boolean {
const context = useContext(ConnectionContext)
return Boolean(context?.connection)
}

const SolanaWidgetProvider = ({
forceInternalWalletManagement,
children,
}: PropsWithChildren<WidgetProviderProps>) => {
const inSolanaContext = useInSolanaContext()

if (inSolanaContext && !forceInternalWalletManagement) {
return (
<SolanaProviderValues isExternalContext={inSolanaContext}>
{children}
</SolanaProviderValues>
)
}
useSolanaWalletStandard({ autoConnect: true })

return (
<SolanaBaseProvider>
<SolanaProviderValues isExternalContext={inSolanaContext}>
{children}
</SolanaProviderValues>
</SolanaBaseProvider>
<SolanaProviderValues isExternalContext={false}>
{children}
</SolanaProviderValues>
)
}

Expand Down
Loading