@algobright/solana-connector 0.1.3 → 0.1.4

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.
package/dist/index.d.mts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { SimplifiedWalletConnectConfig } from '@solana/connector';
2
3
 
3
4
  type Network = 'mainnet' | 'devnet' | 'testnet' | 'localnet';
4
5
  type RpcMap = Record<Network, string[]>;
@@ -21,9 +22,16 @@ type SolanaWrapperProps = {
21
22
  */
22
23
  enableMobile?: boolean;
23
24
  /** * Enable WalletConnect support
24
- * @default true
25
+ * Enable or configure WalletConnect support for QR code and deep-link connections.
26
+ * * **Mobile-First Note:** Setting this to `false` (default) reduces initial bundle size.
27
+ * Enable this if you need to support desktop-to-mobile connections via QR codes.
28
+ * * - `false`: (Default) Disables WalletConnect.
29
+ * - `true`: Enables using `NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID` from your environment.
30
+ * - `object`: Provides manual overrides for `projectId`, `metadata`, etc.
31
+ * * @default false
32
+ * @see https://docs.reown.com/appkit/overview
25
33
  */
26
- walletConnect?: boolean;
34
+ walletConnect?: boolean | SimplifiedWalletConnectConfig;
27
35
  /** * List of default RPC endpoints mapped by network
28
36
  * @default DEFAULT_RPCS
29
37
  */
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { SimplifiedWalletConnectConfig } from '@solana/connector';
2
3
 
3
4
  type Network = 'mainnet' | 'devnet' | 'testnet' | 'localnet';
4
5
  type RpcMap = Record<Network, string[]>;
@@ -21,9 +22,16 @@ type SolanaWrapperProps = {
21
22
  */
22
23
  enableMobile?: boolean;
23
24
  /** * Enable WalletConnect support
24
- * @default true
25
+ * Enable or configure WalletConnect support for QR code and deep-link connections.
26
+ * * **Mobile-First Note:** Setting this to `false` (default) reduces initial bundle size.
27
+ * Enable this if you need to support desktop-to-mobile connections via QR codes.
28
+ * * - `false`: (Default) Disables WalletConnect.
29
+ * - `true`: Enables using `NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID` from your environment.
30
+ * - `object`: Provides manual overrides for `projectId`, `metadata`, etc.
31
+ * * @default false
32
+ * @see https://docs.reown.com/appkit/overview
25
33
  */
26
- walletConnect?: boolean;
34
+ walletConnect?: boolean | SimplifiedWalletConnectConfig;
27
35
  /** * List of default RPC endpoints mapped by network
28
36
  * @default DEFAULT_RPCS
29
37
  */
package/dist/index.js CHANGED
@@ -125,7 +125,7 @@ function SolanaWalletProvider(props) {
125
125
  appUrl,
126
126
  autoConnect = true,
127
127
  enableMobile = true,
128
- walletConnect = true,
128
+ walletConnect = false,
129
129
  additionalWallets = [],
130
130
  coingecko,
131
131
  walletsDisplayConfig
@@ -184,14 +184,13 @@ function SolanaWalletProvider(props) {
184
184
  wallets: walletsDisplayConfig
185
185
  });
186
186
  }, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);
187
- const mobile = (0, import_react2.useMemo)(
188
- () => (0, import_react3.getDefaultMobileConfig)({
189
- appName,
190
- appUrl: appOrigin,
191
- network: activeNetwork === "localnet" ? "devnet" : activeNetwork
192
- }),
193
- [appName, appOrigin, activeNetwork]
194
- );
187
+ const mobile = {
188
+ appIdentity: {
189
+ name: appName,
190
+ uri: appOrigin,
191
+ icon: appUrl ? `${appOrigin}/favicon.ico` : void 0
192
+ }
193
+ };
195
194
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react3.AppProvider, { connectorConfig, mobile, children });
196
195
  }
