Files
zeekay a902c1c1c7 feat: add wallet package, docs, LLM.md, and update submodule refs
- Add packages/wallet with Solana/EVM providers
- Add comprehensive DAO governance documentation
- Fix gitignore to cover nested node_modules
- Update submodule refs
2026-02-20 22:15:37 -08:00

1 line
14 KiB
Plaintext

{"version":3,"sources":["../src/providers/EVMProvider.tsx","../src/constants.ts","../src/providers/SolanaProvider.tsx","../src/config.ts","../src/providers/LuxWalletProvider.tsx","../src/hooks/useOmniWallet.ts","../src/components/OmniConnectButton.tsx"],"names":["jsx","useMemo","useSolanaWallet"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client'\n\nimport { type ReactNode } from 'react'\nimport { RainbowKitProvider, darkTheme, lightTheme } from '@rainbow-me/rainbowkit'\nimport { WagmiProvider, type Config } from 'wagmi'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\n\n// Import RainbowKit styles\nimport '@rainbow-me/rainbowkit/styles.css'\n\nconst queryClient = new QueryClient()\n\ninterface EVMProviderProps {\n children: ReactNode\n config: Config\n theme?: 'dark' | 'light'\n}\n\nexport function EVMProvider({\n children,\n config,\n theme = 'dark',\n}: EVMProviderProps) {\n return (\n <WagmiProvider config={config}>\n <QueryClientProvider client={queryClient}>\n <RainbowKitProvider\n theme={theme === 'dark' ? darkTheme({\n accentColor: '#FFD700',\n accentColorForeground: '#000',\n borderRadius: 'medium',\n }) : lightTheme({\n accentColor: '#FFD700',\n accentColorForeground: '#000',\n borderRadius: 'medium',\n })}\n modalSize=\"compact\"\n >\n {children}\n </RainbowKitProvider>\n </QueryClientProvider>\n </WagmiProvider>\n )\n}\n","// Lux shared WalletConnect Project ID\nexport const LUX_WALLETCONNECT_PROJECT_ID = 'e89228fed40d4c6e9520912214dfd68b'\n\n// Lux Solana RPC endpoints\nexport const LUX_SOLANA_RPC = {\n mainnet: 'https://solana-rpc.lux.network',\n devnet: 'https://solana-devnet.lux.network',\n} as const\n\n// Lux EVM RPC endpoints\nexport const LUX_EVM_RPC = {\n lux: 'https://rpc.lux.network',\n pars: 'https://rpc.pars.network',\n} as const\n","'use client'\n\nimport { useMemo, type ReactNode } from 'react'\nimport { clusterApiUrl, type Cluster } from '@solana/web3.js'\nimport { WalletAdapterNetwork } from '@solana/wallet-adapter-base'\nimport { PhantomWalletAdapter } from '@solana/wallet-adapter-phantom'\nimport { CoinbaseWalletAdapter } from '@solana/wallet-adapter-coinbase'\nimport { SolflareWalletAdapter } from '@solana/wallet-adapter-solflare'\nimport { GlowWalletAdapter } from '@solana/wallet-adapter-glow'\nimport { WalletConnectWalletAdapter } from '@solana/wallet-adapter-walletconnect'\nimport {\n ConnectionProvider,\n WalletProvider,\n} from '@solana/wallet-adapter-react'\nimport { WalletModalProvider } from '@solana/wallet-adapter-react-ui'\nimport { LUX_WALLETCONNECT_PROJECT_ID, LUX_SOLANA_RPC } from '../constants'\n\n// Import Solana wallet styles\nimport '@solana/wallet-adapter-react-ui/styles.css'\n\ninterface SolanaProviderProps {\n children: ReactNode\n network?: 'mainnet-beta' | 'devnet' | 'testnet'\n endpoint?: string\n projectId?: string\n}\n\nexport function SolanaProvider({\n children,\n network = 'mainnet-beta',\n endpoint,\n projectId = LUX_WALLETCONNECT_PROJECT_ID,\n}: SolanaProviderProps) {\n // WalletConnect only supports mainnet and devnet\n const wcNetwork = network === 'mainnet-beta'\n ? WalletAdapterNetwork.Mainnet\n : WalletAdapterNetwork.Devnet\n\n const rpcEndpoint = useMemo(() => {\n if (endpoint) return endpoint\n if (network === 'mainnet-beta') return LUX_SOLANA_RPC.mainnet\n return clusterApiUrl(network as Cluster)\n }, [endpoint, network])\n\n const wallets = useMemo(\n () => [\n new PhantomWalletAdapter(),\n new CoinbaseWalletAdapter(),\n new SolflareWalletAdapter(),\n new GlowWalletAdapter(),\n new WalletConnectWalletAdapter({\n network: wcNetwork,\n options: { projectId },\n }),\n ],\n [wcNetwork, projectId]\n )\n\n return (\n <ConnectionProvider endpoint={rpcEndpoint}>\n <WalletProvider wallets={wallets} autoConnect>\n <WalletModalProvider>{children}</WalletModalProvider>\n </WalletProvider>\n </ConnectionProvider>\n )\n}\n","import { getDefaultConfig } from '@rainbow-me/rainbowkit'\nimport {\n metaMaskWallet,\n rainbowWallet,\n walletConnectWallet,\n trustWallet,\n ledgerWallet,\n phantomWallet,\n okxWallet,\n coinbaseWallet,\n} from '@rainbow-me/rainbowkit/wallets'\nimport { http } from 'wagmi'\nimport type { Chain, HttpTransport } from 'viem'\nimport { LUX_WALLETCONNECT_PROJECT_ID } from './constants'\nimport type { LuxWalletConfig } from './types'\n\nexport function createWagmiConfig(config: LuxWalletConfig) {\n const {\n appName,\n appDescription = 'Powered by Lux Network',\n appUrl = 'https://lux.network',\n appIcon = 'https://lux.network/favicon.svg',\n projectId = LUX_WALLETCONNECT_PROJECT_ID,\n chains,\n } = config\n\n // Build transports for each chain\n const transports: Record<number, HttpTransport> = {}\n for (const chain of chains) {\n transports[chain.id] = http()\n }\n\n return getDefaultConfig({\n appName,\n appDescription,\n appUrl,\n appIcon,\n projectId,\n chains: chains as [Chain, ...Chain[]],\n transports,\n wallets: [\n {\n groupName: 'Popular',\n wallets: [\n metaMaskWallet,\n phantomWallet,\n rainbowWallet,\n coinbaseWallet,\n ],\n },\n {\n groupName: 'More',\n wallets: [\n walletConnectWallet,\n trustWallet,\n ledgerWallet,\n okxWallet,\n ],\n },\n ],\n })\n}\n","'use client'\n\nimport { type ReactNode, useMemo } from 'react'\nimport { EVMProvider } from './EVMProvider'\nimport { SolanaProvider } from './SolanaProvider'\nimport { createWagmiConfig } from '../config'\nimport type { LuxWalletConfig } from '../types'\n\ninterface LuxWalletProviderProps extends LuxWalletConfig {\n children: ReactNode\n theme?: 'dark' | 'light'\n}\n\nexport function LuxWalletProvider({\n children,\n theme = 'dark',\n enableSolana = false,\n solanaNetwork = 'mainnet-beta',\n ...config\n}: LuxWalletProviderProps) {\n const wagmiConfig = useMemo(() => createWagmiConfig(config), [config])\n\n // Wrap with EVM provider\n let content = (\n <EVMProvider config={wagmiConfig} theme={theme}>\n {children}\n </EVMProvider>\n )\n\n // Optionally wrap with Solana provider\n if (enableSolana) {\n content = (\n <SolanaProvider network={solanaNetwork} projectId={config.projectId}>\n {content}\n </SolanaProvider>\n )\n }\n\n return content\n}\n","import { useAccount, useDisconnect } from 'wagmi'\nimport { useWallet as useSolanaWallet } from '@solana/wallet-adapter-react'\nimport { useMemo } from 'react'\nimport type { ConnectedWallet } from '../types'\n\n/**\n * Unified hook for both EVM and Solana wallets\n */\nexport function useOmniWallet() {\n const evmAccount = useAccount()\n const { disconnect: disconnectEvm } = useDisconnect()\n\n const solanaWallet = useSolanaWallet()\n\n const connectedWallets = useMemo<ConnectedWallet[]>(() => {\n const wallets: ConnectedWallet[] = []\n\n if (evmAccount.address) {\n wallets.push({\n address: evmAccount.address,\n networkType: 'evm',\n chainId: evmAccount.chainId,\n })\n }\n\n if (solanaWallet.publicKey) {\n wallets.push({\n address: solanaWallet.publicKey.toBase58(),\n networkType: 'solana',\n })\n }\n\n return wallets\n }, [evmAccount.address, evmAccount.chainId, solanaWallet.publicKey])\n\n const isConnected = connectedWallets.length > 0\n const isEvmConnected = !!evmAccount.address\n const isSolanaConnected = !!solanaWallet.publicKey\n\n const disconnectAll = () => {\n if (evmAccount.address) disconnectEvm()\n if (solanaWallet.connected) solanaWallet.disconnect()\n }\n\n return {\n // EVM\n evmAddress: evmAccount.address,\n evmChainId: evmAccount.chainId,\n isEvmConnected,\n disconnectEvm,\n\n // Solana\n solanaAddress: solanaWallet.publicKey?.toBase58(),\n isSolanaConnected,\n disconnectSolana: solanaWallet.disconnect,\n\n // Unified\n connectedWallets,\n isConnected,\n disconnectAll,\n }\n}\n","'use client'\n\nimport { ConnectButton } from '@rainbow-me/rainbowkit'\nimport { WalletMultiButton } from '@solana/wallet-adapter-react-ui'\nimport { useOmniWallet } from '../hooks/useOmniWallet'\n\ninterface OmniConnectButtonProps {\n showSolana?: boolean\n className?: string\n}\n\n/**\n * Unified connect button for both EVM and Solana\n */\nexport function OmniConnectButton({\n showSolana = false,\n className,\n}: OmniConnectButtonProps) {\n const { isEvmConnected, isSolanaConnected } = useOmniWallet()\n\n return (\n <div className={className} style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <ConnectButton\n chainStatus=\"icon\"\n accountStatus={{\n smallScreen: 'avatar',\n largeScreen: 'full',\n }}\n showBalance={{\n smallScreen: false,\n largeScreen: true,\n }}\n />\n {showSolana && (\n <WalletMultiButton style={{\n backgroundColor: isEvmConnected && !isSolanaConnected ? '#9945FF' : undefined,\n }} />\n )}\n </div>\n )\n}\n"]}