@algobright/solana-connector 0.1.8 → 0.1.11
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 +10 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -7
package/dist/index.js
CHANGED
|
@@ -185,6 +185,16 @@ function SolanaWalletProvider(props) {
|
|
|
185
185
|
});
|
|
186
186
|
}, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);
|
|
187
187
|
const mobile = (0, import_react2.useMemo)(() => {
|
|
188
|
+
if (appName && appOrigin) {
|
|
189
|
+
return {
|
|
190
|
+
appIdentity: {
|
|
191
|
+
name: appName,
|
|
192
|
+
uri: appOrigin,
|
|
193
|
+
icon: `${appOrigin}/favicon.ico`
|
|
194
|
+
},
|
|
195
|
+
cluster: activeNetwork === "localnet" ? "devnet" : activeNetwork
|
|
196
|
+
};
|
|
197
|
+
}
|
|
188
198
|
return (0, import_react3.getDefaultMobileConfig)({
|
|
189
199
|
appName,
|
|
190
200
|
appUrl: appOrigin,
|
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\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 if (appName && appOrigin) {\n return {\n appIdentity: {\n name: appName,\n uri: appOrigin,\n icon: `${appOrigin}/favicon.ico`,\n },\n cluster: activeNetwork === 'localnet' ? 'devnet' : activeNetwork,\n }\n }\n\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":";;;;;;;;;;;;;;;;;;;;;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,gBAAkI;AAqH1H,IAAAC,sBAAA;AAjGD,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;AAE5E,QAAM,aAAS,uBAAQ,MAAM;AACzB,QAAI,WAAW,WAAW;AACtB,aAAO;AAAA,QACH,aAAa;AAAA,UACT,MAAM;AAAA,UACN,KAAK;AAAA,UACL,MAAM,GAAG,SAAS;AAAA,QACtB;AAAA,QACA,SAAS,kBAAkB,aAAa,WAAW;AAAA,MACvD;AAAA,IACJ;AAEA,eAAO,sCAAuB;AAAA,MAC1B;AAAA,MACA,QAAQ;AAAA,MACR,SAAS,kBAAkB,aAAa,WAAW;AAAA,IACvD,CAAC;AAAA,EACL,GAAG,CAAC,SAAS,WAAW,aAAa,CAAC;AAGtC,SACI,6CAAC,6BAAY,iBAAkC,QAC1C,UACL;AAER;;;ACDY,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
|
@@ -166,6 +166,16 @@ function SolanaWalletProvider(props) {
|
|
|
166
166
|
});
|
|
167
167
|
}, [appName, appOrigin, autoConnect, enableMobile, walletConnect, coingecko]);
|
|
168
168
|
const mobile = useMemo2(() => {
|
|
169
|
+
if (appName && appOrigin) {
|
|
170
|
+
return {
|
|
171
|
+
appIdentity: {
|
|
172
|
+
name: appName,
|
|
173
|
+
uri: appOrigin,
|
|
174
|
+
icon: `${appOrigin}/favicon.ico`
|
|
175
|
+
},
|
|
176
|
+
cluster: activeNetwork === "localnet" ? "devnet" : activeNetwork
|
|
177
|
+
};
|
|
178
|
+
}
|
|
169
179
|
return getDefaultMobileConfig({
|
|
170
180
|
appName,
|
|
171
181
|
appUrl: appOrigin,
|
package/dist/index.mjs.map
CHANGED
|
@@ -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\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 if (appName && appOrigin) {\n return {\n appIdentity: {\n name: appName,\n uri: appOrigin,\n icon: `${appOrigin}/favicon.ico`,\n },\n cluster: activeNetwork === 'localnet' ? 'devnet' : activeNetwork,\n }\n }\n\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,8BAA0F;AAqH1H,gBAAAC,YAAA;AAjGD,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,QAAI,WAAW,WAAW;AACtB,aAAO;AAAA,QACH,aAAa;AAAA,UACT,MAAM;AAAA,UACN,KAAK;AAAA,UACL,MAAM,GAAG,SAAS;AAAA,QACtB;AAAA,QACA,SAAS,kBAAkB,aAAa,WAAW;AAAA,MACvD;AAAA,IACJ;AAEA,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;;;ACDY,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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@algobright/solana-connector",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
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,14 +61,8 @@
|
|
|
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
|
-
"peerDependenciesMeta": {
|
|
67
|
-
"@solana/web3.js": {
|
|
68
|
-
"optional": true
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
66
|
"devDependencies": {
|
|
72
67
|
"@solana/kit": "^5.4.0",
|
|
73
68
|
"@solana/connector": "^0.2.4",
|