UNPKG

@openzeppelin/contracts-ui-builder-adapter-solana

Version:
1 lines 35.5 kB
{"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/configuration/execution.ts","../src/configuration/explorer.ts","../src/configuration/rpc.ts","../src/mapping/constants.ts","../src/mapping/type-mapper.ts","../src/mapping/field-generator.ts","../src/query/view-checker.ts","../src/query/handler.ts","../src/transaction/formatter.ts","../src/transaction/sender.ts","../src/transform/input-parser.ts","../src/transform/output-formatter.ts","../src/types/artifacts.ts","../src/utils/artifacts.ts","../src/utils/validation.ts","../src/wallet/connection.ts","../src/networks/mainnet.ts","../src/networks/testnet.ts","../src/networks/index.ts","../src/config.ts"],"sourcesContent":["// Re-export the main adapter class\nexport { SolanaAdapter } from './adapter';\n\n// Re-export adapter-specific types\nexport type { SolanaContractArtifacts } from './types/artifacts';\nexport { isSolanaContractArtifacts } from './types/artifacts';\n\nexport {\n solanaNetworks,\n solanaMainnetNetworks,\n solanaTestnetNetworks,\n // Individual networks\n solanaMainnetBeta,\n solanaDevnet,\n solanaTestnet,\n} from './networks';\n\n// Export adapter configuration\nexport { solanaAdapterConfig } from './config';\n","import type {\n AvailableUiKit,\n Connector,\n ContractAdapter,\n ContractFunction,\n ContractSchema,\n ExecutionConfig,\n ExecutionMethodDetail,\n FieldType,\n FormFieldType,\n FunctionParameter,\n RelayerDetails,\n RelayerDetailsRich,\n SolanaNetworkConfig,\n UiKitConfiguration,\n UserRpcProviderConfig,\n WalletConnectionStatus,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { isSolanaNetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport {\n getSolanaExplorerAddressUrl,\n getSolanaExplorerTxUrl,\n getSolanaSupportedExecutionMethods,\n testSolanaRpcConnection,\n validateSolanaExecutionConfig,\n validateSolanaRpcEndpoint,\n} from './configuration';\n// Import implementations from modules\nimport {\n generateSolanaDefaultField,\n getSolanaCompatibleFieldTypes,\n mapSolanaParamTypeToFieldType,\n} from './mapping';\nimport { isSolanaViewFunction, querySolanaViewFunction } from './query';\nimport {\n formatSolanaTransactionData,\n signAndBroadcastSolanaTransaction,\n waitForSolanaTransactionConfirmation,\n} from './transaction';\nimport { formatSolanaFunctionResult } from './transform';\nimport { isValidSolanaAddress, validateAndConvertSolanaArtifacts } from './utils';\nimport {\n connectSolanaWallet,\n disconnectSolanaWallet,\n getSolanaAvailableConnectors,\n getSolanaWalletConnectionStatus,\n onSolanaWalletConnectionChange,\n solanaSupportsWalletConnection,\n SolanaWalletConnectionStatus,\n} from './wallet';\n\n/**\n * Solana-specific adapter implementation\n */\nexport class SolanaAdapter implements ContractAdapter {\n readonly networkConfig: SolanaNetworkConfig;\n readonly initialAppServiceKitName: UiKitConfiguration['kitName'];\n // private walletImplementation: SolanaWalletImplementation; // Example\n\n constructor(networkConfig: SolanaNetworkConfig) {\n if (!isSolanaNetworkConfig(networkConfig)) {\n throw new Error('SolanaAdapter requires a valid Solana network configuration.');\n }\n this.networkConfig = networkConfig;\n this.initialAppServiceKitName = 'custom';\n logger.info(\n 'SolanaAdapter',\n `Adapter initialized for network: ${networkConfig.name} (ID: ${networkConfig.id})`\n );\n }\n\n async loadContract(source: string | Record<string, unknown>): Promise<ContractSchema> {\n // Solana contracts (programs) don't have a standardized on-chain ABI.\n // The 'source' would likely be an IDL JSON provided by the user.\n // This is a placeholder for a more complex implementation.\n const artifacts = validateAndConvertSolanaArtifacts(source);\n\n return {\n name: 'SolanaProgram',\n address: artifacts.contractAddress,\n ecosystem: 'solana',\n functions: [],\n events: [],\n };\n }\n\n getWritableFunctions(contractSchema: ContractSchema): ContractSchema['functions'] {\n // Simple filtering can stay here or be moved to a query util if complex\n return contractSchema.functions.filter((fn) => fn.modifiesState);\n }\n\n mapParameterTypeToFieldType(parameterType: string): FieldType {\n return mapSolanaParamTypeToFieldType(parameterType);\n }\n\n getCompatibleFieldTypes(parameterType: string): FieldType[] {\n return getSolanaCompatibleFieldTypes(parameterType);\n }\n\n generateDefaultField<T extends FieldType = FieldType>(\n parameter: FunctionParameter\n ): FormFieldType<T> {\n return generateSolanaDefaultField(parameter);\n }\n\n public formatTransactionData(\n contractSchema: ContractSchema,\n functionId: string,\n submittedInputs: Record<string, unknown>,\n fields: FormFieldType[]\n ): unknown {\n return formatSolanaTransactionData(contractSchema, functionId, submittedInputs, fields);\n }\n\n async signAndBroadcast(\n transactionData: unknown,\n executionConfig?: ExecutionConfig\n ): Promise<{ txHash: string }> {\n return signAndBroadcastSolanaTransaction(transactionData, executionConfig);\n }\n\n isValidAddress(address: string): boolean {\n return isValidSolanaAddress(address);\n }\n\n async getSupportedExecutionMethods(): Promise<ExecutionMethodDetail[]> {\n return getSolanaSupportedExecutionMethods();\n }\n\n async validateExecutionConfig(config: ExecutionConfig): Promise<true | string> {\n return validateSolanaExecutionConfig(config);\n }\n\n isViewFunction(functionDetails: ContractFunction): boolean {\n return isSolanaViewFunction(functionDetails);\n }\n\n async queryViewFunction(\n contractAddress: string,\n functionId: string,\n params: unknown[] = [],\n contractSchema?: ContractSchema\n ): Promise<unknown> {\n return querySolanaViewFunction(\n contractAddress,\n functionId,\n this.networkConfig,\n params,\n contractSchema,\n null, // walletContext is not needed for view functions\n (source: string) => this.loadContract({ contractAddress: source })\n );\n }\n\n formatFunctionResult(decodedValue: unknown, functionDetails: ContractFunction): string {\n return formatSolanaFunctionResult(decodedValue, functionDetails);\n }\n\n supportsWalletConnection(): boolean {\n return solanaSupportsWalletConnection();\n }\n\n async getAvailableConnectors(): Promise<Connector[]> {\n return getSolanaAvailableConnectors(/* this.walletImplementation */);\n }\n\n async connectWallet(\n connectorId: string\n ): Promise<{ connected: boolean; address?: string; error?: string }> {\n return connectSolanaWallet(connectorId /*, undefined */);\n }\n\n async disconnectWallet(): Promise<{ disconnected: boolean; error?: string }> {\n return disconnectSolanaWallet(/* undefined */);\n }\n\n getWalletConnectionStatus(): SolanaWalletConnectionStatus {\n return getSolanaWalletConnectionStatus(/* undefined */);\n }\n\n onWalletConnectionChange?(\n callback: (\n currentStatus: WalletConnectionStatus,\n previousStatus: WalletConnectionStatus\n ) => void\n ): () => void {\n // Optional methods need careful handling during delegation\n if (onSolanaWalletConnectionChange) {\n return onSolanaWalletConnectionChange(/* this.walletImplementation, */ callback);\n }\n return () => {}; // Default no-op cleanup\n }\n\n getExplorerUrl(address: string): string | null {\n return getSolanaExplorerAddressUrl(address, this.networkConfig);\n }\n\n getExplorerTxUrl?(txHash: string): string | null {\n if (getSolanaExplorerTxUrl) {\n return getSolanaExplorerTxUrl(txHash, this.networkConfig);\n }\n return null;\n }\n\n async waitForTransactionConfirmation?(txHash: string): Promise<{\n status: 'success' | 'error';\n receipt?: unknown;\n error?: Error;\n }> {\n // Optional methods need careful handling during delegation\n if (waitForSolanaTransactionConfirmation) {\n return waitForSolanaTransactionConfirmation(txHash /*, this.walletImplementation */);\n }\n // If function doesn't exist in module, maybe return success immediately or throw?\n // Throwing is safer if the interface implies support when implemented.\n // Let's return success for placeholder.\n return { status: 'success' };\n }\n\n public async getAvailableUiKits(): Promise<AvailableUiKit[]> {\n return [\n {\n id: 'custom',\n name: 'OpenZeppelin Custom',\n configFields: [],\n },\n ];\n }\n\n public getContractDefinitionInputs(): FormFieldType[] {\n return [\n {\n id: 'contractAddress',\n name: 'contractAddress',\n label: 'Program ID',\n type: 'blockchain-address',\n validation: { required: true },\n placeholder: 'Enter Solana program ID',\n },\n ];\n }\n\n public async getRelayers(_serviceUrl: string, _accessToken: string): Promise<RelayerDetails[]> {\n logger.warn('SolanaAdapter', 'getRelayers is not implemented for the Solana adapter yet.');\n return Promise.resolve([]);\n }\n\n public async getRelayer(\n _serviceUrl: string,\n _accessToken: string,\n _relayerId: string\n ): Promise<RelayerDetailsRich> {\n logger.warn('SolanaAdapter', 'getRelayer is not implemented for the Solana adapter yet.');\n return Promise.resolve({} as RelayerDetailsRich);\n }\n\n /**\n * @inheritdoc\n */\n async validateRpcEndpoint(rpcConfig: UserRpcProviderConfig): Promise<boolean> {\n // TODO: Implement Solana-specific RPC validation when needed\n return validateSolanaRpcEndpoint(rpcConfig);\n }\n\n /**\n * @inheritdoc\n */\n async testRpcConnection(rpcConfig: UserRpcProviderConfig): Promise<{\n success: boolean;\n latency?: number;\n error?: string;\n }> {\n // TODO: Implement Solana-specific RPC validation when needed\n return testSolanaRpcConnection(rpcConfig);\n }\n}\n\nexport default SolanaAdapter;\n","import type {\n ExecutionConfig,\n ExecutionMethodDetail,\n} from '@openzeppelin/contracts-ui-builder-types';\n\n// Placeholders\nexport async function getSolanaSupportedExecutionMethods(): Promise<ExecutionMethodDetail[]> {\n return [{ type: 'eoa', name: 'EOA', description: 'Placeholder' }];\n}\nexport async function validateSolanaExecutionConfig(\n _config: ExecutionConfig\n): Promise<true | string> {\n return true;\n}\n","import { NetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\nimport type { UserExplorerConfig } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n/**\n * Gets a blockchain explorer URL for a Solana address.\n * Uses the explorerUrl from the network configuration.\n */\nexport function getSolanaExplorerAddressUrl(\n address: string,\n networkConfig: NetworkConfig\n): string | null {\n if (!networkConfig.explorerUrl) {\n return null;\n }\n // Construct the URL, assuming a standard /address/ path\n // Handle potential trailing slashes in explorerUrl\n const baseUrl = networkConfig.explorerUrl.replace(/\\/+$/, '');\n return `${baseUrl}/address/${address}`;\n}\n\n/**\n * Gets a blockchain explorer URL for a Solana transaction.\n * Uses the explorerUrl from the network configuration.\n */\nexport function getSolanaExplorerTxUrl(\n txHash: string,\n networkConfig: NetworkConfig\n): string | null {\n if (!networkConfig.explorerUrl) {\n return null;\n }\n // Construct the URL, assuming a standard /tx/ path\n const baseUrl = networkConfig.explorerUrl.replace(/\\/+$/, '');\n return `${baseUrl}/tx/${txHash}`;\n}\n\n/**\n * Validates an explorer configuration for Solana networks.\n * @param explorerConfig - The explorer configuration to validate\n * @returns True if the configuration is valid, false otherwise\n */\nexport function validateSolanaExplorerConfig(_explorerConfig: UserExplorerConfig): boolean {\n // TODO: Implement Solana-specific explorer validation when needed\n logger.info('validateSolanaExplorerConfig', 'Solana explorer validation not yet implemented');\n return true;\n}\n\n/**\n * Tests the connection to a Solana explorer API.\n * @param explorerConfig - The explorer configuration to test\n * @returns Connection test results including success status, latency, and any errors\n */\nexport async function testSolanaExplorerConnection(_explorerConfig: UserExplorerConfig): Promise<{\n success: boolean;\n latency?: number;\n error?: string;\n}> {\n // TODO: Implement explorer connection testing for Solana\n logger.info('testSolanaExplorerConnection', 'TODO: Implement explorer connection testing');\n return { success: true };\n}\n","import type { UserRpcProviderConfig } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n/**\n * Validates an RPC endpoint configuration for Solana networks.\n * @param rpcConfig - The RPC provider configuration to validate\n * @returns True if the configuration is valid, false otherwise\n */\nexport function validateSolanaRpcEndpoint(_rpcConfig: UserRpcProviderConfig): boolean {\n // TODO: Implement Solana-specific RPC validation when needed\n logger.info('validateSolanaRpcEndpoint', 'Solana RPC validation not yet implemented');\n return true;\n}\n\n/**\n * Tests the connection to a Solana RPC endpoint.\n * @param rpcConfig - The RPC provider configuration to test\n * @returns Connection test results including success status, latency, and any errors\n */\nexport async function testSolanaRpcConnection(_rpcConfig: UserRpcProviderConfig): Promise<{\n success: boolean;\n latency?: number;\n error?: string;\n}> {\n // TODO: Implement RPC connection testing for Solana\n // Could use getVersion or getHealth RPC method\n logger.info('testSolanaRpcConnection', 'TODO: Implement RPC connection testing');\n return { success: true };\n}\n","import type { FieldType } from '@openzeppelin/contracts-ui-builder-types';\n\n// Placeholder\nexport const SOLANA_TYPE_TO_FIELD_TYPE: Record<string, FieldType> = {\n string: 'text',\n u64: 'number',\n publicKey: 'blockchain-address',\n // Add more Solana types\n};\n","import type { FieldType } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { SOLANA_TYPE_TO_FIELD_TYPE } from './constants';\n\n// Placeholder\nexport function mapSolanaParamTypeToFieldType(parameterType: string): FieldType {\n logger.warn('adapter-solana', 'mapSolanaParamTypeToFieldType not implemented');\n return SOLANA_TYPE_TO_FIELD_TYPE[parameterType] || 'text';\n}\n\n// Placeholder\nexport function getSolanaCompatibleFieldTypes(parameterType: string): FieldType[] {\n logger.warn('adapter-solana', 'getSolanaCompatibleFieldTypes not implemented');\n // Allow basic types for now\n if (parameterType === 'publicKey') return ['blockchain-address', 'text'];\n if (parameterType.startsWith('u') || parameterType.startsWith('i')) return ['number', 'text'];\n return ['text', 'textarea'];\n}\n","import { startCase } from 'lodash';\n\nimport type {\n FieldType,\n FieldValidation,\n FormFieldType,\n FunctionParameter,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { getDefaultValueForType, logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { mapSolanaParamTypeToFieldType } from './type-mapper';\n\n// Placeholder - Needs specific logic\nfunction getDefaultValidationForType(_parameterType: string): FieldValidation {\n return { required: true };\n}\n\n// Placeholder\nexport function generateSolanaDefaultField<T extends FieldType = FieldType>(\n parameter: FunctionParameter\n): FormFieldType<T> {\n logger.warn('adapter-solana', 'generateSolanaDefaultField not implemented');\n const fieldType = mapSolanaParamTypeToFieldType(parameter.type) as T;\n return {\n id: `field-${Math.random().toString(36).substring(2, 9)}`,\n name: parameter.name || parameter.type,\n label: startCase(parameter.displayName || parameter.name || parameter.type),\n type: fieldType,\n placeholder: `Enter ${parameter.displayName || parameter.name || parameter.type}`,\n defaultValue: getDefaultValueForType(fieldType),\n validation: getDefaultValidationForType(parameter.type),\n width: 'full',\n };\n}\n","import type { ContractFunction } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n// Placeholder\nexport function isSolanaViewFunction(_functionDetails: ContractFunction): boolean {\n logger.warn('adapter-solana', 'isSolanaViewFunction not implemented');\n return false; // Placeholder\n}\n","import type {\n ContractSchema,\n NetworkConfig,\n SolanaNetworkConfig,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n// Assuming we might reuse some types temporarily\n// Placeholder type for wallet implementation\ntype SolanaWalletImplementation = unknown;\n\n// Placeholder - updated to accept networkConfig\nexport async function querySolanaViewFunction(\n _contractAddress: string,\n _functionId: string,\n networkConfig: NetworkConfig,\n _params: unknown[],\n _contractSchema: ContractSchema | undefined,\n _walletImplementation: SolanaWalletImplementation | undefined, // Use placeholder type\n _loadContractFn: (source: string, networkConfig?: NetworkConfig) => Promise<ContractSchema> // Update signature\n): Promise<unknown> {\n // Basic validation\n if (networkConfig.ecosystem !== 'solana') {\n throw new Error('Invalid network configuration for Solana query.');\n }\n const solanaConfig = networkConfig as SolanaNetworkConfig;\n\n // TODO: Implement actual Solana view function query using:\n // - solanaConfig.rpcEndpoint\n // - _contractAddress, _functionId, _params, _contractSchema\n // - Potentially use a Solana library like @solana/web3.js\n logger.warn(\n 'querySolanaViewFunction',\n `Not fully implemented for network: ${solanaConfig.name} (RPC: ${solanaConfig.rpcEndpoint})`\n );\n return undefined;\n}\n","import type { ContractSchema, FormFieldType } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n// Placeholder\nexport function formatSolanaTransactionData(\n _contractSchema: ContractSchema, // Use underscore prefix for unused placeholder args\n _functionId: string,\n _submittedInputs: Record<string, unknown>,\n _fields: FormFieldType[]\n): unknown {\n logger.warn('adapter-solana', 'formatSolanaTransactionData not implemented');\n return {};\n}\n","import type { ExecutionConfig } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nconst SYSTEM_LOG_TAG = 'adapter-solana';\n// Placeholder\nexport async function signAndBroadcastSolanaTransaction(\n _transactionData: unknown,\n executionConfig?: ExecutionConfig\n): Promise<{ txHash: string }> {\n logger.warn(SYSTEM_LOG_TAG, 'signAndBroadcastSolanaTransaction not implemented');\n logger.info(\n SYSTEM_LOG_TAG,\n 'Solana signAndBroadcast called with executionConfig:',\n executionConfig\n );\n // TODO: Use executionConfig\n return { txHash: 'solana_placeholder_tx' };\n}\n\n// Placeholder - Note: Optional methods aren't typically defined this way as standalone functions.\n// The adapter class itself would implement the optional method from the interface.\n// For refactoring, we'll define it here, but it might be better integrated differently.\nexport async function waitForSolanaTransactionConfirmation(\n _txHash: string\n): Promise<{ status: 'success' | 'error'; receipt?: unknown; error?: Error }> {\n logger.warn('adapter-solana', 'waitForSolanaTransactionConfirmation not implemented');\n return { status: 'success' }; // Assume success for placeholder\n}\n","import type { FunctionParameter } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n// Placeholder\nexport function parseSolanaInput(\n _param: FunctionParameter,\n rawValue: unknown,\n _isRecursive = false\n): unknown {\n logger.warn('adapter-solana', 'parseSolanaInput not implemented');\n return rawValue; // Passthrough for now\n}\n","import type { ContractFunction } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n// Placeholder\nexport function formatSolanaFunctionResult(\n decodedValue: unknown,\n _functionDetails: ContractFunction\n): string {\n logger.warn('adapter-solana', 'formatSolanaFunctionResult not implemented');\n if (decodedValue === null || decodedValue === undefined) return '(null)';\n // Basic string formatting for now\n return String(decodedValue);\n}\n","/**\n * Solana-specific contract artifacts interface\n * Defines the structure of data needed to load Solana programs\n */\nexport interface SolanaContractArtifacts {\n /** The program ID (required) */\n contractAddress: string;\n\n /** Optional IDL JSON for program interface */\n idl?: string;\n}\n\n/**\n * Type guard to check if an object matches SolanaContractArtifacts structure\n */\nexport function isSolanaContractArtifacts(obj: unknown): obj is SolanaContractArtifacts {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n typeof (obj as Record<string, unknown>).contractAddress === 'string'\n );\n}\n","/**\n * Utility functions for Solana contract artifacts validation and conversion\n */\nimport type { SolanaContractArtifacts } from '../types/artifacts';\nimport { isSolanaContractArtifacts } from '../types/artifacts';\n\n/**\n * Validates and converts generic source input to SolanaContractArtifacts\n *\n * @param source - Generic contract source (string address or artifacts object)\n * @returns Validated SolanaContractArtifacts\n * @throws Error if the source is invalid\n */\nexport function validateAndConvertSolanaArtifacts(\n source: string | Record<string, unknown>\n): SolanaContractArtifacts {\n if (typeof source === 'string') {\n // If source is a string, assume it's a contract address\n return { contractAddress: source };\n }\n\n // Validate that the object has the required structure\n if (!isSolanaContractArtifacts(source)) {\n throw new Error(\n 'Invalid contract artifacts provided. Expected an object with contractAddress property.'\n );\n }\n\n return source;\n}\n","import { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n// Placeholder validation utility for Solana\nexport function isValidSolanaAddress(address: string): boolean {\n logger.warn('adapter-solana', 'isValidSolanaAddress not implemented robustly');\n // Basic placeholder check\n return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);\n}\n","import type { Connector } from '@openzeppelin/contracts-ui-builder-types';\n\nimport type { SolanaWalletConnectionStatus } from './types';\n\n// Assuming a Solana Wallet Implementation type might exist later\n// import type { SolanaWalletImplementation } from './implementation';\n\n// Placeholders\nexport function solanaSupportsWalletConnection(): boolean {\n return false;\n}\nexport async function getSolanaAvailableConnectors(/* walletImplementation: SolanaWalletImplementation */): Promise<\n Connector[]\n> {\n return [];\n}\nexport async function connectSolanaWallet(\n _connectorId: string\n /* walletImplementation: SolanaWalletImplementation */\n): Promise<{ connected: boolean; error?: string }> {\n return { connected: false, error: 'Not implemented' };\n}\nexport async function disconnectSolanaWallet(/* walletImplementation: SolanaWalletImplementation */): Promise<{\n disconnected: boolean;\n error?: string;\n}> {\n return { disconnected: true };\n}\nexport function getSolanaWalletConnectionStatus(/* walletImplementation: SolanaWalletImplementation */): SolanaWalletConnectionStatus {\n return {\n isConnected: false,\n isConnecting: false,\n isDisconnected: true,\n isReconnecting: false,\n status: 'disconnected',\n };\n}\nexport function onSolanaWalletConnectionChange(\n /* walletImplementation: SolanaWalletImplementation, */\n _callback: (\n currentStatus: SolanaWalletConnectionStatus,\n previousStatus: SolanaWalletConnectionStatus\n ) => void\n): () => void {\n return () => {};\n}\n","import { SolanaNetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\n\n// Placeholder for Solana Mainnet Beta\nexport const solanaMainnetBeta: SolanaNetworkConfig = {\n id: 'solana-mainnet-beta',\n exportConstName: 'solanaMainnetBeta',\n name: 'Solana',\n ecosystem: 'solana',\n network: 'solana',\n type: 'mainnet',\n isTestnet: false,\n rpcEndpoint: 'https://api.mainnet-beta.solana.com',\n commitment: 'confirmed',\n explorerUrl: 'https://explorer.solana.com',\n icon: 'solana',\n};\n\n// Add other Solana mainnet networks if applicable\n","import { SolanaNetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\n\n// Placeholder for Solana Devnet\nexport const solanaDevnet: SolanaNetworkConfig = {\n id: 'solana-devnet',\n exportConstName: 'solanaDevnet',\n name: 'Solana Devnet',\n ecosystem: 'solana',\n network: 'solana',\n type: 'devnet', // Solana uses 'devnet' commonly\n isTestnet: true,\n rpcEndpoint: 'https://api.devnet.solana.com',\n commitment: 'confirmed',\n explorerUrl: 'https://explorer.solana.com/?cluster=devnet',\n icon: 'solana',\n};\n\n// Placeholder for Solana Testnet\nexport const solanaTestnet: SolanaNetworkConfig = {\n id: 'solana-testnet',\n exportConstName: 'solanaTestnet',\n name: 'Solana Testnet',\n ecosystem: 'solana',\n network: 'solana',\n type: 'testnet',\n isTestnet: true,\n rpcEndpoint: 'https://api.testnet.solana.com',\n commitment: 'confirmed',\n explorerUrl: 'https://explorer.solana.com/?cluster=testnet',\n icon: 'solana',\n};\n\n// Add other Solana testnet/devnet networks if applicable\n","import { SolanaNetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\n\nimport { solanaMainnetBeta } from './mainnet';\nimport { solanaDevnet, solanaTestnet } from './testnet';\n\n// All mainnet networks\nexport const solanaMainnetNetworks: SolanaNetworkConfig[] = [solanaMainnetBeta];\n\n// All testnet/devnet networks\nexport const solanaTestnetNetworks: SolanaNetworkConfig[] = [solanaDevnet, solanaTestnet];\n\n// All Solana networks\nexport const solanaNetworks: SolanaNetworkConfig[] = [\n ...solanaMainnetNetworks,\n ...solanaTestnetNetworks,\n];\n\n// Export individual networks as well\nexport { solanaMainnetBeta, solanaDevnet, solanaTestnet };\n","// import type { AdapterConfig } from '../../core/types/AdapterTypes';\n\n/**\n * Configuration for the Solana adapter\n *\n * This file defines the dependencies required by the Solana adapter\n * when generating exported projects. It follows the AdapterConfig\n * interface to provide a structured approach to dependency management.\n */\nexport const solanaAdapterConfig = {\n /**\n * Dependencies required by the Solana adapter\n * These will be included in exported projects that use this adapter\n */\n dependencies: {\n // TODO: Review and update with real, verified dependencies and versions before production release\n\n // Runtime dependencies\n runtime: {\n // Core Solana libraries\n '@solana/web3.js': '^1.78.5',\n '@solana/spl-token': '^0.3.8',\n\n // Wallet adapters\n '@solana/wallet-adapter-react': '^0.15.35',\n '@solana/wallet-adapter-base': '^0.9.23',\n\n // Utilities for working with Solana\n bs58: '^5.0.0',\n '@project-serum/anchor': '^0.26.0',\n },\n\n // Development dependencies\n dev: {\n // Testing utilities for Solana\n '@solana/spl-token-registry': '^0.2.4574',\n\n // CLI tools for development\n '@solana/cli': '^1.1.0',\n },\n },\n};\n"],"mappings":"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","names":["import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils"]}