@algobright/solana-connector 0.1.10 → 0.1.12

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.js CHANGED
@@ -118,6 +118,12 @@ var useRpcProvider = () => {
118
118
  var import_react2 = require("react");
119
119
  var import_react3 = require("@solana/connector/react");
120
120
  var import_jsx_runtime2 = require("react/jsx-runtime");
121
+ var getOrigin = () => {
122
+ if (typeof window !== "undefined") {
123
+ return window.location.origin;
124
+ }
125
+ return "http://localhost:3000";
126
+ };
121
127
  function SolanaWalletProvider(props) {
122
128
  const {
123
129
  children,
@@ -137,7 +143,7 @@ function SolanaWalletProvider(props) {
137
143
  rpcUrl,
138
144
  allRpcUrls
139
145
  } = useRpcProvider();
140
- const appOrigin = appUrl || (typeof window !== "undefined" ? window.location.origin : "");
146
+ const appOrigin = getOrigin();
141
147
  const activeNetwork = (0, import_react2.useMemo)(() => {
142
148
  if (allRpcUrls.devnet.includes(rpcUrl)) return "devnet";
143
149
  else if (allRpcUrls.testnet.includes(rpcUrl)) return "testnet";
@@ -184,13 +190,14 @@ function SolanaWalletProvider(props) {
184
190
  wallets: walletsDisplayConfig
185
191
  });
186
192
  }, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);
187
- const mobile = (0, import_react2.useMemo)(() => {
188
- return (0, import_react3.getDefaultMobileConfig)({
193
+ const mobile = (0, import_react2.useMemo)(
194
+ () => (0, import_react3.getDefaultMobileConfig)({
189
195
  appName,
190
196
  appUrl: appOrigin,
191
197
  network: activeNetwork === "localnet" ? "devnet" : activeNetwork
192
- });
193
- }, [appName, appOrigin, activeNetwork]);
198
+ }),
199
+ []
200
+ );
194
201
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react3.AppProvider, { connectorConfig, mobile, children });
195
202
  }
