@algobright/solana-connector 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/{Avatar.module-P7KEBP7R.module.css → Avatar.module-AACAT34D.module.css} +42 -42
  2. package/dist/{Button.module-7TPMDOJN.module.css → Button.module-HQNNX6IB.module.css} +145 -145
  3. package/dist/{Collapsible.module-NXSN3MGI.module.css → Collapsible.module-F4VIL5FH.module.css} +24 -24
  4. package/dist/ConnectButton.d.mts +4 -0
  5. package/dist/ConnectButton.d.ts +4 -0
  6. package/dist/ConnectButton.js +145 -39
  7. package/dist/ConnectButton.js.map +1 -1
  8. package/dist/ConnectButton.mjs +140 -34
  9. package/dist/ConnectButton.mjs.map +1 -1
  10. package/dist/{ConnectButton.module-UWQKSVTP.module.css → ConnectButton.module-O3M32YJK.module.css} +8 -8
  11. package/dist/{CustomQRCode.module-FOXENMZG.module.css → CustomQRCode.module-JW3JU3FX.module.css} +176 -176
  12. package/dist/{Dialog.module-HCRT743N.module.css → Dialog.module-AYJTMDAD.module.css} +136 -136
  13. package/dist/{Menu.module-GV627ZLI.module.css → Menu.module-6ATSLATI.module.css} +79 -79
  14. package/dist/{Spinner.module-G7GUQJZJ.module.css → Spinner.module-BLSWZSIL.module.css} +16 -16
  15. package/dist/WalletDropdown.d.mts +4 -0
  16. package/dist/WalletDropdown.d.ts +4 -0
  17. package/dist/WalletDropdown.js +132 -28
  18. package/dist/WalletDropdown.js.map +1 -1
  19. package/dist/WalletDropdown.mjs +129 -25
  20. package/dist/WalletDropdown.mjs.map +1 -1
  21. package/dist/{WalletDropdown.module-342MM7XM.module.css → WalletDropdown.module-DOK7CUOQ.module.css} +223 -220
  22. package/dist/WalletModal.js +7 -7
  23. package/dist/WalletModal.js.map +1 -1
  24. package/dist/WalletModal.mjs +7 -7
  25. package/dist/WalletModal.mjs.map +1 -1
  26. package/dist/{WalletModal.module-PVV5PRXU.module.css → WalletModal.module-ZRTJGOQY.module.css} +341 -341
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs.map +1 -1
  29. package/package.json +11 -9
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/providers/RpcProvider.tsx","../src/providers/SolanaWalletProvider.tsx","../src/providers/SolanaWrapper.tsx"],"sourcesContent":["import { SolanaWrapper } from '@providers/SolanaWrapper';\nimport { useRpcProvider } from '@providers/RpcProvider';\n\nexport {\n SolanaWrapper,\n useRpcProvider,\n};","'use client';\r\n\r\nimport {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useState,\r\n useCallback,\r\n useMemo,\r\n type ReactNode\r\n} from 'react';\r\nimport { Network, RpcMap } from '../types';\r\n\r\n\r\nconst DEFAULT_RPCS: RpcMap = {\r\n mainnet: ['https://api.mainnet.solana.com'],\r\n devnet: ['https://api.devnet.solana.com'],\r\n testnet: ['https://api.testnet.solana.com'],\r\n localnet: ['http://localhost:8899'],\r\n};\r\n\r\ninterface RpcContextType {\r\n rpcUrl: string;\r\n setRpcUrl: (url: string) => void;\r\n\r\n persistClusterSelection: boolean;\r\n clusterStorageKey: string;\r\n maxRPCRetries: number;\r\n\r\n allRpcUrls: RpcMap;\r\n addRpcUrl: (network: Network, url: string) => void;\r\n removeRpcUrl: (network: Network, url: string) => void;\r\n}\r\nconst RpcContext = createContext<RpcContextType | null>(null);\r\n\r\n\r\ntype RpcProviderProps = {\r\n children: ReactNode;\r\n\r\n defaultRpcList?: RpcMap;\r\n defaultRpcUrl?: string;\r\n\r\n LS_KEY_RPC_LIST?: string;\r\n LS_KEY_RPC_DEFAULT?: string;\r\n LS_KEY_CLUSTER?: string;\r\n persistClusterSelection?: boolean;\r\n MAX_RPC_RETRIES?: number;\r\n};\r\nexport function RpcProvider(props: RpcProviderProps) {\r\n const {\r\n children,\r\n defaultRpcList = DEFAULT_RPCS,\r\n defaultRpcUrl = DEFAULT_RPCS.mainnet[0],\r\n LS_KEY_RPC_LIST = 'all-rpc-urls',\r\n LS_KEY_RPC_DEFAULT = 'curr-rpc',\r\n LS_KEY_CLUSTER = 'solana-cluster',\r\n persistClusterSelection = true,\r\n MAX_RPC_RETRIES = 3,\r\n } = props;\r\n\r\n const [allRpcUrls, setAllRpcUrls] = useState<RpcMap>(defaultRpcList);\r\n const [rpcUrl, setRpcUrlState] = useState<string>(defaultRpcUrl);\r\n\r\n useEffect(() => {\r\n const savedHistory = localStorage.getItem(LS_KEY_RPC_LIST);\r\n const savedRpc = localStorage.getItem(LS_KEY_RPC_DEFAULT);\r\n\r\n if (savedRpc && savedRpc !== rpcUrl) {\r\n setRpcUrlState(savedRpc);\r\n }\r\n\r\n if (savedHistory) {\r\n try {\r\n const parsed = JSON.parse(savedHistory) as RpcMap;\r\n setAllRpcUrls({\r\n mainnet: Array.from(new Set([...DEFAULT_RPCS.mainnet, ...(parsed.mainnet || [])])),\r\n devnet: Array.from(new Set([...DEFAULT_RPCS.devnet, ...(parsed.devnet || [])])),\r\n testnet: Array.from(new Set([...DEFAULT_RPCS.testnet, ...(parsed.testnet || [])])),\r\n localnet: Array.from(new Set([...DEFAULT_RPCS.localnet, ...(parsed.localnet || [])])),\r\n });\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n }, []);\r\n\r\n const setRpcUrl = useCallback((url: string) => {\r\n setRpcUrlState(url);\r\n localStorage.setItem(LS_KEY_RPC_DEFAULT, url);\r\n }, []);\r\n\r\n const addRpcUrl = useCallback((network: Network, url: string) => {\r\n if (!url) return;\r\n\r\n setAllRpcUrls((prev) => {\r\n const newList = Array.from(new Set([...prev[network], url]));\r\n const newState = { ...prev, [network]: newList };\r\n localStorage.setItem(LS_KEY_RPC_LIST, JSON.stringify(newState));\r\n return newState;\r\n });\r\n\r\n setRpcUrl(url);\r\n }, [setRpcUrl]);\r\n\r\n const removeRpcUrl = useCallback((network: Network, url: string) => {\r\n setAllRpcUrls((prev) => {\r\n let newList = prev[network].filter((rpc) => rpc !== url);\r\n\r\n if (newList.length === 0) {\r\n newList = [...DEFAULT_RPCS[network]];\r\n }\r\n\r\n const newState = { ...prev, [network]: newList };\r\n localStorage.setItem(LS_KEY_RPC_LIST, JSON.stringify(newState));\r\n return newState;\r\n });\r\n }, [LS_KEY_RPC_LIST]);\r\n\r\n const value = useMemo<RpcContextType>(() => ({\r\n persistClusterSelection: persistClusterSelection,\r\n clusterStorageKey: LS_KEY_CLUSTER,\r\n maxRPCRetries: MAX_RPC_RETRIES,\r\n rpcUrl,\r\n setRpcUrl,\r\n allRpcUrls,\r\n addRpcUrl,\r\n removeRpcUrl\r\n }), [rpcUrl, allRpcUrls, setRpcUrl, addRpcUrl, removeRpcUrl]);\r\n\r\n\r\n return (\r\n <RpcContext.Provider value={value}>\r\n {children}\r\n </RpcContext.Provider>\r\n );\r\n}\r\n\r\nexport const useRpcProvider = () => {\r\n const context = useContext(RpcContext);\r\n if (!context) {\r\n throw new Error('useRpcProvider must be used within RpcProvider');\r\n }\r\n return context;\r\n};","'use client';\r\n\r\nimport type { ReactNode } from 'react';\r\nimport { useMemo } from 'react';\r\nimport { AppProvider, getDefaultConfig, getDefaultMobileConfig, Wallet, WalletDisplayConfig } from '@solana/connector/react';\r\nimport { Network } from '../types';\r\nimport { CoinGeckoConfig, SolanaCluster } from '@solana/connector';\r\nimport { useRpcProvider } from './RpcProvider';\r\n\r\ntype SolanaWalletProviderProps = {\r\n children: ReactNode;\r\n\r\n appName?: string;\r\n appUrl?: string;\r\n\r\n autoConnect?: boolean;\r\n enableMobile?: boolean;\r\n\r\n walletConnect?: boolean;\r\n additionalWallets?: Wallet[];\r\n coingecko?: CoinGeckoConfig;\r\n walletsDisplayConfig?: WalletDisplayConfig;\r\n};\r\n\r\nexport function SolanaWalletProvider(props: SolanaWalletProviderProps) {\r\n const {\r\n children,\r\n appName = \"Solana Kit\",\r\n appUrl,\r\n autoConnect = true,\r\n enableMobile = true,\r\n walletConnect = true,\r\n additionalWallets = [],\r\n coingecko,\r\n walletsDisplayConfig\r\n } = props;\r\n\r\n const {\r\n persistClusterSelection,\r\n clusterStorageKey,\r\n maxRPCRetries,\r\n rpcUrl, allRpcUrls\r\n } = useRpcProvider();\r\n\r\n const appOrigin = appUrl || (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n const activeNetwork: Network = useMemo(() => {\r\n if (allRpcUrls.devnet.includes(rpcUrl)) return 'devnet';\r\n else if (allRpcUrls.testnet.includes(rpcUrl)) return 'testnet';\r\n else if (allRpcUrls.localnet.includes(rpcUrl)) return 'localnet';\r\n return 'mainnet';\r\n }, [rpcUrl, allRpcUrls]);\r\n\r\n const connectorConfig = useMemo(() => {\r\n\r\n const clusters: SolanaCluster[] = [\r\n {\r\n id: 'solana:mainnet',\r\n label: 'Mainnet',\r\n url: activeNetwork === 'mainnet' ? rpcUrl : allRpcUrls.mainnet[0],\r\n },\r\n {\r\n id: 'solana:localnet',\r\n label: 'Localnet',\r\n url: activeNetwork === 'localnet' ? rpcUrl : allRpcUrls.localnet[0],\r\n },\r\n {\r\n id: 'solana:devnet',\r\n label: 'Devnet',\r\n url: activeNetwork === 'devnet' ? rpcUrl : allRpcUrls.devnet[0],\r\n },\r\n {\r\n id: 'solana:testnet',\r\n label: 'Testnet',\r\n url: activeNetwork === 'testnet' ? rpcUrl : allRpcUrls.testnet[0],\r\n },\r\n ];\r\n\r\n return getDefaultConfig({\r\n appName: appName,\r\n appUrl: appOrigin,\r\n autoConnect: autoConnect,\r\n\r\n network: activeNetwork,\r\n enableMobile: enableMobile,\r\n\r\n // from RPC settings\r\n clusters,\r\n persistClusterSelection: persistClusterSelection,\r\n clusterStorageKey: clusterStorageKey,\r\n maxRetries: maxRPCRetries,\r\n\r\n walletConnect: walletConnect,\r\n additionalWallets: additionalWallets,\r\n coingecko: coingecko,\r\n wallets: walletsDisplayConfig\r\n\r\n });\r\n }, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);\r\n\r\n const mobile = useMemo(\r\n () =>\r\n getDefaultMobileConfig({\r\n appName: appName,\r\n appUrl: appOrigin,\r\n network: activeNetwork === 'localnet' ? 'devnet' : activeNetwork,\r\n }),\r\n [appName, appOrigin, activeNetwork],\r\n );\r\n\r\n\r\n return (\r\n <AppProvider connectorConfig={connectorConfig} mobile={mobile}>\r\n {children}\r\n </AppProvider>\r\n );\r\n}","\"use client\";\r\n\r\nimport { RpcMap } from \"../types\";\r\nimport { RpcProvider } from \"./RpcProvider\";\r\nimport { SolanaWalletProvider } from \"./SolanaWalletProvider\";\r\n\r\ntype SolanaWrapperProps = {\r\n children: React.ReactNode;\r\n\r\n /** * Name of your app (displayed in wallet connection modals) \r\n * @default \"Solana Kit\"\r\n */\r\n appName?: string;\r\n\r\n /** * URL of your app (used for deep linking) \r\n */\r\n appUrl?: string;\r\n\r\n /** * Automatically connect to the last used wallet on load.\r\n * @default true\r\n */\r\n autoConnect?: boolean;\r\n\r\n /** * Enable mobile wallets (e.g. Phantom on iOS/Android) \r\n * @default true\r\n */\r\n enableMobile?: boolean;\r\n\r\n /** * Enable WalletConnect support \r\n * @default true\r\n */\r\n walletConnect?: boolean;\r\n\r\n /** * List of default RPC endpoints mapped by network \r\n * @default DEFAULT_RPCS\r\n */\r\n defaultRpcList?: RpcMap;\r\n\r\n /** * The default RPC endpoint to use if none is selected \r\n * @default DEFAULT_RPCS.mainnet[0]\r\n */\r\n defaultRpcUrl?: string;\r\n\r\n /** * LocalStorage key for saving custom RPC list \r\n * @default 'all-rpc-urls'\r\n */\r\n LS_KEY_RPC_LIST?: string;\r\n\r\n /** * LocalStorage key for saving default RPC endpoint \r\n * @default 'curr-rpc'\r\n */\r\n LS_KEY_RPC_DEFAULT?: string;\r\n\r\n /** * LocalStorage key for saving selected cluster \r\n * @default 'solana-cluster'\r\n */\r\n LS_KEY_CLUSTER?: string;\r\n\r\n /** * Persist cluster selection in LocalStorage \r\n * @default true\r\n */\r\n persistClusterSelection?: boolean;\r\n\r\n /** * Maximum number of retries for RPC requests \r\n * @default 3\r\n */\r\n MAX_RPC_RETRIES?: number;\r\n}\r\n\r\nexport function SolanaWrapper(props: SolanaWrapperProps) {\r\n const {\r\n children,\r\n\r\n appName,\r\n appUrl,\r\n\r\n autoConnect,\r\n enableMobile,\r\n walletConnect,\r\n\r\n defaultRpcList,\r\n defaultRpcUrl,\r\n LS_KEY_RPC_LIST,\r\n LS_KEY_RPC_DEFAULT,\r\n LS_KEY_CLUSTER,\r\n persistClusterSelection,\r\n MAX_RPC_RETRIES,\r\n\r\n } = props\r\n\r\n\r\n const RPC_PROVIDER_PROPS = {\r\n defaultRpcList,\r\n defaultRpcUrl,\r\n LS_KEY_RPC_LIST,\r\n LS_KEY_RPC_DEFAULT,\r\n LS_KEY_CLUSTER,\r\n persistClusterSelection,\r\n MAX_RPC_RETRIES,\r\n\r\n }\r\n\r\n const solanaWalletProviderProps = {\r\n appName,\r\n appUrl,\r\n\r\n autoConnect,\r\n enableMobile,\r\n\r\n walletConnect,\r\n additionalWallets: [],\r\n coingecko: undefined,\r\n walletsDisplayConfig: undefined\r\n }\r\n\r\n return (\r\n <RpcProvider {...RPC_PROVIDER_PROPS}>\r\n <SolanaWalletProvider {...solanaWalletProviderProps}>\r\n {children}\r\n </SolanaWalletProvider>\r\n </RpcProvider>\r\n )\r\n}"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/providers/RpcProvider.tsx","../src/providers/SolanaWalletProvider.tsx","../src/providers/SolanaWrapper.tsx"],"sourcesContent":["import { SolanaWrapper } from '@providers/SolanaWrapper';\nimport { useRpcProvider } from '@providers/RpcProvider';\n\nexport {\n SolanaWrapper,\n useRpcProvider,\n};","'use client';\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactNode\n} from 'react';\nimport { Network, RpcMap } from '../types';\n\n\nconst DEFAULT_RPCS: RpcMap = {\n mainnet: ['https://api.mainnet.solana.com'],\n devnet: ['https://api.devnet.solana.com'],\n testnet: ['https://api.testnet.solana.com'],\n localnet: ['http://localhost:8899'],\n};\n\ninterface RpcContextType {\n rpcUrl: string;\n setRpcUrl: (url: string) => void;\n\n persistClusterSelection: boolean;\n clusterStorageKey: string;\n maxRPCRetries: number;\n\n allRpcUrls: RpcMap;\n addRpcUrl: (network: Network, url: string) => void;\n removeRpcUrl: (network: Network, url: string) => void;\n}\nconst RpcContext = createContext<RpcContextType | null>(null);\n\n\ntype RpcProviderProps = {\n children: ReactNode;\n\n defaultRpcList?: RpcMap;\n defaultRpcUrl?: string;\n\n LS_KEY_RPC_LIST?: string;\n LS_KEY_RPC_DEFAULT?: string;\n LS_KEY_CLUSTER?: string;\n persistClusterSelection?: boolean;\n MAX_RPC_RETRIES?: number;\n};\nexport function RpcProvider(props: RpcProviderProps) {\n const {\n children,\n defaultRpcList = DEFAULT_RPCS,\n defaultRpcUrl = DEFAULT_RPCS.mainnet[0],\n LS_KEY_RPC_LIST = 'all-rpc-urls',\n LS_KEY_RPC_DEFAULT = 'curr-rpc',\n LS_KEY_CLUSTER = 'solana-cluster',\n persistClusterSelection = true,\n MAX_RPC_RETRIES = 3,\n } = props;\n\n const [allRpcUrls, setAllRpcUrls] = useState<RpcMap>(defaultRpcList);\n const [rpcUrl, setRpcUrlState] = useState<string>(defaultRpcUrl);\n\n useEffect(() => {\n const savedHistory = localStorage.getItem(LS_KEY_RPC_LIST);\n const savedRpc = localStorage.getItem(LS_KEY_RPC_DEFAULT);\n\n if (savedRpc && savedRpc !== rpcUrl) {\n setRpcUrlState(savedRpc);\n }\n\n if (savedHistory) {\n try {\n const parsed = JSON.parse(savedHistory) as RpcMap;\n setAllRpcUrls({\n mainnet: Array.from(new Set([...DEFAULT_RPCS.mainnet, ...(parsed.mainnet || [])])),\n devnet: Array.from(new Set([...DEFAULT_RPCS.devnet, ...(parsed.devnet || [])])),\n testnet: Array.from(new Set([...DEFAULT_RPCS.testnet, ...(parsed.testnet || [])])),\n localnet: Array.from(new Set([...DEFAULT_RPCS.localnet, ...(parsed.localnet || [])])),\n });\n } catch (e) {\n console.error(e);\n }\n }\n }, []);\n\n const setRpcUrl = useCallback((url: string) => {\n setRpcUrlState(url);\n localStorage.setItem(LS_KEY_RPC_DEFAULT, url);\n }, []);\n\n const addRpcUrl = useCallback((network: Network, url: string) => {\n if (!url) return;\n\n setAllRpcUrls((prev) => {\n const newList = Array.from(new Set([...prev[network], url]));\n const newState = { ...prev, [network]: newList };\n localStorage.setItem(LS_KEY_RPC_LIST, JSON.stringify(newState));\n return newState;\n });\n\n setRpcUrl(url);\n }, [setRpcUrl]);\n\n const removeRpcUrl = useCallback((network: Network, url: string) => {\n setAllRpcUrls((prev) => {\n let newList = prev[network].filter((rpc) => rpc !== url);\n\n if (newList.length === 0) {\n newList = [...DEFAULT_RPCS[network]];\n }\n\n const newState = { ...prev, [network]: newList };\n localStorage.setItem(LS_KEY_RPC_LIST, JSON.stringify(newState));\n return newState;\n });\n }, [LS_KEY_RPC_LIST]);\n\n const value = useMemo<RpcContextType>(() => ({\n persistClusterSelection: persistClusterSelection,\n clusterStorageKey: LS_KEY_CLUSTER,\n maxRPCRetries: MAX_RPC_RETRIES,\n rpcUrl,\n setRpcUrl,\n allRpcUrls,\n addRpcUrl,\n removeRpcUrl\n }), [rpcUrl, allRpcUrls, setRpcUrl, addRpcUrl, removeRpcUrl]);\n\n\n return (\n <RpcContext.Provider value={value}>\n {children}\n </RpcContext.Provider>\n );\n}\n\nexport const useRpcProvider = () => {\n const context = useContext(RpcContext);\n if (!context) {\n throw new Error('useRpcProvider must be used within RpcProvider');\n }\n return context;\n};","'use client';\n\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { AppProvider, getDefaultConfig, getDefaultMobileConfig, Wallet, WalletDisplayConfig } from '@solana/connector/react';\nimport { Network } from '../types';\nimport { CoinGeckoConfig, SolanaCluster } from '@solana/connector';\nimport { useRpcProvider } from './RpcProvider';\n\ntype SolanaWalletProviderProps = {\n children: ReactNode;\n\n appName?: string;\n appUrl?: string;\n\n autoConnect?: boolean;\n enableMobile?: boolean;\n\n walletConnect?: boolean;\n additionalWallets?: Wallet[];\n coingecko?: CoinGeckoConfig;\n walletsDisplayConfig?: WalletDisplayConfig;\n};\n\nexport function SolanaWalletProvider(props: SolanaWalletProviderProps) {\n const {\n children,\n appName = \"Solana Kit\",\n appUrl,\n autoConnect = true,\n enableMobile = true,\n walletConnect = true,\n additionalWallets = [],\n coingecko,\n walletsDisplayConfig\n } = props;\n\n const {\n persistClusterSelection,\n clusterStorageKey,\n maxRPCRetries,\n rpcUrl, allRpcUrls\n } = useRpcProvider();\n\n const appOrigin = appUrl || (typeof window !== 'undefined' ? window.location.origin : '');\n\n const activeNetwork: Network = useMemo(() => {\n if (allRpcUrls.devnet.includes(rpcUrl)) return 'devnet';\n else if (allRpcUrls.testnet.includes(rpcUrl)) return 'testnet';\n else if (allRpcUrls.localnet.includes(rpcUrl)) return 'localnet';\n return 'mainnet';\n }, [rpcUrl, allRpcUrls]);\n\n const connectorConfig = useMemo(() => {\n\n const clusters: SolanaCluster[] = [\n {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: activeNetwork === 'mainnet' ? rpcUrl : allRpcUrls.mainnet[0],\n },\n {\n id: 'solana:localnet',\n label: 'Localnet',\n url: activeNetwork === 'localnet' ? rpcUrl : allRpcUrls.localnet[0],\n },\n {\n id: 'solana:devnet',\n label: 'Devnet',\n url: activeNetwork === 'devnet' ? rpcUrl : allRpcUrls.devnet[0],\n },\n {\n id: 'solana:testnet',\n label: 'Testnet',\n url: activeNetwork === 'testnet' ? rpcUrl : allRpcUrls.testnet[0],\n },\n ];\n\n return getDefaultConfig({\n appName: appName,\n appUrl: appOrigin,\n autoConnect: autoConnect,\n\n network: activeNetwork,\n enableMobile: enableMobile,\n\n // from RPC settings\n clusters,\n persistClusterSelection: persistClusterSelection,\n clusterStorageKey: clusterStorageKey,\n maxRetries: maxRPCRetries,\n\n walletConnect: walletConnect,\n additionalWallets: additionalWallets,\n coingecko: coingecko,\n wallets: walletsDisplayConfig\n\n });\n }, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);\n\n const mobile = useMemo(\n () =>\n getDefaultMobileConfig({\n appName: appName,\n appUrl: appOrigin,\n network: activeNetwork === 'localnet' ? 'devnet' : activeNetwork,\n }),\n [appName, appOrigin, activeNetwork],\n );\n\n\n return (\n <AppProvider connectorConfig={connectorConfig} mobile={mobile}>\n {children}\n </AppProvider>\n );\n}","\"use client\";\n\nimport { RpcMap } from \"../types\";\nimport { RpcProvider } from \"./RpcProvider\";\nimport { SolanaWalletProvider } from \"./SolanaWalletProvider\";\n\ntype SolanaWrapperProps = {\n children: React.ReactNode;\n\n /** * Name of your app (displayed in wallet connection modals) \n * @default \"Solana Kit\"\n */\n appName?: string;\n\n /** * URL of your app (used for deep linking) \n */\n appUrl?: string;\n\n /** * Automatically connect to the last used wallet on load.\n * @default true\n */\n autoConnect?: boolean;\n\n /** * Enable mobile wallets (e.g. Phantom on iOS/Android) \n * @default true\n */\n enableMobile?: boolean;\n\n /** * Enable WalletConnect support \n * @default true\n */\n walletConnect?: boolean;\n\n /** * List of default RPC endpoints mapped by network \n * @default DEFAULT_RPCS\n */\n defaultRpcList?: RpcMap;\n\n /** * The default RPC endpoint to use if none is selected \n * @default DEFAULT_RPCS.mainnet[0]\n */\n defaultRpcUrl?: string;\n\n /** * LocalStorage key for saving custom RPC list \n * @default 'all-rpc-urls'\n */\n LS_KEY_RPC_LIST?: string;\n\n /** * LocalStorage key for saving default RPC endpoint \n * @default 'curr-rpc'\n */\n LS_KEY_RPC_DEFAULT?: string;\n\n /** * LocalStorage key for saving selected cluster \n * @default 'solana-cluster'\n */\n LS_KEY_CLUSTER?: string;\n\n /** * Persist cluster selection in LocalStorage \n * @default true\n */\n persistClusterSelection?: boolean;\n\n /** * Maximum number of retries for RPC requests \n * @default 3\n */\n MAX_RPC_RETRIES?: number;\n}\n\nexport function SolanaWrapper(props: SolanaWrapperProps) {\n const {\n children,\n\n appName,\n appUrl,\n\n autoConnect,\n enableMobile,\n walletConnect,\n\n defaultRpcList,\n defaultRpcUrl,\n LS_KEY_RPC_LIST,\n LS_KEY_RPC_DEFAULT,\n LS_KEY_CLUSTER,\n persistClusterSelection,\n MAX_RPC_RETRIES,\n\n } = props\n\n\n const RPC_PROVIDER_PROPS = {\n defaultRpcList,\n defaultRpcUrl,\n LS_KEY_RPC_LIST,\n LS_KEY_RPC_DEFAULT,\n LS_KEY_CLUSTER,\n persistClusterSelection,\n MAX_RPC_RETRIES,\n\n }\n\n const solanaWalletProviderProps = {\n appName,\n appUrl,\n\n autoConnect,\n enableMobile,\n\n walletConnect,\n additionalWallets: [],\n coingecko: undefined,\n walletsDisplayConfig: undefined\n }\n\n return (\n <RpcProvider {...RPC_PROVIDER_PROPS}>\n <SolanaWalletProvider {...solanaWalletProviderProps}>\n {children}\n </SolanaWalletProvider>\n </RpcProvider>\n )\n}"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/RpcProvider.tsx","../src/providers/SolanaWalletProvider.tsx","../src/providers/SolanaWrapper.tsx"],"sourcesContent":["'use client';\r\n\r\nimport {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useState,\r\n useCallback,\r\n useMemo,\r\n type ReactNode\r\n} from 'react';\r\nimport { Network, RpcMap } from '../types';\r\n\r\n\r\nconst DEFAULT_RPCS: RpcMap = {\r\n mainnet: ['https://api.mainnet.solana.com'],\r\n devnet: ['https://api.devnet.solana.com'],\r\n testnet: ['https://api.testnet.solana.com'],\r\n localnet: ['http://localhost:8899'],\r\n};\r\n\r\ninterface RpcContextType {\r\n rpcUrl: string;\r\n setRpcUrl: (url: string) => void;\r\n\r\n persistClusterSelection: boolean;\r\n clusterStorageKey: string;\r\n maxRPCRetries: number;\r\n\r\n allRpcUrls: RpcMap;\r\n addRpcUrl: (network: Network, url: string) => void;\r\n removeRpcUrl: (network: Network, url: string) => void;\r\n}\r\nconst RpcContext = createContext<RpcContextType | null>(null);\r\n\r\n\r\ntype RpcProviderProps = {\r\n children: ReactNode;\r\n\r\n defaultRpcList?: RpcMap;\r\n defaultRpcUrl?: string;\r\n\r\n LS_KEY_RPC_LIST?: string;\r\n LS_KEY_RPC_DEFAULT?: string;\r\n LS_KEY_CLUSTER?: string;\r\n persistClusterSelection?: boolean;\r\n MAX_RPC_RETRIES?: number;\r\n};\r\nexport function RpcProvider(props: RpcProviderProps) {\r\n const {\r\n children,\r\n defaultRpcList = DEFAULT_RPCS,\r\n defaultRpcUrl = DEFAULT_RPCS.mainnet[0],\r\n LS_KEY_RPC_LIST = 'all-rpc-urls',\r\n LS_KEY_RPC_DEFAULT = 'curr-rpc',\r\n LS_KEY_CLUSTER = 'solana-cluster',\r\n persistClusterSelection = true,\r\n MAX_RPC_RETRIES = 3,\r\n } = props;\r\n\r\n const [allRpcUrls, setAllRpcUrls] = useState<RpcMap>(defaultRpcList);\r\n const [rpcUrl, setRpcUrlState] = useState<string>(defaultRpcUrl);\r\n\r\n useEffect(() => {\r\n const savedHistory = localStorage.getItem(LS_KEY_RPC_LIST);\r\n const savedRpc = localStorage.getItem(LS_KEY_RPC_DEFAULT);\r\n\r\n if (savedRpc && savedRpc !== rpcUrl) {\r\n setRpcUrlState(savedRpc);\r\n }\r\n\r\n if (savedHistory) {\r\n try {\r\n const parsed = JSON.parse(savedHistory) as RpcMap;\r\n setAllRpcUrls({\r\n mainnet: Array.from(new Set([...DEFAULT_RPCS.mainnet, ...(parsed.mainnet || [])])),\r\n devnet: Array.from(new Set([...DEFAULT_RPCS.devnet, ...(parsed.devnet || [])])),\r\n testnet: Array.from(new Set([...DEFAULT_RPCS.testnet, ...(parsed.testnet || [])])),\r\n localnet: Array.from(new Set([...DEFAULT_RPCS.localnet, ...(parsed.localnet || [])])),\r\n });\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n }, []);\r\n\r\n const setRpcUrl = useCallback((url: string) => {\r\n setRpcUrlState(url);\r\n localStorage.setItem(LS_KEY_RPC_DEFAULT, url);\r\n }, []);\r\n\r\n const addRpcUrl = useCallback((network: Network, url: string) => {\r\n if (!url) return;\r\n\r\n setAllRpcUrls((prev) => {\r\n const newList = Array.from(new Set([...prev[network], url]));\r\n const newState = { ...prev, [network]: newList };\r\n localStorage.setItem(LS_KEY_RPC_LIST, JSON.stringify(newState));\r\n return newState;\r\n });\r\n\r\n setRpcUrl(url);\r\n }, [setRpcUrl]);\r\n\r\n const removeRpcUrl = useCallback((network: Network, url: string) => {\r\n setAllRpcUrls((prev) => {\r\n let newList = prev[network].filter((rpc) => rpc !== url);\r\n\r\n if (newList.length === 0) {\r\n newList = [...DEFAULT_RPCS[network]];\r\n }\r\n\r\n const newState = { ...prev, [network]: newList };\r\n localStorage.setItem(LS_KEY_RPC_LIST, JSON.stringify(newState));\r\n return newState;\r\n });\r\n }, [LS_KEY_RPC_LIST]);\r\n\r\n const value = useMemo<RpcContextType>(() => ({\r\n persistClusterSelection: persistClusterSelection,\r\n clusterStorageKey: LS_KEY_CLUSTER,\r\n maxRPCRetries: MAX_RPC_RETRIES,\r\n rpcUrl,\r\n setRpcUrl,\r\n allRpcUrls,\r\n addRpcUrl,\r\n removeRpcUrl\r\n }), [rpcUrl, allRpcUrls, setRpcUrl, addRpcUrl, removeRpcUrl]);\r\n\r\n\r\n return (\r\n <RpcContext.Provider value={value}>\r\n {children}\r\n </RpcContext.Provider>\r\n );\r\n}\r\n\r\nexport const useRpcProvider = () => {\r\n const context = useContext(RpcContext);\r\n if (!context) {\r\n throw new Error('useRpcProvider must be used within RpcProvider');\r\n }\r\n return context;\r\n};","'use client';\r\n\r\nimport type { ReactNode } from 'react';\r\nimport { useMemo } from 'react';\r\nimport { AppProvider, getDefaultConfig, getDefaultMobileConfig, Wallet, WalletDisplayConfig } from '@solana/connector/react';\r\nimport { Network } from '../types';\r\nimport { CoinGeckoConfig, SolanaCluster } from '@solana/connector';\r\nimport { useRpcProvider } from './RpcProvider';\r\n\r\ntype SolanaWalletProviderProps = {\r\n children: ReactNode;\r\n\r\n appName?: string;\r\n appUrl?: string;\r\n\r\n autoConnect?: boolean;\r\n enableMobile?: boolean;\r\n\r\n walletConnect?: boolean;\r\n additionalWallets?: Wallet[];\r\n coingecko?: CoinGeckoConfig;\r\n walletsDisplayConfig?: WalletDisplayConfig;\r\n};\r\n\r\nexport function SolanaWalletProvider(props: SolanaWalletProviderProps) {\r\n const {\r\n children,\r\n appName = \"Solana Kit\",\r\n appUrl,\r\n autoConnect = true,\r\n enableMobile = true,\r\n walletConnect = true,\r\n additionalWallets = [],\r\n coingecko,\r\n walletsDisplayConfig\r\n } = props;\r\n\r\n const {\r\n persistClusterSelection,\r\n clusterStorageKey,\r\n maxRPCRetries,\r\n rpcUrl, allRpcUrls\r\n } = useRpcProvider();\r\n\r\n const appOrigin = appUrl || (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n const activeNetwork: Network = useMemo(() => {\r\n if (allRpcUrls.devnet.includes(rpcUrl)) return 'devnet';\r\n else if (allRpcUrls.testnet.includes(rpcUrl)) return 'testnet';\r\n else if (allRpcUrls.localnet.includes(rpcUrl)) return 'localnet';\r\n return 'mainnet';\r\n }, [rpcUrl, allRpcUrls]);\r\n\r\n const connectorConfig = useMemo(() => {\r\n\r\n const clusters: SolanaCluster[] = [\r\n {\r\n id: 'solana:mainnet',\r\n label: 'Mainnet',\r\n url: activeNetwork === 'mainnet' ? rpcUrl : allRpcUrls.mainnet[0],\r\n },\r\n {\r\n id: 'solana:localnet',\r\n label: 'Localnet',\r\n url: activeNetwork === 'localnet' ? rpcUrl : allRpcUrls.localnet[0],\r\n },\r\n {\r\n id: 'solana:devnet',\r\n label: 'Devnet',\r\n url: activeNetwork === 'devnet' ? rpcUrl : allRpcUrls.devnet[0],\r\n },\r\n {\r\n id: 'solana:testnet',\r\n label: 'Testnet',\r\n url: activeNetwork === 'testnet' ? rpcUrl : allRpcUrls.testnet[0],\r\n },\r\n ];\r\n\r\n return getDefaultConfig({\r\n appName: appName,\r\n appUrl: appOrigin,\r\n autoConnect: autoConnect,\r\n\r\n network: activeNetwork,\r\n enableMobile: enableMobile,\r\n\r\n // from RPC settings\r\n clusters,\r\n persistClusterSelection: persistClusterSelection,\r\n clusterStorageKey: clusterStorageKey,\r\n maxRetries: maxRPCRetries,\r\n\r\n walletConnect: walletConnect,\r\n additionalWallets: additionalWallets,\r\n coingecko: coingecko,\r\n wallets: walletsDisplayConfig\r\n\r\n });\r\n }, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);\r\n\r\n const mobile = useMemo(\r\n () =>\r\n getDefaultMobileConfig({\r\n appName: appName,\r\n appUrl: appOrigin,\r\n network: activeNetwork === 'localnet' ? 'devnet' : activeNetwork,\r\n }),\r\n [appName, appOrigin, activeNetwork],\r\n );\r\n\r\n\r\n return (\r\n <AppProvider connectorConfig={connectorConfig} mobile={mobile}>\r\n {children}\r\n </AppProvider>\r\n );\r\n}","\"use client\";\r\n\r\nimport { RpcMap } from \"../types\";\r\nimport { RpcProvider } from \"./RpcProvider\";\r\nimport { SolanaWalletProvider } from \"./SolanaWalletProvider\";\r\n\r\ntype SolanaWrapperProps = {\r\n children: React.ReactNode;\r\n\r\n /** * Name of your app (displayed in wallet connection modals) \r\n * @default \"Solana Kit\"\r\n */\r\n appName?: string;\r\n\r\n /** * URL of your app (used for deep linking) \r\n */\r\n appUrl?: string;\r\n\r\n /** * Automatically connect to the last used wallet on load.\r\n * @default true\r\n */\r\n autoConnect?: boolean;\r\n\r\n /** * Enable mobile wallets (e.g. Phantom on iOS/Android) \r\n * @default true\r\n */\r\n enableMobile?: boolean;\r\n\r\n /** * Enable WalletConnect support \r\n * @default true\r\n */\r\n walletConnect?: boolean;\r\n\r\n /** * List of default RPC endpoints mapped by network \r\n * @default DEFAULT_RPCS\r\n */\r\n defaultRpcList?: RpcMap;\r\n\r\n /** * The default RPC endpoint to use if none is selected \r\n * @default DEFAULT_RPCS.mainnet[0]\r\n */\r\n defaultRpcUrl?: string;\r\n\r\n /** * LocalStorage key for saving custom RPC list \r\n * @default 'all-rpc-urls'\r\n */\r\n LS_KEY_RPC_LIST?: string;\r\n\r\n /** * LocalStorage key for saving default RPC endpoint \r\n * @default 'curr-rpc'\r\n */\r\n LS_KEY_RPC_DEFAULT?: string;\r\n\r\n /** * LocalStorage key for saving selected cluster \r\n * @default 'solana-cluster'\r\n */\r\n LS_KEY_CLUSTER?: string;\r\n\r\n /** * Persist cluster selection in LocalStorage \r\n * @default true\r\n */\r\n persistClusterSelection?: boolean;\r\n\r\n /** * Maximum number of retries for RPC requests \r\n * @default 3\r\n */\r\n MAX_RPC_RETRIES?: number;\r\n}\r\n\r\nexport function SolanaWrapper(props: SolanaWrapperProps) {\r\n const {\r\n children,\r\n\r\n appName,\r\n appUrl,\r\n\r\n autoConnect,\r\n enableMobile,\r\n walletConnect,\r\n\r\n defaultRpcList,\r\n defaultRpcUrl,\r\n LS_KEY_RPC_LIST,\r\n LS_KEY_RPC_DEFAULT,\r\n LS_KEY_CLUSTER,\r\n persistClusterSelection,\r\n MAX_RPC_RETRIES,\r\n\r\n } = props\r\n\r\n\r\n const RPC_PROVIDER_PROPS = {\r\n defaultRpcList,\r\n defaultRpcUrl,\r\n LS_KEY_RPC_LIST,\r\n LS_KEY_RPC_DEFAULT,\r\n LS_KEY_CLUSTER,\r\n persistClusterSelection,\r\n MAX_RPC_RETRIES,\r\n\r\n }\r\n\r\n const solanaWalletProviderProps = {\r\n appName,\r\n appUrl,\r\n\r\n autoConnect,\r\n enableMobile,\r\n\r\n walletConnect,\r\n additionalWallets: [],\r\n coingecko: undefined,\r\n walletsDisplayConfig: undefined\r\n }\r\n\r\n return (\r\n <RpcProvider {...RPC_PROVIDER_PROPS}>\r\n <SolanaWalletProvider {...solanaWalletProviderProps}>\r\n {children}\r\n </SolanaWalletProvider>\r\n </RpcProvider>\r\n )\r\n}"],"mappings":"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","names":["useMemo","jsx","useMemo","jsx"]}
1
+ {"version":3,"sources":["../src/providers/RpcProvider.tsx","../src/providers/SolanaWalletProvider.tsx","../src/providers/SolanaWrapper.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n type ReactNode\n} from 'react';\nimport { Network, RpcMap } from '../types';\n\n\nconst DEFAULT_RPCS: RpcMap = {\n mainnet: ['https://api.mainnet.solana.com'],\n devnet: ['https://api.devnet.solana.com'],\n testnet: ['https://api.testnet.solana.com'],\n localnet: ['http://localhost:8899'],\n};\n\ninterface RpcContextType {\n rpcUrl: string;\n setRpcUrl: (url: string) => void;\n\n persistClusterSelection: boolean;\n clusterStorageKey: string;\n maxRPCRetries: number;\n\n allRpcUrls: RpcMap;\n addRpcUrl: (network: Network, url: string) => void;\n removeRpcUrl: (network: Network, url: string) => void;\n}\nconst RpcContext = createContext<RpcContextType | null>(null);\n\n\ntype RpcProviderProps = {\n children: ReactNode;\n\n defaultRpcList?: RpcMap;\n defaultRpcUrl?: string;\n\n LS_KEY_RPC_LIST?: string;\n LS_KEY_RPC_DEFAULT?: string;\n LS_KEY_CLUSTER?: string;\n persistClusterSelection?: boolean;\n MAX_RPC_RETRIES?: number;\n};\nexport function RpcProvider(props: RpcProviderProps) {\n const {\n children,\n defaultRpcList = DEFAULT_RPCS,\n defaultRpcUrl = DEFAULT_RPCS.mainnet[0],\n LS_KEY_RPC_LIST = 'all-rpc-urls',\n LS_KEY_RPC_DEFAULT = 'curr-rpc',\n LS_KEY_CLUSTER = 'solana-cluster',\n persistClusterSelection = true,\n MAX_RPC_RETRIES = 3,\n } = props;\n\n const [allRpcUrls, setAllRpcUrls] = useState<RpcMap>(defaultRpcList);\n const [rpcUrl, setRpcUrlState] = useState<string>(defaultRpcUrl);\n\n useEffect(() => {\n const savedHistory = localStorage.getItem(LS_KEY_RPC_LIST);\n const savedRpc = localStorage.getItem(LS_KEY_RPC_DEFAULT);\n\n if (savedRpc && savedRpc !== rpcUrl) {\n setRpcUrlState(savedRpc);\n }\n\n if (savedHistory) {\n try {\n const parsed = JSON.parse(savedHistory) as RpcMap;\n setAllRpcUrls({\n mainnet: Array.from(new Set([...DEFAULT_RPCS.mainnet, ...(parsed.mainnet || [])])),\n devnet: Array.from(new Set([...DEFAULT_RPCS.devnet, ...(parsed.devnet || [])])),\n testnet: Array.from(new Set([...DEFAULT_RPCS.testnet, ...(parsed.testnet || [])])),\n localnet: Array.from(new Set([...DEFAULT_RPCS.localnet, ...(parsed.localnet || [])])),\n });\n } catch (e) {\n console.error(e);\n }\n }\n }, []);\n\n const setRpcUrl = useCallback((url: string) => {\n setRpcUrlState(url);\n localStorage.setItem(LS_KEY_RPC_DEFAULT, url);\n }, []);\n\n const addRpcUrl = useCallback((network: Network, url: string) => {\n if (!url) return;\n\n setAllRpcUrls((prev) => {\n const newList = Array.from(new Set([...prev[network], url]));\n const newState = { ...prev, [network]: newList };\n localStorage.setItem(LS_KEY_RPC_LIST, JSON.stringify(newState));\n return newState;\n });\n\n setRpcUrl(url);\n }, [setRpcUrl]);\n\n const removeRpcUrl = useCallback((network: Network, url: string) => {\n setAllRpcUrls((prev) => {\n let newList = prev[network].filter((rpc) => rpc !== url);\n\n if (newList.length === 0) {\n newList = [...DEFAULT_RPCS[network]];\n }\n\n const newState = { ...prev, [network]: newList };\n localStorage.setItem(LS_KEY_RPC_LIST, JSON.stringify(newState));\n return newState;\n });\n }, [LS_KEY_RPC_LIST]);\n\n const value = useMemo<RpcContextType>(() => ({\n persistClusterSelection: persistClusterSelection,\n clusterStorageKey: LS_KEY_CLUSTER,\n maxRPCRetries: MAX_RPC_RETRIES,\n rpcUrl,\n setRpcUrl,\n allRpcUrls,\n addRpcUrl,\n removeRpcUrl\n }), [rpcUrl, allRpcUrls, setRpcUrl, addRpcUrl, removeRpcUrl]);\n\n\n return (\n <RpcContext.Provider value={value}>\n {children}\n </RpcContext.Provider>\n );\n}\n\nexport const useRpcProvider = () => {\n const context = useContext(RpcContext);\n if (!context) {\n throw new Error('useRpcProvider must be used within RpcProvider');\n }\n return context;\n};","'use client';\n\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { AppProvider, getDefaultConfig, getDefaultMobileConfig, Wallet, WalletDisplayConfig } from '@solana/connector/react';\nimport { Network } from '../types';\nimport { CoinGeckoConfig, SolanaCluster } from '@solana/connector';\nimport { useRpcProvider } from './RpcProvider';\n\ntype SolanaWalletProviderProps = {\n children: ReactNode;\n\n appName?: string;\n appUrl?: string;\n\n autoConnect?: boolean;\n enableMobile?: boolean;\n\n walletConnect?: boolean;\n additionalWallets?: Wallet[];\n coingecko?: CoinGeckoConfig;\n walletsDisplayConfig?: WalletDisplayConfig;\n};\n\nexport function SolanaWalletProvider(props: SolanaWalletProviderProps) {\n const {\n children,\n appName = \"Solana Kit\",\n appUrl,\n autoConnect = true,\n enableMobile = true,\n walletConnect = true,\n additionalWallets = [],\n coingecko,\n walletsDisplayConfig\n } = props;\n\n const {\n persistClusterSelection,\n clusterStorageKey,\n maxRPCRetries,\n rpcUrl, allRpcUrls\n } = useRpcProvider();\n\n const appOrigin = appUrl || (typeof window !== 'undefined' ? window.location.origin : '');\n\n const activeNetwork: Network = useMemo(() => {\n if (allRpcUrls.devnet.includes(rpcUrl)) return 'devnet';\n else if (allRpcUrls.testnet.includes(rpcUrl)) return 'testnet';\n else if (allRpcUrls.localnet.includes(rpcUrl)) return 'localnet';\n return 'mainnet';\n }, [rpcUrl, allRpcUrls]);\n\n const connectorConfig = useMemo(() => {\n\n const clusters: SolanaCluster[] = [\n {\n id: 'solana:mainnet',\n label: 'Mainnet',\n url: activeNetwork === 'mainnet' ? rpcUrl : allRpcUrls.mainnet[0],\n },\n {\n id: 'solana:localnet',\n label: 'Localnet',\n url: activeNetwork === 'localnet' ? rpcUrl : allRpcUrls.localnet[0],\n },\n {\n id: 'solana:devnet',\n label: 'Devnet',\n url: activeNetwork === 'devnet' ? rpcUrl : allRpcUrls.devnet[0],\n },\n {\n id: 'solana:testnet',\n label: 'Testnet',\n url: activeNetwork === 'testnet' ? rpcUrl : allRpcUrls.testnet[0],\n },\n ];\n\n return getDefaultConfig({\n appName: appName,\n appUrl: appOrigin,\n autoConnect: autoConnect,\n\n network: activeNetwork,\n enableMobile: enableMobile,\n\n // from RPC settings\n clusters,\n persistClusterSelection: persistClusterSelection,\n clusterStorageKey: clusterStorageKey,\n maxRetries: maxRPCRetries,\n\n walletConnect: walletConnect,\n additionalWallets: additionalWallets,\n coingecko: coingecko,\n wallets: walletsDisplayConfig\n\n });\n }, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);\n\n const mobile = useMemo(\n () =>\n getDefaultMobileConfig({\n appName: appName,\n appUrl: appOrigin,\n network: activeNetwork === 'localnet' ? 'devnet' : activeNetwork,\n }),\n [appName, appOrigin, activeNetwork],\n );\n\n\n return (\n <AppProvider connectorConfig={connectorConfig} mobile={mobile}>\n {children}\n </AppProvider>\n );\n}","\"use client\";\n\nimport { RpcMap } from \"../types\";\nimport { RpcProvider } from \"./RpcProvider\";\nimport { SolanaWalletProvider } from \"./SolanaWalletProvider\";\n\ntype SolanaWrapperProps = {\n children: React.ReactNode;\n\n /** * Name of your app (displayed in wallet connection modals) \n * @default \"Solana Kit\"\n */\n appName?: string;\n\n /** * URL of your app (used for deep linking) \n */\n appUrl?: string;\n\n /** * Automatically connect to the last used wallet on load.\n * @default true\n */\n autoConnect?: boolean;\n\n /** * Enable mobile wallets (e.g. Phantom on iOS/Android) \n * @default true\n */\n enableMobile?: boolean;\n\n /** * Enable WalletConnect support \n * @default true\n */\n walletConnect?: boolean;\n\n /** * List of default RPC endpoints mapped by network \n * @default DEFAULT_RPCS\n */\n defaultRpcList?: RpcMap;\n\n /** * The default RPC endpoint to use if none is selected \n * @default DEFAULT_RPCS.mainnet[0]\n */\n defaultRpcUrl?: string;\n\n /** * LocalStorage key for saving custom RPC list \n * @default 'all-rpc-urls'\n */\n LS_KEY_RPC_LIST?: string;\n\n /** * LocalStorage key for saving default RPC endpoint \n * @default 'curr-rpc'\n */\n LS_KEY_RPC_DEFAULT?: string;\n\n /** * LocalStorage key for saving selected cluster \n * @default 'solana-cluster'\n */\n LS_KEY_CLUSTER?: string;\n\n /** * Persist cluster selection in LocalStorage \n * @default true\n */\n persistClusterSelection?: boolean;\n\n /** * Maximum number of retries for RPC requests \n * @default 3\n */\n MAX_RPC_RETRIES?: number;\n}\n\nexport function SolanaWrapper(props: SolanaWrapperProps) {\n const {\n children,\n\n appName,\n appUrl,\n\n autoConnect,\n enableMobile,\n walletConnect,\n\n defaultRpcList,\n defaultRpcUrl,\n LS_KEY_RPC_LIST,\n LS_KEY_RPC_DEFAULT,\n LS_KEY_CLUSTER,\n persistClusterSelection,\n MAX_RPC_RETRIES,\n\n } = props\n\n\n const RPC_PROVIDER_PROPS = {\n defaultRpcList,\n defaultRpcUrl,\n LS_KEY_RPC_LIST,\n LS_KEY_RPC_DEFAULT,\n LS_KEY_CLUSTER,\n persistClusterSelection,\n MAX_RPC_RETRIES,\n\n }\n\n const solanaWalletProviderProps = {\n appName,\n appUrl,\n\n autoConnect,\n enableMobile,\n\n walletConnect,\n additionalWallets: [],\n coingecko: undefined,\n walletsDisplayConfig: undefined\n }\n\n return (\n <RpcProvider {...RPC_PROVIDER_PROPS}>\n <SolanaWalletProvider {...solanaWalletProviderProps}>\n {children}\n </SolanaWalletProvider>\n </RpcProvider>\n )\n}"],"mappings":"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","names":["useMemo","jsx","useMemo","jsx"]}
package/package.json CHANGED
@@ -1,13 +1,17 @@
1
1
  {
2
2
  "name": "@algobright/solana-connector",
3
- "version": "0.1.0",
4
- "description": "AlgoBright Solana Wallet Connector",
5
- "license": "Apache-2.0",
6
- "author": "AlgoBright Tech Private Limited",
3
+ "version": "0.1.2",
7
4
  "repository": {
8
5
  "type": "git",
9
6
  "url": "https://github.com/algobright/solana-connector.git"
10
7
  },
8
+ "publishConfig": {
9
+ "access": "public",
10
+ "provenance": true
11
+ },
12
+ "description": "AlgoBright Solana Wallet Connector",
13
+ "license": "Apache-2.0",
14
+ "author": "AlgoBright Tech Private Limited",
11
15
  "sideEffects": false,
12
16
  "main": "./dist/index.js",
13
17
  "module": "./dist/index.mjs",
@@ -38,12 +42,10 @@
38
42
  "local:refresh": "npm run build && yalc publish --push",
39
43
  "prepublishOnly": "npm run build"
40
44
  },
41
- "publishConfig": {
42
- "access": "public",
43
- "registry": "https://registry.npmjs.org/"
44
- },
45
45
  "dependencies": {
46
46
  "@base-ui/react": "^1.1.0",
47
+ "@solana-program/token": "^0.9.0",
48
+ "@solana-program/token-2022": "^0.6.1",
47
49
  "@solana/connector": "^0.2.3",
48
50
  "@solana/kit": "^5.4.0",
49
51
  "@solana/web3.js": "^1.98.4",
@@ -68,4 +70,4 @@
68
70
  "tsup": "^8.5.1",
69
71
  "typescript": "^5.9.3"
70
72
  }
71
- }
73
+ }