197
196
 
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';\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
+ {"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, MobileWalletAdapterConfig, SimplifiedWalletConnectConfig, 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 | SimplifiedWalletConnectConfig;\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 = false,\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 // console.error(mobile.appIdentity)\n\n const mobile: MobileWalletAdapterConfig = {\n appIdentity: {\n name: appName,\n uri: appOrigin,\n icon: appUrl ? `${appOrigin}/favicon.ico` : undefined,\n }\n }\n\n\n return (\n <AppProvider connectorConfig={connectorConfig} mobile={mobile} >\n {children}\n </AppProvider >\n );\n}","\"use client\";\n\nimport { SimplifiedWalletConnectConfig } from \"@solana/connector\";\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 * Enable or configure WalletConnect support for QR code and deep-link connections.\n * * **Mobile-First Note:** Setting this to `false` (default) reduces initial bundle size. \n * Enable this if you need to support desktop-to-mobile connections via QR codes.\n * * - `false`: (Default) Disables WalletConnect.\n * - `true`: Enables using `NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID` from your environment.\n * - `object`: Provides manual overrides for `projectId`, `metadata`, etc.\n * * @default false\n * @see https://docs.reown.com/appkit/overview\n */\n walletConnect?: boolean | SimplifiedWalletConnectConfig;\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":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,mBAQO;AAyHC;AArHR,IAAM,eAAuB;AAAA,EACzB,SAAS,CAAC,gCAAgC;AAAA,EAC1C,QAAQ,CAAC,+BAA+B;AAAA,EACxC,SAAS,CAAC,gCAAgC;AAAA,EAC1C,UAAU,CAAC,uBAAuB;AACtC;AAcA,IAAM,iBAAa,4BAAqC,IAAI;AAerD,SAAS,YAAY,OAAyB;AACjD,QAAM;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,IACjB,gBAAgB,aAAa,QAAQ,CAAC;AAAA,IACtC,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,IAC1B,kBAAkB;AAAA,EACtB,IAAI;AAEJ,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAiB,cAAc;AACnE,QAAM,CAAC,QAAQ,cAAc,QAAI,uBAAiB,aAAa;AAE/D,8BAAU,MAAM;AACZ,UAAM,eAAe,aAAa,QAAQ,eAAe;AACzD,UAAM,WAAW,aAAa,QAAQ,kBAAkB;AAExD,QAAI,YAAY,aAAa,QAAQ;AACjC,qBAAe,QAAQ;AAAA,IAC3B;AAEA,QAAI,cAAc;AACd,UAAI;AACA,cAAM,SAAS,KAAK,MAAM,YAAY;AACtC,sBAAc;AAAA,UACV,SAAS,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,aAAa,SAAS,GAAI,OAAO,WAAW,CAAC,CAAE,CAAC,CAAC;AAAA,UACjF,QAAQ,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,aAAa,QAAQ,GAAI,OAAO,UAAU,CAAC,CAAE,CAAC,CAAC;AAAA,UAC9E,SAAS,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,aAAa,SAAS,GAAI,OAAO,WAAW,CAAC,CAAE,CAAC,CAAC;AAAA,UACjF,UAAU,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,aAAa,UAAU,GAAI,OAAO,YAAY,CAAC,CAAE,CAAC,CAAC;AAAA,QACxF,CAAC;AAAA,MACL,SAAS,GAAG;AACR,gBAAQ,MAAM,CAAC;AAAA,MACnB;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAY,0BAAY,CAAC,QAAgB;AAC3C,mBAAe,GAAG;AAClB,iBAAa,QAAQ,oBAAoB,GAAG;AAAA,EAChD,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAY,0BAAY,CAAC,SAAkB,QAAgB;AAC7D,QAAI,CAAC,IAAK;AAEV,kBAAc,CAAC,SAAS;AACpB,YAAM,UAAU,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,KAAK,OAAO,GAAG,GAAG,CAAC,CAAC;AAC3D,YAAM,WAAW,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,QAAQ;AAC/C,mBAAa,QAAQ,iBAAiB,KAAK,UAAU,QAAQ,CAAC;AAC9D,aAAO;AAAA,IACX,CAAC;AAED,cAAU,GAAG;AAAA,EACjB,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,mBAAe,0BAAY,CAAC,SAAkB,QAAgB;AAChE,kBAAc,CAAC,SAAS;AACpB,UAAI,UAAU,KAAK,OAAO,EAAE,OAAO,CAAC,QAAQ,QAAQ,GAAG;AAEvD,UAAI,QAAQ,WAAW,GAAG;AACtB,kBAAU,CAAC,GAAG,aAAa,OAAO,CAAC;AAAA,MACvC;AAEA,YAAM,WAAW,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,QAAQ;AAC/C,mBAAa,QAAQ,iBAAiB,KAAK,UAAU,QAAQ,CAAC;AAC9D,aAAO;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,YAAQ,sBAAwB,OAAO;AAAA,IACzC;AAAA,IACA,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,QAAQ,YAAY,WAAW,WAAW,YAAY,CAAC;AAG5D,SACI,4CAAC,WAAW,UAAX,EAAoB,OAChB,UACL;AAER;AAEO,IAAM,iBAAiB,MAAM;AAChC,QAAM,cAAU,yBAAW,UAAU;AACrC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,gDAAgD;AAAA,EACpE;AACA,SAAO;AACX;;;AC5IA,IAAAA,gBAAwB;AACxB,IAAAA,gBAA6J;AAsHrJ,IAAAC,sBAAA;AAlGD,SAAS,qBAAqB,OAAkC;AACnE,QAAM;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,cAAc;AAAA,IACd,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,oBAAoB,CAAC;AAAA,IACrB;AAAA,IACA;AAAA,EACJ,IAAI;AAEJ,QAAM;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAAQ;AAAA,EACZ,IAAI,eAAe;AAEnB,QAAM,YAAY,WAAW,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAEtF,QAAM,oBAAyB,uBAAQ,MAAM;AACzC,QAAI,WAAW,OAAO,SAAS,MAAM,EAAG,QAAO;AAAA,aACtC,WAAW,QAAQ,SAAS,MAAM,EAAG,QAAO;AAAA,aAC5C,WAAW,SAAS,SAAS,MAAM,EAAG,QAAO;AACtD,WAAO;AAAA,EACX,GAAG,CAAC,QAAQ,UAAU,CAAC;AAEvB,QAAM,sBAAkB,uBAAQ,MAAM;AAElC,UAAM,WAA4B;AAAA,MAC9B;AAAA,QACI,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,KAAK,kBAAkB,YAAY,SAAS,WAAW,QAAQ,CAAC;AAAA,MACpE;AAAA,MACA;AAAA,QACI,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,KAAK,kBAAkB,aAAa,SAAS,WAAW,SAAS,CAAC;AAAA,MACtE;AAAA,MACA;AAAA,QACI,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,KAAK,kBAAkB,WAAW,SAAS,WAAW,OAAO,CAAC;AAAA,MAClE;AAAA,MACA;AAAA,QACI,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,KAAK,kBAAkB,YAAY,SAAS,WAAW,QAAQ,CAAC;AAAA,MACpE;AAAA,IACJ;AAEA,eAAO,gCAAiB;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MAEA,SAAS;AAAA,MACT;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MAEZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IAEb,CAAC;AAAA,EACL,GAAG,CAAC,SAAS,WAAW,aAAa,cAAc,eAAe,SAAS,CAAC;AAc5E,QAAM,SAAoC;AAAA,IACtC,aAAa;AAAA,MACT,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM,SAAS,GAAG,SAAS,iBAAiB;AAAA,IAChD;AAAA,EACJ;AAGA,SACI,6CAAC,6BAAY,iBAAkC,QAC1C,UACL;AAER;;;ACFY,IAAAC,sBAAA;AAhDL,SAAS,cAAc,OAA2B;AACrD,QAAM;AAAA,IACF;AAAA,IAEA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAEJ,IAAI;AAGJ,QAAM,qBAAqB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAEJ;AAEA,QAAM,4BAA4B;AAAA,IAC9B;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IAEA;AAAA,IACA,mBAAmB,CAAC;AAAA,IACpB,WAAW;AAAA,IACX,sBAAsB;AAAA,EAC1B;AAEA,SACI,6CAAC,eAAa,GAAG,oBACb,uDAAC,wBAAsB,GAAG,2BACrB,UACL,GACJ;AAER;","names":["import_react","import_jsx_runtime","import_jsx_runtime"]}
package/dist/index.mjs CHANGED
@@ -97,7 +97,7 @@ var useRpcProvider = () => {
97
97
 
98
98
  // src/providers/SolanaWalletProvider.tsx
99
99
  import { useMemo as useMemo2 } from "react";
100
- import { AppProvider, getDefaultConfig, getDefaultMobileConfig } from "@solana/connector/react";
100
+ import { AppProvider, getDefaultConfig } from "@solana/connector/react";
101
101
  import { jsx as jsx2 } from "react/jsx-runtime";
102
102
  function SolanaWalletProvider(props) {
103
103
  const {
@@ -106,7 +106,7 @@ function SolanaWalletProvider(props) {
106
106
  appUrl,
107
107
  autoConnect = true,
108
108
  enableMobile = true,
109
- walletConnect = true,
109
+ walletConnect = false,
110
110
  additionalWallets = [],
111
111
  coingecko,
112
112
  walletsDisplayConfig
@@ -165,14 +165,13 @@ function SolanaWalletProvider(props) {
165
165
  wallets: walletsDisplayConfig
166
166
  });
167
167
  }, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);
168
- const mobile = useMemo2(
169
- () => getDefaultMobileConfig({
170
- appName,
171
- appUrl: appOrigin,
172
- network: activeNetwork === "localnet" ? "devnet" : activeNetwork
173
- }),
174
- [appName, appOrigin, activeNetwork]
175
- );
168
+ const mobile = {
169
+ appIdentity: {
170
+ name: appName,
171
+ uri: appOrigin,
172
+ icon: appUrl ? `${appOrigin}/favicon.ico` : void 0
173
+ }
174
+ };
176
175
  return /* @__PURE__ */ jsx2(AppProvider, { connectorConfig, mobile, children });
177
176
  }
178
177
 
@@ -1 +1 @@
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"]}
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, MobileWalletAdapterConfig, SimplifiedWalletConnectConfig, 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 | SimplifiedWalletConnectConfig;\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 = false,\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 // console.error(mobile.appIdentity)\n\n const mobile: MobileWalletAdapterConfig = {\n appIdentity: {\n name: appName,\n uri: appOrigin,\n icon: appUrl ? `${appOrigin}/favicon.ico` : undefined,\n }\n }\n\n\n return (\n <AppProvider connectorConfig={connectorConfig} mobile={mobile} >\n {children}\n </AppProvider >\n );\n}","\"use client\";\n\nimport { SimplifiedWalletConnectConfig } from \"@solana/connector\";\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 * Enable or configure WalletConnect support for QR code and deep-link connections.\n * * **Mobile-First Note:** Setting this to `false` (default) reduces initial bundle size. \n * Enable this if you need to support desktop-to-mobile connections via QR codes.\n * * - `false`: (Default) Disables WalletConnect.\n * - `true`: Enables using `NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID` from your environment.\n * - `object`: Provides manual overrides for `projectId`, `metadata`, etc.\n * * @default false\n * @see https://docs.reown.com/appkit/overview\n */\n walletConnect?: boolean | SimplifiedWalletConnectConfig;\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,6 +1,6 @@
1
1
  {
2
2
  "name": "@algobright/solana-connector",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/algobright/solana-connector.git"