196
203
 
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, 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 return getDefaultMobileConfig({\n appName: appName,\n appUrl: appOrigin,\n network: activeNetwork === 'localnet' ? 'devnet' : activeNetwork,\n });\n }, [appName, appOrigin, activeNetwork]);\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":["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, 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\n// Get origin synchronously on client, fallback for SSR\nconst getOrigin = () => {\n if (typeof window !== 'undefined') {\n return window.location.origin;\n }\n return 'http://localhost:3000';\n};\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 = getOrigin();\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 [],\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":["import_react","import_jsx_runtime","import_jsx_runtime"]}
package/dist/index.mjs CHANGED
@@ -99,6 +99,12 @@ var useRpcProvider = () => {
99
99
  import { useMemo as useMemo2 } from "react";
100
100
  import { AppProvider, getDefaultConfig, getDefaultMobileConfig } from "@solana/connector/react";
101
101
  import { jsx as jsx2 } from "react/jsx-runtime";
102
+ var getOrigin = () => {
103
+ if (typeof window !== "undefined") {
104
+ return window.location.origin;
105
+ }
106
+ return "http://localhost:3000";
107
+ };
102
108
  function SolanaWalletProvider(props) {
103
109
  const {
104
110
  children,
@@ -118,7 +124,7 @@ function SolanaWalletProvider(props) {
118
124
  rpcUrl,
119
125
  allRpcUrls
120
126
  } = useRpcProvider();
121
- const appOrigin = appUrl || (typeof window !== "undefined" ? window.location.origin : "");
127
+ const appOrigin = getOrigin();
122
128
  const activeNetwork = useMemo2(() => {
123
129
  if (allRpcUrls.devnet.includes(rpcUrl)) return "devnet";
124
130
  else if (allRpcUrls.testnet.includes(rpcUrl)) return "testnet";
@@ -165,13 +171,14 @@ function SolanaWalletProvider(props) {
165
171
  wallets: walletsDisplayConfig
166
172
  });
167
173
  }, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);
168
- const mobile = useMemo2(() => {
169
- return getDefaultMobileConfig({
174
+ const mobile = useMemo2(
175
+ () => getDefaultMobileConfig({
170
176
  appName,
171
177
  appUrl: appOrigin,
172
178
  network: activeNetwork === "localnet" ? "devnet" : activeNetwork
173
- });
174
- }, [appName, appOrigin, activeNetwork]);
179
+ }),
180
+ []
181
+ );
175
182
  return /* @__PURE__ */ jsx2(AppProvider, { connectorConfig, mobile, children });
176
183
  }
177
184
 
@@ -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, 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 return getDefaultMobileConfig({\n appName: appName,\n appUrl: appOrigin,\n network: activeNetwork === 'localnet' ? 'devnet' : activeNetwork,\n });\n }, [appName, appOrigin, activeNetwork]);\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":";;;AAEA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEG;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,aAAa,cAAqC,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,IAAI,SAAiB,cAAc;AACnE,QAAM,CAAC,QAAQ,cAAc,IAAI,SAAiB,aAAa;AAE/D,YAAU,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,YAAY,YAAY,CAAC,QAAgB;AAC3C,mBAAe,GAAG;AAClB,iBAAa,QAAQ,oBAAoB,GAAG;AAAA,EAChD,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,YAAY,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,eAAe,YAAY,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,QAAQ,QAAwB,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,oBAAC,WAAW,UAAX,EAAoB,OAChB,UACL;AAER;AAEO,IAAM,iBAAiB,MAAM;AAChC,QAAM,UAAU,WAAW,UAAU;AACrC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,gDAAgD;AAAA,EACpE;AACA,SAAO;AACX;;;AC5IA,SAAS,WAAAA,gBAAe;AACxB,SAAS,aAAa,kBAAkB,8BAAqH;AA0GrJ,gBAAAC,YAAA;AAtFD,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,gBAAyBC,SAAQ,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,kBAAkBA,SAAQ,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,WAAO,iBAAiB;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;AAE5E,QAAM,SAASA,SAAQ,MAAM;AACzB,WAAO,uBAAuB;AAAA,MAC1B;AAAA,MACA,QAAQ;AAAA,MACR,SAAS,kBAAkB,aAAa,WAAW;AAAA,IACvD,CAAC;AAAA,EACL,GAAG,CAAC,SAAS,WAAW,aAAa,CAAC;AAGtC,SACI,gBAAAD,KAAC,eAAY,iBAAkC,QAC1C,UACL;AAER;;;ACUY,gBAAAE,YAAA;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,gBAAAA,KAAC,eAAa,GAAG,oBACb,0BAAAA,KAAC,wBAAsB,GAAG,2BACrB,UACL,GACJ;AAER;","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, 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\n// Get origin synchronously on client, fallback for SSR\nconst getOrigin = () => {\n if (typeof window !== 'undefined') {\n return window.location.origin;\n }\n return 'http://localhost:3000';\n};\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 = getOrigin();\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 [],\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.10",
3
+ "version": "0.1.12",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/algobright/solana-connector.git"
@@ -48,6 +48,7 @@
48
48
  "prepublishOnly": "npm run build"
49
49
  },
50
50
  "dependencies": {
51
+ "@solana/web3.js": "^1.0.0",
51
52
  "@solana/kit": "^6.0.0",
52
53
  "@solana/connector": "^0.2.0",
53
54
  "@base-ui/react": "^1.1.0",
@@ -60,7 +61,6 @@
60
61
  },
61
62
  "peerDependencies": {
62
63
  "react": ">=18.0.0",
63
- "@solana/web3.js": "^1.0.0",
64
64
  "react-dom": ">=18.0.0"
65
65
  },
66
66
  "devDependencies": {