@tuwaio/nova-connect 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/{chunk-JFUJC4EJ.cjs → chunk-2SFIZVDC.cjs} +1 -2
  2. package/dist/{chunk-NHKYALBZ.cjs → chunk-4BGH6VFE.cjs} +3 -4
  3. package/dist/{chunk-WSHZWOWS.cjs → chunk-K44IHM6B.cjs} +1 -2
  4. package/dist/{chunk-QGCEN6MP.js → chunk-S3IRVZMG.js} +1 -2
  5. package/dist/{chunk-WVALNTUP.js → chunk-S3RQJGCL.js} +1 -2
  6. package/dist/{chunk-3BMX6JWH.js → chunk-T6H7HGCM.js} +1 -2
  7. package/dist/{chunk-PTHXIVB5.cjs → chunk-WTDBHPAK.cjs} +1 -2
  8. package/dist/{chunk-RARO6QP2.js → chunk-Y53IY57F.js} +2 -3
  9. package/dist/{chunk-YIZJUEA3.cjs → chunk-YDPI5PAY.cjs} +1 -2
  10. package/dist/{chunk-H2RLZRJ4.js → chunk-YO3PXLI4.js} +1 -2
  11. package/dist/components/index.cjs +1 -2
  12. package/dist/components/index.js +1 -2
  13. package/dist/evm/index.cjs +1 -2
  14. package/dist/evm/index.js +1 -2
  15. package/dist/{evm-BHPO7QCV.js → evm-DUQXCW22.js} +1 -2
  16. package/dist/{evm-4RL5ZQMP.cjs → evm-KSA7PJIK.cjs} +1 -2
  17. package/dist/getChainsListByConnectorType-QCNOPM6I.cjs +1 -0
  18. package/dist/{getChainsListByConnectorType-B3BLNZZH.js → getChainsListByConnectorType-YZZUYC6D.js} +1 -2
  19. package/dist/hooks/index.cjs +1 -2
  20. package/dist/hooks/index.js +1 -2
  21. package/dist/i18n/index.cjs +1 -2
  22. package/dist/i18n/index.js +1 -2
  23. package/dist/index.cjs +1 -2
  24. package/dist/index.js +1 -2
  25. package/dist/satellite/index.cjs +1 -2
  26. package/dist/satellite/index.js +1 -2
  27. package/dist/solana/index.cjs +1 -2
  28. package/dist/solana/index.js +1 -2
  29. package/dist/{solana-CQFZWAY7.cjs → solana-CVUSQUPL.cjs} +1 -2
  30. package/dist/{solana-6OCXX47U.js → solana-GDE2KIT6.js} +1 -2
  31. package/package.json +15 -15
  32. package/dist/chunk-3BMX6JWH.js.map +0 -1
  33. package/dist/chunk-H2RLZRJ4.js.map +0 -1
  34. package/dist/chunk-JFUJC4EJ.cjs.map +0 -1
  35. package/dist/chunk-NHKYALBZ.cjs.map +0 -1
  36. package/dist/chunk-PTHXIVB5.cjs.map +0 -1
  37. package/dist/chunk-QGCEN6MP.js.map +0 -1
  38. package/dist/chunk-RARO6QP2.js.map +0 -1
  39. package/dist/chunk-WSHZWOWS.cjs.map +0 -1
  40. package/dist/chunk-WVALNTUP.js.map +0 -1
  41. package/dist/chunk-YIZJUEA3.cjs.map +0 -1
  42. package/dist/components/index.cjs.map +0 -1
  43. package/dist/components/index.js.map +0 -1
  44. package/dist/evm/index.cjs.map +0 -1
  45. package/dist/evm/index.js.map +0 -1
  46. package/dist/evm-4RL5ZQMP.cjs.map +0 -1
  47. package/dist/evm-BHPO7QCV.js.map +0 -1
  48. package/dist/getChainsListByConnectorType-B3BLNZZH.js.map +0 -1
  49. package/dist/getChainsListByConnectorType-BXIDPPGC.cjs +0 -2
  50. package/dist/getChainsListByConnectorType-BXIDPPGC.cjs.map +0 -1
  51. package/dist/hooks/index.cjs.map +0 -1
  52. package/dist/hooks/index.js.map +0 -1
  53. package/dist/i18n/index.cjs.map +0 -1
  54. package/dist/i18n/index.js.map +0 -1
  55. package/dist/index.cjs.map +0 -1
  56. package/dist/index.js.map +0 -1
  57. package/dist/satellite/index.cjs.map +0 -1
  58. package/dist/satellite/index.js.map +0 -1
  59. package/dist/solana/index.cjs.map +0 -1
  60. package/dist/solana/index.js.map +0 -1
  61. package/dist/solana-6OCXX47U.js.map +0 -1
  62. package/dist/solana-CQFZWAY7.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/solana/index.ts"],"names":["getSolanaExports","satelliteReactSolana","actualSolanaConnectorsWatcher","error"],"mappings":"kEAeA,eAAsBA,CAAAA,EAAmB,CACvC,GAAI,CAOF,IAAMC,CAAAA,CAAuB,MAJF,IAAI,QAAA,CAC7B,yIACF,CAAA,EAEsD,CAEtD,GAAI,CAACA,CAAAA,CACH,OAAO,CACL,SAAA,CAAW,CAAA,CAAA,CACX,KAAA,CAAO,+BACT,CAAA,CAKF,IAAMC,CAAAA,CAAgCD,EAAqB,uBAAA,CAE3D,OAAO,CACL,GAAGA,CAAAA,CACH,SAAA,CAAW,CAAA,CAAA,CACX,uBAAA,CAAyBC,CAC3B,CACF,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,IAAA,CAAK,gCAAA,CAAkCA,CAAK,CAAA,CAC7C,CACL,SAAA,CAAW,KAAA,CACX,KAAA,CAAOA,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,sCAClD,CACF,CACF","file":"index.cjs","sourcesContent":["// Export types only, not implementations\nexport type { SolanaClusterMoniker } from 'gill';\n\n// Import types from satellite-react/solana\nimport { OrbitAdapter } from '@tuwaio/orbit-core';\nimport { SolanaConnectorsWatcher } from '@tuwaio/satellite-react/solana';\nimport { ConnectorSolana, SolanaConnection } from '@tuwaio/satellite-solana';\n\n// Re-export the types\nexport type { ConnectorSolana, SolanaConnection };\n\n// Re-export the component\nexport { SolanaConnectorsWatcher };\n\n// Dynamic exports that will be loaded at runtime\nexport async function getSolanaExports() {\n try {\n // Use a more indirect approach to prevent bundlers from resolving imports at build time\n // This creates a function that will be called at runtime\n const importSolanaModule = new Function(\n 'return import(\"@tuwaio/satellite-react/solana\").catch(error => { console.warn(\"Failed to load Solana exports:\", error); return null; })',\n );\n\n const satelliteReactSolana = await importSolanaModule();\n\n if (!satelliteReactSolana) {\n return {\n available: false,\n error: 'Failed to load Solana exports',\n };\n }\n\n // Instead of trying to modify exports directly, we'll return the actual component\n // implementation and let the consumer handle the assignment\n const actualSolanaConnectorsWatcher = satelliteReactSolana.SolanaConnectorsWatcher;\n\n return {\n ...satelliteReactSolana,\n available: true,\n SolanaConnectorsWatcher: actualSolanaConnectorsWatcher,\n };\n } catch (error) {\n console.warn('Failed to load Solana exports:', error);\n return {\n available: false,\n error: error instanceof Error ? error.message : 'Unknown error loading Solana exports',\n };\n }\n}\n\n// Extend the main interface with Solana-specific config\n// This will override the default `any` type with specific SolanaClusterMoniker typing\n// eslint-disable-next-line\n// @ts-ignore - Need for declaration merging\ndeclare module '@tuwaio/nova-connect' {\n interface AllChainConfigs {\n /**\n * Solana RPC URLs configuration - enhanced from default any type\n * @override Replaces default `any` with specific SolanaClusterMoniker typing when gill is available\n */\n // eslint-disable-next-line\n // @ts-ignore - Need for declaration merging\n solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>;\n }\n}\n\n// Extend the satellite-react interfaces with Solana-specific types\n// eslint-disable-next-line\n// @ts-ignore - Need for declaration merging\ndeclare module '@tuwaio/satellite-react' {\n export interface AllConnections {\n [OrbitAdapter.SOLANA]: SolanaConnection;\n }\n export interface AllConnectors {\n [OrbitAdapter.SOLANA]: ConnectorSolana;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/solana/index.ts"],"names":["getSolanaExports","satelliteReactSolana","actualSolanaConnectorsWatcher","error"],"mappings":"oEAeA,eAAsBA,CAAAA,EAAmB,CACvC,GAAI,CAOF,IAAMC,CAAAA,CAAuB,MAJF,IAAI,QAAA,CAC7B,yIACF,CAAA,EAEsD,CAEtD,GAAI,CAACA,CAAAA,CACH,OAAO,CACL,SAAA,CAAW,CAAA,CAAA,CACX,KAAA,CAAO,+BACT,CAAA,CAKF,IAAMC,CAAAA,CAAgCD,EAAqB,uBAAA,CAE3D,OAAO,CACL,GAAGA,CAAAA,CACH,SAAA,CAAW,CAAA,CAAA,CACX,uBAAA,CAAyBC,CAC3B,CACF,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,IAAA,CAAK,gCAAA,CAAkCA,CAAK,CAAA,CAC7C,CACL,SAAA,CAAW,KAAA,CACX,KAAA,CAAOA,CAAAA,YAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,sCAClD,CACF,CACF","file":"index.js","sourcesContent":["// Export types only, not implementations\nexport type { SolanaClusterMoniker } from 'gill';\n\n// Import types from satellite-react/solana\nimport { OrbitAdapter } from '@tuwaio/orbit-core';\nimport { SolanaConnectorsWatcher } from '@tuwaio/satellite-react/solana';\nimport { ConnectorSolana, SolanaConnection } from '@tuwaio/satellite-solana';\n\n// Re-export the types\nexport type { ConnectorSolana, SolanaConnection };\n\n// Re-export the component\nexport { SolanaConnectorsWatcher };\n\n// Dynamic exports that will be loaded at runtime\nexport async function getSolanaExports() {\n try {\n // Use a more indirect approach to prevent bundlers from resolving imports at build time\n // This creates a function that will be called at runtime\n const importSolanaModule = new Function(\n 'return import(\"@tuwaio/satellite-react/solana\").catch(error => { console.warn(\"Failed to load Solana exports:\", error); return null; })',\n );\n\n const satelliteReactSolana = await importSolanaModule();\n\n if (!satelliteReactSolana) {\n return {\n available: false,\n error: 'Failed to load Solana exports',\n };\n }\n\n // Instead of trying to modify exports directly, we'll return the actual component\n // implementation and let the consumer handle the assignment\n const actualSolanaConnectorsWatcher = satelliteReactSolana.SolanaConnectorsWatcher;\n\n return {\n ...satelliteReactSolana,\n available: true,\n SolanaConnectorsWatcher: actualSolanaConnectorsWatcher,\n };\n } catch (error) {\n console.warn('Failed to load Solana exports:', error);\n return {\n available: false,\n error: error instanceof Error ? error.message : 'Unknown error loading Solana exports',\n };\n }\n}\n\n// Extend the main interface with Solana-specific config\n// This will override the default `any` type with specific SolanaClusterMoniker typing\n// eslint-disable-next-line\n// @ts-ignore - Need for declaration merging\ndeclare module '@tuwaio/nova-connect' {\n interface AllChainConfigs {\n /**\n * Solana RPC URLs configuration - enhanced from default any type\n * @override Replaces default `any` with specific SolanaClusterMoniker typing when gill is available\n */\n // eslint-disable-next-line\n // @ts-ignore - Need for declaration merging\n solanaRPCUrls?: Partial<Record<SolanaClusterMoniker, string>>;\n }\n}\n\n// Extend the satellite-react interfaces with Solana-specific types\n// eslint-disable-next-line\n// @ts-ignore - Need for declaration merging\ndeclare module '@tuwaio/satellite-react' {\n export interface AllConnections {\n [OrbitAdapter.SOLANA]: SolanaConnection;\n }\n export interface AllConnectors {\n [OrbitAdapter.SOLANA]: ConnectorSolana;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/adapters/solana.ts"],"names":["getSolanaUtils","getSolanaClusters","isSolanaChainList","getAvailableSolanaClusters","isValidSolanaCluster","error","createSolanaAdapter","solanaUtils","solanaRPCUrls","chains","chain","cluster"],"mappings":"AAiCA,eAAeA,CAAAA,EAAoD,CACjE,GAAI,CACF,GAAM,CAAE,iBAAA,CAAAC,CAAAA,CAAmB,iBAAA,CAAAC,CAAAA,CAAmB,0BAAA,CAAAC,CAAAA,CAA4B,oBAAA,CAAAC,CAAqB,CAAA,CAC7F,MAAM,OAAO,sBAAsB,CAAA,CACrC,OAAO,CAAE,iBAAA,CAAAH,CAAAA,CAAmB,iBAAA,CAAAC,CAAAA,CAAmB,0BAAA,CAAAC,CAAAA,CAA4B,oBAAA,CAAAC,CAAqB,CAClG,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,IAAA,CAAK,iCAAA,CAAmCA,CAAK,CAAA,CAC9C,IACT,CACF,CAiCA,eAAsBC,CAAAA,EAA6C,CACjE,IAAMC,CAAAA,CAAc,MAAMP,CAAAA,EAAe,CAEzC,OAAO,CAQL,SAAA,CAAUQ,CAAAA,CAAoBC,CAAAA,CAAmC,CAE/D,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,kBAAkBC,CAAAA,CAAeC,CAAM,CAAA,CAIxDD,CAAAA,EAAiB,OAAOA,CAAAA,EAAkB,QAAA,CACrC,MAAA,CAAO,IAAA,CAAKA,CAAa,CAAA,CAE3B,EACT,CAAA,CASA,YAAYC,CAAAA,CAAsC,CAChD,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,iBAAA,CAAkBE,CAAM,CAAA,CAItCA,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAO,KAAA,CAAOC,GAAU,OAAOA,CAAAA,EAAU,QAAQ,CAC/E,CAAA,CAcA,oBAAA,EAAiC,CAC/B,OAAIH,CAAAA,EAAa,0BAAA,CACRA,CAAAA,CAAY,0BAAA,EAA2B,CAEzC,EACT,CAAA,CAkBA,cAAA,CAAeI,CAAAA,CAA0B,CACvC,OAAIJ,CAAAA,EAAa,oBAAA,CACRA,CAAAA,CAAY,oBAAA,CAAqBI,CAAO,CAAA,CAE1C,KACT,CACF,CACF","file":"solana-6OCXX47U.js","sourcesContent":["import type { ChainAdapter } from './types';\n\n/**\n * Solana utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface SolanaUtilsModule {\n getSolanaClusters?: (solanaRPCUrls: any, chains?: any) => string[];\n isSolanaChainList?: (chains: (string | number)[]) => boolean;\n getAvailableSolanaClusters?: () => string[];\n isValidSolanaCluster?: (cluster: string) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of Solana utilities.\n * This function attempts to load Solana-specific utilities without throwing errors\n * if the Solana package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to Solana utilities module or null if not available\n *\n * @example\n * ```typescript\n * const solanaUtils = await getSolanaUtils();\n * if (solanaUtils?.getSolanaClusters) {\n * const clusters = solanaUtils.getSolanaClusters(rpcUrls);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getSolanaUtils(): Promise<SolanaUtilsModule | null> {\n try {\n const { getSolanaClusters, isSolanaChainList, getAvailableSolanaClusters, isValidSolanaCluster } =\n await import('@tuwaio/orbit-solana');\n return { getSolanaClusters, isSolanaChainList, getAvailableSolanaClusters, isValidSolanaCluster };\n } catch (error) {\n console.warn('Solana utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates a Solana chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides Solana-specific functionality while gracefully handling\n * environments where Solana utilities are not available. It includes Solana-specific\n * methods like cluster management that are unique to the Solana blockchain architecture.\n *\n * @returns Promise resolving to a configured Solana ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createSolanaAdapter();\n *\n * // Get Solana cluster names from RPC configuration\n * const clusters = adapter.getChains({\n * 'mainnet-beta': 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * });\n * console.log(clusters); // ['mainnet-beta', 'devnet']\n *\n * // Validate cluster list format\n * const isValid = adapter.isChainList(['mainnet-beta', 'devnet']);\n * console.log(isValid); // true (string identifiers are valid for Solana)\n *\n * // Get available clusters\n * const availableClusters = adapter.getAvailableClusters?.();\n * console.log(availableClusters); // All configured cluster names\n * ```\n *\n * @since 1.0.0\n */\nexport async function createSolanaAdapter(): Promise<ChainAdapter> {\n const solanaUtils = await getSolanaUtils();\n\n return {\n /**\n * Extracts cluster names from Solana RPC URL configuration.\n *\n * @param solanaRPCUrls Object mapping cluster names to RPC URLs\n * @param chains Optional array of specific chains to filter\n * @returns Array of cluster names (strings)\n */\n getChains(solanaRPCUrls: any, chains?: any): (string | number)[] {\n // Use imported Solana utilities if available\n if (solanaUtils?.getSolanaClusters) {\n return solanaUtils.getSolanaClusters(solanaRPCUrls, chains);\n }\n\n // Fallback implementation for basic cluster extraction\n if (solanaRPCUrls && typeof solanaRPCUrls === 'object') {\n return Object.keys(solanaRPCUrls);\n }\n return [];\n },\n\n /**\n * Validates whether the provided chains list conforms to Solana cluster format.\n * Solana clusters are typically identified by string names like 'mainnet-beta', 'devnet'.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for Solana\n */\n isChainList(chains: (string | number)[]): boolean {\n if (solanaUtils?.isSolanaChainList) {\n return solanaUtils.isSolanaChainList(chains);\n }\n\n // Fallback validation: Solana clusters should be strings\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n },\n\n /**\n * Gets all available Solana clusters from the current configuration.\n * This is a Solana-specific method that returns cluster names that can be used.\n *\n * @returns Array of available cluster names\n *\n * @example\n * ```typescript\n * const clusters = await adapter.getAvailableClusters?.();\n * // Might return: ['mainnet-beta', 'devnet', 'testnet']\n * ```\n */\n getAvailableClusters(): string[] {\n if (solanaUtils?.getAvailableSolanaClusters) {\n return solanaUtils.getAvailableSolanaClusters();\n }\n return [];\n },\n\n /**\n * Validates whether a cluster name is valid for Solana.\n * Checks against known Solana cluster monikers and custom configurations.\n *\n * @param cluster Cluster name to validate\n * @returns True if the cluster name is valid\n *\n * @example\n * ```typescript\n * const isValid = await adapter.isValidCluster?.('mainnet-beta');\n * console.log(isValid); // true\n *\n * const isInvalid = await adapter.isValidCluster?.('invalid-cluster');\n * console.log(isInvalid); // false\n * ```\n */\n isValidCluster(cluster: string): boolean {\n if (solanaUtils?.isValidSolanaCluster) {\n return solanaUtils.isValidSolanaCluster(cluster);\n }\n return false;\n },\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/adapters/solana.ts"],"names":["getSolanaUtils","getSolanaClusters","isSolanaChainList","getAvailableSolanaClusters","isValidSolanaCluster","error","createSolanaAdapter","solanaUtils","solanaRPCUrls","chains","chain","cluster"],"mappings":"aAiCA,eAAeA,CAAAA,EAAoD,CACjE,GAAI,CACF,GAAM,CAAE,iBAAA,CAAAC,CAAAA,CAAmB,iBAAA,CAAAC,CAAAA,CAAmB,0BAAA,CAAAC,CAAAA,CAA4B,oBAAA,CAAAC,CAAqB,CAAA,CAC7F,MAAM,OAAO,sBAAsB,CAAA,CACrC,OAAO,CAAE,iBAAA,CAAAH,CAAAA,CAAmB,iBAAA,CAAAC,CAAAA,CAAmB,0BAAA,CAAAC,CAAAA,CAA4B,oBAAA,CAAAC,CAAqB,CAClG,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,IAAA,CAAK,iCAAA,CAAmCA,CAAK,CAAA,CAC9C,IACT,CACF,CAiCA,eAAsBC,CAAAA,EAA6C,CACjE,IAAMC,CAAAA,CAAc,MAAMP,CAAAA,EAAe,CAEzC,OAAO,CAQL,SAAA,CAAUQ,CAAAA,CAAoBC,CAAAA,CAAmC,CAE/D,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,kBAAkBC,CAAAA,CAAeC,CAAM,CAAA,CAIxDD,CAAAA,EAAiB,OAAOA,CAAAA,EAAkB,QAAA,CACrC,MAAA,CAAO,IAAA,CAAKA,CAAa,CAAA,CAE3B,EACT,CAAA,CASA,YAAYC,CAAAA,CAAsC,CAChD,OAAIF,CAAAA,EAAa,iBAAA,CACRA,CAAAA,CAAY,iBAAA,CAAkBE,CAAM,CAAA,CAItCA,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAKA,CAAAA,CAAO,KAAA,CAAOC,GAAU,OAAOA,CAAAA,EAAU,QAAQ,CAC/E,CAAA,CAcA,oBAAA,EAAiC,CAC/B,OAAIH,CAAAA,EAAa,0BAAA,CACRA,CAAAA,CAAY,0BAAA,EAA2B,CAEzC,EACT,CAAA,CAkBA,cAAA,CAAeI,CAAAA,CAA0B,CACvC,OAAIJ,CAAAA,EAAa,oBAAA,CACRA,CAAAA,CAAY,oBAAA,CAAqBI,CAAO,CAAA,CAE1C,KACT,CACF,CACF","file":"solana-CQFZWAY7.cjs","sourcesContent":["import type { ChainAdapter } from './types';\n\n/**\n * Solana utilities module interface for dynamic imports.\n *\n * @internal\n * @since 1.0.0\n */\ninterface SolanaUtilsModule {\n getSolanaClusters?: (solanaRPCUrls: any, chains?: any) => string[];\n isSolanaChainList?: (chains: (string | number)[]) => boolean;\n getAvailableSolanaClusters?: () => string[];\n isValidSolanaCluster?: (cluster: string) => boolean;\n}\n\n/**\n * Dynamically imports and checks availability of Solana utilities.\n * This function attempts to load Solana-specific utilities without throwing errors\n * if the Solana package is not installed in the current environment.\n *\n * @internal\n * @returns Promise resolving to Solana utilities module or null if not available\n *\n * @example\n * ```typescript\n * const solanaUtils = await getSolanaUtils();\n * if (solanaUtils?.getSolanaClusters) {\n * const clusters = solanaUtils.getSolanaClusters(rpcUrls);\n * }\n * ```\n *\n * @since 1.0.0\n */\nasync function getSolanaUtils(): Promise<SolanaUtilsModule | null> {\n try {\n const { getSolanaClusters, isSolanaChainList, getAvailableSolanaClusters, isValidSolanaCluster } =\n await import('@tuwaio/orbit-solana');\n return { getSolanaClusters, isSolanaChainList, getAvailableSolanaClusters, isValidSolanaCluster };\n } catch (error) {\n console.warn('Solana utilities not available:', error);\n return null;\n }\n}\n\n/**\n * Creates a Solana chain adapter with dynamic loading and fallback support.\n *\n * This adapter provides Solana-specific functionality while gracefully handling\n * environments where Solana utilities are not available. It includes Solana-specific\n * methods like cluster management that are unique to the Solana blockchain architecture.\n *\n * @returns Promise resolving to a configured Solana ChainAdapter\n *\n * @example\n * ```typescript\n * const adapter = await createSolanaAdapter();\n *\n * // Get Solana cluster names from RPC configuration\n * const clusters = adapter.getChains({\n * 'mainnet-beta': 'https://api.mainnet-beta.solana.com',\n * devnet: 'https://api.devnet.solana.com'\n * });\n * console.log(clusters); // ['mainnet-beta', 'devnet']\n *\n * // Validate cluster list format\n * const isValid = adapter.isChainList(['mainnet-beta', 'devnet']);\n * console.log(isValid); // true (string identifiers are valid for Solana)\n *\n * // Get available clusters\n * const availableClusters = adapter.getAvailableClusters?.();\n * console.log(availableClusters); // All configured cluster names\n * ```\n *\n * @since 1.0.0\n */\nexport async function createSolanaAdapter(): Promise<ChainAdapter> {\n const solanaUtils = await getSolanaUtils();\n\n return {\n /**\n * Extracts cluster names from Solana RPC URL configuration.\n *\n * @param solanaRPCUrls Object mapping cluster names to RPC URLs\n * @param chains Optional array of specific chains to filter\n * @returns Array of cluster names (strings)\n */\n getChains(solanaRPCUrls: any, chains?: any): (string | number)[] {\n // Use imported Solana utilities if available\n if (solanaUtils?.getSolanaClusters) {\n return solanaUtils.getSolanaClusters(solanaRPCUrls, chains);\n }\n\n // Fallback implementation for basic cluster extraction\n if (solanaRPCUrls && typeof solanaRPCUrls === 'object') {\n return Object.keys(solanaRPCUrls);\n }\n return [];\n },\n\n /**\n * Validates whether the provided chains list conforms to Solana cluster format.\n * Solana clusters are typically identified by string names like 'mainnet-beta', 'devnet'.\n *\n * @param chains Array of chain identifiers to validate\n * @returns True if the chain list is valid for Solana\n */\n isChainList(chains: (string | number)[]): boolean {\n if (solanaUtils?.isSolanaChainList) {\n return solanaUtils.isSolanaChainList(chains);\n }\n\n // Fallback validation: Solana clusters should be strings\n return chains.length > 0 && chains.every((chain) => typeof chain === 'string');\n },\n\n /**\n * Gets all available Solana clusters from the current configuration.\n * This is a Solana-specific method that returns cluster names that can be used.\n *\n * @returns Array of available cluster names\n *\n * @example\n * ```typescript\n * const clusters = await adapter.getAvailableClusters?.();\n * // Might return: ['mainnet-beta', 'devnet', 'testnet']\n * ```\n */\n getAvailableClusters(): string[] {\n if (solanaUtils?.getAvailableSolanaClusters) {\n return solanaUtils.getAvailableSolanaClusters();\n }\n return [];\n },\n\n /**\n * Validates whether a cluster name is valid for Solana.\n * Checks against known Solana cluster monikers and custom configurations.\n *\n * @param cluster Cluster name to validate\n * @returns True if the cluster name is valid\n *\n * @example\n * ```typescript\n * const isValid = await adapter.isValidCluster?.('mainnet-beta');\n * console.log(isValid); // true\n *\n * const isInvalid = await adapter.isValidCluster?.('invalid-cluster');\n * console.log(isInvalid); // false\n * ```\n */\n isValidCluster(cluster: string): boolean {\n if (solanaUtils?.isValidSolanaCluster) {\n return solanaUtils.isValidSolanaCluster(cluster);\n }\n return false;\n },\n };\n}\n"]}