@openzeppelin/contracts-ui-builder-adapter-stellar
Version:
Stellar Adapter for Contracts UI Builder
1 lines • 378 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/contract/loader.ts","../src/validation/address.ts","../src/validation/eoa.ts","../src/validation/relayer.ts","../src/configuration/explorer.ts","../src/mapping/struct-fields.ts","../src/utils/type-detection.ts","../src/query/handler.ts","../src/transform/parsers/index.ts","../src/transform/parsers/generic-parser.ts","../src/transform/parsers/primitive-parser.ts","../src/transform/parsers/complex-parser.ts","../src/utils/safe-type-parser.ts","../src/utils/formatting.ts","../src/utils/input-parsing.ts","../src/transform/parsers/scval-converter.ts","../src/transform/parsers/struct-parser.ts","../src/transform/output-formatter.ts","../src/types/artifacts.ts","../src/utils/artifacts.ts","../src/query/view-checker.ts","../src/transaction/components/StellarRelayerOptions.tsx","../src/transaction/components/AdvancedInfo.tsx","../src/transaction/components/FeeConfiguration.tsx","../src/transaction/components/TransactionTiming.tsx","../src/transaction/components/useStellarRelayerOptions.ts","../src/transaction/relayer.ts","../src/wallet/connection.ts","../src/wallet/utils/stellarWalletImplementationManager.ts","../src/wallet/implementation/wallets-kit-implementation.ts","../src/wallet/stellar-wallets-kit/stellarUiKitManager.ts","../src/wallet/stellar-wallets-kit/config-generator.ts","../src/wallet/stellar-wallets-kit/export-service.ts","../src/wallet/stellar-wallets-kit/StellarWalletsKitConnectButton.tsx","../src/configuration/execution.ts","../src/configuration/rpc.ts","../src/mapping/constants.ts","../src/mapping/type-mapper.ts","../src/mapping/field-generator.ts","../src/mapping/enum-metadata.ts","../src/transaction/formatter.ts","../src/transaction/sender.ts","../src/transaction/eoa.ts","../src/wallet/components/StellarWalletUiRoot.tsx","../src/wallet/context/StellarWalletContext.ts","../src/wallet/context/useStellarWalletContext.ts","../src/wallet/hooks/useStellarAccount.ts","../src/wallet/hooks/useStellarConnect.ts","../src/wallet/hooks/useStellarDisconnect.ts","../src/wallet/hooks/facade-hooks.ts","../src/wallet/hooks/useUiKitConfig.ts","../src/wallet/components/connect/ConnectButton.tsx","../src/wallet/components/connect/ConnectorDialog.tsx","../src/wallet/components/account/AccountDisplay.tsx","../src/wallet/utils/filterWalletComponents.ts","../src/wallet/utils/uiKitService.ts","../src/wallet/services/configResolutionService.ts","../src/networks/mainnet.ts","../src/networks/testnet.ts","../src/networks/index.ts","../src/config.ts"],"sourcesContent":["// Re-export the main adapter class\nexport { StellarAdapter } from './adapter';\n\n// Re-export adapter-specific types\nexport type { StellarContractArtifacts } from './types/artifacts';\nexport { isStellarContractArtifacts } from './types/artifacts';\n\nexport {\n stellarNetworks,\n stellarMainnetNetworks,\n stellarTestnetNetworks,\n // Individual networks\n stellarPublic,\n stellarTestnet,\n} from './networks';\n\n// Export adapter configuration\nexport { stellarAdapterConfig } from './config';\n","import type React from 'react';\n\nimport type {\n AvailableUiKit,\n Connector,\n ContractAdapter,\n ContractFunction,\n ContractSchema,\n EcosystemReactUiProviderProps,\n EcosystemSpecificReactHooks,\n EcosystemWalletComponents,\n ExecutionConfig,\n ExecutionMethodDetail,\n FieldType,\n FormFieldType,\n FunctionParameter,\n NativeConfigLoader,\n RelayerDetails,\n RelayerDetailsRich,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n UiKitConfiguration,\n UserRpcProviderConfig,\n WalletConnectionStatus,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { isStellarNetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n// Import functions from modules\nimport { loadStellarContract, loadStellarContractWithMetadata } from './contract/loader';\nimport { StellarRelayerOptions } from './transaction/components';\nimport { RelayerExecutionStrategy } from './transaction/relayer';\n\nimport {\n getStellarExplorerAddressUrl,\n getStellarExplorerTxUrl,\n getStellarSupportedExecutionMethods,\n testStellarRpcConnection,\n validateStellarExecutionConfig,\n validateStellarRpcEndpoint,\n} from './configuration';\nimport {\n generateStellarDefaultField,\n getStellarCompatibleFieldTypes,\n mapStellarParameterTypeToFieldType,\n} from './mapping';\nimport {\n getStellarWritableFunctions,\n isStellarViewFunction,\n queryStellarViewFunction,\n} from './query';\nimport { formatStellarTransactionData, signAndBroadcastStellarTransaction } from './transaction';\nimport { formatStellarFunctionResult } from './transform';\nimport { validateAndConvertStellarArtifacts } from './utils';\nimport { isValidAddress as isStellarValidAddress, type StellarAddressType } from './validation';\nimport {\n connectStellarWallet,\n disconnectStellarWallet,\n generateStellarWalletsKitExportables,\n getInitializedStellarWalletImplementation,\n getResolvedWalletComponents,\n getStellarAvailableConnectors,\n getStellarWalletImplementation,\n loadInitialConfigFromAppService,\n resolveFullUiKitConfiguration,\n stellarFacadeHooks,\n stellarUiKitManager,\n StellarWalletConnectionStatus,\n StellarWalletUiRoot,\n supportsStellarWalletConnection,\n} from './wallet';\n\n/**\n * Stellar-specific adapter implementation using explicit method delegation.\n *\n * NOTE: Contains placeholder implementations for most functionalities.\n */\nexport class StellarAdapter implements ContractAdapter {\n readonly networkConfig: StellarNetworkConfig;\n readonly initialAppServiceKitName: UiKitConfiguration['kitName'];\n\n constructor(networkConfig: StellarNetworkConfig) {\n if (!isStellarNetworkConfig(networkConfig)) {\n throw new Error('StellarAdapter requires a valid Stellar network configuration.');\n }\n this.networkConfig = networkConfig;\n\n // Set the network config in the wallet UI kit manager\n stellarUiKitManager.setNetworkConfig(networkConfig);\n\n // Initialize wallet implementation with network config\n getStellarWalletImplementation(networkConfig).catch((error) => {\n logger.error(\n 'StellarAdapter:constructor',\n 'Failed to initialize wallet implementation:',\n error\n );\n });\n\n // Determine the initial kitName from AppConfigService at the time of adapter construction.\n // This provides a baseline kitName preference from the application's static/global configuration.\n // It defaults to 'custom' if no specific kitName is found in AppConfigService.\n const initialGlobalConfig = loadInitialConfigFromAppService();\n this.initialAppServiceKitName =\n (initialGlobalConfig.kitName as UiKitConfiguration['kitName']) || 'custom';\n\n logger.info(\n 'StellarAdapter:constructor',\n 'Initial kitName from AppConfigService noted:',\n this.initialAppServiceKitName\n );\n\n logger.info(\n 'StellarAdapter',\n `Adapter initialized for network: ${networkConfig.name} (ID: ${networkConfig.id})`\n );\n }\n\n // --- Contract Loading --- //\n /**\n * NOTE about artifact inputs (single input with auto-detection):\n *\n * The Builder renders the contract definition step using whatever fields the\n * adapter returns here. EVM uses one optional ABI field; Midnight provides\n * multiple fields. Stellar should use a single input approach with automatic\n * content detection when we add manual-spec support:\n *\n * - Keep `contractAddress` (required)\n * - Add optional `contractDefinition` (type: `code-editor`, language: `json`)\n * with file upload support for both JSON and Wasm binary content\n *\n * When this field is added:\n * - Extend `validateAndConvertStellarArtifacts(...)` to accept\n * `{ contractAddress, contractDefinition? }`\n * - In the loader, branch: if `contractDefinition` provided, auto-detect\n * content type (JSON vs Wasm using magic bytes `\\0asm`):\n * - For JSON: Parse and validate as Soroban spec, use `transformStellarSpecToSchema`\n * - For Wasm: Extract embedded spec from binary, parse locally (no RPC)\n * - Set `source: 'manual'` with `contractDefinitionOriginal` to the raw\n * user-provided content. This ensures auto-save captures and restores the\n * manual contract definition exactly like the EVM/Midnight flows.\n * - Provide clear UI hints about supported formats (JSON spec or Wasm binary).\n */\n public getContractDefinitionInputs(): FormFieldType[] {\n return [\n {\n id: 'contractAddress',\n name: 'contractAddress',\n label: 'Contract ID',\n type: 'blockchain-address',\n validation: { required: true },\n placeholder: 'C...',\n helperText: 'Enter the Stellar contract ID (C...).',\n },\n ];\n }\n\n /**\n * @inheritdoc\n */\n public async loadContract(source: string | Record<string, unknown>): Promise<ContractSchema> {\n // Convert generic input to Stellar-specific artifacts\n const artifacts = validateAndConvertStellarArtifacts(source);\n const result = await loadStellarContract(artifacts, this.networkConfig);\n return result.schema;\n }\n\n /**\n * @inheritdoc\n */\n public async loadContractWithMetadata(source: string | Record<string, unknown>): Promise<{\n schema: ContractSchema;\n source: 'fetched' | 'manual';\n contractDefinitionOriginal?: string;\n metadata?: {\n fetchedFrom?: string;\n contractName?: string;\n fetchTimestamp?: Date;\n definitionHash?: string;\n };\n }> {\n try {\n // Convert generic input to Stellar-specific artifacts\n const artifacts = validateAndConvertStellarArtifacts(source);\n const result = await loadStellarContractWithMetadata(artifacts, this.networkConfig);\n\n return {\n schema: result.schema,\n source: result.source,\n contractDefinitionOriginal: result.contractDefinitionOriginal,\n metadata: result.metadata,\n };\n } catch (error) {\n // Re-throw errors consistently with EVM adapter\n throw error;\n }\n }\n\n getWritableFunctions(contractSchema: ContractSchema): ContractSchema['functions'] {\n return getStellarWritableFunctions(contractSchema);\n }\n\n // --- Type Mapping & Field Generation --- //\n mapParameterTypeToFieldType(parameterType: string): FieldType {\n return mapStellarParameterTypeToFieldType(parameterType);\n }\n getCompatibleFieldTypes(parameterType: string): FieldType[] {\n return getStellarCompatibleFieldTypes(parameterType);\n }\n generateDefaultField<T extends FieldType = FieldType>(\n parameter: FunctionParameter,\n contractSchema?: ContractSchema\n ): FormFieldType<T> {\n return generateStellarDefaultField(parameter, contractSchema);\n }\n\n // --- Transaction Formatting & Execution --- //\n public formatTransactionData(\n contractSchema: ContractSchema,\n functionId: string,\n submittedInputs: Record<string, unknown>,\n fields: FormFieldType[]\n ): unknown {\n return formatStellarTransactionData(contractSchema, functionId, submittedInputs, fields);\n }\n async signAndBroadcast(\n transactionData: unknown,\n executionConfig: ExecutionConfig,\n onStatusChange: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<{ txHash: string }> {\n return signAndBroadcastStellarTransaction(\n transactionData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n }\n\n // NOTE: waitForTransactionConfirmation? is optional in the interface.\n // Since the imported function is currently undefined, we omit the method here.\n // If implemented in ./transaction/sender.ts later, add the method back:\n // async waitForTransactionConfirmation?(...) { ... }\n\n // --- View Function Querying --- //\n isViewFunction(functionDetails: ContractFunction): boolean {\n return isStellarViewFunction(functionDetails);\n }\n\n // Implement queryViewFunction with the correct signature from ContractAdapter\n async queryViewFunction(\n contractAddress: string,\n functionId: string,\n params: unknown[] = [],\n contractSchema?: ContractSchema\n ): Promise<unknown> {\n return queryStellarViewFunction(\n contractAddress,\n functionId,\n this.networkConfig,\n params,\n contractSchema,\n (address: string) => this.loadContract({ contractAddress: address })\n );\n }\n\n formatFunctionResult(decodedValue: unknown, functionDetails: ContractFunction): string {\n return formatStellarFunctionResult(decodedValue, functionDetails);\n }\n\n // --- Wallet Interaction --- //\n supportsWalletConnection(): boolean {\n return supportsStellarWalletConnection();\n }\n async getAvailableConnectors(): Promise<Connector[]> {\n return getStellarAvailableConnectors();\n }\n async connectWallet(\n connectorId: string\n ): Promise<{ connected: boolean; address?: string; error?: string }> {\n return connectStellarWallet(connectorId);\n }\n async disconnectWallet(): Promise<{ disconnected: boolean; error?: string }> {\n return disconnectStellarWallet();\n }\n getWalletConnectionStatus(): StellarWalletConnectionStatus {\n const impl = getInitializedStellarWalletImplementation();\n if (!impl) {\n return {\n isConnected: false,\n address: undefined,\n chainId: stellarUiKitManager.getState().networkConfig?.id || 'stellar-testnet',\n };\n }\n\n const stellarStatus = impl.getWalletConnectionStatus();\n\n // Return the rich Stellar-specific status directly\n return stellarStatus;\n }\n\n /**\n * @inheritdoc\n */\n onWalletConnectionChange(\n callback: (\n currentStatus: WalletConnectionStatus,\n previousStatus: WalletConnectionStatus\n ) => void\n ): () => void {\n const walletImplementation = getInitializedStellarWalletImplementation();\n if (!walletImplementation) {\n logger.warn(\n 'StellarAdapter:onWalletConnectionChange',\n 'Wallet implementation not ready. Subscription may not work.'\n );\n return () => {};\n }\n\n return walletImplementation.onWalletConnectionChange(\n (currentImplStatus, previousImplStatus) => {\n callback(currentImplStatus, previousImplStatus);\n }\n );\n }\n\n // --- Configuration & Metadata --- //\n async getSupportedExecutionMethods(): Promise<ExecutionMethodDetail[]> {\n return getStellarSupportedExecutionMethods();\n }\n async validateExecutionConfig(config: ExecutionConfig): Promise<true | string> {\n const walletStatus = this.getWalletConnectionStatus();\n return validateStellarExecutionConfig(config, walletStatus);\n }\n\n // Implement getExplorerUrl with the correct signature from ContractAdapter\n getExplorerUrl(address: string): string | null {\n return getStellarExplorerAddressUrl(address, this.networkConfig);\n }\n\n // Implement getExplorerTxUrl with the correct signature from ContractAdapter\n getExplorerTxUrl?(txHash: string): string | null {\n if (getStellarExplorerTxUrl) {\n return getStellarExplorerTxUrl(txHash, this.networkConfig);\n }\n return null;\n }\n\n // --- Validation --- //\n isValidAddress(address: string, addressType?: string): boolean {\n return isStellarValidAddress(address, addressType as StellarAddressType);\n }\n\n public async getAvailableUiKits(): Promise<AvailableUiKit[]> {\n return [\n {\n id: 'custom',\n name: 'Stellar Wallets Kit Custom',\n configFields: [],\n },\n {\n id: 'stellar-wallets-kit',\n name: 'Stellar Wallets Kit',\n configFields: [],\n },\n ];\n }\n\n /**\n * @inheritdoc\n */\n public async configureUiKit(\n programmaticOverrides: Partial<UiKitConfiguration> = {},\n options?: {\n loadUiKitNativeConfig?: NativeConfigLoader;\n }\n ): Promise<void> {\n const currentAppServiceConfig = loadInitialConfigFromAppService();\n\n // Delegate the entire configuration resolution to the service function\n const finalFullConfig = await resolveFullUiKitConfiguration(\n programmaticOverrides,\n this.initialAppServiceKitName,\n currentAppServiceConfig,\n options\n );\n\n // Configure the Stellar UI kit manager\n await stellarUiKitManager.configure(finalFullConfig);\n logger.info(\n 'StellarAdapter:configureUiKit',\n 'StellarUiKitManager configuration requested with final config:',\n finalFullConfig\n );\n }\n\n /**\n * @inheritdoc\n */\n public async getExportableWalletConfigFiles(\n uiKitConfig?: UiKitConfiguration\n ): Promise<Record<string, string>> {\n if (uiKitConfig?.kitName === 'stellar-wallets-kit') {\n return generateStellarWalletsKitExportables(uiKitConfig);\n }\n return {};\n }\n\n /**\n * @inheritdoc\n */\n public getEcosystemWalletComponents(): EcosystemWalletComponents | undefined {\n const currentManagerState = stellarUiKitManager.getState();\n\n // Only attempt to resolve components if the manager has a configuration set\n if (!currentManagerState.currentFullUiKitConfig) {\n logger.debug(\n 'StellarAdapter:getEcosystemWalletComponents',\n 'No UI kit configuration available in manager yet. Returning undefined components.'\n );\n return undefined;\n }\n\n // Use the service to resolve components based on the current UI kit configuration\n const components = getResolvedWalletComponents(currentManagerState.currentFullUiKitConfig);\n return components;\n }\n\n /**\n * @inheritdoc\n */\n public getEcosystemReactUiContextProvider():\n | React.ComponentType<EcosystemReactUiProviderProps>\n | undefined {\n logger.info(\n 'StellarAdapter:getEcosystemReactUiContextProvider',\n 'Returning StellarWalletUiRoot.'\n );\n return StellarWalletUiRoot;\n }\n\n /**\n * @inheritdoc\n */\n public getEcosystemReactHooks(): EcosystemSpecificReactHooks | undefined {\n // Always provide hooks for Stellar adapter regardless of UI kit\n return stellarFacadeHooks;\n }\n\n public async getRelayers(serviceUrl: string, accessToken: string): Promise<RelayerDetails[]> {\n const relayerStrategy = new RelayerExecutionStrategy();\n try {\n return await relayerStrategy.getStellarRelayers(serviceUrl, accessToken, this.networkConfig);\n } catch (error) {\n logger.error('StellarAdapter', 'Failed to fetch Stellar relayers:', error);\n return Promise.resolve([]);\n }\n }\n\n public async getRelayer(\n serviceUrl: string,\n accessToken: string,\n relayerId: string\n ): Promise<RelayerDetailsRich> {\n const relayerStrategy = new RelayerExecutionStrategy();\n try {\n return await relayerStrategy.getStellarRelayer(\n serviceUrl,\n accessToken,\n relayerId,\n this.networkConfig\n );\n } catch (error) {\n logger.error('StellarAdapter', 'Failed to fetch Stellar relayer details:', error);\n return Promise.resolve({} as RelayerDetailsRich);\n }\n }\n\n /**\n * Returns a React component for configuring Stellar-specific relayer transaction options.\n * @returns The Stellar relayer options component\n */\n public getRelayerOptionsComponent():\n | React.ComponentType<{\n options: Record<string, unknown>;\n onChange: (options: Record<string, unknown>) => void;\n }>\n | undefined {\n return StellarRelayerOptions;\n }\n\n /**\n * @inheritdoc\n */\n public async validateRpcEndpoint(rpcConfig: UserRpcProviderConfig): Promise<boolean> {\n // TODO: Implement Stellar-specific RPC validation when needed\n return validateStellarRpcEndpoint(rpcConfig);\n }\n\n /**\n * @inheritdoc\n */\n public async testRpcConnection(rpcConfig: UserRpcProviderConfig): Promise<{\n success: boolean;\n latency?: number;\n error?: string;\n }> {\n // TODO: Implement Stellar-specific RPC validation when needed\n return testStellarRpcConnection(rpcConfig);\n }\n\n /**\n * @inheritdoc\n */\n public getUiLabels(): Record<string, string> | undefined {\n return {\n relayerConfigTitle: 'Transaction Configuration',\n relayerConfigActiveDesc: 'Customize transaction parameters for submission',\n relayerConfigInactiveDesc: 'Using recommended transaction configuration for reliability',\n relayerConfigPresetTitle: 'Recommended Preset Active',\n relayerConfigPresetDesc: 'Transactions will use recommended parameters for quick inclusion',\n relayerConfigCustomizeBtn: 'Customize Settings',\n detailsTitle: 'Relayer Details',\n network: 'Network',\n relayerId: 'Relayer ID',\n active: 'Active',\n paused: 'Paused',\n systemDisabled: 'System Disabled',\n balance: 'Balance',\n // For Stellar, sequence number is conceptually similar; adapters supply the value\n nonce: 'Sequence',\n pending: 'Pending Transactions',\n lastTransaction: 'Last Transaction',\n };\n }\n}\n\n// Also export as default to ensure compatibility with various import styles\nexport default StellarAdapter;\n","import * as StellarSdk from '@stellar/stellar-sdk';\nimport { xdr } from '@stellar/stellar-sdk';\n\nimport type {\n ContractFunction,\n ContractSchema,\n FunctionParameter,\n StellarNetworkConfig,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { getStellarExplorerAddressUrl } from '../configuration/explorer';\nimport { extractStructFields, isStructType } from '../mapping/struct-fields';\nimport { checkStellarFunctionStateMutability } from '../query/handler';\nimport type { StellarContractArtifacts } from '../types/artifacts';\nimport { extractSorobanTypeFromScSpec } from '../utils/type-detection';\n\n/**\n * Load a Stellar contract using the official Stellar SDK approach\n * Based on the patterns from the official Stellar laboratory\n */\nexport async function loadStellarContractFromAddress(\n contractAddress: string,\n networkConfig: StellarNetworkConfig\n): Promise<ContractSchema> {\n logger.info('loadStellarContractFromAddress', 'Loading contract:', {\n contractAddress,\n network: networkConfig.name,\n rpcUrl: networkConfig.sorobanRpcUrl,\n networkPassphrase: networkConfig.networkPassphrase,\n });\n\n try {\n // Validate contract address\n if (!StellarSdk.StrKey.isValidContract(contractAddress)) {\n throw new Error(`Invalid contract address: ${contractAddress}`);\n }\n\n // Create contract client using the official Stellar SDK approach\n // Laboratory note: some contracts may be missing Wasm/definition retrievable via RPC.\n // In that case the SDK can throw an internal error like\n // \"Cannot destructure property 'length'...\". Detect and surface an explicit error.\n let contractClient: StellarSdk.contract.Client;\n try {\n contractClient = await StellarSdk.contract.Client.from({\n contractId: contractAddress,\n networkPassphrase: networkConfig.networkPassphrase,\n rpcUrl: networkConfig.sorobanRpcUrl,\n });\n } catch (e) {\n const message = (e as Error)?.message || String(e);\n if (message.includes(\"Cannot destructure property 'length'\")) {\n const friendly =\n 'Unable to fetch contract metadata from RPC. The contract appears to have no published Wasm/definition on this network.';\n logger.error('loadStellarContractFromAddress', friendly);\n throw new Error(`NO_WASM: ${friendly}`);\n }\n throw e;\n }\n\n logger.info('loadStellarContractFromAddress', 'Contract client created successfully');\n\n // Get spec entries - try different approaches to access them\n let specEntries: xdr.ScSpecEntry[] = [];\n try {\n // Access spec entries from the spec object\n\n // Try to access spec entries through different possible properties/methods\n if (contractClient.spec && typeof contractClient.spec === 'object') {\n const spec = contractClient.spec as unknown as Record<string, unknown>;\n\n // Try common property names\n if (Array.isArray(spec.entries)) {\n specEntries = spec.entries as xdr.ScSpecEntry[];\n } else if (Array.isArray(spec._entries)) {\n specEntries = spec._entries as xdr.ScSpecEntry[];\n } else if (Array.isArray(spec.specEntries)) {\n specEntries = spec.specEntries as xdr.ScSpecEntry[];\n } else if (typeof spec.entries === 'function') {\n // Maybe it's a method after all, but with different signature\n try {\n specEntries = (spec.entries as () => xdr.ScSpecEntry[])();\n } catch (e) {\n logger.warn('loadStellarContractFromAddress', 'entries() method failed:', e);\n }\n }\n\n // Try the method directly on spec if it has the method\n if (specEntries.length === 0 && typeof spec.entries === 'function') {\n try {\n specEntries = (spec.entries as () => xdr.ScSpecEntry[])();\n } catch (e) {\n logger.warn('loadStellarContractFromAddress', 'direct entries() method failed:', e);\n }\n }\n\n logger.info('loadStellarContractFromAddress', `Found ${specEntries.length} spec entries`);\n }\n } catch (specError) {\n logger.warn('loadStellarContractFromAddress', 'Could not extract spec entries:', specError);\n }\n\n // Extract functions using the official laboratory approach with spec entries for struct extraction\n const functions = await extractFunctionsFromSpec(\n contractClient.spec,\n contractAddress,\n specEntries,\n networkConfig\n );\n\n logger.info(\n 'loadStellarContractFromAddress',\n `Successfully extracted ${functions.length} functions`\n );\n\n return {\n name: `Soroban Contract ${contractAddress.slice(0, 8)}...`,\n ecosystem: 'stellar',\n functions,\n metadata: {\n specEntries,\n },\n };\n } catch (error) {\n const msg = (error as Error)?.message || String(error);\n // Preserve explicit NO_WASM error so downstream can surface it to the user\n if (msg.startsWith('NO_WASM:')) {\n logger.error('loadStellarContractFromAddress', msg);\n throw new Error(msg);\n }\n logger.error('loadStellarContractFromAddress', 'Failed to load contract:', error);\n throw new Error(`Failed to load contract: ${msg}`);\n }\n}\n\n/**\n * Extract functions from contract spec using the official Stellar laboratory approach\n * with simulation-based state mutability detection\n */\nasync function extractFunctionsFromSpec(\n spec: StellarSdk.contract.Spec,\n contractAddress: string,\n specEntries?: xdr.ScSpecEntry[],\n networkConfig?: StellarNetworkConfig\n): Promise<ContractFunction[]> {\n try {\n // Get all functions using the official SDK method\n const specFunctions = spec.funcs();\n\n logger.info('extractFunctionsFromSpec', `Found ${specFunctions.length} functions in spec`);\n\n return await Promise.all(\n specFunctions.map(async (func, index) => {\n try {\n // Extract function name using the official SDK method\n const functionName = func.name().toString();\n\n logger.info('extractFunctionsFromSpec', `Processing function: ${functionName}`);\n\n // Get function inputs and outputs using the official SDK methods\n const inputs: FunctionParameter[] = func.inputs().map((input, inputIndex) => {\n try {\n const inputName = input.name().toString();\n const inputType = extractSorobanTypeFromScSpec(input.type());\n\n if (inputType === 'unknown') {\n logger.warn(\n 'extractFunctionsFromSpec',\n `Unknown type for parameter \"${inputName}\" in function \"${functionName}\"`\n );\n }\n\n // Check if this is a struct type and extract components\n let components: FunctionParameter[] | undefined;\n if (specEntries && specEntries.length > 0 && isStructType(specEntries, inputType)) {\n const structFields = extractStructFields(specEntries, inputType);\n if (structFields && structFields.length > 0) {\n components = structFields;\n logger.debug(\n 'extractFunctionsFromSpec',\n `Extracted ${structFields.length} fields for struct type \"${inputType}\": ${structFields.map((f) => `${f.name}:${f.type}`).join(', ')}`\n );\n } else {\n logger.warn(\n 'extractFunctionsFromSpec',\n `No fields extracted for struct \"${inputType}\"`\n );\n }\n }\n\n return {\n name: inputName || `param_${inputIndex}`,\n type: inputType,\n ...(components && { components }),\n };\n } catch (error) {\n logger.warn(\n 'extractFunctionsFromSpec',\n `Failed to parse input ${inputIndex}:`,\n error\n );\n return {\n name: `param_${inputIndex}`,\n type: 'unknown',\n };\n }\n });\n\n const outputs: FunctionParameter[] = func.outputs().map((output, outputIndex) => {\n try {\n // Outputs are ScSpecTypeDef objects, they don't have names, only types\n const outputType = extractSorobanTypeFromScSpec(output);\n\n return {\n name: `result_${outputIndex}`,\n type: outputType,\n };\n } catch (error) {\n logger.warn(\n 'extractFunctionsFromSpec',\n `Failed to parse output ${outputIndex}:`,\n error\n );\n return {\n name: `result_${outputIndex}`,\n type: 'unknown',\n };\n }\n });\n\n // Determine if function is read-only (view function) using simulation-based detection\n // This follows the same approach as the official Stellar Laboratory\n let modifiesState = true; // Default assumption for safety\n let stateMutability: 'view' | 'pure' | 'nonpayable' = 'nonpayable';\n\n if (networkConfig) {\n try {\n // Extract input types for simulation\n const inputTypes = inputs.map((input) => input.type);\n\n logger.debug(\n 'extractFunctionsFromSpec',\n `Checking state mutability for ${functionName} with input types: ${inputTypes.join(', ')}`\n );\n\n // Use simulation-based state mutability detection\n modifiesState = await checkStellarFunctionStateMutability(\n contractAddress,\n functionName,\n networkConfig,\n inputTypes\n );\n\n stateMutability = modifiesState ? 'nonpayable' : 'view';\n\n logger.info(\n 'extractFunctionsFromSpec',\n `Function ${functionName} state mutability determined:`,\n { modifiesState, stateMutability }\n );\n } catch (error) {\n logger.warn(\n 'extractFunctionsFromSpec',\n `Failed to determine state mutability for ${functionName}, assuming it modifies state:`,\n error\n );\n // Keep defaults: modifiesState = true, stateMutability = 'nonpayable'\n }\n } else {\n logger.warn(\n 'extractFunctionsFromSpec',\n `No network config provided for ${functionName}, assuming it modifies state`\n );\n }\n\n // Generate a unique ID for the function\n const functionId = `${functionName}_${inputs.map((i) => i.type).join('_')}`;\n\n return {\n id: functionId,\n name: functionName,\n displayName:\n functionName.charAt(0).toUpperCase() + functionName.slice(1).replace(/_/g, ' '),\n description: `Soroban function: ${functionName}`,\n inputs,\n outputs,\n type: 'function',\n modifiesState,\n stateMutability,\n };\n } catch (error) {\n logger.error('extractFunctionsFromSpec', `Failed to process function ${index}:`, error);\n\n // Return a basic function entry for failed parsing\n return {\n id: `function_${index}`,\n name: `function_${index}`,\n displayName: `Function ${index}`,\n description: `Failed to parse function ${index}: ${(error as Error).message}`,\n inputs: [],\n outputs: [],\n type: 'function',\n modifiesState: true,\n stateMutability: 'nonpayable',\n };\n }\n })\n );\n } catch (error) {\n logger.error('extractFunctionsFromSpec', 'Failed to extract functions from spec:', error);\n throw new Error(`Failed to extract functions: ${(error as Error).message}`);\n }\n}\n\n/**\n * Enhanced result type for Stellar contract loading with metadata\n */\nexport interface StellarContractLoadResult {\n schema: ContractSchema;\n source: 'fetched' | 'manual';\n contractDefinitionOriginal?: string;\n metadata?: {\n fetchedFrom?: string;\n contractName?: string;\n fetchTimestamp?: Date;\n definitionHash?: string;\n };\n}\n\n/**\n * Load Stellar contract with basic metadata\n */\nexport async function loadStellarContract(\n artifacts: StellarContractArtifacts,\n networkConfig: StellarNetworkConfig\n): Promise<StellarContractLoadResult> {\n if (typeof artifacts.contractAddress !== 'string') {\n throw new Error('A contract address must be provided.');\n }\n\n const schema = await loadStellarContractFromAddress(artifacts.contractAddress, networkConfig);\n\n const schemaWithAddress = { ...schema, address: artifacts.contractAddress };\n\n return {\n schema: schemaWithAddress,\n source: 'fetched',\n contractDefinitionOriginal: JSON.stringify(schemaWithAddress),\n metadata: {\n fetchedFrom:\n getStellarExplorerAddressUrl(artifacts.contractAddress, networkConfig) ||\n networkConfig.sorobanRpcUrl,\n contractName: schema.name,\n fetchTimestamp: new Date(),\n },\n };\n}\n\n/**\n * Load Stellar contract with extended metadata\n */\nexport async function loadStellarContractWithMetadata(\n artifacts: StellarContractArtifacts,\n networkConfig: StellarNetworkConfig\n): Promise<StellarContractLoadResult> {\n if (typeof artifacts.contractAddress !== 'string') {\n throw new Error('A contract address must be provided.');\n }\n\n try {\n const contractData = await loadStellarContractFromAddress(\n artifacts.contractAddress,\n networkConfig\n );\n\n const schema = {\n ...contractData,\n address: artifacts.contractAddress,\n };\n\n return {\n schema,\n source: 'fetched',\n contractDefinitionOriginal: JSON.stringify(schema),\n metadata: {\n fetchedFrom:\n getStellarExplorerAddressUrl(artifacts.contractAddress, networkConfig) ||\n networkConfig.sorobanRpcUrl,\n contractName: schema.name,\n fetchTimestamp: new Date(),\n },\n };\n } catch (error) {\n // Check if this is a network/connection error\n const errorMessage = (error as Error).message || '';\n // Surface Laboratory-style explicit message if Wasm is missing\n if (errorMessage.startsWith('NO_WASM:')) {\n // Re-throw without swallowing details so UI can show this immediately\n throw new Error(errorMessage.replace(/^NO_WASM:\\s*/, ''));\n }\n if (errorMessage.includes('Failed to load contract')) {\n throw new Error(\n `Contract at ${artifacts.contractAddress} could not be loaded from the network. ` +\n `Please verify the contract ID is correct and the network is accessible.`\n );\n }\n\n // Re-throw other errors\n throw error;\n }\n}\n\n/**\n * Integration points for manual contract definition input (future work):\n *\n * Single Input with Auto-Detection (simplified UX):\n * - Add a new loader path: `loadStellarContractFromDefinition(definition, networkConfig)`\n * - Auto-detect content type using magic bytes and structure:\n * - Wasm binary: starts with magic bytes `[0x00, 0x61, 0x73, 0x6D]` (`\\0asm`)\n * - JSON spec: valid JSON array with Soroban spec entry objects\n * - For JSON: Parse and validate, use `transformStellarSpecToSchema()` to build schema\n * - For Wasm: Extract embedded spec from binary locally (no RPC), then build schema\n * - Return `{ schema, source: 'manual' }` with `contractDefinitionOriginal` set to\n * the raw input (JSON string or Wasm binary) for auto-save restoration\n *\n * The builder UI provides a single input field (code editor with file upload support)\n * that accepts either format, eliminating user confusion about format selection.\n * The auto-save system will store the resulting schema and `contractDefinitionOriginal`\n * so the configuration restores seamlessly.\n */\n\n/**\n * Transform Stellar contract spec to our internal schema format.\n *\n * This function is intentionally minimal at the moment and primarily used by\n * tests. The production load path derives function metadata using the\n * Stellar SDK via `loadStellarContractFromAddress`/`extractFunctionsFromSpec`.\n * A full spec-to-schema converter (with robust type mapping for inputs/outputs\n * and state mutability inference) is planned under the upcoming\n * \"Type Mapping and Data Transformation\" work in\n * `.agent-os/specs/2025-08-20-stellar-adapter-integration/tasks.md`.\n */\nexport function transformStellarSpecToSchema(\n contractSpec: Record<string, unknown>,\n contractAddress: string,\n ecosystem: 'stellar' = 'stellar'\n): ContractSchema {\n logger.info('transformStellarSpecToSchema', 'Transforming Stellar spec to schema format');\n\n const schema: ContractSchema = {\n name: (contractSpec.name as string) || `Soroban Contract ${contractAddress.slice(0, 8)}...`,\n ecosystem,\n functions: (contractSpec.functions as ContractFunction[]) || [],\n };\n\n logger.info('transformStellarSpecToSchema', 'Generated schema:', {\n name: schema.name,\n ecosystem: schema.ecosystem,\n functionCount: Array.isArray(schema.functions) ? schema.functions.length : 0,\n });\n\n return schema;\n}\n","import { StrKey } from '@stellar/stellar-sdk';\n\n/**\n * Stellar address types supported by the validation functions\n */\nexport type StellarAddressType =\n | 'account' // G... - Ed25519 public keys (standard account addresses)\n | 'contract' // C... - Contract addresses\n | 'muxed' // M... - Muxed account addresses (for exchanges/sub-accounts)\n | 'secret' // S... - Secret seeds (private keys)\n | 'signed-payload' // P... - Signed payload addresses\n | 'pre-auth-tx' // T... - Pre-authorized transaction hashes\n | 'hash-x'; // X... - Hash-x condition addresses\n\n/**\n * Validate a standard Stellar account address (Ed25519 public key starting with 'G')\n * @param address The address to validate\n * @returns Whether the address is a valid account address\n */\nexport function isValidAccountAddress(address: string): boolean {\n try {\n return StrKey.isValidEd25519PublicKey(address);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate a Stellar contract address (starting with 'C')\n * @param address The address to validate\n * @returns Whether the address is a valid contract address\n */\nexport function isValidContractAddress(address: string): boolean {\n try {\n return StrKey.isValidContract(address);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate a Stellar muxed account address (starting with 'M')\n * @param address The address to validate\n * @returns Whether the address is a valid muxed account address\n */\nexport function isValidMuxedAddress(address: string): boolean {\n try {\n return StrKey.isValidMed25519PublicKey(address);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate a Stellar secret seed (private key starting with 'S')\n * @param seed The secret seed to validate\n * @returns Whether the seed is a valid secret seed\n */\nexport function isValidSecretSeed(seed: string): boolean {\n try {\n return StrKey.isValidEd25519SecretSeed(seed);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate a signed payload address (starting with 'P')\n * @param address The address to validate\n * @returns Whether the address is a valid signed payload address\n */\nexport function isValidSignedPayloadAddress(address: string): boolean {\n try {\n return StrKey.isValidSignedPayload(address);\n } catch {\n return false;\n }\n}\n\n/**\n * Main validation function that supports all Stellar address types\n * @param address The address to validate\n * @param addressType Optional specific address type to validate\n * @returns Whether the address is valid for the specified or any supported type\n */\nexport function isValidAddress(address: string, addressType?: StellarAddressType): boolean {\n if (!address || typeof address !== 'string') {\n return false;\n }\n\n // If specific type is requested, validate only that type\n if (addressType) {\n switch (addressType) {\n case 'account':\n return isValidAccountAddress(address);\n case 'contract':\n return isValidContractAddress(address);\n case 'muxed':\n return isValidMuxedAddress(address);\n case 'secret':\n return isValidSecretSeed(address);\n case 'signed-payload':\n return isValidSignedPayloadAddress(address);\n case 'pre-auth-tx':\n try {\n // Pre-auth transactions start with 'T' - validate by trying to decode\n StrKey.decodePreAuthTx(address);\n return true;\n } catch {\n return false;\n }\n case 'hash-x':\n try {\n // Hash-x conditions start with 'X' - validate by trying to decode\n StrKey.decodeSha256Hash(address);\n return true;\n } catch {\n return false;\n }\n default:\n return false;\n }\n }\n\n // If no specific type requested, validate against common address types\n // (excluding secrets and special-purpose addresses for security)\n try {\n return (\n StrKey.isValidEd25519PublicKey(address) || // G... - accounts (most common)\n StrKey.isValidContract(address) || // C... - contracts\n StrKey.isValidMed25519PublicKey(address) // M... - muxed accounts\n );\n } catch {\n return false;\n }\n}\n","import { EoaExecutionConfig } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { StellarWalletConnectionStatus } from '../wallet/types';\nimport { isValidAddress } from './address';\n\nconst SYSTEM_LOG_TAG = 'StellarEoaValidator';\n\nexport async function validateEoaConfig(\n config: EoaExecutionConfig,\n walletStatus: StellarWalletConnectionStatus\n): Promise<true | string> {\n if (!config.allowAny) {\n if (!config.specificAddress) {\n return \"EOA execution selected, but no specific address was provided when 'allowAny' is false.\";\n }\n if (!isValidAddress(config.specificAddress)) {\n return `Invalid specific Stellar address format: ${config.specificAddress}`;\n }\n if (walletStatus.isConnected && walletStatus.address) {\n if (walletStatus.address !== config.specificAddress) {\n return `Connected wallet address (${walletStatus.address}) does not match the required specific Stellar address (${config.specificAddress}). Please connect the correct wallet.`;\n }\n } else if (walletStatus.isConnected && !walletStatus.address) {\n logger.warn(\n SYSTEM_LOG_TAG,\n 'Wallet is connected but address is unavailable for Stellar EOA validation.'\n );\n return 'Connected wallet address is not available for validation against specific Stellar address.';\n }\n }\n return true;\n}\n","import { RelayerExecutionConfig } from '@openzeppelin/contracts-ui-builder-types';\n\nexport async function validateRelayerConfig(\n config: RelayerExecutionConfig\n): Promise<true | string> {\n if (!config.serviceUrl) {\n return 'Relayer execution selected, but no service URL was provided.';\n }\n if (!config.relayer?.relayerId) {\n return 'Relayer execution selected, but no relayer was chosen from the list.';\n }\n return true;\n}\n","/*\n * Stellar Explorer Configuration\n *\n * DESIGN NOTE: This module provides minimal explorer functionality compared to EVM adapters.\n * Stellar explorers are used only for generating display URLs, unlike EVM where explorers\n * are critical infrastructure for ABI fetching. See comments below for detailed explanation.\n */\n\nimport { NetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\nimport type { UserExplorerConfig } from '@openzeppelin/contracts-ui-builder-types';\n\nimport { isValidContractAddress } from '../validation';\n\n/**\n * Gets a blockchain explorer URL for an address on Stellar.\n * Uses the explorerUrl from the network configuration.\n *\n * @param address The address to get the explorer URL for\n * @param networkConfig The network configuration object.\n * @returns A URL to view the address on the configured Stellar explorer, or null.\n */\nexport function getStellarExplorerAddressUrl(\n address: string,\n networkConfig: NetworkConfig\n): string | null {\n if (!address || !networkConfig.explorerUrl) {\n return null;\n }\n // Use /contract for Soroban contract IDs, otherwise /account\n const baseUrl = networkConfig.explorerUrl.replace(/\\/+$/, '');\n const path = isValidContractAddress(address) ? 'contract' : 'account';\n return `${baseUrl}/${path}/${encodeURIComponent(address)}`;\n}\n\n/**\n * Gets a blockchain explorer URL for a transaction on Stellar.\n * Uses the explorerUrl from the network configuration.\n *\n * @param txHash - The hash of the transaction to get the explorer URL for\n * @param networkConfig The network configuration object.\n * @returns A URL to view the transaction on the configured Stellar explorer, or null.\n */\nexport function getStellarExplorerTxUrl(\n txHash: string,\n networkConfig: NetworkConfig\n): string | null {\n if (!txHash || !networkConfig.explorerUrl) {\n return null;\n }\n // Construct the URL, assuming a standard /tx/ path for Stellar explorers\n const baseUrl = networkConfig.explorerUrl.replace(/\\/+$/, '');\n return `${baseUrl}/tx/${encodeURIComponent(txHash)}`;\n}\n\n/**\n * Validates a Stellar explorer configuration.\n *\n * NOTE: This validation is minimal compared to EVM - only checks URL formats.\n * No API key validation or connection testing since Stellar explorers are\n * display-only (not used for contract ABI fetching like in EVM).\n */\nexport function validateStellarExplorerConfig(explorerConfig: UserExplorerConfig): boolean {\n // Validate URLs if provided\n if (explorerConfig.explorerUrl) {\n try {\n new URL(explorerConfig.explorerUrl);\n } catch {\n return false;\n }\n } else {\n // explorerUrl is required\n return false;\n }\n\n if (explorerConfig.apiUrl) {\n try {\n new URL(explorerConfig.apiUrl);\n } catch {\n return false;\n }\n }\n\n // Basic API key validation (not empty)\n if (explorerConfig.apiKey !== undefined && explorerConfig.apiKey.trim().length === 0) {\n return false;\n }\n\n return true;\n}\n\n/*\n * NOTE: Unlike EVM adapters, Stellar does not implement explorer connection testing.\n *\n * DESIGN DECISION: Stellar explorers are used only for generating display URLs,\n * not for critical functionality like ABI fetching (which EVM requires).\n *\n * Key differences from EVM:\n * - EVM: Explorers provide essential APIs for contract ABI fetching\n * - Stellar: Explorers are display-only; contract loading uses Soroban RPC directly\n * - EVM: Multiple explorer providers with varying API formats requiring validation\n * - Stellar: Standardized ecosystem using Horizon API underneath\n *\n * Therefore, testing explorer \"connectivity\" would only verify website availability,\n * which provides no functional value and adds unnecessary complexity.\n */\n","import { xdr } from '@stellar/stellar-sdk';\n\nimport type { FunctionParameter } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n// Import the type extraction utility from the shared utils module\nimport { extractSorobanTypeFromScSpec } from '../utils/type-detection';\n\n/**\n * Extracts struct field definitions from Stellar contract spec entries\n *\n * @param entries Array of ScSpecEntry from contract spec\n * @param structName Name of the struct type to extract fields for\n * @returns Array of FunctionParameter representing struct fields, or null if not found\n */\nexport function extractStructFields(\n entries: xdr.ScSpecEntry[],\n structName: string\n): FunctionParameter[] | null {\n try {\n // Find the entry for the requested struct name\n const entry = entries.find((e) => {\n try {\n return e.value().name().toString() === structName;\n } catch {\n return false;\n }\n });\n\n if (!entry) {\n return null;\n }\n\n const entryKind = entry.switch();\n\n // Handle UDT Struct (like DemoStruct { id: u32, flag: bool, info: Symbol })\n if (entryKind.value === xdr.ScSpecEntryKind.scSpecEntryUdtStructV0().value) {\n const structUdt = entry.udtStructV0();\n const fields = structUdt.fields();\n const structFields: FunctionParameter[] = [];\n\n for (const field of fields) {\n const fieldName = field.name().toString();\n const fieldType = extractSorobanTypeFromScSpec(field.type());\n\n structFields.push({\n name: fieldName,\n type: fieldType,\n });\n }\n\n return structFields;\n }\n\n return null;\n } catch (error) {\n logger.error(\n 'extractStructFields',\n `Failed to extract struct fields for ${structName}:`,\n error\n );\n return null;\n }\n}\n\n/**\n * Determines if a given type name is a struct type in the contract spec\n *\n * @param entries Array of ScSpecEntry from contract spec\n * @param typeName Name of the type to check\n * @returns true if the type is a struct, false otherwise\n */\nexport function isStructType(entries: xdr.ScSpecEntry[], typeName: string): boolean {\n try {\n const entry = entries.find((e) => {\n try {\n const entryName = e.value().name().toString();\n return entryName === typeName;\n } catch {\n return false;\n }\n });\n\n if (!entry) {\n return false;\n }\n\n const entryKind = entry.switch();\n const isStruct = entryKind.value === xdr.ScSpecEntryKind.scSpecEntryUdtStructV0().value;\n\n return isStruct;\n } catch (error) {\n logger.error('isStructType', `Failed to check if ${typeName} is struct:`, error);\n return false;\n }\n}\n","import * as StellarSdk from '@stellar/stellar-sdk';\n\nimport { isDevelopmentOrTestEnvironment, logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n/**\n * Utility functions for detecting and analyzing Stellar/Soroban parameter types\n */\n\n/**\n * Extract human-readable Soroban type name from ScSpecTypeDef\n * Based on the Stellar SDK type system\n */\nexport function extractSorobanTypeFromScSpec(scSpecType: StellarSdk.xdr.ScSpecTypeDef): string {\n try {\n const typeSwitch = scSpecType.switch();\n\n switch (typeSwitch) {\n case StellarSdk.xdr.ScSpecType.scSpecTypeVal():\n return 'Val';\n case StellarSdk.xdr.ScSpecType.scSpecTypeBool():\n return 'Bool';\n case StellarSdk.xdr.ScSpecType.scSpecTypeVoid():\n return 'Void';\n case StellarSdk.xdr.ScSpecType.scSpecTypeError():\n return 'Error';\n case StellarSdk.xdr.ScSpecType.scSpecTypeU32():\n return 'U32';\n case StellarSdk.xdr.ScSpecType.scSpecTypeI32():\n return 'I32';\n case StellarSdk.xdr.ScSpecType.scSpecTypeU64():\n return 'U64';\n case StellarSdk.xdr.ScSpecType.scSpecTypeI64():\n return 'I64';\n case StellarSdk.xdr.ScSpecType.scSpecTypeTimepoint():\n return 'Timepoint';\n case StellarSdk.xdr.ScSpecType.scSpecTypeDuration():\n return 'Duration';\n case StellarSdk.xdr.ScSpecType.scSpecTypeU128():\n return 'U128';\n case StellarSdk.xdr.ScSpecType.scSpecTypeI128():\n return 'I128';\n case StellarSdk.xdr.ScSpecType.scSpecTypeU256():\n return 'U256';\n case StellarSdk.xdr.ScSpecType.scSpecTypeI256():\n return 'I256';\n case StellarSdk.xdr.ScSpecType.scSpecTypeBytes():\n return 'Bytes';\n case StellarSdk.xdr.ScSpecType.scSpecTypeBytesN(): {\n const bytesNType = scSpecType.bytesN();\n const size = bytesNType.n();\n return `BytesN<${size}>`;\n }\n case StellarSdk.xdr.ScSpecType.scSpecTypeString():\n return 'ScString';\n case StellarSdk.xdr.ScSpecType.scSpecTypeSymbol():\n return 'ScSymbol';\n case StellarSdk.xdr.ScSpecType.scSpecTypeVec(): {\n const vecType = scSpecType.vec();\n const elementType = extractSorobanTypeFromScSpec(vecType.elementType());\n return `Vec<${elementType}>`;\n }\n case StellarSdk.xdr.ScSpecType.scSpecTypeMap(): {\n const mapType = scSpecType.map();\n const keyType = extractSorobanTypeFromScSpec(mapType.keyType());\n const valueType = extractSorobanTypeFromScSpec(mapType.valueType());\n return `Map<${keyType}, ${valueType}>`;\n }\n case StellarSdk.xdr.ScSpecType.scSpecTypeTuple(): {\n const tupleType = scSpecType.tuple();\n const valueTypes = tupleType.valueTypes();\n const typeNames = valueTypes.map((t) => extractSorobanTypeFromScSpec(t));\n return `Tuple<${typeNames.join(', ')}>`;\n }\n case StellarSdk.xdr.ScSpecType.scSpecTypeOption(): {\n const optionType = scSpecType.option();\n const valueType = extractSorobanTypeFromScSpec(optionType.valueType());\n return `Option<${valueType}>`;\n }\n case StellarSdk.xdr.ScSpecType.scSpecTypeResult(): {\n const resultType = scSpecType.result();\n const okType = extractSorobanTypeFromScSpec(resultType.okType());\n const errorType = extractSorobanTypeFromScSpec(resultType.errorType());\n return `Result<${okType}, ${errorType}>`;\n }\n case StellarSdk.xdr.ScSpecType.scSpecTypeAddress():\n return 'Address';\n case StellarSdk.xdr.ScSpecType.scSpecTypeMuxedAddress():\n return 'MuxedAddress';\n case StellarSdk.xdr.ScSpecType.scSpecTypeUdt(): {\n const udtType = scSpecType.udt();\n return udtType.name().toString();\n }\n default:\n // COMPREHENSIVE TYPE MISS DETECTION\n logger.error('extractSorobanTypeFromScSpec', `🚨 MISSING SCSPEC TYPE HANDLER 🚨`, {\n typeSwitchValue: typeSwitch.value,\n typeSwitchName: typeSwitch.name,\n rawScSpecType: scSpecType,\n message: 'This indicates a missing case in extractSorobanTypeFromScSpec switch statement',\n actionRequired: 'Add support for this ScSpec type immediately',\n sdkVersion: process.env.npm_package_dependencies_stellar_sdk || 'unknown',\n });\n\n // Create detailed error report for unknown types\n const errorReport = {\n type: 'MISSING_SCSPEC_TYPE',\n scSpecType: typeSwitch.name,\n value: typeSwitch.value,\n timestamp: new Date().toISOString(),\n };\n\n // In development, throw an error to fail fast\n if (isDevelopmentOrTestEnvironment()) {\n throw new Error(\n `Missing ScSpec type handler: ${typeSwitch.name} (value: ${typeSwitch.value}). Please add support for this type.`\n );\n }\n\n // In production, log extensively but don't break\n logger.error('STELLAR_ADAPTER_MISSING_TYPE', 'Missing ScSpec type handler:', errorReport);\n return 'unknown';\n }\n } catch (error) {\n logger.error('extractSorobanTypeFromScSpec', 'Failed to extract type:', error);\n return 'unknown';\n }\n}\n\n/**\n * Determines if a parameter type is likely an enum based on naming conventions\n * and common patterns in Stellar/Soroban contracts.\n *\n * @param parameterType The parameter type string to analyze\n * @returns true if the type appears to be an enum based on naming patterns\n */\nexport function isLikelyEnumType(parameterType: string): boolean {\n // Direct enum name patterns\n if (parameterType.includes('Enum') || parameterType.includes('enum')) {\n return true;\n }\n\n // Common enum naming patterns in Stellar/Soroban\n const enumPatterns = [\n /^(Status|State|Type|Kind|Mode|Level|Priority|Category)$/i,\n /^.*?(Status|State|Type|Kind|Mode|Level|Priority|Category)$/i,\n /^(Token|Asset|Account|Contract|Network)Type$/i,\n ];\n\n // Only apply pattern matching if it's not a generic \"UnknownType\" or similar\n if (\n parameterType === 'UnknownType' ||\n parameterType === 'CustomStruct' ||\n parameterType === 'UserInfo'\n ) {\n return false;\n }\n\n return enumPatterns.some((pattern) => pattern.test(parameterType));\n}\n","import {\n Account,\n Address,\n BASE_FEE,\n Contract,\n Keypair,\n nativeToScVal,\n rpc as StellarRpc,\n TransactionBuilder,\n} from '@stellar/stellar-sdk';\n\nimport type {\n ContractSchema,\n FunctionParameter,\n NetworkConfig,\n StellarNetworkConfig,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { parseStellarInput } from '../transform';\nimport { formatStellarFunctionResult } from '../transform/output-formatter';\nimport { convertStellarTypeToScValType } from '../utils';\nimport { isStellarViewFunction } from './view-checker';\n\n/**\n * Private helper to get a Soroban RPC Server instance for view queries.\n * Prioritizes custom RPC configuration, then falls back to network default.\n */\nfunction getSorobanRpcServer(networkConfig: StellarNetworkConfig): StellarRpc.Server {\n // Check if there's a custom RPC configuration\n const customRpcConfig = userRpcConfigService.getUserRpcConfig(networkConfig.id);\n const rpcUrl = customRpcConfig?.url || networkConfig.sorobanRpcUrl;\n\n if (!rpcUrl) {\n throw new Error(`No Soroban RPC URL available for network ${networkConfig.name}`);\n }\n\n logger.info(\n 'getSorobanRpcServer',\n `Creating Soroban RPC server for ${networkConfig.name} using RPC: ${rpcUrl}`\n );\n\n // Allow HTTP for localhost development\n const allowHttp = new URL(rpcUrl).hostname === 'localhost';\n\n return new StellarRpc.Server(rpcUrl, {\n allowHttp,\n });\n}\n\n/**\n * Creates a dummy transaction to simulate a contract function call.\n * This is used for view functions that don't modify state.\n */\nasync function createSimulationTransaction(\n contractAddress: string,\n functionName: string,\n args: unknown[],\n paramTypes: string[],\n networkConfig: StellarNetworkConfig\n): Promise<TransactionBuilder> {\n try {\n // Create a dummy source account for simulation\n // We'll use a well-known testnet account for simulation\n const dummyKeypair = Keypair.random();\n const sourceAccount = new Account(dummyKeypair.publicKey(), '0');\n\n // Create contract instance\n const contract = new Contract(contractAddress);\n\n // Convert args to ScVal with proper type hints\n const scValArgs = args.map((arg, index) => {\n const paramType = paramTypes[index];\n if (!paramType) {\n // Fallback to direct conversion if type info missing\n return nativeToScVal(arg);\n }\n\n // Special cases that don't need type hints\n if (paramType === 'Bool' || paramType === 'Bytes' || paramType.match(/^BytesN<\\d+>$/)) {\n return nativeToScVal(arg);\n }\n\n // Use common utility for type conversion with hints\n const typeHint = convertStellarTypeToScValType(paramType);\n return nativeToScVal(arg, { type: typeHint });\n });\n\n // Build the transaction for simulation\n const transaction = new TransactionBuilder(sourceAccount, {\n fee: BASE_FEE,\n networkPassphrase: networkConfig.networkPassphrase,\n })\n .addOperation(contract.call(functionName, ...scValArgs))\n .setTimeout(30);\n\n return transaction;\n } catch (error) {\n logger.error('createSimulationTransaction', 'Failed to create simulation transaction:', error);\n throw new Error(`Failed to create simulation transaction: ${(error as Error).message}`);\n }\n}\n\n/**\n * Determines if a Stellar contract function modifies state by simulating it\n * and checking for state changes.\n *\n * @param contractAddress Address of the contract.\n * @param functionName Name of the function to check.\n * @param networkConfig The specific network configuration.\n * @param inputTypes Parameter types for the function (empty array for parameterless functions).\n * @returns True if the function modifies state, false if it's read-only.\n */\nexport async function checkStellarFunctionStateMutability(\n contractAddress: string,\n functionName: string,\n networkConfig: StellarNetworkConfig,\n inputTypes: string[] = []\n): Promise<boolean> {\n logger.info(\n 'checkStellarFunctionStateMutability',\n `Checking state mutability for function: ${functionName} on ${contractAddress}`\n );\n\n try {\n // --- Validate Contract Address --- //\n try {\n Address.fromString(contractAddress);\n } catch {\n throw new Error(`Invalid Stellar contract address provided: ${contractAddress}`);\n }\n\n // --- Get Soroban RPC Server --- //\n const rpcServer = getSorobanRpcServer(networkConfig);\n\n // --- Create dummy parameters for simulation --- //\n // For state mutability detection, we can use dummy values since we only care about state changes\n const dummyArgs = inputTypes.map((paramType) => {\n // Create minimal dummy values for different types\n switch (paramType) {\n case 'Bool':\n return false;\n case 'I32':\n case 'U32':\n case 'I64':\n case 'U64':\n case 'I128':\n case 'U128':\n case 'I256':\n case 'U256':\n return 0;\n case 'String':\n return '';\n case 'Bytes':\n return Buffer.alloc(0);\n case 'Address':\n // Use the contract address as a dummy address\n return contractAddress;\n default:\n // For complex types, use null which often gets converted to appropriate defaults\n return null;\n }\n });\n\n // --- Create Simulation Transaction --- //\n const transactionBuilder = await createSimulationTransaction(\n contractAddress,\n functionName,\n dummyArgs,\n inputTypes,\n networkConfig\n );\n\n const transaction = transactionBuilder.build();\n\n logger.debug(\n 'checkStellarFunctionStateMutability',\n `[Check ${functionName}] Simulating transaction for state mutability check`\n );\n\n // --- Simulate Transaction --- //\n let simulationResult: StellarRpc.Api.SimulateTransactionResponse;\n try {\n simulationResult = await rpcServer.simulateTransaction(transaction);\n } catch (simulationError) {\n logger.warn(\n 'checkStellarFunctionStateMutability',\n `[Check ${functionName}] Simulation failed, assuming function modifies state:`,\n simulationError\n );\n // If simulation fails, err on the side of caution and assume it modifies state\n return true;\n }\n\n // --- Process Simulation Result --- //\n if (StellarRpc.Api.isSimulationError(simulationResult)) {\n logger.warn(\n 'checkStellarFunctionStateMutability',\n `[Check ${functionName}] Simulation error, assuming function modifies state:`,\n simulationResult.error\n );\n // If there's a simulation error, assume it modifies state for safety\n return true;\n }\n\n // --- Check State Changes (following Laboratory approach) --- //\n const hasStateChanges =\n simulationResult.stateChanges && simulationResult.stateChanges.length > 0;\n\n logger.info(\n 'checkStellarFunctionStateMutability',\n `[Check ${functionName}] State mutability check complete:`,\n {\n hasStateChanges,\n stateChangesCount: simulationResult.stateChanges?.length || 0,\n modifiesState: Boolean(hasStateChanges),\n }\n );\n\n return Boolean(hasStateChanges);\n } catch (error) {\n logger.warn(\n 'checkStellarFunctionStateMutability',\n `Failed to check state mutability for ${functionName}, assuming it modifies state:`,\n error\n );\n // If anything goes wrong, assume the function modifies state as a safe default\n return true;\n }\n}\n\n/**\n * Core logic for querying a Stellar view function.\n *\n * @param contractAddress Address of the contract.\n * @param functionId ID of the function to query.\n * @param networkConfig The specific network configuration.\n * @param params Raw parameters for the function call.\n * @param contractSchema Optional pre-loaded contract schema.\n * @param loadContractFn Function reference to load contract schema if not provided.\n * @returns The decoded result of the view function call.\n */\nexport async function queryStellarViewFunction(\n contractAddress: string,\n functionId: string,\n networkConfig: NetworkConfig,\n params: unknown[] = [],\n contractSchema?: ContractSchema,\n loadContractFn?: (source: string) => Promise<ContractSchema>\n): Promise<unknown> {\n logger.info(\n 'queryStellarViewFunction',\n `Querying Stellar view function: ${functionId} on ${contractAddress} (${networkConfig.name})`,\n { params }\n );\n\n if (networkConfig.ecosystem !== 'stellar') {\n throw new Error('Invalid network configuration for Stellar query.');\n }\n\n const stellarConfig = networkConfig as StellarNetworkConfig;\n\n try {\n // --- Validate Contract Address --- //\n try {\n Address.fromString(contractAddress);\n } catch {\n throw new Error(`Invalid Stellar contract address provided: ${contractAddress}`);\n }\n\n // --- Get Soroban RPC Server --- //\n const rpcServer = getSorobanRpcServer(stellarConfig);\n\n // --- Get Schema & Function Details --- //\n let schema = contractSchema;\n if (!schema && loadContractFn) {\n schema = await loadContractFn(contractAddress);\n }\n if (!schema) {\n throw new Error(\n `Contract schema not provided and loadContractFn not available for ${contractAddress}`\n );\n }\n\n const functionDetails = schema.functions.find((fn) => fn.id === functionId);\n if (!functionDetails) {\n throw new Error(`Function with ID ${functionId} not found in contract schema.`);\n }\n\n if (!isStellarViewFunction(functionDetails)) {\n throw new Error(`Function ${functionDetails.name} is not a view function.`);\n }\n\n // --- Parse Input Parameters --- //\n const expectedInputs: readonly FunctionParameter[] = functionDetails.inputs;\n if (params.length !== expectedInputs.length) {\n throw new Error(\n `Incorrect number of parameters provided for ${functionDetails.name}. Expected ${expectedInputs.length}, got ${params.length}.`\n );\n }\n\n const args = expectedInputs.map((inputParam: FunctionParameter, index: number) => {\n const rawValue = params[index];\n return parseStellarInput(rawValue, inputParam.type);\n });\n\n logger.debug('queryStellarViewFunction', 'Parsed Args for contract call:', args);\n\n // --- Create Simulation Transaction --- //\n const paramTypes = expectedInputs.map((input) => input.type);\n const transactionBuilder = await createSimulationTransaction(\n contractAddress,\n functionDetails.name,\n args,\n paramTypes,\n stellarConfig\n );\n\n const transaction = transactionBuilder.build();\n\n logger.debug(\n 'queryStellarViewFunction',\n `[Query ${functionDetails.name}] Simulating transaction:`,\n transaction.toXDR()\n );\n\n // --- Simulate Transaction --- //\n let simulationResult: StellarRpc.Api.SimulateTransactionResponse;\n try {\n simulationResult = await rpcServer.simulateTransaction(transaction);\n } catch (simulationError) {\n logger.error(\n 'queryStellarViewFunction',\n `[Query ${functionDetails.name}] Simulation failed:`,\n simulationError\n );\n throw new Error(\n `Soroban RPC simulation failed for ${functionDetails.name}: ${(simulationError as Error).message}`\n );\n }\n\n // --- Process Simulation Result --- //\n if (StellarRpc.Api.isSimulationError(simulationResult)) {\n logger.error(\n 'queryStellarViewFunction',\n `[Query ${functionDetails.name}] Simulation error:`,\n simulationResult.error\n );\n throw new Error(`Contract simulation failed: ${simulationResult.error}`);\n }\n\n if (!simulationResult.result) {\n throw new Error(`No result returned from contract simulation for ${functionDetails.name}`);\n }\n\n const rawResult = simulationResult.result.retval;\n logger.debug(\n 'queryStellarViewFunction',\n `[Query ${functionDetails.name}] Raw simulation result:`,\n rawResult\n );\n\n // --- Format Result --- //\n const formattedResult = formatStellarFunctionResult(rawResult, functionDetails);\n\n logger.info(\n 'queryStellarViewFunction',\n `[Query ${functionDetails.name}] Formatted result:`,\n formattedResult\n );\n\n return formattedResult;\n } catch (error) {\n const errorMessage = `Failed to query Stellar view function ${functionId} on network ${networkConfig.name}: ${(error as Error).message}`;\n logger.error('queryStellarViewFunction', errorMessage, {\n contractAddress,\n functionId,\n params,\n networkConfig,\n error,\n });\n throw new Error(errorMessage);\n }\n}\n","import { isEnumValue } from '@openzeppelin/contracts-ui-builder-types';\nimport { isPlainObject, logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { isLikelyEnumType } from '../../utils/type-detection';\nimport { isGenericType, parseGeneric } from './generic-parser';\nimport { isPrimitiveType, parsePrimitive } from './primitive-parser';\n\n// Re-export types for backward compatibility\nexport type {\n SorobanArgumentValue,\n SorobanEnumValue,\n SorobanMapEntry,\n SorobanComplexValue,\n} from './types';\n\n// Re-export specific functions for backward compatibility\nexport { getScValsFromArgs } from './complex-parser';\nexport { valueToScVal } from './scval-converter';\n\nconst SYSTEM_LOG_TAG = 'StellarInputParser';\n\n/**\n * Parses form input values for Stellar/Soroban contracts.\n * Handles both simple UI form inputs and complex structures.\n *\n * @param value - The input value from the form\n * @param parameterType - The Stellar parameter type (e.g., 'Address', 'U128', 'Vec<U32>')\n * @returns The parsed value suitable for nativeToScVal conversion\n */\nexport function parseStellarInput(value: unknown, parameterType: string): unknown {\n try {\n // Handle null/undefined values\n if (value === null || value === undefined) {\n return null;\n }\n\n // Try primitive types first (most common)\n if (isPrimitiveType(parameterType)) {\n const result = parsePrimitive(value, parameterType);\n if (result !== null) {\n return result;\n }\n }\n\n // Try generic types (Vec, Map, Option, Result)\n if (isGenericType(parameterType)) {\n const result = parseGeneric(value, parameterType, parseStellarInput);\n // For generic types, we always return the result (including null for Option<T> with empty/null values)\n return result;\n }\n\n // Handle remaining custom types and special cases\n // Check if this is an enum type and transform from chain-agnostic to Soroban format\n if (isEnumValue(value) && isLikelyEnumType(parameterType)) {\n // Chain-agnostic enum format: { tag: \"VariantName\", values?: [...] }\n // Return the chain-agnostic enum value as-is\n // The Stellar-specific transformation will happen in valueToScVal\n return value;\n }\n\n // Check if this is a struct type (object with primitive fields)\n if (isPlainObject(value)) {\n // For structs, we need to recursively process each field\n // But since we don't have field type information here, we'll pass it through\n // and handle the conversion in valueToScVal where we have access to contract schema\n return value;\n }\n\n // For other types, try to return raw value with validation\n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n\n throw new Error(`Unsupported parameter type: ${parameterType} with value type ${typeof value}`);\n } catch (error) {\n logger.error(SYSTEM_LOG_TAG, 'Failed to parse Stellar input:', error);\n throw error;\n }\n}\n","import { isMapEntryArray } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nconst SYSTEM_LOG_TAG = 'GenericParser';\n\n/**\n * Parses a generic type string and extracts the base type and parameters\n * @param typeString - Type like \"Vec<U32>\", \"Map<U32,Address>\", \"Option<Vec<U32>>\"\n * @returns Object with baseType and parameters, or null if not generic\n */\nexport function parseGenericType(typeString: string): {\n baseType: string;\n parameters: string[];\n} | null {\n const match = typeString.match(/^(\\w+)<(.*)>$/);\n if (!match) return null;\n\n const baseType = match[1];\n const paramString = match[2];\n\n // Handle nested generics by counting angle brackets\n const parameters: string[] = [];\n let current = '';\n let depth = 0;\n let i = 0;\n\n while (i < paramString.length) {\n const char = paramString[i];\n\n if (char === '<') {\n depth++;\n current += char;\n } else if (char === '>') {\n depth--;\n current += char;\n } else if (char === ',' && depth === 0) {\n parameters.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n i++;\n }\n\n if (current.trim()) {\n parameters.push(current.trim());\n }\n\n return { baseType, parameters };\n}\n\n/**\n * Parses generic types like Vec<T>, Map<K,V>, and Option<T>.\n *\n * @param value - The input value from the form\n * @param parameterType - The generic parameter type (e.g., 'Vec<U32>', 'Map<Symbol,Bytes>')\n * @param parseInnerValue - Function to recursively parse inner values\n * @returns The parsed value suitable for further processing\n */\nexport function parseGeneric(\n value: unknown,\n parameterType: string,\n parseInnerValue: (val: unknown, type: string) => unknown\n): unknown {\n try {\n const genericInfo = parseGenericType(parameterType);\n if (!genericInfo) {\n return null; // Not a generic type\n }\n\n const { baseType, parameters } = genericInfo;\n\n switch (baseType) {\n case 'Vec': {\n // Handle Vec<T> types\n if (!Array.isArray(value)) {\n throw new Error(`Array expected for Vec type ${parameterType}, got ${typeof value}`);\n }\n\n const innerType = parameters[0];\n if (!innerType) {\n throw new Error(`Could not parse Vec inner type: ${parameterType}`);\n }\n\n return value.map((item) => parseInnerValue(item, innerType));\n }\n\n case 'Map': {\n // Handle Map<K,V> types\n if (!isMapEntryArray(value)) {\n throw new Error(`Array of MapEntry objects expected for Map type, got ${typeof value}`);\n }\n\n if (parameters.length < 2) {\n throw new Error(`Could not parse Map types: ${parameterType}`);\n }\n\n const mapKeyType = parameters[0];\n const mapValueType = parameters[1];\n\n // Convert MapEntry array to Stellar SDK expected format\n return value.map((entry) => ({\n 0: {\n value: entry.key,\n type: mapKeyType,\n },\n 1: {\n value: entry.value,\n type: mapValueType,\n },\n }));\n }\n\n case 'Option': {\n // Handle Option<T> types - empty string should be treated as null\n if (value === null || value === undefined || value === '') {\n return null;\n }\n\n const innerType = parameters[0];\n if (!innerType) {\n throw new Error(`Could not parse Option inner type: ${parameterType}`);\n }\n\n return parseInnerValue(value, innerType);\n }\n\n case 'Result': {\n // Handle Result<T,E> types (basic support)\n if (parameters.length < 2) {\n throw new Error(`Could not parse Result types: ${parameterType}`);\n }\n\n // Result types typically come as {ok: value} or {err: error}\n if (typeof value === 'object' && value !== null) {\n const resultObj = value as Record<string, unknown>;\n if ('ok' in resultObj) {\n return {\n ok: parseInnerValue(resultObj.ok, parameters[0]),\n };\n } else if ('err' in resultObj) {\n return {\n err: parseInnerValue(resultObj.err, parameters[1]),\n };\n }\n }\n\n return value; // Pass through if not in expected format\n }\n\n default:\n // Unknown generic type\n logger.warn(SYSTEM_LOG_TAG, `Unknown generic type: ${baseType}`);\n return null;\n }\n } catch (error) {\n logger.error(SYSTEM_LOG_TAG, `Failed to parse generic type ${parameterType}:`, error);\n throw error;\n }\n}\n\n/**\n * Checks if the given parameter type is a generic type that can be handled by this parser.\n *\n * @param parameterType - The Stellar parameter type\n * @returns True if this is a generic type\n */\nexport function isGenericType(parameterType: string): boolean {\n const genericInfo = parseGenericType(parameterType);\n return genericInfo !== null && ['Vec', 'Map', 'Option', 'Result'].includes(genericInfo.baseType);\n}\n","import { Address } from '@stellar/stellar-sdk';\n\nimport {\n detectBytesEncoding,\n logger,\n stringToBytes,\n} from '@openzeppelin/contracts-ui-builder-utils';\n\nconst SYSTEM_LOG_TAG = 'PrimitiveParser';\n\n/**\n * Parses primitive Stellar/Soroban types from form inputs.\n * Handles: Bool, Bytes, Address, ScString, ScSymbol, and numeric types (U32, U64, U128, U256, I32, I64, I128, I256).\n *\n * @param value - The input value from the form\n * @param parameterType - The Stellar parameter type\n * @returns The parsed primitive value\n */\nexport function parsePrimitive(value: unknown, parameterType: string): unknown {\n try {\n // Handle null/undefined values\n if (value === null || value === undefined) {\n return null;\n }\n\n switch (parameterType) {\n // Boolean: convert string \"true\"/\"false\" to actual boolean\n case 'Bool':\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true';\n }\n throw new Error(`Boolean parameter expected, got ${typeof value}`);\n\n // Bytes: handle encoding detection\n case 'Bytes':\n if (typeof value === 'string') {\n // Remove 0x prefix if present\n const cleanValue = value.startsWith('0x') ? value.slice(2) : value;\n const encoding = detectBytesEncoding(cleanValue);\n return stringToBytes(cleanValue, encoding);\n }\n throw new Error(`Bytes parameter must be a string, got ${typeof value}`);\n\n // DataUrl: handle base64 encoded data (similar to Bytes)\n case 'DataUrl':\n if (typeof value === 'string') {\n // DataUrl is typically base64 encoded\n const encoding = detectBytesEncoding(value);\n return stringToBytes(value, encoding);\n }\n throw new Error(`DataUrl parameter must be a string, got ${typeof value}`);\n\n // Address: validate format\n case 'Address':\n if (typeof value === 'string') {\n try {\n Address.fromString(value); // Validate format\n return value; // Return raw string - nativeToScVal will handle conversion\n } catch {\n throw new Error(`Invalid Stellar address format: ${value}`);\n }\n }\n throw new Error(`Address parameter must be a string, got ${typeof value}`);\n\n // String types: return as-is\n case 'ScString':\n case 'ScSymbol':\n if (typeof value === 'string') {\n return value;\n }\n throw new Error(`String parameter expected, got ${typeof value}`);\n\n default:\n // Handle BytesN<size> patterns\n if (/^BytesN<\\d+>$/.test(parameterType)) {\n if (typeof value === 'string') {\n const cleanValue = value.startsWith('0x') ? value.slice(2) : value;\n const encoding = detectBytesEncoding(cleanValue);\n return stringToBytes(cleanValue, encoding);\n }\n throw new Error(`Bytes parameter must be a string, got ${typeof value}`);\n }\n\n // Handle numeric types: U32, U64, U128, U256, I32, I64, I128, I256\n if (/^[UI](32|64|128|256)$/.test(parameterType)) {\n if (typeof value === 'string') {\n // Validate it's a valid integer (no decimals, letters)\n if (!/^-?\\d+$/.test(value.trim())) {\n throw new Error(`Invalid number format for ${parameterType}: ${value}`);\n }\n return value; // Return raw string - let nativeToScVal handle conversion with type hints\n }\n if (typeof value === 'number') {\n return value.toString(); // Convert to string for consistency\n }\n throw new Error(`Numeric parameter expected for ${parameterType}, got ${typeof value}`);\n }\n\n return null; // Not a primitive type - let other parsers handle it\n }\n } catch (error) {\n logger.error(SYSTEM_LOG_TAG, `Failed to parse primitive ${parameterType}:`, error);\n throw error;\n }\n}\n\n/**\n * Checks if the given parameter type is a primitive type that can be handled by this parser.\n *\n * @param parameterType - The Stellar parameter type\n * @returns True if this is a primitive type\n */\nexport function isPrimitiveType(parameterType: string): boolean {\n return (\n parameterType === 'Bool' ||\n parameterType === 'Bytes' ||\n parameterType === 'DataUrl' ||\n parameterType === 'Address' ||\n parameterType === 'ScString' ||\n parameterType === 'ScSymbol' ||\n /^BytesN<\\d+>$/.test(parameterType) ||\n /^[UI](32|64|128|256)$/.test(parameterType)\n );\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport { detectBytesEncoding, stringToBytes } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { convertStellarTypeToScValType } from '../../utils/formatting';\nimport {\n convertEnumToScVal,\n convertObjectToMap,\n convertObjectToScVal,\n convertTupleToScVal,\n getScValFromArg,\n getScValFromPrimitive,\n isComplexObjectArray,\n isEnumArgumentSet,\n isMapArray,\n isObjectWithTypedValues,\n isPrimitiveArgumentSet,\n isPrimitiveArray,\n isPrimitiveValue,\n isTupleArray,\n} from '../../utils/input-parsing';\nimport type {\n SorobanArgumentValue,\n SorobanComplexValue,\n SorobanEnumValue,\n SorobanMapEntry,\n} from './types';\n\n/**\n * Advanced ScVal generation from complex Soroban arguments.\n * Handles Maps, Enums, Tuples, and nested structures.\n *\n * @param args - Complex argument structure from advanced UI forms\n * @param scVals - Accumulator for generated ScVals (used for recursion)\n * @returns Array of ScVals ready for contract invocation\n */\nexport function getScValsFromArgs(\n args: Record<string, SorobanComplexValue> | SorobanComplexValue[],\n scVals: xdr.ScVal[] = []\n): xdr.ScVal[] {\n // Handle array input (multiple arguments)\n if (Array.isArray(args)) {\n return args.map((arg) => {\n if (typeof arg === 'object' && 'value' in arg && 'type' in arg) {\n return getScValFromPrimitive(arg as SorobanArgumentValue);\n }\n return getScValFromArg(arg, []);\n });\n }\n\n // Handle primitive case - all values have type and value\n if (isPrimitiveArgumentSet(args)) {\n const primitiveScVals = Object.values(args).map((v) => {\n return getScValFromPrimitive(v as SorobanArgumentValue);\n });\n\n return primitiveScVals;\n }\n\n // Handle enum case - values have tag or enum properties\n if (isEnumArgumentSet(args)) {\n const enumScVals = Object.values(args).map((v) => {\n return convertEnumToScVal(v as SorobanEnumValue, scVals);\n });\n\n return enumScVals;\n }\n\n // Handle complex cases (maps, objects, arrays)\n for (const argKey in args) {\n const argValue = args[argKey];\n\n if (Array.isArray(argValue)) {\n // Map case - array of key-value pair objects\n if (isMapArray(argValue)) {\n const { mapVal, mapType } = convertObjectToMap(argValue as SorobanMapEntry[]);\n const mapScVal = nativeToScVal(mapVal, { type: mapType });\n scVals.push(mapScVal);\n continue;\n }\n\n // Vector case #1: array of complex objects or tuples\n if (isComplexObjectArray(argValue)) {\n const arrayScVals = argValue.map((v) => {\n // Use proper type guards to ensure safe casting\n if (typeof v === 'object' && v !== null && ('tag' in v || 'enum' in v)) {\n return convertEnumToScVal(v as SorobanEnumValue, scVals);\n }\n if (\n typeof v === 'object' &&\n v !== null &&\n !Array.isArray(v) &&\n !('0' in v) &&\n !('1' in v)\n ) {\n return convertObjectToScVal(v as Record<string, SorobanArgumentValue>);\n }\n // Fallback for other types\n return nativeToScVal(v);\n });\n\n const tupleScValsVec = xdr.ScVal.scvVec(arrayScVals);\n scVals.push(tupleScValsVec);\n continue;\n }\n\n // Vector case #2: array of primitives (homogeneous type)\n if (isPrimitiveArray(argValue)) {\n // TypeScript now knows argValue is SorobanArgumentValue[] thanks to type predicate\n const arrayScVals = argValue.reduce((acc: unknown[], v) => {\n const primitive = v as unknown as SorobanArgumentValue;\n if (primitive.type === 'bool') {\n acc.push(primitive.value === 'true' ? true : false);\n } else if (primitive.type === 'bytes') {\n const encoding = detectBytesEncoding(primitive.value as string);\n acc.push(stringToBytes(primitive.value as string, encoding));\n } else {\n acc.push(primitive.value);\n }\n return acc;\n }, []);\n\n const firstItem = argValue[0];\n const scValType = convertStellarTypeToScValType(firstItem.type);\n const typeHint = Array.isArray(scValType) ? scValType[0] : scValType;\n const scVal = nativeToScVal(arrayScVals, {\n type: typeHint,\n });\n\n scVals.push(scVal);\n continue;\n }\n\n // Tuple case - mixed types in array\n if (isTupleArray(argValue)) {\n // TypeScript now knows argValue is SorobanArgumentValue[] thanks to type predicate\n const tupleScValsVec = convertTupleToScVal(argValue);\n scVals.push(tupleScValsVec);\n continue;\n }\n }\n\n // Object case - structured data\n if (isObjectWithTypedValues(argValue)) {\n const convertedObj = convertObjectToScVal(argValue as Record<string, SorobanArgumentValue>);\n scVals.push(convertedObj);\n continue;\n }\n\n // Single primitive value\n if (isPrimitiveValue(argValue)) {\n scVals.push(getScValFromPrimitive(argValue as SorobanArgumentValue));\n }\n }\n\n return scVals;\n}\n","/**\n * Safe type parsing utilities for Stellar generic types.\n *\n * This module provides secure, performant alternatives to regex-based parsing\n * to prevent ReDoS (Regular Expression Denial of Service) attacks when processing\n * Stellar contract parameter types like Vec<T>, Map<K,V>, and Option<T>.\n *\n * Uses iterative parsing instead of vulnerable regex patterns with greedy quantifiers.\n */\n\n/**\n * Configuration constants for safe parsing\n */\nconst PARSING_LIMITS = {\n /** Maximum depth for nested generic types to prevent stack overflow */\n MAX_NESTING_DEPTH: 10,\n /** Maximum string length for type parsing to prevent DoS */\n MAX_TYPE_STRING_LENGTH: 1000,\n} as const;\n\n/**\n * Result type for type extraction operations\n */\ntype ExtractionResult<T> = T | null;\n\n/**\n * Safely extracts the inner type from a Stellar Vec type.\n *\n * @param parameterType - The parameter type (e.g., 'Vec<U32>', 'Vec<Vec<Address>>')\n * @returns The inner type (e.g., 'U32', 'Vec<Address>') or null if not a Vec type\n *\n * @example\n * ```typescript\n * extractVecElementType('Vec<U32>') // → 'U32'\n * extractVecElementType('Vec<Vec<Address>>') // → 'Vec<Address>'\n * extractVecElementType('U32') // → null\n * ```\n */\nexport function extractVecElementType(parameterType: string): ExtractionResult<string> {\n if (!isValidTypeString(parameterType) || !parameterType.startsWith('Vec<')) {\n return null;\n }\n\n return extractGenericInnerType(parameterType, 'Vec');\n}\n\n/**\n * Safely extracts the key and value types from a Stellar Map type.\n *\n * @param parameterType - The parameter type (e.g., 'Map<Symbol, Bytes>', 'Map<U32, Vec<Address>>')\n * @returns An object with keyType and valueType, or null if not a Map type\n *\n * @example\n * ```typescript\n * extractMapTypes('Map<U32, Address>') // → { keyType: 'U32', valueType: 'Address' }\n * extractMapTypes('Map<Symbol, Vec<U32>>') // → { keyType: 'Symbol', valueType: 'Vec<U32>' }\n * extractMapTypes('U32') // → null\n * ```\n */\nexport function extractMapTypes(\n parameterType: string\n): ExtractionResult<{ keyType: string; valueType: string }> {\n if (!isValidTypeString(parameterType) || !parameterType.startsWith('Map<')) {\n return null;\n }\n\n const innerContent = extractGenericInnerType(parameterType, 'Map');\n if (!innerContent) {\n return null;\n }\n\n // Find the top-level comma that separates key and value types\n const commaIndex = findTopLevelComma(innerContent);\n if (commaIndex === -1) {\n return null;\n }\n\n const keyType = innerContent.slice(0, commaIndex).trim();\n const valueType = innerContent.slice(commaIndex + 1).trim();\n\n // Validate both types are non-empty and don't contain invalid characters\n if (!keyType || !valueType || hasInvalidCharacters(keyType) || hasInvalidCharacters(valueType)) {\n return null;\n }\n\n return { keyType, valueType };\n}\n\n/**\n * Safely extracts the inner type from a Stellar Option type.\n *\n * @param parameterType - The parameter type (e.g., 'Option<U32>', 'Option<Vec<Address>>')\n * @returns The inner type or null if not an Option type\n *\n * @example\n * ```typescript\n * extractOptionElementType('Option<U32>') // → 'U32'\n * extractOptionElementType('Option<Vec<Address>>') // → 'Vec<Address>'\n * extractOptionElementType('U32') // → null\n * ```\n */\nexport function extractOptionElementType(parameterType: string): ExtractionResult<string> {\n if (!isValidTypeString(parameterType) || !parameterType.startsWith('Option<')) {\n return null;\n }\n\n return extractGenericInnerType(parameterType, 'Option');\n}\n\n/**\n * Generic function to extract inner content from generic types.\n *\n * @param parameterType - The full parameter type\n * @param genericName - The generic type name (e.g., 'Vec', 'Map', 'Option')\n * @returns The inner content or null if extraction fails\n */\nfunction extractGenericInnerType(\n parameterType: string,\n genericName: string\n): ExtractionResult<string> {\n const prefix = `${genericName}<`;\n\n if (!parameterType.startsWith(prefix) || !parameterType.endsWith('>')) {\n return null;\n }\n\n const innerContent = parameterType.slice(prefix.length, -1);\n\n if (!innerContent || hasInvalidCharacters(innerContent)) {\n return null;\n }\n\n // Validate that brackets are properly balanced\n if (!isBalancedBrackets(innerContent)) {\n return null;\n }\n\n return innerContent.trim();\n}\n\n/**\n * Finds the first top-level comma in a type string, ignoring commas inside nested brackets.\n *\n * @param content - The content to search in\n * @returns The index of the top-level comma, or -1 if not found\n *\n * @example\n * ```typescript\n * findTopLevelComma('U32, Address') // → 3\n * findTopLevelComma('Vec<U32, U64>, Address') // → 13 (after the first >)\n * ```\n */\nfunction findTopLevelComma(content: string): number {\n let angleLevel = 0;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n switch (char) {\n case '<':\n angleLevel++;\n break;\n case '>':\n angleLevel--;\n if (angleLevel < 0) return -1; // Malformed input\n break;\n case ',':\n if (angleLevel === 0) {\n return i;\n }\n break;\n }\n }\n\n return -1;\n}\n\n/**\n * Checks if brackets are properly balanced in a string and enforces nesting depth limits.\n *\n * @param content - The content to validate\n * @returns True if brackets are balanced and within depth limits, false otherwise\n */\nfunction isBalancedBrackets(content: string): boolean {\n let angleLevel = 0;\n let maxNesting = 0;\n\n for (const char of content) {\n switch (char) {\n case '<':\n angleLevel++;\n maxNesting = Math.max(maxNesting, angleLevel);\n // Enforce nesting depth limit\n if (maxNesting > PARSING_LIMITS.MAX_NESTING_DEPTH) {\n return false;\n }\n break;\n case '>':\n angleLevel--;\n if (angleLevel < 0) return false;\n break;\n }\n }\n\n return angleLevel === 0;\n}\n\n/**\n * Validates that a type string is safe to process.\n *\n * @param typeString - The type string to validate\n * @returns True if the type string is safe to process\n */\nexport function isValidTypeString(typeString: string): boolean {\n if (!typeString || typeof typeString !== 'string') {\n return false;\n }\n\n // Length check to prevent DoS\n if (typeString.length > PARSING_LIMITS.MAX_TYPE_STRING_LENGTH) {\n return false;\n }\n\n // Check for invalid characters\n if (hasInvalidCharacters(typeString)) {\n return false;\n }\n\n // Validate bracket balance\n return isBalancedBrackets(typeString);\n}\n\n/**\n * Checks if a string contains invalid characters for type names.\n *\n * @param str - The string to check\n * @returns True if the string contains invalid characters\n */\nfunction hasInvalidCharacters(str: string): boolean {\n // No control characters or line breaks\n if (/[\\x00-\\x1F\\x7F\\r\\n]/.test(str)) {\n return true;\n }\n\n // Only allow alphanumeric, angle brackets, commas, underscores, and spaces\n // Note: Parentheses are NOT allowed in Stellar type strings\n return !/^[A-Za-z0-9<>,\\s_]+$/.test(str);\n}\n","import {\n extractOptionElementType,\n extractVecElementType,\n isValidTypeString,\n} from './safe-type-parser';\n\n/**\n * Custom JSON stringifier that handles BigInt values by converting them to strings.\n * @param value The value to stringify.\n * @param space Adds indentation, white space, and line break characters to the return-value JSON text for readability.\n * @returns A JSON string representing the given value.\n */\nexport function stringifyWithBigInt(value: unknown, space?: number | string): string {\n const replacer = (_key: string, val: unknown) => {\n // Check if the value is a BigInt\n if (typeof val === 'bigint') {\n // Convert BigInt to string\n return val.toString();\n }\n // Return the value unchanged for other types\n return val;\n };\n\n return JSON.stringify(value, replacer, space);\n}\n\n/**\n * Check if a value is a serializable plain object suitable for blockchain output display.\n * Excludes arrays, dates, typed arrays, and objects with custom constructors.\n * @param value The value to check\n * @returns True if the value is a plain object that can be safely serialized\n */\nexport function isSerializableObject(value: unknown): boolean {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof Uint8Array) &&\n value.constructor === Object\n );\n}\n\n/**\n * Converts Stellar spec types to ScVal type hints.\n * This mapping is used with nativeToScVal to ensure proper type conversion.\n *\n * @param stellarType - The Stellar parameter type (e.g., 'U32', 'Address', 'Bool')\n * @returns The corresponding ScVal type hint (e.g., 'u32', 'address', 'bool')\n *\n * @example\n * ```typescript\n * nativeToScVal(\"0\", { type: convertStellarTypeToScValType(\"U32\") }) // → ScU32\n * nativeToScVal(\"GDQP2...\", { type: convertStellarTypeToScValType(\"Address\") }) // → ScAddress\n * ```\n */\nexport function convertStellarTypeToScValType(stellarType: string): string | string[] {\n // Input validation\n if (!isValidTypeString(stellarType)) {\n return stellarType.toLowerCase();\n }\n\n // Handle Vec types - return array type hint\n if (stellarType.startsWith('Vec<')) {\n const innerType = extractVecElementType(stellarType);\n if (innerType) {\n const innerScValType = convertStellarTypeToScValType(innerType);\n // For Vec types, nativeToScVal expects the inner type as string\n return Array.isArray(innerScValType) ? innerScValType[0] : innerScValType;\n }\n }\n\n // Handle Map types - return undefined to signal special handling needed\n if (stellarType.startsWith('Map<')) {\n // Map types need special handling - can't use a simple type hint\n return 'map-special';\n }\n\n // Handle Option types - return the inner type\n if (stellarType.startsWith('Option<')) {\n const innerType = extractOptionElementType(stellarType);\n if (innerType) {\n return convertStellarTypeToScValType(innerType);\n }\n }\n\n switch (stellarType) {\n case 'Address':\n return 'address';\n case 'U32':\n return 'u32';\n case 'U64':\n return 'u64';\n case 'U128':\n return 'u128';\n case 'U256':\n return 'u256';\n case 'I32':\n return 'i32';\n case 'I64':\n return 'i64';\n case 'I128':\n return 'i128';\n case 'I256':\n return 'i256';\n case 'ScString':\n return 'string';\n case 'ScSymbol':\n return 'symbol';\n case 'Bool':\n return 'bool';\n case 'Bytes':\n return 'bytes';\n case 'DataUrl':\n return 'bytes';\n default:\n return stellarType.toLowerCase();\n }\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport {\n detectBytesEncoding,\n logger,\n stringToBytes,\n} from '@openzeppelin/contracts-ui-builder-utils';\n\n// Import types for internal use\nimport type {\n SorobanArgumentValue,\n SorobanComplexValue,\n SorobanEnumValue,\n SorobanMapEntry,\n} from '../transform/input-parser';\nimport { convertStellarTypeToScValType } from './formatting';\n\nconst SYSTEM_LOG_TAG = 'StellarInputParsingUtils';\n\n// Re-export types for convenience\nexport type {\n SorobanArgumentValue,\n SorobanEnumValue,\n SorobanMapEntry,\n SorobanComplexValue,\n} from '../transform/input-parser';\n\n// ================================\n// TYPE GUARDS AND UTILITIES\n// ================================\n\nexport function isPrimitiveArgumentSet(args: Record<string, SorobanComplexValue>): boolean {\n return Object.values(args).every(\n (v) => typeof v === 'object' && v !== null && 'type' in v && 'value' in v\n );\n}\n\nexport function isEnumArgumentSet(args: Record<string, SorobanComplexValue>): boolean {\n return Object.values(args).some(\n (v) => typeof v === 'object' && v !== null && ('tag' in v || 'enum' in v)\n );\n}\n\nexport function isMapArray(argValue: unknown[]): boolean {\n try {\n return (\n Array.isArray(argValue) &&\n argValue.every((obj: unknown) => {\n if (typeof obj !== 'object' || obj === null) return false;\n\n const keys = Object.keys(obj);\n if (keys.length !== 2 || !keys.includes('0') || !keys.includes('1')) {\n return false;\n }\n\n const keyEntry = (obj as Record<string, unknown>)['0'];\n return (\n typeof keyEntry === 'object' &&\n keyEntry !== null &&\n 'value' in keyEntry &&\n 'type' in keyEntry\n );\n })\n );\n } catch {\n return false;\n }\n}\n\nexport function isComplexObjectArray(argValue: unknown[]): boolean {\n return argValue.some(\n (v) =>\n typeof v === 'object' &&\n v !== null &&\n typeof Object.values(v as Record<string, unknown>)[0] === 'object'\n );\n}\n\nexport function isPrimitiveArray(argValue: unknown[]): argValue is SorobanArgumentValue[] {\n if (argValue.length === 0) return false;\n\n // Check if all items are SorobanArgumentValue (not SorobanMapEntry)\n const allArePrimitives = argValue.every(\n (v) =>\n typeof v === 'object' &&\n v !== null &&\n 'value' in v &&\n 'type' in v &&\n !('0' in v) && // Not a map entry\n !('1' in v) // Not a map entry\n );\n\n if (!allArePrimitives) return false;\n\n const firstItem = argValue[0] as SorobanArgumentValue;\n return argValue.every((v) => {\n const item = v as SorobanArgumentValue;\n return item.type === firstItem.type;\n });\n}\n\nexport function isTupleArray(argValue: unknown[]): argValue is SorobanArgumentValue[] {\n return argValue.every(\n (v: unknown) =>\n typeof v === 'object' &&\n v !== null &&\n 'type' in v &&\n 'value' in v &&\n !('0' in v) && // Not a map entry\n !('1' in v) // Not a map entry\n );\n}\n\nexport function isObjectWithTypedValues(argValue: SorobanComplexValue): boolean {\n return (\n typeof argValue === 'object' &&\n argValue !== null &&\n !Array.isArray(argValue) &&\n Object.values(argValue).every(\n (v: unknown) => typeof v === 'object' && v !== null && 'type' in v && 'value' in v\n )\n );\n}\n\nexport function isPrimitiveValue(argValue: SorobanComplexValue): boolean {\n return (\n typeof argValue === 'object' && argValue !== null && 'type' in argValue && 'value' in argValue\n );\n}\n\n// ================================\n// SCVAL CONVERSION UTILITIES\n// ================================\n\nexport function getScValFromPrimitive(v: SorobanArgumentValue): xdr.ScVal {\n try {\n if (v.type === 'bool') {\n const boolValue = typeof v.value === 'boolean' ? v.value : v.value === 'true';\n return nativeToScVal(boolValue);\n }\n\n if (v.type === 'bytes') {\n const stringValue = v.value as string;\n const encoding = detectBytesEncoding(stringValue);\n return nativeToScVal(stringToBytes(stringValue, encoding));\n }\n\n // Use our improved type conversion utility\n const typeHint = convertStellarTypeToScValType(v.type);\n return nativeToScVal(v.value, { type: typeHint });\n } catch (error) {\n logger.error(SYSTEM_LOG_TAG, `Failed to convert primitive ${v.type}:`, error);\n throw new Error(`Failed to convert primitive value of type ${v.type}: ${error}`);\n }\n}\n\nexport function getScValFromArg(arg: SorobanComplexValue, scVals: xdr.ScVal[]): xdr.ScVal {\n // Handle array of arrays with numeric objects (nested structures)\n if (Array.isArray(arg) && arg.length > 0) {\n const arrayScVals = arg.map((subArray) => {\n if (Array.isArray(subArray) && isMapArray(subArray)) {\n const { mapVal, mapType } = convertObjectToMap(subArray as SorobanMapEntry[]);\n\n // Better map key-value pair handling\n const items = Object.keys(mapVal);\n if (items.length > 1) {\n items.forEach((item) => {\n const mapScVal = nativeToScVal(mapVal[item], {\n type: mapType[item],\n });\n scVals.push(mapScVal);\n });\n }\n\n return nativeToScVal(mapVal, { type: mapType });\n }\n return getScValFromArg(subArray as SorobanComplexValue, scVals);\n });\n\n return xdr.ScVal.scvVec(arrayScVals);\n }\n\n // For single values, handle based on type\n if (typeof arg === 'object' && arg !== null && 'type' in arg && 'value' in arg) {\n return getScValFromPrimitive(arg as SorobanArgumentValue);\n }\n\n // Fallback to nativeToScVal for simple values\n return nativeToScVal(arg);\n}\n\nexport function convertEnumToScVal(obj: SorobanEnumValue, scVals?: xdr.ScVal[]): xdr.ScVal {\n try {\n // Integer variant - has enum property (keep as-is for integer enums)\n if (obj.enum !== undefined) {\n const enumScVal = nativeToScVal(obj.enum, { type: 'u32' });\n return enumScVal;\n }\n\n if (!obj.tag) {\n throw new Error('Enum object must have either \"tag\" or \"enum\" property');\n }\n\n // Use Vector format with Symbol for variant names (as per Soroban documentation)\n // Unit variants: ScVec containing single ScSymbol\n // Tuple variants: ScVec with ScSymbol + payload elements\n const tagSymbol = nativeToScVal(obj.tag, { type: 'symbol' });\n\n if (!obj.values || obj.values.length === 0) {\n // Unit variant - ScVec containing single ScSymbol\n const unitVec = xdr.ScVal.scvVec([tagSymbol]);\n return unitVec;\n }\n\n // Tuple variant - ScVec with ScSymbol + payload elements\n const valuesVal = obj.values.map((v) => getScValFromArg(v, scVals || []));\n const tupleVec = xdr.ScVal.scvVec([tagSymbol, ...valuesVal]);\n return tupleVec;\n } catch (error) {\n logger.error(SYSTEM_LOG_TAG, 'Failed to convert enum:', error);\n throw new Error(`Failed to convert enum: ${error}`);\n }\n}\n\nexport function convertValuesToScVals(\n values: SorobanArgumentValue[],\n scVals: xdr.ScVal[]\n): xdr.ScVal[] {\n return values.map((v) => getScValFromArg(v, scVals));\n}\n\nexport function convertObjectToScVal(obj: Record<string, SorobanArgumentValue>): xdr.ScVal {\n try {\n const convertedValue: Record<string, unknown> = {};\n const typeHints: Record<string, string | string[]> = {};\n\n // Process each field in the object\n for (const key in obj) {\n const field = obj[key];\n\n if (field.type === 'bool') {\n convertedValue[key] =\n typeof field.value === 'boolean' ? field.value : field.value === 'true';\n typeHints[key] = ['symbol']; // Key is always symbol, value type varies\n } else {\n convertedValue[key] = field.value;\n const fieldTypeHint = convertStellarTypeToScValType(field.type);\n typeHints[key] = [\n 'symbol',\n ...(Array.isArray(fieldTypeHint) ? fieldTypeHint : [fieldTypeHint]),\n ];\n }\n }\n\n return nativeToScVal(convertedValue, { type: typeHints });\n } catch (error) {\n logger.error(SYSTEM_LOG_TAG, 'Failed to convert object:', error);\n throw new Error(`Failed to convert object to ScVal: ${error}`);\n }\n}\n\nexport function convertObjectToMap(mapArray: SorobanMapEntry[]): {\n mapVal: Record<string, unknown>;\n mapType: Record<string, string | string[]>;\n} {\n try {\n const mapVal = mapArray.reduce((acc: Record<string, unknown>, pair) => {\n const key = pair['0'].value as string;\n\n if (Array.isArray(pair['1'])) {\n // Handle nested array values\n const valueScVal = getScValFromArg(pair['1'], []);\n acc[key] = valueScVal;\n } else {\n // Handle primitive values\n const value = pair['1'].value;\n acc[key] = pair['1'].type === 'bool' ? value === 'true' : value;\n }\n return acc;\n }, {});\n\n const mapType = mapArray.reduce((acc: Record<string, string[]>, pair) => {\n const key = pair['0'].value as string;\n const keyTypeHint = convertStellarTypeToScValType(pair['0'].type);\n const valueTypeHint = convertStellarTypeToScValType(pair['1'].type);\n acc[key] = [\n ...(Array.isArray(keyTypeHint) ? keyTypeHint : [keyTypeHint]),\n ...(Array.isArray(valueTypeHint) ? valueTypeHint : [valueTypeHint]),\n ];\n return acc;\n }, {});\n\n return { mapVal, mapType };\n } catch (error) {\n logger.error(SYSTEM_LOG_TAG, 'Failed to convert map:', error);\n throw new Error(`Failed to convert map: ${error}`);\n }\n}\n\nexport function convertTupleToScVal(tupleArray: SorobanArgumentValue[]): xdr.ScVal {\n try {\n const tupleScVals = tupleArray.map((v) => {\n if (v.type === 'bool') {\n const boolValue = typeof v.value === 'boolean' ? v.value : v.value === 'true';\n return nativeToScVal(boolValue);\n }\n\n if (v.type === 'bytes') {\n const encoding = detectBytesEncoding(v.value as string);\n return nativeToScVal(stringToBytes(v.value as string, encoding));\n }\n\n const typeHint = convertStellarTypeToScValType(v.type);\n return nativeToScVal(v.value, { type: typeHint });\n });\n\n // JS SDK's nativeToScVal doesn't support mixed-type arrays, so use xdr.ScVal.scvVec\n return xdr.ScVal.scvVec(tupleScVals);\n } catch (error) {\n logger.error(SYSTEM_LOG_TAG, 'Failed to convert tuple:', error);\n throw new Error(`Failed to convert tuple: ${error}`);\n }\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport { isEnumValue, type FunctionParameter } from '@openzeppelin/contracts-ui-builder-types';\n\nimport { convertStellarTypeToScValType } from '../../utils/formatting';\nimport { convertEnumToScVal } from '../../utils/input-parsing';\nimport { parseGenericType } from './generic-parser';\nimport { parsePrimitive } from './primitive-parser';\nimport { convertStructToScVal, isStructType } from './struct-parser';\nimport type { SorobanEnumValue } from './types';\n\n/**\n * Converts a value to ScVal with comprehensive generic type support.\n * This should be used in the transaction execution instead of calling nativeToScVal directly.\n *\n * @param value - The parsed value from parseStellarInput\n * @param parameterType - The Stellar parameter type\n * @param paramSchema - Optional parameter schema with struct field definitions\n * @param parseInnerValue - Function to recursively parse inner values (defaults to parseStellarInput)\n * @returns ScVal ready for contract calls\n */\nexport function valueToScVal(\n value: unknown,\n parameterType: string,\n paramSchema?: FunctionParameter,\n parseInnerValue?: (val: unknown, type: string) => unknown\n): xdr.ScVal {\n // Default parseInnerValue to a basic pass-through function if not provided\n // This handles the common case where callers don't need recursive parsing\n const parseValue = parseInnerValue || ((val: unknown) => val);\n const genericInfo = parseGenericType(parameterType);\n\n if (!genericInfo) {\n // Check if this is an enum object (has 'tag' or 'enum' property)\n if (isEnumValue(value) || (typeof value === 'object' && value !== null && 'enum' in value)) {\n return convertEnumToScVal(value as SorobanEnumValue);\n }\n\n // Check if this is a struct type\n if (isStructType(value, parameterType)) {\n return convertStructToScVal(\n value as Record<string, unknown>,\n parameterType,\n paramSchema,\n parseValue\n );\n }\n\n // Non-generic types - use existing logic\n if (parameterType === 'Bool' || parameterType === 'Bytes') {\n return nativeToScVal(value);\n }\n const scValType = convertStellarTypeToScValType(parameterType);\n const typeHint = Array.isArray(scValType) ? scValType[0] : scValType;\n return nativeToScVal(value, { type: typeHint });\n }\n\n const { baseType, parameters } = genericInfo;\n\n switch (baseType) {\n case 'Vec': {\n // Handle Vec<T> types\n const innerType = parameters[0];\n if (Array.isArray(value)) {\n const convertedElements = value.map((element) => valueToScVal(element, innerType));\n return nativeToScVal(convertedElements);\n }\n return nativeToScVal(value);\n }\n\n case 'Map': {\n // Handle Map<K,V> types in Stellar SDK format\n if (Array.isArray(value)) {\n // Expect Stellar SDK format: [{ 0: {value, type}, 1: {value, type} }, ...]\n const convertedValue: Record<string, unknown> = {};\n const typeHints: Record<string, string[]> = {};\n\n value.forEach(\n (entry: { 0: { value: string; type: string }; 1: { value: string; type: string } }) => {\n if (\n typeof entry !== 'object' ||\n entry === null ||\n !entry[0] ||\n !entry[1] ||\n typeof entry[0].value === 'undefined' ||\n typeof entry[1].value === 'undefined'\n ) {\n throw new Error('Invalid Stellar SDK map format in valueToScVal');\n }\n\n // Process key and value through parsePrimitive for bytes conversion\n // This ensures bytes strings are converted to Uint8Array before nativeToScVal\n let processedKey: unknown = entry[0].value;\n let processedValue: unknown = entry[1].value;\n\n // Handle bytes conversion for keys\n const keyPrimitive = parsePrimitive(entry[0].value, entry[0].type);\n if (keyPrimitive !== null) {\n processedKey = keyPrimitive;\n }\n\n // Handle bytes conversion for values\n const valuePrimitive = parsePrimitive(entry[1].value, entry[1].type);\n if (valuePrimitive !== null) {\n processedValue = valuePrimitive;\n }\n\n // Use the processed key as the object key (convert to string if needed)\n const keyString =\n typeof processedKey === 'string' ? processedKey : String(processedKey);\n convertedValue[keyString] = processedValue;\n\n const keyScValType = convertStellarTypeToScValType(entry[0].type);\n const valueScValType = convertStellarTypeToScValType(entry[1].type);\n typeHints[keyString] = [\n Array.isArray(keyScValType) ? keyScValType[0] : keyScValType,\n Array.isArray(valueScValType) ? valueScValType[0] : valueScValType,\n ];\n }\n );\n\n return nativeToScVal(convertedValue, { type: typeHints });\n }\n\n return nativeToScVal(value);\n }\n\n case 'Option': {\n // Handle Option<T> types\n const innerType = parameters[0];\n\n if (value === null || value === undefined) {\n return nativeToScVal(null); // None variant\n } else {\n // Some variant - convert the inner value\n return valueToScVal(value, innerType);\n }\n }\n\n case 'Result': {\n // Handle Result<T,E> types\n const okType = parameters[0];\n const errType = parameters[1];\n\n // Result types typically come as {ok: value} or {err: error}\n if (typeof value === 'object' && value !== null) {\n const resultObj = value as Record<string, unknown>;\n if ('ok' in resultObj) {\n const okScVal = valueToScVal(resultObj.ok, okType);\n return nativeToScVal({ ok: okScVal });\n } else if ('err' in resultObj) {\n const errScVal = valueToScVal(resultObj.err, errType);\n return nativeToScVal({ err: errScVal });\n }\n }\n return nativeToScVal(value);\n }\n\n default: {\n // Unknown generic type - fallback to basic conversion\n const scValType = convertStellarTypeToScValType(parameterType);\n const typeHint = Array.isArray(scValType) ? scValType[0] : scValType;\n return nativeToScVal(value, { type: typeHint });\n }\n }\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport type { FunctionParameter } from '@openzeppelin/contracts-ui-builder-types';\nimport { isPlainObject, logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { convertStellarTypeToScValType } from '../../utils/formatting';\nimport { parseGenericType } from './generic-parser';\n\nconst SYSTEM_LOG_TAG = 'StructParser';\n\n/**\n * Determines if a field value needs parsing through parseStellarInput.\n * Returns false for already-processed values (like Uint8Array for bytes).\n */\nfunction needsParsing(value: unknown, fieldType: string): boolean {\n // Skip parsing for already-processed Uint8Array values for bytes types\n if ((fieldType === 'Bytes' || fieldType.startsWith('BytesN<')) && value instanceof Uint8Array) {\n return false;\n }\n\n // For Vec types, check if it's already an array of properly typed values\n if (fieldType.startsWith('Vec<')) {\n if (!Array.isArray(value)) {\n return true; // Needs parsing if not an array\n }\n\n // Extract inner type to check array elements\n const innerTypeMatch = fieldType.match(/Vec<(.+)>$/);\n if (innerTypeMatch) {\n // If all elements are already properly typed, skip parsing\n // For now, let's always parse Vec types to ensure validation\n return true;\n }\n }\n\n // For Map types, always parse to convert UI MapEntry format to Stellar SDK format\n if (fieldType.startsWith('Map<')) {\n return true; // Map data needs conversion from UI format to Stellar SDK format\n }\n\n // For primitive types, parse if value is string (form input)\n if (typeof value === 'string') {\n return true;\n }\n\n // For complex objects, they might need recursive parsing\n if (isPlainObject(value)) {\n return true;\n }\n\n // For other cases, skip parsing (assume already processed)\n return false;\n}\n\n/**\n * Converts a struct object to ScVal using Laboratory pattern with schema-based type resolution.\n *\n * @param structObj - The plain object representing the struct\n * @param parameterType - The Stellar parameter type (for error messages)\n * @param paramSchema - Parameter schema with struct field definitions (required)\n * @param parseInnerValue - Function to recursively parse inner values\n * @returns ScVal ready for contract calls\n * @throws Error if schema information is missing for any field\n */\nexport function convertStructToScVal(\n structObj: Record<string, unknown>,\n parameterType: string,\n paramSchema: FunctionParameter | undefined,\n parseInnerValue: (val: unknown, type: string) => unknown\n): xdr.ScVal {\n // Laboratory-style struct conversion with proper type hint handling\n\n // Struct conversion using Laboratory pattern with schema-based type resolution\n // See: laboratory/src/helpers/sorobanUtils.ts convertObjectToScVal\n const convertedValue: Record<string, unknown> = {};\n const typeHints: Record<string, unknown> = {};\n\n // For structs with Vec/Map fields, ensure proper parsing but use nativeToScVal approach\n\n // Laboratory pattern: preserve raw values, provide type hints as arrays\n // Type hints format: [keyType, valueType] where keyType is always \"symbol\"\n for (const [fieldName, fieldValue] of Object.entries(structObj)) {\n // Use schema information for accurate type mapping\n let fieldType: string | undefined;\n if (paramSchema?.components) {\n const fieldSchema = paramSchema.components.find(\n (comp: FunctionParameter) => comp.name === fieldName\n );\n fieldType = fieldSchema?.type;\n }\n\n if (fieldType) {\n // Parse the field value using the correct type to ensure validation and conversion\n // Only parse if the value appears to be raw form input (strings/primitives)\n // Skip parsing for already-processed values (like Uint8Array for bytes)\n let parsedValue: unknown;\n\n if (needsParsing(fieldValue, fieldType)) {\n parsedValue = parseInnerValue(fieldValue, fieldType);\n } else {\n parsedValue = fieldValue;\n }\n\n // Handle Map fields specially - convert from SDK format to plain object with type hints\n if (fieldType.startsWith('Map<') && Array.isArray(parsedValue)) {\n // Extract key and value types\n const mapTypeMatch = fieldType.match(/Map<(.+),\\s*(.+)>$/);\n const mapKeyType = mapTypeMatch ? mapTypeMatch[1] : 'ScSymbol';\n const mapValueType = mapTypeMatch ? mapTypeMatch[2] : 'Bytes';\n\n // parsedValue is in Stellar SDK format: [{0: {value, type}, 1: {value, type}}, ...]\n // Convert to plain object for nativeToScVal\n const mapObject: Record<string, unknown> = {};\n const mapTypeHints: Record<string, string[]> = {};\n\n (\n parsedValue as Array<{\n 0: { value: unknown; type: string };\n 1: { value: unknown; type: string };\n }>\n ).forEach((entry) => {\n // Parse the key and value\n const processedKey = parseInnerValue(entry[0].value, entry[0].type || mapKeyType);\n const processedVal = parseInnerValue(entry[1].value, entry[1].type || mapValueType);\n\n const keyString = typeof processedKey === 'string' ? processedKey : String(processedKey);\n mapObject[keyString] = processedVal;\n\n // Set type hints for each entry using the actual types\n const keyScValType = convertStellarTypeToScValType(entry[0].type || mapKeyType);\n const valueScValType = convertStellarTypeToScValType(entry[1].type || mapValueType);\n\n // Laboratory pattern: [keyType, valueType] for each map entry\n mapTypeHints[keyString] = [\n Array.isArray(keyScValType)\n ? keyScValType[0]\n : keyScValType === 'map-special'\n ? 'symbol'\n : keyScValType,\n Array.isArray(valueScValType)\n ? valueScValType[0]\n : valueScValType === 'map-special'\n ? 'bytes'\n : valueScValType,\n ];\n });\n\n convertedValue[fieldName] = mapObject;\n // Provide nested type hints for Map field (Laboratory pattern)\n typeHints[fieldName] = ['symbol', mapTypeHints];\n } else {\n convertedValue[fieldName] = parsedValue;\n\n // Use exact type from schema for non-Map fields\n const scValType = convertStellarTypeToScValType(fieldType);\n if (scValType !== 'map-special') {\n typeHints[fieldName] = ['symbol', Array.isArray(scValType) ? scValType[0] : scValType];\n }\n }\n } else {\n // Schema is required for struct field type resolution\n throw new Error(\n `Missing schema information for struct field \"${fieldName}\" in struct type \"${parameterType}\". ` +\n `Schema-based type resolution is required for accurate ScVal conversion.`\n );\n }\n }\n\n logger.debug(SYSTEM_LOG_TAG, 'convertStructToScVal final values:', {\n parameterType,\n convertedValue,\n typeHints,\n });\n\n const scVal = nativeToScVal(convertedValue, { type: typeHints });\n logger.debug(SYSTEM_LOG_TAG, 'convertStructToScVal generated ScVal:', {\n parameterType,\n scValType: scVal.switch().name,\n scValValue: scVal.value(),\n });\n\n return scVal;\n}\n\n/**\n * Checks if the given value and type represent a struct that can be handled by this parser.\n *\n * @param value - The value to check\n * @param parameterType - The Stellar parameter type\n * @returns True if this is a struct type\n */\nexport function isStructType(value: unknown, parameterType: string): boolean {\n // Check if this is a struct type (object that doesn't match enum pattern or generic pattern)\n // Exclude special object types like Uint8Array, Date, etc.\n if (!isPlainObject(value)) {\n return false;\n }\n\n // Skip if it's a generic type\n const genericInfo = parseGenericType(parameterType);\n if (genericInfo) {\n return false;\n }\n\n // Skip if it looks like an enum (has 'tag', 'enum', or 'values' properties)\n const obj = value as Record<string, unknown>;\n if ('tag' in obj || 'enum' in obj || 'values' in obj) {\n return false;\n }\n\n // Check if it's a plain object with simple constructor\n return (\n !(value instanceof Uint8Array) &&\n !(value instanceof Date) &&\n typeof value.constructor === 'function' &&\n value.constructor === Object\n );\n}\n","import { scValToNative, xdr } from '@stellar/stellar-sdk';\n\nimport type { ContractFunction } from '@openzeppelin/contracts-ui-builder-types';\nimport { bytesToHex, logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { isSerializableObject, stringifyWithBigInt } from '../utils';\n\n/**\n * Formats the result of a Stellar view function call into a user-friendly string.\n *\n * @param result The result value (can be ScVal, native JS value, or other types).\n * @param functionDetails The contract function details.\n * @returns A string representation suitable for display.\n */\nexport function formatStellarFunctionResult(\n result: unknown,\n functionDetails: ContractFunction\n): string {\n if (!functionDetails.outputs || !Array.isArray(functionDetails.outputs)) {\n logger.warn(\n 'formatStellarFunctionResult',\n `Output definition missing or invalid for function ${functionDetails.name}.`\n );\n return '[Error: Output definition missing]';\n }\n\n try {\n let valueToFormat: unknown;\n\n // Handle null/undefined values\n if (result === null || result === undefined) {\n return '(null)';\n }\n\n // Check if result is an ScVal and convert to native JS value\n if (isScVal(result)) {\n try {\n // Special handling for void ScVal\n const scVal = result as xdr.ScVal;\n if (scVal.switch().name === 'scvVoid') {\n return '(void)';\n }\n valueToFormat = scValToNative(scVal);\n\n // Convert Buffer to Uint8Array for cross-platform compatibility\n // scValToNative may return Buffer objects in some environments\n if (\n valueToFormat &&\n typeof valueToFormat === 'object' &&\n 'constructor' in valueToFormat &&\n valueToFormat.constructor?.name === 'Buffer'\n ) {\n valueToFormat = new Uint8Array(valueToFormat as ArrayLike<number>);\n }\n } catch (error) {\n logger.error('formatStellarFunctionResult', 'Failed to convert ScVal to native', {\n functionName: functionDetails.name,\n error,\n });\n return '[Error: Failed to decode ScVal]';\n }\n } else {\n valueToFormat = result;\n }\n\n // Format based on type\n if (typeof valueToFormat === 'bigint') {\n return valueToFormat.toString();\n } else if (typeof valueToFormat === 'string') {\n return valueToFormat;\n } else if (typeof valueToFormat === 'number') {\n return valueToFormat.toString();\n } else if (typeof valueToFormat === 'boolean') {\n return String(valueToFormat);\n } else if (valueToFormat instanceof Uint8Array) {\n // Handle byte arrays - convert to hex string\n return bytesToHex(valueToFormat, true);\n } else if (Array.isArray(valueToFormat)) {\n // Handle arrays/vectors\n if (valueToFormat.length === 0) {\n return '[]';\n }\n // Use compact formatting for simple arrays, pretty formatting for complex ones\n if (\n valueToFormat.every(\n (item) =>\n typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean' ||\n typeof item === 'bigint'\n )\n ) {\n return stringifyWithBigInt(valueToFormat); // No spacing for simple arrays\n }\n return stringifyWithBigInt(valueToFormat, 2);\n } else if (isSerializableObject(valueToFormat)) {\n // Handle objects/maps/structs\n if (Object.keys(valueToFormat as object).length === 0) {\n return '{}';\n }\n return stringifyWithBigInt(valueToFormat, 2);\n } else if (valueToFormat === null || valueToFormat === undefined) {\n return '(null)';\n } else {\n // Handle any other type by stringifying\n return stringifyWithBigInt(valueToFormat, 2);\n }\n } catch (error) {\n const errorMessage = `Error formatting result for ${functionDetails.name}: ${(error as Error).message}`;\n logger.error('formatStellarFunctionResult', errorMessage, {\n functionName: functionDetails.name,\n result,\n error,\n });\n return `[${errorMessage}]`;\n }\n}\n\n/**\n * Type guard to check if a value is an ScVal\n */\nfunction isScVal(value: unknown): boolean {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n try {\n // Use instanceof check for robust type detection\n return typeof xdr !== 'undefined' && xdr.ScVal && value instanceof xdr.ScVal;\n } catch {\n return false;\n }\n}\n","/**\n * Stellar-specific contract artifacts interface\n * Defines the structure of data needed to load Stellar contracts\n */\nexport interface StellarContractArtifacts {\n /** The deployed contract ID (required, C...) */\n contractAddress: string;\n}\n\n/**\n * Type guard to check if an object matches StellarContractArtifacts structure\n */\nexport function isStellarContractArtifacts(obj: unknown): obj is StellarContractArtifacts {\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 Stellar contract artifacts validation and conversion\n */\nimport type { StellarContractArtifacts } from '../types/artifacts';\nimport { isStellarContractArtifacts } from '../types/artifacts';\n\n/**\n * Validates and converts generic source input to StellarContractArtifacts\n *\n * @param source - Generic contract source (string address or artifacts object)\n * @returns Validated StellarContractArtifacts\n * @throws Error if the source is invalid\n */\nexport function validateAndConvertStellarArtifacts(\n source: string | Record<string, unknown>\n): StellarContractArtifacts {\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 (!isStellarContractArtifacts(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 type { ContractFunction, ContractSchema } from '@openzeppelin/contracts-ui-builder-types';\n\n/**\n * Determines if a function is a view/pure function (read-only) for Stellar contracts.\n * This function works with simulation-based state mutability detection results\n * from the contract loader, following the same approach as the official Stellar Laboratory.\n *\n * @param functionDetails The function details from the contract schema (with simulation-based mutability info).\n * @returns True if the function is read-only, false otherwise.\n */\nexport function isStellarViewFunction(functionDetails: ContractFunction): boolean {\n // First check stateMutability if available (set by simulation-based detection)\n if (functionDetails.stateMutability) {\n return functionDetails.stateMutability === 'view' || functionDetails.stateMutability === 'pure';\n }\n\n // Fallback to modifiesState if stateMutability is not available\n // (also set by simulation-based detection in the loader)\n return !functionDetails.modifiesState;\n}\n\n/**\n * Get only the functions that modify state (writable functions) for Stellar contracts.\n * Uses simulation-based state mutability detection results to accurately filter functions.\n * @param contractSchema The contract schema to filter (with simulation-based mutability info).\n * @returns Array of writable functions\n */\nexport function getStellarWritableFunctions(\n contractSchema: ContractSchema\n): ContractSchema['functions'] {\n return contractSchema.functions.filter((func) => !isStellarViewFunction(func));\n}\n","import React from 'react';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@openzeppelin/contracts-ui-builder-ui';\n\nimport { AdvancedInfo } from './AdvancedInfo';\nimport { FeeConfiguration } from './FeeConfiguration';\nimport { TransactionTiming } from './TransactionTiming';\nimport { useStellarRelayerOptions } from './useStellarRelayerOptions';\n\n/**\n * Stellar-specific relayer transaction options component.\n *\n * Provides configuration for Stellar transaction parameters:\n * - Basic: Simple max fee configuration with reasonable defaults\n * - Advanced: Full control over maxFee, validUntil, and feeBump options\n *\n * Stellar transactions have different parameters compared to EVM:\n * - maxFee: Maximum fee willing to pay (in stroops)\n * - validUntil: Transaction expiration time\n * - feeBump: Enable fee bump for stuck transactions\n */\nexport const StellarRelayerOptions: React.FC<{\n options: Record<string, unknown>;\n onChange: (options: Record<string, unknown>) => void;\n}> = ({ options, onChange }) => {\n const [showAdvancedInfo, setShowAdvancedInfo] = React.useState(false);\n\n const { control, configMode, handleModeChange } = useStellarRelayerOptions({\n options,\n onChange,\n });\n\n return (\n <div className=\"space-y-4\">\n <AdvancedInfo\n showAdvancedInfo={showAdvancedInfo}\n onToggle={() => setShowAdvancedInfo(!showAdvancedInfo)}\n />\n\n <Tabs value={configMode} onValueChange={handleModeChange}>\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"basic\">Basic</TabsTrigger>\n <TabsTrigger value=\"advanced\">Advanced</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"basic\" className=\"space-y-4\">\n <FeeConfiguration control={control} showBasicFeeOnly={true} />\n </TabsContent>\n\n <TabsContent value=\"advanced\" className=\"space-y-4\">\n <div className=\"space-y-6\">\n <FeeConfiguration control={control} showBasicFeeOnly={false} />\n\n <TransactionTiming control={control} />\n </div>\n </TabsContent>\n </Tabs>\n </div>\n );\n};\n","import { Info } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@openzeppelin/contracts-ui-builder-ui';\n\ninterface AdvancedInfoProps {\n showAdvancedInfo: boolean;\n onToggle: () => void;\n}\n\nexport const AdvancedInfo: React.FC<AdvancedInfoProps> = ({ showAdvancedInfo, onToggle }) => {\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-base font-medium\">Stellar Transaction Configuration</label>\n <Button variant=\"ghost\" size=\"sm\" onClick={onToggle} className=\"text-xs\" type=\"button\">\n <Info className=\"h-3 w-3 mr-1\" />\n Stellar Options\n </Button>\n </div>\n\n {showAdvancedInfo && (\n <div className=\"mt-3 rounded-lg bg-muted/30 p-4\">\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n Configure Stellar-specific transaction parameters: <strong>maxFee</strong> sets the\n maximum fee in stroops you're willing to pay, <strong>validUntil</strong> sets\n transaction expiration, and <strong>feeBump</strong> enables automatic fee increases for\n stuck transactions.\n </p>\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { Control } from 'react-hook-form';\n\nimport { BooleanField, NumberField } from '@openzeppelin/contracts-ui-builder-ui';\n\nimport type { StellarRelayerFormData } from './useStellarRelayerOptions';\n\ninterface FeeConfigurationProps {\n control: Control<StellarRelayerFormData>;\n showBasicFeeOnly: boolean;\n}\n\nexport const FeeConfiguration: React.FC<FeeConfigurationProps> = ({\n control,\n showBasicFeeOnly,\n}) => {\n return (\n <div className=\"space-y-4\">\n <NumberField\n id=\"maxFee\"\n label=\"Maximum Fee (stroops)\"\n name=\"transactionOptions.maxFee\"\n control={control}\n placeholder=\"e.g., 1000000 (0.1 XLM)\"\n helperText=\"Maximum fee you're willing to pay in stroops (1 XLM = 10,000,000 stroops). Leave empty to use network defaults.\"\n min={0}\n step={1}\n />\n\n {!showBasicFeeOnly && (\n <BooleanField\n id=\"feeBump\"\n label=\"Enable Fee Bump\"\n name=\"transactionOptions.feeBump\"\n control={control}\n helperText=\"Automatically increase fee if transaction gets stuck in the network.\"\n />\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { Control, Controller } from 'react-hook-form';\n\nimport { Button, DateTimeField } from '@openzeppelin/contracts-ui-builder-ui';\n\nimport type { StellarRelayerFormData } from './useStellarRelayerOptions';\n\ninterface TransactionTimingProps {\n control: Control<StellarRelayerFormData>;\n}\n\nexport const TransactionTiming: React.FC<TransactionTimingProps> = ({ control }) => {\n // Helper function to generate a datetime-local value for 1 hour from now\n const getOneHourFromNow = () => {\n const now = new Date();\n now.setHours(now.getHours() + 1);\n // Format for datetime-local input (YYYY-MM-DDTHH:mm)\n return now.toISOString().slice(0, 16);\n };\n\n // Helper function to generate a datetime-local value for 24 hours from now\n const getTwentyFourHoursFromNow = () => {\n const now = new Date();\n now.setHours(now.getHours() + 24);\n return now.toISOString().slice(0, 16);\n };\n\n return (\n <div className=\"space-y-4\">\n <DateTimeField\n id=\"validUntil\"\n label=\"Transaction Expiration\"\n name=\"transactionOptions.validUntil\"\n control={control}\n placeholder=\"YYYY-MM-DDTHH:mm\"\n helperText=\"Set when this transaction should expire. Leave empty for no expiration limit.\"\n />\n <div className=\"flex gap-2 pt-1\">\n <Controller\n name=\"transactionOptions.validUntil\"\n control={control}\n render={({ field }) => (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => field.onChange(new Date(getOneHourFromNow()).toISOString())}\n className=\"text-xs\"\n >\n +1 Hour\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => field.onChange(new Date(getTwentyFourHoursFromNow()).toISOString())}\n className=\"text-xs\"\n >\n +24 Hours\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => field.onChange('')}\n className=\"text-xs\"\n >\n Clear\n </Button>\n </>\n )}\n />\n </div>\n </div>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport type { StellarRelayerTransactionOptions } from '../relayer';\n\nexport interface StellarRelayerFormData {\n transactionOptions: StellarRelayerTransactionOptions;\n}\n\ninterface UseStellarRelayerOptionsProps {\n options: Record<string, unknown>;\n onChange: (options: Record<string, unknown>) => void;\n}\n\nexport const useStellarRelayerOptions = ({ options, onChange }: UseStellarRelayerOptionsProps) => {\n // Store the latest onChange callback in a ref to avoid dependency issues\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n // Initialize form with options from parent (only on mount to prevent loops)\n const initialOptions: StellarRelayerTransactionOptions = {\n maxFee: options.maxFee as number | undefined,\n validUntil: options.validUntil as string | undefined,\n feeBump: options.feeBump as boolean | undefined,\n };\n\n const { control, setValue, watch } = useForm<StellarRelayerFormData>({\n defaultValues: {\n transactionOptions: initialOptions,\n },\n });\n\n const formValues = watch('transactionOptions');\n const isInitialMount = useRef(true);\n\n // Track user's intended mode (separate from auto-detection)\n const [userMode, setUserMode] = useState<'basic' | 'advanced'>(() => {\n // Determine initial mode based on existing settings\n const hasAdvancedSettings = Boolean(formValues.validUntil || formValues.feeBump);\n return hasAdvancedSettings ? 'advanced' : 'basic';\n });\n\n const configMode = userMode;\n\n // Handle initial mount - ensure any default values are communicated to parent\n useEffect(() => {\n if (isInitialMount.current) {\n isInitialMount.current = false;\n // No default values to set for Stellar (unlike EVM's Speed.FAST)\n return;\n }\n }, []);\n\n // Notify parent of changes after initial mount - watch specific fields\n useEffect(() => {\n if (isInitialMount.current) {\n return;\n }\n\n const timeoutId = setTimeout(() => {\n const newOptions: StellarRelayerTransactionOptions = {};\n\n // Set maxFee if provided\n if (formValues.maxFee !== undefined && formValues.maxFee !== null) {\n newOptions.maxFee = formValues.maxFee;\n }\n\n // Set validUntil if provided (check for actual date string, not just truthy)\n if (formValues.validUntil && formValues.validUntil.trim() !== '') {\n newOptions.validUntil = formValues.validUntil;\n }\n\n // Set feeBump if enabled\n if (formValues.feeBump !== undefined) {\n newOptions.feeBump = formValues.feeBump;\n }\n\n // Soroban transactions do not support memos; do not propagate any\n\n onChangeRef.current(newOptions as Record<string, unknown>);\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }, [formValues.maxFee, formValues.validUntil, formValues.feeBump]);\n\n // Event handlers\n const handleModeChange = (mode: string) => {\n const newMode = mode as 'basic' | 'advanced';\n setUserMode(newMode);\n\n if (newMode === 'basic') {\n // Reset advanced options when switching to basic mode\n setValue('transactionOptions', {\n ...formValues,\n validUntil: undefined,\n feeBump: undefined,\n });\n } else {\n // When switching to advanced mode, keep existing values or set reasonable defaults\n setValue('transactionOptions', {\n ...formValues,\n validUntil: formValues.validUntil || undefined,\n feeBump: formValues.feeBump || false,\n });\n }\n };\n\n return {\n control,\n formValues,\n configMode,\n handleModeChange,\n };\n};\n","import {\n Account,\n BASE_FEE,\n Contract,\n rpc as StellarRpc,\n TransactionBuilder,\n xdr,\n} from '@stellar/stellar-sdk';\n\nimport type {\n ExecutionConfig,\n RelayerDetails,\n RelayerDetailsRich,\n RelayerExecutionConfig,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\nimport {\n Configuration,\n RelayersApi,\n type ApiResponseRelayerResponseData,\n type ApiResponseRelayerStatusDataOneOf1,\n type ScVal,\n type StellarTransactionRequest,\n type StellarTransactionResponse,\n} from '@openzeppelin/relayer-sdk';\n\nimport { valueToScVal } from '../transform/input-parser';\nimport { getStellarWalletConnectionStatus, signTransaction } from '../wallet/connection';\nimport { ExecutionStrategy } from './execution-strategy';\nimport type { StellarTransactionData } from './formatter';\n\n/**\n * Stellar-specific transaction options for the OpenZeppelin Relayer.\n * These options map directly to the StellarTransactionRequest parameters in the SDK.\n */\nexport interface StellarRelayerTransactionOptions {\n // Basic options\n maxFee?: number;\n\n // Transaction expiration\n validUntil?: string; // ISO 8601 date string\n\n // Fee bump for stuck transactions\n feeBump?: boolean;\n}\n\n/**\n * Implements the ExecutionStrategy for the OpenZeppelin Relayer for Stellar networks.\n * This strategy sends the transaction to the relayer service, which then handles\n * fee payment, signing, and broadcasting on Stellar/Soroban. It includes a polling\n * mechanism to wait for the transaction to be confirmed and return the final hash.\n */\nexport class RelayerExecutionStrategy implements ExecutionStrategy {\n public async execute(\n transactionData: StellarTransactionData,\n executionConfig: ExecutionConfig,\n networkConfig: StellarNetworkConfig,\n onStatusChange: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<{ txHash: string }> {\n const relayerConfig = executionConfig as RelayerExecutionConfig;\n\n if (!runtimeApiKey) {\n throw new Error('API Key is required for Relayer execution.');\n }\n\n const { transactionId } = await this.sendTransactionViaRelayer(\n transactionData,\n relayerConfig,\n networkConfig,\n runtimeApiKey\n );\n\n onStatusChange('pendingRelayer', { transactionId });\n\n const sdkConfig = new Configuration({\n basePath: relayerConfig.serviceUrl,\n accessToken: runtimeApiKey,\n });\n\n const txHash = await this.pollForTransactionHash(\n relayerConfig.relayer.relayerId,\n transactionId,\n sdkConfig\n );\n\n return { txHash };\n }\n\n /**\n * Fetches and filters relayers for Stellar networks from the OpenZeppelin Relayer service.\n * This function handles pagination to retrieve all available relayers.\n *\n * @param serviceUrl The base URL of the relayer service.\n * @param accessToken The session-based API key for authentication.\n * @param networkConfig The Stellar network configuration to filter relayers by.\n * @returns A promise that resolves to an array of compatible relayer details.\n * @throws If the API call fails or returns an unsuccessful response.\n */\n public async getStellarRelayers(\n serviceUrl: string,\n accessToken: string,\n networkConfig: StellarNetworkConfig\n ): Promise<RelayerDetails[]> {\n logger.info(\n '[StellarRelayer] Getting relayers with access token',\n accessToken.slice(0, 5).padEnd(accessToken.length, '*')\n );\n const sdkConfig = new Configuration({\n basePath: serviceUrl,\n accessToken,\n });\n const relayersApi = new RelayersApi(sdkConfig);\n\n let allRelayers: ApiResponseRelayerResponseData[] = [];\n let currentPage = 1;\n let totalItems = 0;\n let hasMore = true;\n\n do {\n const { data } = await relayersApi.listRelayers(currentPage, 100);\n\n if (!data.success || !data.data) {\n throw new Error(`Failed to fetch relayers on page ${currentPage}.`);\n }\n\n allRelayers = [...allRelayers, ...data.data];\n totalItems = data.pagination?.total_items || 0;\n\n if (allRelayers.length >= totalItems) {\n hasMore = false;\n } else {\n currentPage++;\n }\n } while (hasMore);\n\n return allRelayers\n .filter(\n (r: ApiResponseRelayerResponseData) =>\n r.network_type === 'stellar' && networkConfig.id.includes(r.network)\n )\n .map((r: ApiResponseRelayerResponseData) => ({\n relayerId: r.id,\n name: r.name,\n address: r.address || '',\n network: r.network,\n paused: r.paused || false,\n }));\n }\n\n /**\n * Fetches comprehensive information about a specific Stellar relayer including balance and status.\n * This function combines multiple SDK API calls to provide rich relayer details.\n *\n * @param serviceUrl The base URL of the relayer service.\n * @param accessToken The session-based API key for authentication.\n * @param relayerId The unique identifier of the relayer.\n * @param networkConfig The Stellar network configuration for context.\n * @returns A promise that resolves to enhanced relayer details including balance and status.\n * @throws If any API call fails or returns an unsuccessful response.\n */\n public async getStellarRelayer(\n serviceUrl: string,\n accessToken: string,\n relayerId: string,\n _networkConfig: StellarNetworkConfig\n ): Promise<RelayerDetailsRich> {\n logger.info('[StellarRelayer] Getting detailed relayer info', relayerId);\n\n const sdkConfig = new Configuration({\n basePath: serviceUrl,\n accessToken,\n });\n const relayersApi = new RelayersApi(sdkConfig);\n\n try {\n // Fetch basic relayer details, balance, and status in parallel\n const [relayerResponse, balanceResponse, statusResponse] = await Promise.all([\n relayersApi.getRelayer(relayerId),\n relayersApi.getRelayerBalance(relayerId).catch((err) => {\n logger.warn('[StellarRelayer] Failed to fetch balance', err);\n return null;\n }),\n relayersApi.getRelayerStatus(relayerId).catch((err) => {\n logger.warn('[StellarRelayer] Failed to fetch status', err);\n return null;\n }),\n ]);\n\n if (!relayerResponse.data.success || !relayerResponse.data.data) {\n throw new Error(`Failed to fetch relayer details for ID: ${relayerId}`);\n }\n\n const relayerData = relayerResponse.data.data;\n\n // Build enhanced relayer details object\n const enhancedDetails: RelayerDetailsRich = {\n relayerId: relayerData.id,\n name: relayerData.name,\n address: relayerData.address || '',\n network: relayerData.network,\n paused: relayerData.paused || false,\n systemDisabled: relayerData.system_disabled || false,\n };\n\n // Add balance if available (Stellar native balance in lumens)\n if (balanceResponse?.data?.success && balanceResponse.data.data?.balance) {\n try {\n // Stellar balance is in stroops (1 XLM = 10,000,000 stroops)\n const balanceInStroops = Number(balanceResponse.data.data.balance);\n const balanceInXlm = balanceInStroops / 10000000;\n enhancedDetails.balance = `${balanceInXlm.toFixed(7)} XLM`;\n } catch (error) {\n logger.warn('[StellarRelayer] Failed to format balance, using raw value', String(error));\n enhancedDetails.balance = String(balanceResponse.data.data.balance);\n }\n }\n\n // Add status details if available\n if (statusResponse?.data?.success && statusResponse.data.data) {\n const statusData = statusResponse.data.data;\n if (statusData.network_type === 'stellar') {\n // Type guard to ensure we have Stellar-specific fields\n const stellarStatusData = statusData as ApiResponseRelayerStatusDataOneOf1;\n if (\n stellarStatusData.sequence_number !== undefined &&\n stellarStatusData.sequence_number !== null\n ) {\n enhancedDetails.nonce = String(stellarStatusData.sequence_number);\n }\n if (stellarStatusData.pending_transactions_count !== undefined) {\n enhancedDetails.pendingTransactionsCount = stellarStatusData.pending_transactions_count;\n }\n if (stellarStatusData.last_confirmed_transaction_timestamp) {\n enhancedDetails.lastConfirmedTransactionTimestamp =\n stellarStatusData.last_confirmed_transaction_timestamp;\n }\n }\n }\n\n logger.info(\n '[StellarRelayer] Retrieved enhanced relayer details',\n JSON.stringify(enhancedDetails)\n );\n return enhancedDetails;\n } catch (error) {\n logger.error(\n '[StellarRelayer] Failed to get relayer details',\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n }\n\n /**\n * Submits a Stellar transaction to the relayer service for asynchronous processing.\n * @param transactionData The Stellar contract transaction data.\n * @param executionConfig The relayer-specific execution configuration.\n * @param networkConfig The Stellar network configuration.\n * @param runtimeApiKey The user's session-only API key.\n * @returns A promise that resolves to an object containing the transaction ID assigned by the relayer.\n */\n private async sendTransactionViaRelayer(\n transactionData: StellarTransactionData,\n executionConfig: RelayerExecutionConfig,\n _networkConfig: StellarNetworkConfig,\n runtimeApiKey: string\n ): Promise<{ transactionId: string }> {\n // Type-safe extraction of Stellar-specific options\n const stellarOptions = executionConfig.transactionOptions as\n | StellarRelayerTransactionOptions\n | undefined;\n\n // If fee bump is requested, use signed XDR mode per relayer docs\n // Only valid when providing a signed transaction_xdr\n let relayerTxRequest: StellarTransactionRequest;\n if (stellarOptions?.feeBump) {\n const signedInnerXdr = await this.buildSignedInnerTransactionXdr(\n transactionData,\n _networkConfig,\n stellarOptions\n );\n\n relayerTxRequest = {\n network: executionConfig.relayer.network,\n transaction_xdr: signedInnerXdr,\n fee_bump: true,\n ...(stellarOptions?.maxFee !== undefined && { max_fee: stellarOptions.maxFee }),\n ...(stellarOptions?.validUntil !== undefined && { valid_until: stellarOptions.validUntil }),\n };\n } else {\n // Default operations-based mode\n relayerTxRequest = {\n network: executionConfig.relayer.network, // Use relayer's network (e.g., 'testnet', 'mainnet')\n source_account: executionConfig.relayer.address, // Use relayer's address as source account\n operations: [\n {\n type: 'invoke_contract',\n contract_address: transactionData.contractAddress,\n function_name: transactionData.functionName,\n args: this.convertArgsToScVal(transactionData),\n // No auth field needed - using source_account at top level\n },\n ],\n // Include optional parameters if provided\n ...(stellarOptions?.maxFee !== undefined && { max_fee: stellarOptions.maxFee }),\n ...(stellarOptions?.validUntil !== undefined && { valid_until: stellarOptions.validUntil }),\n // Note: fee_bump is not supported by the relayer service in operations mode\n // Memos are not supported for Soroban contract operations\n };\n }\n\n const sdkConfig = new Configuration({\n basePath: executionConfig.serviceUrl,\n accessToken: runtimeApiKey,\n });\n const relayersApi = new RelayersApi(sdkConfig);\n\n const result = await relayersApi.sendTransaction(\n executionConfig.relayer.relayerId,\n relayerTxRequest\n );\n\n if (!result.data.success || !result.data.data?.id) {\n throw new Error(`Relayer API failed to return a transaction ID. Error: ${result.data.error}`);\n }\n\n return { transactionId: result.data.data.id };\n }\n\n /**\n * Converts Stellar transaction arguments to ScVal format for the relayer.\n * Uses the same comprehensive conversion utility as the EOA execution strategy.\n */\n private convertArgsToScVal(transactionData: StellarTransactionData): ScVal[] {\n // Use the same comprehensive conversion as EOA execution strategy\n return transactionData.args.map((arg, index) => {\n const argType = transactionData.argTypes[index];\n const argSchema = transactionData.argSchema?.[index]; // Pass schema for struct field type resolution\n\n const scVal = valueToScVal(arg, argType, argSchema);\n\n // Convert Stellar SDK ScVal to relayer SDK ScVal format\n return this.stellarScValToRelayerScVal(scVal);\n });\n }\n\n /**\n * Build and sign the inner transaction using the connected wallet.\n * Returns the signed inner transaction XDR to be wrapped by the relayer as a fee bump.\n */\n private async buildSignedInnerTransactionXdr(\n txData: StellarTransactionData,\n stellarConfig: StellarNetworkConfig,\n _options?: StellarRelayerTransactionOptions\n ): Promise<string> {\n const rpcServer = this.getSorobanRpcServer(stellarConfig);\n const connectedAddress = this.getConnectedWalletAddress();\n\n // Fetch sequence for the connected address\n const accountResponse = await rpcServer.getAccount(connectedAddress);\n const sourceAccount = new Account(connectedAddress, accountResponse.sequenceNumber());\n\n // Build a contract invocation transaction\n const contract = new Contract(txData.contractAddress);\n const transactionBuilder = new TransactionBuilder(sourceAccount, {\n fee: BASE_FEE,\n networkPassphrase: stellarConfig.networkPassphrase,\n });\n\n const scValArgs = txData.args.map((arg, index) => {\n const argType = txData.argTypes[index];\n const argSchema = txData.argSchema?.[index];\n return valueToScVal(arg, argType, argSchema);\n });\n\n transactionBuilder.addOperation(contract.call(txData.functionName, ...scValArgs));\n\n // Note: Soroban contract transactions do not support memos; do not attach\n\n // Timeout: keep short; relayer will wrap in fee bump and submit\n transactionBuilder.setTimeout(30);\n\n // Build → simulate → prepare\n let transaction = transactionBuilder.build();\n\n const simulation = await rpcServer.simulateTransaction(transaction);\n if (StellarRpc.Api.isSimulationError(simulation)) {\n throw new Error(`Transaction simulation failed: ${simulation.error}`);\n }\n transaction = await rpcServer.prepareTransaction(transaction);\n\n // Sign with connected wallet\n const signResult = await signTransaction(transaction.toXDR(), connectedAddress);\n const signedTx = TransactionBuilder.fromXDR(\n signResult.signedTxXdr,\n stellarConfig.networkPassphrase\n );\n\n // Ensure we have a standard Transaction (not FeeBumpTransaction)\n if ('memo' in signedTx && 'sequence' in signedTx) {\n return signedTx.toXDR();\n }\n throw new Error('Unexpected transaction type returned from signing');\n }\n\n /**\n * Get Soroban RPC Server instance with current configuration and user overrides.\n */\n private getSorobanRpcServer(networkConfig: StellarNetworkConfig): StellarRpc.Server {\n // Allow HTTP for localhost development\n const rpcUrl = networkConfig.sorobanRpcUrl;\n if (!rpcUrl) {\n throw new Error(`No Soroban RPC URL available for network ${networkConfig.name}`);\n }\n const allowHttp = new URL(rpcUrl).hostname === 'localhost';\n return new StellarRpc.Server(rpcUrl, { allowHttp });\n }\n\n private getConnectedWalletAddress(): string {\n const connectionStatus = getStellarWalletConnectionStatus();\n if (!connectionStatus.isConnected || !connectionStatus.address) {\n throw new Error('No connected wallet found. Please connect your Stellar wallet first.');\n }\n return connectionStatus.address;\n }\n\n /**\n * Converts a Stellar SDK ScVal to the relayer SDK ScVal format.\n * The relayer SDK uses a simplified ScVal representation compared to Stellar SDK's XDR types.\n */\n private stellarScValToRelayerScVal(stellarScVal: xdr.ScVal): ScVal {\n const scValType = stellarScVal.switch();\n\n switch (scValType.name) {\n case 'scvBool':\n return { bool: stellarScVal.b() };\n case 'scvVoid':\n return { bool: false }; // Fallback for void\n case 'scvU32':\n return { u32: stellarScVal.u32() };\n case 'scvI32':\n return { i32: stellarScVal.i32() };\n case 'scvU64':\n return { u64: stellarScVal.u64().toString() };\n case 'scvI64':\n return { i64: stellarScVal.i64().toString() };\n case 'scvU128': {\n const u128Parts = stellarScVal.u128();\n return {\n u128: {\n hi: u128Parts.hi().toString(),\n lo: u128Parts.lo().toString(),\n },\n };\n }\n case 'scvI128': {\n const i128Parts = stellarScVal.i128();\n return {\n i128: {\n hi: i128Parts.hi().toString(),\n lo: i128Parts.lo().toString(),\n },\n };\n }\n case 'scvU256': {\n const u256Parts = stellarScVal.u256();\n return {\n u256: {\n hi_hi: u256Parts.hiHi().toString(),\n hi_lo: u256Parts.hiLo().toString(),\n lo_hi: u256Parts.loHi().toString(),\n lo_lo: u256Parts.loLo().toString(),\n },\n };\n }\n case 'scvI256': {\n const i256Parts = stellarScVal.i256();\n return {\n i256: {\n hi_hi: i256Parts.hiHi().toString(),\n hi_lo: i256Parts.hiLo().toString(),\n lo_hi: i256Parts.loHi().toString(),\n lo_lo: i256Parts.loLo().toString(),\n },\n };\n }\n case 'scvBytes':\n return { bytes: stellarScVal.bytes().toString('hex') };\n case 'scvString':\n return { string: stellarScVal.str().toString() };\n case 'scvSymbol':\n return { symbol: stellarScVal.sym().toString() };\n case 'scvVec':\n return {\n vec: stellarScVal.vec()?.map((val) => this.stellarScValToRelayerScVal(val)) || [],\n };\n case 'scvMap': {\n const mapEntries = stellarScVal.map() || [];\n return {\n map: mapEntries.map((entry) => ({\n key: this.stellarScValToRelayerScVal(entry.key()),\n val: this.stellarScValToRelayerScVal(entry.val()),\n })),\n };\n }\n case 'scvAddress':\n return { address: stellarScVal.address().toString() };\n default:\n // For any unhandled types, convert to string representation as fallback\n return { string: stellarScVal.toString() };\n }\n }\n\n /**\n * Polls the relayer for a Stellar transaction's status until it is confirmed and has a hash, or fails.\n * @param relayerId The ID of the relayer processing the transaction.\n * @param transactionId The ID of the transaction to poll.\n * @param sdkConfig The SDK configuration containing the necessary authentication.\n * @returns A promise that resolves to the final transaction hash.\n * @throws If the transaction fails or polling times out.\n */\n private async pollForTransactionHash(\n relayerId: string,\n transactionId: string,\n sdkConfig: Configuration\n ): Promise<string> {\n const relayersApi = new RelayersApi(sdkConfig);\n const POLLING_INTERVAL = 2000;\n const POLLING_TIMEOUT = 300000; // 5 minutes in milliseconds\n const startTime = Date.now();\n\n while (Date.now() - startTime < POLLING_TIMEOUT) {\n const { data } = await relayersApi.getTransactionById(relayerId, transactionId);\n\n if (!data.success || !data.data) {\n throw new Error(`Failed to get transaction status for ID: ${transactionId}`);\n }\n\n const txResponse = data.data as StellarTransactionResponse;\n\n if (txResponse.status === 'mined' || txResponse.status === 'confirmed') {\n if (!txResponse.hash) {\n throw new Error(\n `Transaction is confirmed but no hash was returned for ID: ${transactionId}`\n );\n }\n return txResponse.hash;\n }\n\n if (\n txResponse.status === 'failed' ||\n txResponse.status === 'canceled' ||\n txResponse.status === 'expired'\n ) {\n throw new Error(`Transaction ${txResponse.status}`);\n }\n\n // Continue polling for 'pending' or 'sent' statuses\n await new Promise((resolve) => setTimeout(resolve, POLLING_INTERVAL));\n }\n\n throw new Error(`Polling for transaction hash timed out for ID: ${transactionId}`);\n }\n}\n","import type { Connector } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport {\n getInitializedStellarWalletImplementation,\n getStellarWalletImplementation,\n} from './utils/stellarWalletImplementationManager';\n\nimport { stellarUiKitManager } from './stellar-wallets-kit';\nimport { StellarConnectionStatusListener } from './types';\n\n/**\n * Indicates if this adapter supports wallet connection\n * @returns Whether wallet connection is supported by this adapter\n */\nexport function supportsStellarWalletConnection(): boolean {\n return true;\n}\n\n/**\n * Get available Stellar wallet connectors\n */\nexport async function getStellarAvailableConnectors(): Promise<Connector[]> {\n const impl = await getStellarWalletImplementation();\n return impl.getAvailableConnectors();\n}\n\n/**\n * Connect to a Stellar wallet\n * @param connectorId - The ID of the wallet to connect to\n */\nexport async function connectStellarWallet(\n connectorId: string\n): Promise<{ connected: boolean; address?: string; error?: string }> {\n const impl = await getStellarWalletImplementation();\n return impl.connect(connectorId);\n}\n\n/**\n * Disconnect from the current Stellar wallet\n */\nexport async function disconnectStellarWallet(): Promise<{\n disconnected: boolean;\n error?: string;\n}> {\n const impl = await getStellarWalletImplementation();\n return impl.disconnect();\n}\n\n/**\n * Get the current wallet connection status\n * @inheritdoc\n */\nexport function getStellarWalletConnectionStatus(): {\n isConnected: boolean;\n address?: string;\n chainId?: string;\n walletId?: string;\n} {\n const impl = getInitializedStellarWalletImplementation();\n if (!impl) {\n logger.warn(\n 'getStellarWalletConnectionStatus',\n 'Wallet implementation not ready. Returning default disconnected state.'\n );\n return {\n isConnected: false,\n address: undefined,\n chainId: stellarUiKitManager.getState().networkConfig?.id || 'stellar-testnet',\n walletId: undefined,\n };\n }\n\n const status = impl.getWalletConnectionStatus();\n return {\n isConnected: status.isConnected,\n address: status.address,\n chainId: typeof status.chainId === 'number' ? status.chainId.toString() : status.chainId,\n walletId: status.walletId,\n };\n}\n\n/**\n * Update the cached Stellar wallet connection state.\n * Used by provider code that derives the address directly from the kit.\n */\nexport function setStellarConnectedAddress(address: string | null, walletId?: string | null): void {\n const impl = getInitializedStellarWalletImplementation();\n if (impl) {\n impl.updateConnectionStatus(address, walletId);\n } else {\n logger.warn(\n 'setStellarConnectedAddress',\n 'Wallet implementation not ready. Cannot update connection status.'\n );\n }\n}\n\n// StellarConnectionStatusListener is now imported from the implementation file\n\n/**\n * Subscribe to Stellar wallet connection status changes\n * @param callback Function to call when connection status changes\n * @returns Unsubscribe function\n */\nexport function onStellarWalletConnectionChange(\n callback: StellarConnectionStatusListener\n): () => void {\n const impl = getInitializedStellarWalletImplementation();\n if (!impl) {\n logger.warn(\n 'onStellarWalletConnectionChange',\n 'Wallet implementation not ready. Returning no-op.'\n );\n return () => {};\n }\n\n // Convert from implementation status format to connection format\n return impl.onWalletConnectionChange((currentImplStatus, prevImplStatus) => {\n const currentStatus = {\n isConnected: currentImplStatus.isConnected,\n address: currentImplStatus.address,\n chainId: currentImplStatus.chainId,\n walletId: currentImplStatus.walletId,\n };\n const previousStatus = {\n isConnected: prevImplStatus.isConnected,\n address: prevImplStatus.address,\n chainId: prevImplStatus.chainId,\n walletId: prevImplStatus.walletId,\n };\n\n try {\n callback(currentStatus, previousStatus);\n } catch (error) {\n logger.error('Error in Stellar connection status listener:', String(error));\n }\n });\n}\n\n/**\n * Sign a transaction using the connected wallet\n * @internal\n */\nexport async function signTransaction(\n xdr: string,\n address: string\n): Promise<{ signedTxXdr: string }> {\n const impl = await getStellarWalletImplementation();\n return impl.signTransaction(xdr, address);\n}\n","import type {\n StellarNetworkConfig,\n UiKitConfiguration,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { appConfigService, logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { WalletsKitImplementation } from '../implementation/wallets-kit-implementation';\n\nlet walletImplementationInstance: WalletsKitImplementation | undefined;\nlet walletImplementationPromise: Promise<WalletsKitImplementation> | undefined;\n\nconst LOG_SYSTEM = 'StellarWalletImplementationManager';\n\n/**\n * Get or create the singleton instance of WalletsKitImplementation.\n * This function ensures that the initialization logic runs only once.\n *\n * @param networkConfig - Optional network configuration to use for initialization\n * @returns A Promise resolving to the WalletsKitImplementation singleton\n */\nexport async function getStellarWalletImplementation(\n networkConfig?: StellarNetworkConfig\n): Promise<WalletsKitImplementation> {\n if (walletImplementationInstance) {\n // If network config is provided and different, update it\n if (networkConfig) {\n walletImplementationInstance.setNetworkConfig(networkConfig);\n }\n return walletImplementationInstance;\n }\n\n if (walletImplementationPromise) {\n const instance = await walletImplementationPromise;\n // If network config is provided and different, update it\n if (networkConfig) {\n instance.setNetworkConfig(networkConfig);\n }\n return instance;\n }\n\n walletImplementationPromise = (async () => {\n try {\n logger.info(LOG_SYSTEM, 'Initializing StellarWalletImplementation singleton (async)...');\n\n // Get initial UI kit config from appConfigService\n const initialUiKitConfig = appConfigService.getTypedNestedConfig<UiKitConfiguration>(\n 'walletui',\n 'config'\n );\n\n // Create instance with provided network config or undefined\n const instance = new WalletsKitImplementation(networkConfig, initialUiKitConfig);\n\n logger.info(LOG_SYSTEM, 'WalletsKitImplementation singleton created (async).');\n walletImplementationInstance = instance;\n return instance;\n } catch (error) {\n logger.error(LOG_SYSTEM, 'Failed to initialize WalletsKitImplementation (async):', error);\n\n // Create fallback instance\n const fallbackInstance = new WalletsKitImplementation(networkConfig);\n walletImplementationInstance = fallbackInstance;\n return fallbackInstance;\n }\n })();\n\n return walletImplementationPromise;\n}\n\n/**\n * A synchronous getter for cases where the instance is known to be initialized.\n * Use with caution, prefer the async getter.\n *\n * This function is essential for cases where you need immediate access to the\n * wallet implementation and know it has already been initialized.\n *\n * @returns The initialized WalletsKitImplementation instance or undefined\n */\nexport function getInitializedStellarWalletImplementation(): WalletsKitImplementation | undefined {\n if (!walletImplementationInstance) {\n logger.warn(\n LOG_SYSTEM,\n 'getInitializedStellarWalletImplementation called before instance was ready.'\n );\n }\n return walletImplementationInstance;\n}\n\n/**\n * Updates the network configuration for the wallet implementation\n * This is useful when the network changes but the implementation instance should remain the same\n *\n * @param networkConfig - The new network configuration\n */\nexport function updateWalletImplementationNetworkConfig(networkConfig: StellarNetworkConfig): void {\n logger.info(LOG_SYSTEM, 'Updating wallet implementation network config:', networkConfig.name);\n\n if (walletImplementationInstance) {\n walletImplementationInstance.setNetworkConfig(networkConfig);\n } else {\n logger.warn(\n LOG_SYSTEM,\n 'Cannot update network config - wallet implementation not initialized yet'\n );\n }\n}\n\n/**\n * Resets the singleton instance (primarily for testing or cleanup)\n * Use with extreme caution in production code\n */\nexport function resetWalletImplementationInstance(): void {\n logger.warn(LOG_SYSTEM, 'Resetting wallet implementation singleton instance');\n\n if (walletImplementationInstance) {\n walletImplementationInstance.cleanup();\n }\n\n walletImplementationInstance = undefined;\n walletImplementationPromise = undefined;\n}\n","/**\n * Private Stellar wallet implementation for Stellar wallet connection\n *\n * This file contains the internal implementation of StellarWalletsKit for wallet connection.\n * It's encapsulated within the Stellar adapter and not exposed to the rest of the application.\n */\nimport {\n allowAllModules,\n ISupportedWallet,\n StellarWalletsKit,\n WalletNetwork,\n} from '@creit.tech/stellar-wallets-kit';\n\nimport type {\n Connector,\n StellarNetworkConfig,\n UiKitConfiguration,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport type { StellarConnectionStatusListener, StellarWalletConnectionStatus } from '../types';\n\nconst LOG_SYSTEM = 'StellarWalletImplementation';\n\n/**\n * Class responsible for encapsulating StellarWalletsKit logic for wallet interactions.\n * This class should not be used directly by UI components. The StellarAdapter\n * exposes a standardized interface for wallet operations.\n * It manages StellarWalletsKit instances and provides methods for wallet actions.\n */\nexport class WalletsKitImplementation {\n private defaultInstanceKit: StellarWalletsKit | null = null;\n private activeStellarKit: StellarWalletsKit | null = null; // To be set by StellarUiKitManager\n private unsubscribeFromStatusChanges?: () => void;\n private initialized: boolean = false;\n private networkConfig: StellarNetworkConfig | null = null;\n\n // Internal state tracking for connection status\n private currentAddress: string | null = null;\n private currentWalletId: string | null = null;\n private connectionStatusListeners = new Set<StellarConnectionStatusListener>();\n\n /**\n * Constructs the StellarWalletImplementation.\n * Configuration for StellarWalletsKit is deferred until actually needed or set externally.\n * @param networkConfig - Stellar network configuration\n * @param initialUiKitConfig - Optional initial UI kit configuration, primarily for logging the anticipated kit.\n */\n constructor(networkConfig?: StellarNetworkConfig, initialUiKitConfig?: UiKitConfiguration) {\n this.networkConfig = networkConfig || null;\n logger.info(\n LOG_SYSTEM,\n 'Constructor called. Initial anticipated kitName:',\n initialUiKitConfig?.kitName,\n 'Network:',\n networkConfig?.name\n );\n this.initialized = true;\n logger.info(\n LOG_SYSTEM,\n 'StellarWalletImplementation instance initialized (StellarWalletsKit config creation deferred).'\n );\n // No kit created here by default anymore.\n }\n\n /**\n * Sets the network configuration for the wallet implementation\n * @param config - The Stellar network configuration\n */\n public setNetworkConfig(config: StellarNetworkConfig): void {\n logger.info(LOG_SYSTEM, 'Network config updated:', config.name);\n this.networkConfig = config;\n\n // If we have active kits, they might need to be recreated with new network\n // For now, just log - the kit manager will handle reconfiguration\n if (this.activeStellarKit || this.defaultInstanceKit) {\n logger.info(LOG_SYSTEM, 'Active kits detected - may need reconfiguration for new network');\n }\n }\n\n /**\n * Sets the externally determined, currently active StellarWalletsKit instance.\n * This is typically called by StellarUiKitManager after it has resolved the appropriate\n * kit for the selected UI kit mode.\n * @param kit - The StellarWalletsKit object to set as active, or null to clear it.\n */\n public setActiveStellarKit(kit: StellarWalletsKit | null): void {\n logger.info(\n LOG_SYSTEM,\n 'setActiveStellarKit called with kit:',\n kit ? 'Valid StellarWalletsKit' : 'Null'\n );\n this.activeStellarKit = kit;\n\n // If there was an existing direct subscription, it might need to be updated\n if (this.unsubscribeFromStatusChanges) {\n logger.info(LOG_SYSTEM, 'Re-establishing connection status monitoring with new kit');\n // The connection status will be managed internally\n }\n }\n\n /**\n * Creates a default StellarWalletsKit instance when no active kit is available.\n * This ensures wallet functionality works even without explicit UI kit configuration.\n * @returns A default StellarWalletsKit instance\n */\n private createDefaultKit(): StellarWalletsKit {\n logger.info(LOG_SYSTEM, 'Creating default StellarWalletsKit instance');\n\n const network = this.getWalletNetwork();\n const kit = new StellarWalletsKit({\n network,\n selectedWalletId: undefined,\n modules: allowAllModules(),\n });\n\n logger.info(LOG_SYSTEM, 'Default StellarWalletsKit instance created');\n return kit;\n }\n\n /**\n * Gets the appropriate WalletNetwork enum value based on network configuration\n */\n private getWalletNetwork(): WalletNetwork {\n if (!this.networkConfig) {\n logger.warn(LOG_SYSTEM, 'No network config available, defaulting to TESTNET');\n return WalletNetwork.TESTNET;\n }\n return this.networkConfig.type === 'mainnet' ? WalletNetwork.PUBLIC : WalletNetwork.TESTNET;\n }\n\n /**\n * Gets the kit to use for operations (active or default)\n */\n private getKitToUse(): StellarWalletsKit {\n const kit =\n this.activeStellarKit ||\n this.defaultInstanceKit ||\n (this.defaultInstanceKit = this.createDefaultKit());\n return kit;\n }\n\n /**\n * Gets available wallet connectors from StellarWalletsKit\n * @returns Promise resolving to array of available connectors\n */\n public async getAvailableConnectors(): Promise<Connector[]> {\n if (!this.initialized) {\n logger.warn(LOG_SYSTEM, 'getAvailableConnectors called before initialization');\n return [];\n }\n\n try {\n const kit = this.getKitToUse();\n const wallets = await kit.getSupportedWallets();\n\n const connectors: Connector[] = wallets.map((wallet: ISupportedWallet) => ({\n id: wallet.id,\n name: wallet.name,\n icon: wallet.icon,\n installed: wallet.isAvailable,\n type: (wallet.type as string) || 'browser',\n }));\n\n logger.info(LOG_SYSTEM, `Found ${connectors.length} available wallet connectors`);\n return connectors;\n } catch (error) {\n logger.error(LOG_SYSTEM, 'Failed to get available connectors:', error);\n return [];\n }\n }\n\n /**\n * Connects to a wallet using the specified connector ID\n * @param connectorId - The ID of the wallet connector to use\n * @returns Promise resolving to connection result\n */\n public async connect(connectorId: string): Promise<{\n connected: boolean;\n address?: string;\n chainId?: string;\n error?: string;\n }> {\n if (!this.initialized) {\n return { connected: false, error: 'Wallet implementation not initialized' };\n }\n\n try {\n const prevStatus = this.getWalletConnectionStatus();\n const kit = this.getKitToUse();\n\n logger.info(LOG_SYSTEM, `Attempting to connect to wallet: ${connectorId}`);\n\n // Set the selected wallet\n kit.setWallet(connectorId);\n\n // Get the address from the wallet\n const result = await kit.getAddress();\n\n if (result.address) {\n this.currentAddress = result.address;\n this.currentWalletId = connectorId;\n\n // Notify listeners of the connection change\n const newStatus = this.getWalletConnectionStatus();\n this.notifyConnectionListeners(newStatus, prevStatus);\n\n logger.info(\n LOG_SYSTEM,\n `Successfully connected to wallet: ${connectorId}, address: ${result.address}`\n );\n\n return {\n connected: true,\n address: result.address,\n chainId: this.networkConfig?.id,\n };\n } else {\n return {\n connected: false,\n error: 'Failed to get address from wallet',\n };\n }\n } catch (error) {\n logger.error(LOG_SYSTEM, `Failed to connect to wallet ${connectorId}:`, error);\n return {\n connected: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n }\n\n /**\n * Disconnects from the currently connected wallet\n * @returns Promise resolving to disconnection result\n */\n public async disconnect(): Promise<{ disconnected: boolean; error?: string }> {\n if (!this.initialized) {\n return { disconnected: false, error: 'Wallet implementation not initialized' };\n }\n\n try {\n const prevStatus = this.getWalletConnectionStatus();\n\n logger.info(LOG_SYSTEM, 'Disconnecting wallet');\n\n // Clear the current connection state\n this.currentAddress = null;\n this.currentWalletId = null;\n\n // Notify listeners of the disconnection\n const newStatus = this.getWalletConnectionStatus();\n this.notifyConnectionListeners(newStatus, prevStatus);\n\n // For Stellar Wallets Kit, we just clear our internal state\n // The kit doesn't have a specific disconnect method\n\n logger.info(LOG_SYSTEM, 'Successfully disconnected wallet');\n return { disconnected: true };\n } catch (error) {\n logger.error(LOG_SYSTEM, 'Failed to disconnect wallet:', error);\n return {\n disconnected: false,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n };\n }\n }\n\n /**\n * Gets the current wallet connection status\n * @returns The current connection status\n */\n public getWalletConnectionStatus(): StellarWalletConnectionStatus {\n const isConnected = this.currentAddress !== null;\n const chainId = this.networkConfig?.id || 'stellar-testnet';\n\n return {\n isConnected,\n isConnecting: false, // We don't track intermediate connecting state yet\n isDisconnected: !isConnected,\n isReconnecting: false,\n status: isConnected ? 'connected' : 'disconnected',\n address: this.currentAddress || undefined,\n walletId: this.currentWalletId || undefined,\n chainId,\n };\n }\n\n /**\n * Subscribes to wallet connection status changes\n * @param callback - Function to call when connection status changes\n * @returns A function to unsubscribe from the changes\n */\n public onWalletConnectionChange(callback: StellarConnectionStatusListener): () => void {\n if (!this.initialized) {\n logger.warn(LOG_SYSTEM, 'onWalletConnectionChange called before initialization. No-op.');\n return () => {};\n }\n\n this.connectionStatusListeners.add(callback);\n logger.info(LOG_SYSTEM, 'Connection status listener added');\n\n // Return unsubscribe function\n return () => {\n this.connectionStatusListeners.delete(callback);\n logger.debug(LOG_SYSTEM, 'Connection status listener removed');\n };\n }\n\n /**\n * Manually updates the cached connection address and wallet ID\n * This is used when the connection status is determined externally\n * @param address - The wallet address or null\n * @param walletId - The wallet ID or null\n */\n public updateConnectionStatus(address: string | null, walletId?: string | null): void {\n const prevStatus = this.getWalletConnectionStatus();\n\n this.currentAddress = address;\n this.currentWalletId = walletId ?? null;\n\n const newStatus = this.getWalletConnectionStatus();\n this.notifyConnectionListeners(newStatus, prevStatus);\n }\n\n /**\n * Gets the active StellarWalletsKit instance for advanced operations\n * @returns The active kit or null if not available\n */\n public getActiveKit(): StellarWalletsKit | null {\n return this.activeStellarKit || this.defaultInstanceKit;\n }\n\n /**\n * Signs a transaction using the connected wallet\n * @param xdr - The transaction XDR to sign\n * @param address - The account address\n * @returns Promise resolving to signed transaction\n */\n public async signTransaction(xdr: string, address: string): Promise<{ signedTxXdr: string }> {\n if (!this.initialized) {\n throw new Error('Wallet implementation not initialized');\n }\n\n const kit = this.getKitToUse();\n const networkPassphrase = this.getWalletNetwork();\n\n logger.info(LOG_SYSTEM, 'Signing transaction with wallet');\n\n return await kit.signTransaction(xdr, {\n address,\n networkPassphrase,\n });\n }\n\n /**\n * Notifies all connection listeners of status changes\n */\n private notifyConnectionListeners(\n currentStatus: StellarWalletConnectionStatus,\n previousStatus: StellarWalletConnectionStatus\n ): void {\n this.connectionStatusListeners.forEach((listener) => {\n try {\n listener(currentStatus, previousStatus);\n } catch (error) {\n logger.error(LOG_SYSTEM, 'Error in connection status listener:', String(error));\n }\n });\n }\n\n /**\n * Cleanup resources when implementation is no longer needed\n */\n public cleanup(): void {\n if (this.unsubscribeFromStatusChanges) {\n this.unsubscribeFromStatusChanges();\n this.unsubscribeFromStatusChanges = undefined;\n }\n this.connectionStatusListeners.clear();\n logger.info(LOG_SYSTEM, 'Cleanup completed');\n }\n}\n","import { allowAllModules, StellarWalletsKit, WalletNetwork } from '@creit.tech/stellar-wallets-kit';\n\nimport type {\n StellarNetworkConfig,\n UiKitConfiguration,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nexport interface StellarUiKitManagerState {\n isConfigured: boolean;\n isInitializing: boolean;\n hasConfigError: boolean;\n error: Error | null;\n lastConfigError: Error | null;\n currentFullUiKitConfig: UiKitConfiguration | null;\n stellarKitProvider: StellarWalletsKit | null;\n kitProviderComponent: React.ComponentType<{ children: React.ReactNode }> | null;\n isKitAssetsLoaded: boolean;\n networkConfig: StellarNetworkConfig | null;\n}\n\nconst getInitialState = (): StellarUiKitManagerState => ({\n isConfigured: false,\n isInitializing: false,\n hasConfigError: false,\n error: null,\n lastConfigError: null,\n currentFullUiKitConfig: null,\n stellarKitProvider: null,\n kitProviderComponent: null,\n isKitAssetsLoaded: false,\n networkConfig: null,\n});\n\nlet state: StellarUiKitManagerState = getInitialState();\n\ninterface StellarUiKitManagerListener {\n (state: StellarUiKitManagerState): void;\n}\n\nconst listeners: Set<StellarUiKitManagerListener> = new Set();\n\nfunction notifyListeners() {\n listeners.forEach((listener) => listener(state));\n}\n\nfunction subscribe(listener: StellarUiKitManagerListener): () => void {\n listeners.add(listener);\n\n // Call the listener immediately with the current state\n listener(state);\n\n // Return unsubscribe function\n return () => {\n listeners.delete(listener);\n };\n}\n\nfunction getState(): StellarUiKitManagerState {\n return state;\n}\n\nfunction setNetworkConfig(config: StellarNetworkConfig): void {\n state = {\n ...state,\n networkConfig: config,\n };\n notifyListeners();\n}\n\nfunction getWalletNetwork(networkConfig: StellarNetworkConfig | null): WalletNetwork {\n if (!networkConfig) {\n logger.warn('StellarUiKitManager', 'No network config available, defaulting to TESTNET');\n return WalletNetwork.TESTNET;\n }\n\n return networkConfig.type === 'mainnet' ? WalletNetwork.PUBLIC : WalletNetwork.TESTNET;\n}\n\nasync function configure(newFullUiKitConfig: UiKitConfiguration): Promise<void> {\n logger.info(\n 'StellarUiKitManager:configure',\n 'Configuring UI kit. New config:',\n newFullUiKitConfig\n );\n\n const oldKitName = state.currentFullUiKitConfig?.kitName;\n const newKitName = newFullUiKitConfig.kitName;\n const kitChanged = oldKitName !== newKitName;\n\n state = {\n ...state,\n isInitializing: true,\n error: null,\n currentFullUiKitConfig: newFullUiKitConfig,\n kitProviderComponent: kitChanged ? null : state.kitProviderComponent,\n isKitAssetsLoaded: kitChanged ? false : state.isKitAssetsLoaded,\n };\n notifyListeners();\n\n try {\n const walletNetwork = getWalletNetwork(state.networkConfig);\n\n if (newKitName === 'stellar-wallets-kit') {\n // Initialize the Stellar Wallets Kit with its built-in UI components\n const kit = new StellarWalletsKit({\n network: walletNetwork,\n selectedWalletId: undefined,\n modules: allowAllModules(), // Use all available wallet modules\n });\n\n state.stellarKitProvider = kit;\n // Stellar Wallets Kit provides its own modal UI that can be opened with kit.openModal()\n // We don't need to provide custom components when using the built-in UI\n state.kitProviderComponent = null;\n state.isKitAssetsLoaded = true;\n state.error = null;\n logger.info(\n 'StellarUiKitManager:configure',\n 'Stellar Wallets Kit configured with built-in UI and all wallet modules'\n );\n } else if (newKitName === 'custom' || !newKitName) {\n // Initialize the Stellar Wallets Kit for custom UI mode\n const kit = new StellarWalletsKit({\n network: walletNetwork,\n selectedWalletId: undefined,\n modules: allowAllModules(),\n });\n\n state.stellarKitProvider = kit;\n state.kitProviderComponent = null;\n state.isKitAssetsLoaded = true;\n state.error = null;\n logger.info(\n 'StellarUiKitManager:configure',\n 'Stellar Wallets Kit configured for custom UI components'\n );\n } else if (newKitName === 'none') {\n // No wallet UI kit\n state.stellarKitProvider = null;\n state.kitProviderComponent = null;\n state.isKitAssetsLoaded = false;\n state.error = null;\n logger.info('StellarUiKitManager:configure', 'UI kit set to \"none\", no wallet UI provided');\n } else {\n throw new Error(`Unknown UI kit name: ${newKitName}`);\n }\n\n state = {\n ...state,\n isConfigured: true,\n isInitializing: false,\n hasConfigError: false,\n error: null,\n };\n notifyListeners();\n } catch (error) {\n logger.error('StellarUiKitManager:configure', 'Failed to configure UI kit:', error);\n state = {\n ...state,\n isInitializing: false,\n hasConfigError: true,\n error: error instanceof Error ? error : new Error('Failed to configure UI kit'),\n lastConfigError: error instanceof Error ? error : new Error('Failed to configure UI kit'),\n isConfigured: false,\n };\n notifyListeners();\n throw error;\n }\n}\n\nexport const stellarUiKitManager = {\n configure,\n getState,\n subscribe,\n setNetworkConfig,\n};\n","import type { UiKitConfiguration } from '@openzeppelin/contracts-ui-builder-types';\n\n/**\n * Generates the content for a `stellar-wallets-kit.config.ts` file for an exported project.\n * This creates a configuration wrapper that can be used to initialize the Stellar Wallets Kit.\n *\n * @param userConfig - The user-provided configuration from the builder app.\n * @returns A string containing the formatted TypeScript code for the config file.\n */\nexport function generateStellarWalletsKitConfigFile(\n userConfig: UiKitConfiguration['kitConfig']\n): string {\n const config = (userConfig || {}) as Record<string, unknown>;\n\n // Extract user-provided configuration options\n const appName = (config.appName as string) || 'My Stellar App';\n const network = (config.network as string) || 'TESTNET';\n const walletConnectProjectId = (config.walletConnectProjectId as string) || '';\n const modalTitle = (config.modalTitle as string) || `Connect to ${appName}`;\n const buttonText = (config.buttonText as string) || 'Connect Wallet';\n\n const fileContent = `// Stellar Wallets Kit configuration for your exported application\n// This file is used ONLY in the exported app, not in the builder app preview\n\nimport { \n StellarWalletsKit, \n WalletNetwork, \n allowAllModules,\n WalletConnectModule,\n WalletConnectAllowedMethods\n} from '@creit.tech/stellar-wallets-kit';\n\n/**\n * Stellar Wallets Kit configuration wrapper\n * \n * The kit supports multiple wallets including:\n * - Freighter\n * - xBull \n * - Ledger\n * - Trezor\n * - WalletConnect\n * - And more...\n */\nexport const stellarWalletsKitConfig = {\n // App information\n appName: '${appName}',\n \n // Network configuration (TESTNET or PUBLIC/MAINNET)\n network: WalletNetwork.${network === 'MAINNET' || network === 'PUBLIC' ? 'PUBLIC' : 'TESTNET'},\n \n // UI customization\n buttonText: '${buttonText}',\n modalTitle: '${modalTitle}',\n \n // WalletConnect configuration\n ${walletConnectProjectId ? `walletConnectProjectId: '${walletConnectProjectId}',` : \"// walletConnectProjectId: 'YOUR_PROJECT_ID', // Get yours at https://cloud.walletconnect.com\"}\n};\n\n/**\n * Creates and configures a StellarWalletsKit instance\n * @returns Configured StellarWalletsKit instance\n */\nexport function createStellarWalletsKit(): StellarWalletsKit {\n const modules = [\n ...allowAllModules(),\n ${\n walletConnectProjectId\n ? `\n // WalletConnect module with custom configuration\n new WalletConnectModule({\n url: window.location.origin,\n projectId: stellarWalletsKitConfig.walletConnectProjectId,\n method: WalletConnectAllowedMethods.SIGN,\n description: stellarWalletsKitConfig.appName,\n name: stellarWalletsKitConfig.appName,\n icons: [],\n network: stellarWalletsKitConfig.network,\n }),`\n : ''\n }\n ];\n\n return new StellarWalletsKit({\n network: stellarWalletsKitConfig.network,\n modules,\n });\n}\n\nexport default stellarWalletsKitConfig;`;\n\n return fileContent;\n}\n","import type { UiKitConfiguration } from '@openzeppelin/contracts-ui-builder-types';\n\nimport { generateStellarWalletsKitConfigFile } from './config-generator';\n\n/**\n * Generates the specific configuration file for Stellar Wallets Kit during project export.\n *\n * @param uiKitConfig The full UI kit configuration object from the builder.\n * @returns A record containing the file path and its generated content.\n */\nexport function generateStellarWalletsKitExportables(\n uiKitConfig: UiKitConfiguration\n): Record<string, string> {\n const filePath = 'src/config/wallet/stellar-wallets-kit.config.ts';\n const content =\n uiKitConfig.customCode || generateStellarWalletsKitConfigFile(uiKitConfig.kitConfig);\n\n return { [filePath]: content };\n}\n","import { useEffect, useRef } from 'react';\n\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { stellarUiKitManager } from './stellarUiKitManager';\n\n/**\n * Creates a Stellar Wallets Kit ConnectButton component.\n * This renders the kit's native button UI which includes built-in connected state,\n * copy address functionality, and disconnect options.\n *\n * @returns A React component that uses Stellar Wallets Kit's native button\n */\nexport function StellarWalletsKitConnectButton() {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const state = stellarUiKitManager.getState();\n const kit = state.stellarKitProvider;\n\n if (!kit || !containerRef.current) {\n logger.error(\n 'StellarWalletsKitConnectButton',\n 'Kit not initialized or container not available'\n );\n return;\n }\n\n // Create the native button provided by Stellar Wallets Kit\n kit.createButton({\n container: containerRef.current,\n onConnect: ({ address }) => {\n logger.info('StellarWalletsKitConnectButton', `Connected to address: ${address}`);\n },\n onDisconnect: () => {\n logger.info('StellarWalletsKitConnectButton', 'Disconnected');\n },\n buttonText: 'Connect Wallet',\n });\n\n // Cleanup: remove the button when component unmounts\n return () => {\n if (typeof kit.removeButton === 'function') {\n try {\n kit.removeButton();\n } catch (error) {\n logger.warn('StellarWalletsKitConnectButton', 'Error removing button:', error);\n }\n } else {\n logger.warn(\n 'StellarWalletsKitConnectButton',\n 'removeButton method not available on kit instance'\n );\n }\n };\n }, []);\n\n return <div ref={containerRef} className=\"stellar-native-button\" />;\n}\n","import type {\n EoaExecutionConfig,\n ExecutionConfig,\n ExecutionMethodDetail,\n MultisigExecutionConfig,\n RelayerExecutionConfig,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { validateEoaConfig, validateRelayerConfig } from '../validation';\nimport { StellarWalletConnectionStatus } from '../wallet/types';\n\nconst SYSTEM_LOG_TAG = 'adapter-stellar-execution-config';\n\n/**\n * Returns details for execution methods supported by the Stellar adapter.\n */\nexport async function getStellarSupportedExecutionMethods(): Promise<ExecutionMethodDetail[]> {\n logger.warn(\n 'adapter-stellar-execution-config',\n 'getStellarSupportedExecutionMethods is using placeholder implementation.'\n );\n // TODO: Implement actual supported methods for Stellar (e.g., EOA, Relayer).\n return Promise.resolve([\n {\n type: 'eoa',\n name: 'EOA (External Account)',\n description: 'Execute using a standard Stellar account address.',\n },\n {\n type: 'relayer',\n name: 'OpenZeppelin Relayer',\n description: 'Execute via a OpenZeppelin open source transaction relayer service.',\n disabled: false,\n },\n {\n type: 'multisig',\n name: 'Stellar Multisig', // Example for future\n description: 'Execute via a Stellar multisignature configuration.',\n disabled: true,\n },\n ]);\n}\n\n/**\n * Validates Multisig execution configuration (placeholder).\n */\nasync function _validateMultisigConfig(\n _config: MultisigExecutionConfig,\n _walletStatus: StellarWalletConnectionStatus\n): Promise<true | string> {\n logger.info(SYSTEM_LOG_TAG, 'Multisig execution config validation: Not yet fully implemented.');\n // TODO: Add validation for Stellar multisig configuration, required signers, etc.\n return true; // Placeholder\n}\n\n/**\n * Validates the complete execution configuration object against the\n * requirements and capabilities of the Stellar adapter.\n */\nexport async function validateStellarExecutionConfig(\n config: ExecutionConfig,\n walletStatus: StellarWalletConnectionStatus\n): Promise<true | string> {\n logger.info(SYSTEM_LOG_TAG, 'Validating Stellar execution config:', { config, walletStatus });\n\n switch (config.method) {\n case 'eoa':\n return validateEoaConfig(config as EoaExecutionConfig, walletStatus);\n case 'relayer':\n return validateRelayerConfig(config as RelayerExecutionConfig);\n case 'multisig':\n return _validateMultisigConfig(config as MultisigExecutionConfig, walletStatus);\n default: {\n const unknownMethod = (config as ExecutionConfig).method;\n logger.warn(\n SYSTEM_LOG_TAG,\n `Unsupported execution method type encountered: ${unknownMethod}`\n );\n return `Unsupported execution method type: ${unknownMethod}`;\n }\n }\n}\n","import type {\n StellarNetworkConfig,\n UserRpcProviderConfig,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport {\n appConfigService,\n isValidUrl,\n logger,\n userRpcConfigService,\n} from '@openzeppelin/contracts-ui-builder-utils';\n\n/**\n * Builds a complete RPC URL from a user RPC provider configuration.\n * For Stellar (Soroban), this just returns the URL as-is since\n * users are providing complete RPC URLs including any API keys.\n *\n * @param config The user RPC provider configuration\n * @returns The RPC URL\n */\nexport function buildRpcUrl(config: UserRpcProviderConfig): string {\n return config.url;\n}\n\n/**\n * Resolves the RPC URL for a given Stellar network configuration.\n * Priority order:\n * 1. User-provided RPC configuration (from UserRpcConfigService)\n * 2. RPC URL override from AppConfigService\n * 3. Default sorobanRpcUrl from the network configuration\n *\n * @param networkConfig - The Stellar network configuration.\n * @returns The resolved RPC URL string.\n * @throws If no RPC URL can be resolved (neither user config, override, nor default is present and valid).\n */\nexport function resolveRpcUrl(networkConfig: StellarNetworkConfig): string {\n const logSystem = 'StellarRpcResolver';\n const networkId = networkConfig.id;\n\n // First priority: Check user-provided RPC configuration\n const userRpcConfig = userRpcConfigService.getUserRpcConfig(networkId);\n if (userRpcConfig) {\n const userRpcUrl = buildRpcUrl(userRpcConfig);\n if (isValidUrl(userRpcUrl)) {\n logger.info(\n logSystem,\n `Using user-configured Soroban RPC URL for network ${networkId}: ${userRpcConfig.name || 'Custom'}`\n );\n return userRpcUrl;\n } else {\n logger.warn(\n logSystem,\n `User-configured Soroban RPC URL for ${networkId} is invalid: ${userRpcUrl}. Falling back.`\n );\n }\n }\n\n // Second priority: Check AppConfigService for an override\n const rpcOverrideSetting = appConfigService.getRpcEndpointOverride(networkId);\n let rpcUrlFromOverride: string | undefined;\n\n if (typeof rpcOverrideSetting === 'string') {\n rpcUrlFromOverride = rpcOverrideSetting;\n } else if (typeof rpcOverrideSetting === 'object' && rpcOverrideSetting) {\n // Check if it's a UserRpcProviderConfig\n if ('url' in rpcOverrideSetting && 'isCustom' in rpcOverrideSetting) {\n const userConfig = rpcOverrideSetting as UserRpcProviderConfig;\n rpcUrlFromOverride = buildRpcUrl(userConfig);\n } else if ('http' in rpcOverrideSetting) {\n // It's an RpcEndpointConfig\n rpcUrlFromOverride = rpcOverrideSetting.http;\n }\n }\n\n if (rpcUrlFromOverride) {\n logger.info(\n logSystem,\n `Using overridden Soroban RPC URL for network ${networkId}: ${rpcUrlFromOverride}`\n );\n if (isValidUrl(rpcUrlFromOverride)) {\n return rpcUrlFromOverride;\n } else {\n logger.warn(\n logSystem,\n `Overridden Soroban RPC URL for ${networkId} is invalid: ${rpcUrlFromOverride}. Falling back.`\n );\n }\n }\n\n // Third priority: Fallback to the sorobanRpcUrl in the networkConfig\n if (networkConfig.sorobanRpcUrl && isValidUrl(networkConfig.sorobanRpcUrl)) {\n logger.debug(\n logSystem,\n `Using default Soroban RPC URL for network ${networkId}: ${networkConfig.sorobanRpcUrl}`\n );\n return networkConfig.sorobanRpcUrl;\n }\n\n logger.error(\n logSystem,\n `No valid Soroban RPC URL could be resolved for network ${networkId}. Checked user config, override, and networkConfig.sorobanRpcUrl.`\n );\n throw new Error(\n `No valid Soroban RPC URL configured for network ${networkConfig.name} (ID: ${networkId}).`\n );\n}\n\n/**\n * Validates an RPC endpoint configuration for Stellar networks.\n * @param rpcConfig - The RPC provider configuration to validate\n * @returns True if the configuration is valid, false otherwise\n */\nexport function validateStellarRpcEndpoint(rpcConfig: UserRpcProviderConfig): boolean {\n try {\n // Check if it's a valid URL (our validator already ensures HTTP/HTTPS)\n if (!isValidUrl(rpcConfig.url)) {\n logger.error('validateStellarRpcEndpoint', `Invalid RPC URL format: ${rpcConfig.url}`);\n return false;\n }\n\n // Additional Stellar-specific validation could be added here\n // For example, checking if the URL follows known provider patterns\n\n return true;\n } catch (error) {\n logger.error('validateStellarRpcEndpoint', 'Error validating RPC endpoint:', error);\n return false;\n }\n}\n\n/**\n * Tests the connection to a Stellar (Soroban) RPC endpoint with a timeout.\n * Uses the Soroban RPC getHealth method to test connectivity.\n * @param rpcConfig - The RPC provider configuration to test\n * @param timeoutMs - Timeout in milliseconds (default: 5000ms)\n * @returns Connection test results including success status, latency, and any errors\n */\nexport async function testStellarRpcConnection(\n rpcConfig: UserRpcProviderConfig,\n timeoutMs: number = 5000\n): Promise<{\n success: boolean;\n latency?: number;\n error?: string;\n}> {\n if (!rpcConfig.url) {\n return { success: false, error: 'Soroban RPC URL is required' };\n }\n\n // Create an AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const startTime = Date.now();\n\n // Use fetch to make a JSON-RPC call to test the connection\n // Using getHealth method which is standard for Soroban RPC endpoints\n const response = await fetch(rpcConfig.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getHealth',\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n return { success: false, error: `HTTP error: ${response.status}` };\n }\n\n const data = await response.json();\n const latency = Date.now() - startTime;\n\n // Check for JSON-RPC error\n if (data.error) {\n return {\n success: false,\n error: `Soroban RPC error: ${data.error.message || 'Unknown RPC error'}`,\n };\n }\n\n // For Soroban RPC getHealth, a successful response should contain result\n if (!data.result) {\n // Try fallback method - getLatestLedger\n return await testWithFallbackMethod(rpcConfig, controller.signal, startTime);\n }\n\n // Check if the health status indicates the service is healthy\n const healthStatus = data.result.status;\n if (healthStatus && healthStatus !== 'healthy') {\n return {\n success: false,\n error: `Soroban RPC service unhealthy: ${healthStatus}`,\n latency,\n };\n }\n\n return { success: true, latency };\n } catch (error) {\n logger.error('testStellarRpcConnection', 'Connection test failed:', error);\n\n // Check if the error was due to timeout\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n success: false,\n error: `Connection timeout after ${timeoutMs}ms`,\n };\n }\n\n // Try fallback method if primary test failed\n try {\n return await testWithFallbackMethod(rpcConfig, controller.signal, Date.now());\n } catch {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Connection failed',\n };\n }\n } finally {\n // Clear the timeout\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Fallback method to test Soroban RPC connection using getLatestLedger.\n * This is used when getHealth is not available or fails.\n */\nasync function testWithFallbackMethod(\n rpcConfig: UserRpcProviderConfig,\n signal: AbortSignal,\n startTime: number\n): Promise<{\n success: boolean;\n latency?: number;\n error?: string;\n}> {\n const response = await fetch(rpcConfig.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getLatestLedger',\n }),\n signal,\n });\n\n if (!response.ok) {\n return { success: false, error: `HTTP error: ${response.status}` };\n }\n\n const data = await response.json();\n const latency = Date.now() - startTime;\n\n if (data.error) {\n return {\n success: false,\n error: `Soroban RPC error: ${data.error.message || 'Unknown RPC error'}`,\n };\n }\n\n // If we get a valid response with ledger info, the connection is working\n if (data.result && data.result.sequence) {\n return { success: true, latency };\n }\n\n return {\n success: false,\n error: 'Unexpected response format from Soroban RPC endpoint',\n };\n}\n","import type { FieldType } from '@openzeppelin/contracts-ui-builder-types';\n\n/**\n * Stellar/Soroban-specific type mapping to default form field types.\n * Based on Soroban type system: https://developers.stellar.org/docs/learn/fundamentals/contract-development/types\n */\nexport const STELLAR_TYPE_TO_FIELD_TYPE: Record<string, FieldType> = {\n // Address types\n Address: 'blockchain-address',\n MuxedAddress: 'blockchain-address',\n\n // String types\n ScString: 'text',\n ScSymbol: 'text',\n\n // Numeric types - unsigned integers\n U32: 'number',\n U64: 'number',\n U128: 'number',\n U256: 'number',\n\n // Numeric types - signed integers\n I32: 'number',\n I64: 'number',\n I128: 'number',\n I256: 'number',\n\n // Boolean type\n Bool: 'checkbox',\n\n // Byte types\n Bytes: 'bytes',\n DataUrl: 'bytes',\n\n // Collection types\n Vec: 'array',\n Map: 'map',\n\n // Complex types\n Tuple: 'object',\n Enum: 'select',\n\n // Instance types (for compatibility)\n Instance: 'object',\n};\n","import type { FieldType } from '@openzeppelin/contracts-ui-builder-types';\n\nimport { isLikelyEnumType } from '../utils/type-detection';\nimport { STELLAR_TYPE_TO_FIELD_TYPE } from './constants';\n\n/**\n * Map a Stellar-specific parameter type to a default form field type.\n * @param parameterType The Stellar parameter type (e.g., 'U128', 'Address', 'Vec<U32>')\n * @returns The appropriate default form field type (e.g., 'number', 'blockchain-address', 'array')\n */\nexport function mapStellarParameterTypeToFieldType(parameterType: string): FieldType {\n // Check if this is a Vec of custom/complex types (e.g., Vec<CustomStruct>)\n const vecComplexMatch = parameterType.match(/^Vec<([^>]+)>$/);\n if (vecComplexMatch) {\n const innerType = vecComplexMatch[1];\n // If inner type is not a primitive, treat as array of objects\n if (!STELLAR_TYPE_TO_FIELD_TYPE[innerType]) {\n return 'array-object';\n }\n return 'array';\n }\n\n // Check if this is a simple Vec type\n if (parameterType === 'Vec' || parameterType.startsWith('Vec<')) {\n return 'array';\n }\n\n // Check if this is a Map type\n if (parameterType === 'Map' || parameterType.startsWith('Map<')) {\n return 'map' as FieldType;\n }\n\n // Extract base type for generic types (e.g., Option<U32> -> U32)\n const genericMatch = parameterType.match(/^(\\w+)<(.+)>$/);\n if (genericMatch) {\n const baseType = genericMatch[1];\n // For Option and Result types, use the inner type\n if (baseType === 'Option' || baseType === 'Result') {\n const innerType = genericMatch[2];\n return mapStellarParameterTypeToFieldType(innerType);\n }\n }\n\n // Map known Stellar/Soroban types to appropriate field types\n const mappedType = STELLAR_TYPE_TO_FIELD_TYPE[parameterType];\n if (mappedType) {\n return mappedType;\n }\n\n // Handle BytesN types (fixed-size byte arrays like BytesN<32> for hashes)\n if (parameterType.startsWith('BytesN<')) {\n return 'textarea'; // Users input as hex strings\n }\n\n // Handle custom types (structs, enums) - default to object unless it's clearly an enum\n if (isLikelyEnumType(parameterType)) {\n return 'select';\n }\n\n // Check if this looks like a custom struct (capitalized name and not a known primitive)\n if (parameterType[0] && parameterType[0] === parameterType[0].toUpperCase()) {\n // Check if it's not a known Stellar primitive type that starts with uppercase\n const knownUppercaseTypes = [\n 'U32',\n 'U64',\n 'U128',\n 'U256',\n 'I32',\n 'I64',\n 'I128',\n 'I256',\n 'Bool',\n 'Bytes',\n ];\n if (\n !knownUppercaseTypes.includes(parameterType) &&\n !parameterType.startsWith('Vec') &&\n !parameterType.startsWith('Map') &&\n !parameterType.includes('Unknown')\n ) {\n // Don't treat Unknown* as structs\n return 'object';\n }\n }\n\n // Final fallback to text for truly unknown types\n return 'text';\n}\n\n/**\n * Get field types compatible with a specific parameter type.\n * @param parameterType The Stellar parameter type.\n * @returns Array of compatible form field types.\n */\nexport function getStellarCompatibleFieldTypes(parameterType: string): FieldType[] {\n // Handle Vec of complex types\n const vecComplexMatch = parameterType.match(/^Vec<([^>]+)>$/);\n if (vecComplexMatch) {\n const innerType = vecComplexMatch[1];\n if (!STELLAR_TYPE_TO_FIELD_TYPE[innerType]) {\n return ['array-object', 'textarea', 'text'];\n }\n return ['array', 'textarea', 'text'];\n }\n\n // Handle Vec types - allow array field or fallback to textarea/text\n if (parameterType === 'Vec' || parameterType.startsWith('Vec<')) {\n return ['array', 'textarea', 'text'];\n }\n\n // Handle Map types\n if (parameterType === 'Map' || parameterType.startsWith('Map<')) {\n return ['map' as FieldType, 'textarea', 'text'];\n }\n\n // Handle generic types\n const genericMatch = parameterType.match(/^(\\w+)<(.+)>$/);\n if (genericMatch) {\n const baseType = genericMatch[1];\n if (baseType === 'Option' || baseType === 'Result') {\n const innerType = genericMatch[2];\n return getStellarCompatibleFieldTypes(innerType);\n }\n }\n\n // Define compatibility map for known types\n const compatibilityMap: Record<string, FieldType[]> = {\n Address: ['blockchain-address', 'text'],\n\n // Unsigned integers\n U32: ['number', 'amount', 'text'],\n U64: ['number', 'amount', 'text'],\n U128: ['number', 'amount', 'text'],\n U256: ['number', 'amount', 'text'],\n\n // Signed integers\n I32: ['number', 'amount', 'text'],\n I64: ['number', 'amount', 'text'],\n I128: ['number', 'amount', 'text'],\n I256: ['number', 'amount', 'text'],\n\n // Boolean\n Bool: ['checkbox', 'select', 'radio', 'text'],\n\n // String types\n ScString: ['text', 'textarea', 'email', 'password'],\n ScSymbol: ['text', 'textarea'],\n\n // Byte types\n Bytes: ['bytes', 'textarea', 'text'],\n DataUrl: ['bytes', 'textarea', 'text'],\n // BytesN types like BytesN<32> for hashes\n 'BytesN<32>': ['bytes', 'textarea', 'text'],\n\n // Complex types\n Tuple: ['object', 'textarea', 'text'],\n Instance: ['object', 'textarea', 'text'],\n };\n\n // Check if we have a specific compatibility mapping\n const compatibleTypes = compatibilityMap[parameterType];\n if (compatibleTypes) {\n return compatibleTypes;\n }\n\n // Handle enums\n if (isLikelyEnumType(parameterType)) {\n return ['enum', 'select', 'radio', 'text'];\n }\n\n // Handle custom types (assumed to be structs)\n if (parameterType[0] && parameterType[0] === parameterType[0].toUpperCase()) {\n // Check if it's not a known Stellar primitive type that starts with uppercase\n const knownUppercaseTypes = [\n 'U32',\n 'U64',\n 'U128',\n 'U256',\n 'I32',\n 'I64',\n 'I128',\n 'I256',\n 'Bool',\n 'Bytes',\n ];\n if (\n !knownUppercaseTypes.includes(parameterType) &&\n !parameterType.startsWith('Vec') &&\n !parameterType.startsWith('Map') &&\n !parameterType.includes('Unknown')\n ) {\n // Don't treat Unknown* as structs\n return ['object', 'textarea', 'text'];\n }\n }\n\n // Default fallback for truly unknown types\n return ['text'];\n}\n","import { xdr } from '@stellar/stellar-sdk';\nimport { startCase } from 'lodash';\n\nimport type {\n ContractSchema,\n FieldType,\n FieldValidation,\n FieldValue,\n FormFieldType,\n FunctionParameter,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { getDefaultValueForType, logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { extractMapTypes, extractVecElementType } from '../utils/safe-type-parser';\nimport { isLikelyEnumType } from '../utils/type-detection';\nimport { extractEnumVariants, isEnumType, type EnumMetadata } from './enum-metadata';\nimport { mapStellarParameterTypeToFieldType } from './type-mapper';\n\n/**\n * Get default validation rules for a parameter type.\n * Only includes serializable validation rules - no custom functions.\n */\nfunction getDefaultValidationForType(): FieldValidation {\n return { required: true };\n}\n\n/**\n * Generate default field configuration for a Stellar function parameter.\n */\nexport function generateStellarDefaultField<T extends FieldType = FieldType>(\n parameter: FunctionParameter,\n contractSchema?: ContractSchema\n): FormFieldType<T> {\n // Extract spec entries from contract schema metadata if available\n const specEntries = contractSchema?.metadata?.specEntries as xdr.ScSpecEntry[] | undefined;\n const fieldType = mapStellarParameterTypeToFieldType(parameter.type) as T;\n\n // Debug logging for unmapped types\n if (parameter.type === 'unknown') {\n logger.warn(\n 'adapter-stellar',\n `[generateStellarDefaultField] Parameter \"${parameter.name}\" has type \"unknown\"`\n );\n }\n\n let enumMetadata: EnumMetadata | null = null;\n let finalFieldType = fieldType;\n let options: { label: string; value: string }[] | undefined;\n\n // Check if this parameter is an enum type and extract metadata\n if (isLikelyEnumType(parameter.type)) {\n if (specEntries && isEnumType(specEntries, parameter.type)) {\n // We have spec entries, extract full metadata\n enumMetadata = extractEnumVariants(specEntries, parameter.type);\n if (enumMetadata) {\n if (enumMetadata.isUnitOnly) {\n // Unit-only enums can use select/radio with options\n finalFieldType = 'select' as T;\n options = enumMetadata.variants.map((variant) => ({\n label: variant.name,\n value: variant.type === 'integer' ? variant.value!.toString() : variant.name,\n }));\n } else {\n // Tagged enums with payloads use the composite enum field\n finalFieldType = 'enum' as T;\n }\n }\n } else {\n // No spec entries available, but type looks like enum - use enum field as fallback\n finalFieldType = 'enum' as T;\n // Create minimal enum metadata for fallback\n enumMetadata = {\n name: parameter.type,\n variants: [], // Empty variants will trigger fallback UI\n isUnitOnly: false,\n };\n }\n }\n\n const baseField: FormFieldType<T> = {\n id: `field-${Math.random().toString(36).substring(2, 9)}`,\n name: parameter.name || parameter.type, // Use type if name missing\n label: startCase(parameter.displayName || parameter.name || parameter.type),\n type: finalFieldType,\n placeholder: enumMetadata\n ? `Select ${parameter.displayName || parameter.name || parameter.type}`\n : `Enter ${parameter.displayName || parameter.name || parameter.type}`,\n helperText: parameter.description || '',\n defaultValue: getDefaultValueForType(finalFieldType) as FieldValue<T>,\n validation: getDefaultValidationForType(),\n width: 'full',\n options,\n };\n\n // For array types, provide element type information\n if (fieldType === 'array') {\n const elementType = extractVecElementType(parameter.type);\n if (elementType) {\n const elementFieldType = mapStellarParameterTypeToFieldType(elementType);\n\n // Add array-specific properties\n const arrayField = {\n ...baseField,\n elementType: elementFieldType,\n elementFieldConfig: {\n type: elementFieldType,\n validation: { required: true },\n placeholder: `Enter ${elementType}`,\n },\n };\n return arrayField;\n }\n }\n\n // For map types, provide key and value type information\n if (fieldType === ('map' as FieldType)) {\n const mapTypes = extractMapTypes(parameter.type);\n if (mapTypes) {\n const keyFieldType = mapStellarParameterTypeToFieldType(mapTypes.keyType);\n const valueFieldType = mapStellarParameterTypeToFieldType(mapTypes.valueType);\n\n // Add map-specific properties\n const mapField = {\n ...baseField,\n mapMetadata: {\n keyType: keyFieldType,\n valueType: valueFieldType,\n keyFieldConfig: {\n type: keyFieldType,\n validation: { required: true },\n placeholder: `Enter ${mapTypes.keyType}`,\n originalParameterType: mapTypes.keyType,\n },\n valueFieldConfig: {\n type: valueFieldType,\n validation: { required: true },\n placeholder: `Enter ${mapTypes.valueType}`,\n originalParameterType: mapTypes.valueType,\n },\n },\n validation: {\n ...getDefaultValidationForType(),\n min: 0,\n // No max limit - users can add as many map entries as needed\n },\n };\n return mapField;\n }\n }\n\n // Preserve components for object and array-object types\n if (parameter.components && (fieldType === 'object' || fieldType === 'array-object')) {\n const result = {\n ...baseField,\n components: parameter.components,\n };\n return result;\n }\n\n // Add enum metadata if available\n if (enumMetadata) {\n const result = {\n ...baseField,\n enumMetadata,\n };\n return result;\n }\n\n return baseField;\n}\n","import { xdr } from '@stellar/stellar-sdk';\n\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n// Import the type extraction utility from the shared utils module\nimport { extractSorobanTypeFromScSpec } from '../utils/type-detection';\n\n/**\n * Represents a single enum variant with its type and optional payload information\n */\nexport interface EnumVariant {\n /** Name of the variant (e.g., 'One', 'Two', 'Three') */\n name: string;\n /** Type of variant: 'void' for unit variants, 'tuple' for variants with payload, 'integer' for numeric enums */\n type: 'void' | 'tuple' | 'integer';\n /** For tuple variants: array of payload type names (e.g., ['U32', 'ScString']) */\n payloadTypes?: string[];\n /** For integer variants: the numeric value */\n value?: number;\n}\n\n/**\n * Metadata about an enum extracted from Stellar contract spec\n */\nexport interface EnumMetadata {\n /** Name of the enum type */\n name: string;\n /** Array of variants in the enum */\n variants: EnumVariant[];\n /** True if all variants are unit variants (no payloads), suitable for simple select/radio */\n isUnitOnly: boolean;\n}\n\n/**\n * Extracts enum variant metadata from Stellar contract spec entries\n *\n * @param entries Array of ScSpecEntry from contract spec\n * @param enumName Name of the enum type to extract variants for\n * @returns EnumMetadata if found, null if not found or not an enum\n */\nexport function extractEnumVariants(\n entries: xdr.ScSpecEntry[],\n enumName: string\n): EnumMetadata | null {\n try {\n // Find the entry for the requested enum name\n const entry = entries.find((e) => {\n try {\n return e.value().name().toString() === enumName;\n } catch {\n return false;\n }\n });\n\n if (!entry) {\n return null;\n }\n\n const entryKind = entry.switch();\n\n // Handle UDT Union (tagged union enum like DemoEnum { One, Two(u32), Three(String) })\n if (entryKind.value === xdr.ScSpecEntryKind.scSpecEntryUdtUnionV0().value) {\n const unionUdt = entry.udtUnionV0();\n const cases = unionUdt.cases();\n const variants: EnumVariant[] = [];\n let isUnitOnly = true;\n\n for (const caseEntry of cases) {\n const caseKind = caseEntry.switch();\n\n if (caseKind.value === xdr.ScSpecUdtUnionCaseV0Kind.scSpecUdtUnionCaseVoidV0().value) {\n // Void case (unit variant)\n const voidCase = caseEntry.voidCase();\n variants.push({\n name: voidCase.name().toString(),\n type: 'void',\n });\n } else if (\n caseKind.value === xdr.ScSpecUdtUnionCaseV0Kind.scSpecUdtUnionCaseTupleV0().value\n ) {\n // Tuple case (variant with payload)\n const tupleCase = caseEntry.tupleCase();\n const payloadTypes = tupleCase\n .type()\n .map((typeDef) => extractSorobanTypeFromScSpec(typeDef));\n\n variants.push({\n name: tupleCase.name().toString(),\n type: 'tuple',\n payloadTypes,\n });\n isUnitOnly = false;\n }\n }\n\n return {\n name: enumName,\n variants,\n isUnitOnly,\n };\n }\n\n // Handle UDT Enum (integer enum like Priority { Low = 0, Medium = 1, High = 2 })\n if (entryKind.value === xdr.ScSpecEntryKind.scSpecEntryUdtEnumV0().value) {\n const enumUdt = entry.udtEnumV0();\n const cases = enumUdt.cases();\n const variants: EnumVariant[] = [];\n\n for (const caseEntry of cases) {\n variants.push({\n name: caseEntry.name().toString(),\n type: 'integer',\n value: caseEntry.value(),\n });\n }\n\n return {\n name: enumName,\n variants,\n isUnitOnly: true, // Integer enums are considered unit-only for UI purposes\n };\n }\n\n return null;\n } catch (error) {\n logger.error('extractEnumVariants', `Failed to extract enum variants for ${enumName}:`, error);\n return null;\n }\n}\n\n/**\n * Checks if a parameter type name refers to a user-defined enum/union type\n * by looking for it in the contract spec entries\n *\n * @param entries Array of ScSpecEntry from contract spec\n * @param typeName Name of the type to check\n * @returns true if the type is a UDT enum or union\n */\nexport function isEnumType(entries: xdr.ScSpecEntry[], typeName: string): boolean {\n try {\n const entry = entries.find((e) => {\n try {\n const entryName = e.value().name().toString();\n return entryName === typeName;\n } catch {\n return false;\n }\n });\n\n if (!entry) {\n return false;\n }\n\n const entryKind = entry.switch();\n const isEnum =\n entryKind.value === xdr.ScSpecEntryKind.scSpecEntryUdtUnionV0().value ||\n entryKind.value === xdr.ScSpecEntryKind.scSpecEntryUdtEnumV0().value;\n\n return isEnum;\n } catch (error) {\n logger.error('isEnumType', `Failed to check if ${typeName} is enum:`, error);\n return false;\n }\n}\n","import { Address, xdr } from '@stellar/stellar-sdk';\n\nimport type {\n ContractSchema,\n EnumValue,\n FormFieldType,\n FunctionParameter,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { isEnumValue } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { extractEnumVariants, isEnumType } from '../mapping/enum-metadata';\nimport { parseStellarInput } from '../transform';\n\n/**\n * Stellar transaction data structure that will be passed to signAndBroadcast\n */\nexport interface StellarTransactionData {\n contractAddress: string;\n functionName: string;\n args: unknown[];\n argTypes: string[]; // Parameter types for nativeToScVal type hints\n argSchema?: FunctionParameter[]; // Full parameter schema with struct field info\n transactionOptions: Record<string, unknown>;\n}\n\n/**\n * Formats transaction data for Stellar chains based on parsed inputs.\n *\n * @param contractSchema The contract schema.\n * @param functionId The ID of the function being called.\n * @param submittedInputs The raw data submitted from the form.\n * @param fields The fields of the form schema.\n * @returns The formatted data payload suitable for signAndBroadcast.\n */\nexport function formatStellarTransactionData(\n contractSchema: ContractSchema,\n functionId: string,\n submittedInputs: Record<string, unknown>,\n fields: FormFieldType[]\n): StellarTransactionData {\n logger.info(\n 'formatStellarTransactionData',\n `Formatting Stellar transaction data for function: ${functionId}`\n );\n\n // --- Step 1: Determine Argument Order --- //\n const functionDetails = contractSchema.functions.find((fn) => fn.id === functionId);\n if (!functionDetails) {\n throw new Error(`Function definition for ${functionId} not found in provided contract schema.`);\n }\n const expectedArgs = functionDetails.inputs;\n\n // --- Step 2: Iterate and Select Values --- //\n\n const orderedRawValues: unknown[] = [];\n for (const expectedArg of expectedArgs) {\n const fieldConfig = fields.find((field: FormFieldType) => field.name === expectedArg.name);\n if (!fieldConfig) {\n throw new Error(`Configuration missing for argument: ${expectedArg.name} in provided fields`);\n }\n let value: unknown;\n if (fieldConfig.isHardcoded) {\n // FIX: If hardcoded value is undefined but we have submitted input, use submitted input instead\n // This handles cases where fields were incorrectly saved with undefined hardcoded values\n if (fieldConfig.hardcodedValue === undefined && fieldConfig.name in submittedInputs) {\n logger.warn(\n 'formatStellarTransactionData',\n `Field '${fieldConfig.name}' is hardcoded with undefined value but has submitted input. Using submitted input instead.`\n );\n value = submittedInputs[fieldConfig.name];\n } else {\n value = fieldConfig.hardcodedValue;\n }\n } else if (fieldConfig.isHidden) {\n throw new Error(`Field '${fieldConfig.name}' cannot be hidden without being hardcoded.`);\n } else {\n if (!(fieldConfig.name in submittedInputs)) {\n throw new Error(`Missing submitted input for required field: ${fieldConfig.name}`);\n }\n value = submittedInputs[fieldConfig.name];\n }\n orderedRawValues.push(value);\n }\n\n // --- Step 3: Parse/Transform Values using the imported parser --- //\n const transformedArgs = expectedArgs.map((param, index) => {\n let valueToParse = orderedRawValues[index];\n\n // Handle enum values - process payload types using enum metadata\n if (isEnumValue(valueToParse)) {\n const specEntries = contractSchema.metadata?.specEntries as xdr.ScSpecEntry[] | undefined;\n if (specEntries && isEnumType(specEntries, param.type)) {\n const enumMetadata = extractEnumVariants(specEntries, param.type);\n const enumValue = valueToParse as EnumValue;\n if (enumMetadata && enumValue.values) {\n // Find the variant metadata for the selected tag\n const selectedVariant = enumMetadata.variants.find((v) => v.name === enumValue.tag);\n if (selectedVariant && selectedVariant.payloadTypes) {\n // Process each payload value according to its expected type\n const processedValues = enumValue.values.map(\n (rawValue: unknown, payloadIndex: number) => {\n const expectedType = selectedVariant.payloadTypes![payloadIndex];\n if (expectedType) {\n // Use parseStellarInput to convert the raw value to the proper type\n const processedValue = parseStellarInput(rawValue, expectedType);\n // Create SorobanArgumentValue structure for getScValFromArg\n return {\n type: expectedType,\n value: processedValue,\n };\n }\n return rawValue;\n }\n );\n // Return the enum with processed payload values\n valueToParse = { ...enumValue, values: processedValues };\n }\n }\n }\n }\n\n // Handle array parameters - if the value is already an array and the type expects it,\n // we can pass it directly. The Stellar input parser will handle the conversion.\n if (\n typeof param.type === 'string' &&\n param.type.startsWith('Vec<') &&\n Array.isArray(valueToParse)\n ) {\n // For Vec types, pass array as-is to parseStellarInput\n return parseStellarInput(valueToParse, param.type);\n }\n\n return parseStellarInput(valueToParse, param.type);\n });\n\n // --- Step 4: Validate Contract Address --- //\n if (!contractSchema.address) {\n throw new Error('Contract address is missing or invalid in the provided schema.');\n }\n\n try {\n Address.fromString(contractSchema.address);\n } catch {\n throw new Error('Contract address is missing or invalid in the provided schema.');\n }\n\n // --- Step 5: Prepare Return Object --- //\n const stellarTransactionData: StellarTransactionData = {\n contractAddress: contractSchema.address,\n functionName: functionDetails.name,\n args: transformedArgs,\n argTypes: functionDetails.inputs.map((param) => param.type), // Include parameter types for ScVal conversion\n argSchema: functionDetails.inputs, // Include full parameter schema with struct field definitions\n transactionOptions: {\n // Add any Stellar-specific transaction options here\n // For example: fee, timeout, memo, etc.\n },\n };\n\n logger.debug(\n 'formatStellarTransactionData',\n 'Formatted transaction data:',\n stellarTransactionData\n );\n\n return stellarTransactionData;\n}\n","import { rpc as StellarRpc } from '@stellar/stellar-sdk';\n\nimport type {\n ExecutionConfig,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { EoaExecutionStrategy } from './eoa';\nimport { ExecutionStrategy } from './execution-strategy';\nimport type { StellarTransactionData } from './formatter';\nimport { RelayerExecutionStrategy } from './relayer';\n\nconst SYSTEM_LOG_TAG = 'adapter-stellar';\n\n// --- Helper Functions ---\n\n/**\n * Get Soroban RPC Server instance with proper configuration\n */\nfunction getSorobanRpcServer(networkConfig: StellarNetworkConfig): StellarRpc.Server {\n const customRpcConfig = userRpcConfigService.getUserRpcConfig(networkConfig.id);\n const rpcUrl = customRpcConfig?.url || networkConfig.sorobanRpcUrl;\n\n if (!rpcUrl) {\n throw new Error(`No Soroban RPC URL available for network ${networkConfig.name}`);\n }\n\n // Allow HTTP for localhost development\n const allowHttp = new URL(rpcUrl).hostname === 'localhost';\n\n return new StellarRpc.Server(rpcUrl, {\n allowHttp,\n });\n}\n\n/**\n * Sign and broadcast a Stellar transaction using the strategy pattern.\n * This follows the same architecture as the EVM adapter.\n *\n * @param transactionData - The formatted transaction data from formatStellarTransactionData\n * @param executionConfig - Execution configuration specifying method (eoa, relayer, etc.)\n * @param networkConfig - Stellar network configuration\n * @param onStatusChange - Callback for status updates\n * @param runtimeApiKey - Optional session-only API key for methods like Relayer\n * @returns Promise resolving to the transaction hash\n */\nexport async function signAndBroadcastStellarTransaction(\n transactionData: unknown,\n executionConfig: ExecutionConfig,\n networkConfig: StellarNetworkConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n): Promise<{ txHash: string }> {\n logger.info(\n SYSTEM_LOG_TAG,\n 'Stellar signAndBroadcast called with executionConfig:',\n executionConfig\n );\n\n // Validate network config\n if (!networkConfig || networkConfig.ecosystem !== 'stellar') {\n throw new Error('Invalid Stellar network configuration provided.');\n }\n\n const txData = transactionData as StellarTransactionData;\n let strategy: ExecutionStrategy;\n\n // Select execution strategy based on method\n switch (executionConfig.method) {\n case 'eoa':\n strategy = new EoaExecutionStrategy();\n break;\n case 'relayer':\n strategy = new RelayerExecutionStrategy();\n break;\n case 'multisig':\n // TODO: Implement MultisigExecutionStrategy when Stellar multisig support is added\n throw new Error('Multisig execution method not yet implemented for Stellar.');\n default: {\n const exhaustiveCheck: never = executionConfig;\n logger.error(SYSTEM_LOG_TAG, `Unsupported execution method encountered: ${exhaustiveCheck}`);\n throw new Error(`Unsupported execution method: ${exhaustiveCheck}`);\n }\n }\n\n return strategy.execute(\n txData,\n executionConfig,\n networkConfig,\n onStatusChange || (() => {}),\n runtimeApiKey\n );\n}\n\n/**\n * Waits for a transaction to be confirmed on the blockchain.\n *\n * @param txHash - The hash of the transaction to wait for.\n * @param networkConfig - The network configuration.\n * @returns A promise resolving to the final status and receipt/error.\n */\nexport async function waitForStellarTransactionConfirmation(\n txHash: string,\n networkConfig: StellarNetworkConfig\n): Promise<{\n status: 'success' | 'error';\n receipt?: unknown;\n error?: Error;\n}> {\n try {\n const rpcServer = getSorobanRpcServer(networkConfig);\n const MAX_ATTEMPTS = 20; // More attempts for confirmation\n let attempts = 0;\n\n while (attempts++ < MAX_ATTEMPTS) {\n try {\n const txResponse = await rpcServer.getTransaction(txHash);\n\n switch (txResponse.status) {\n case 'SUCCESS':\n return {\n status: 'success',\n receipt: txResponse,\n };\n case 'FAILED':\n return {\n status: 'error',\n error: new Error(`Transaction failed: ${JSON.stringify(txResponse.resultXdr)}`),\n };\n case 'NOT_FOUND':\n // Continue waiting\n break;\n default:\n // Continue waiting for other statuses\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n } catch (error) {\n logger.error('waitForStellarTransactionConfirmation', `Attempt ${attempts} failed:`, error);\n }\n }\n\n return {\n status: 'error',\n error: new Error('Transaction confirmation timeout'),\n };\n } catch (error) {\n return {\n status: 'error',\n error: error as Error,\n };\n }\n}\n","import {\n Account,\n BASE_FEE,\n Contract,\n rpc as StellarRpc,\n TransactionBuilder,\n} from '@stellar/stellar-sdk';\n\nimport type {\n ExecutionConfig,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { valueToScVal } from '../transform/input-parser';\nimport { getStellarWalletConnectionStatus, signTransaction } from '../wallet/connection';\nimport { ExecutionStrategy } from './execution-strategy';\nimport type { StellarTransactionData } from './formatter';\n\nconst SYSTEM_LOG_TAG = 'EoaExecutionStrategy';\n\n/**\n * Get Soroban RPC Server instance with proper configuration\n */\nfunction getSorobanRpcServer(networkConfig: StellarNetworkConfig): StellarRpc.Server {\n const customRpcConfig = userRpcConfigService.getUserRpcConfig(networkConfig.id);\n const rpcUrl = customRpcConfig?.url || networkConfig.sorobanRpcUrl;\n\n if (!rpcUrl) {\n throw new Error(`No Soroban RPC URL available for network ${networkConfig.name}`);\n }\n\n // Allow HTTP for localhost development\n const allowHttp = new URL(rpcUrl).hostname === 'localhost';\n\n return new StellarRpc.Server(rpcUrl, {\n allowHttp,\n });\n}\n\n/**\n * Implements the ExecutionStrategy for a standard Externally Owned Account (EOA).\n * This strategy involves signing and broadcasting a transaction directly from the user's\n * connected Stellar wallet, which is the most common way of interacting with Stellar/Soroban contracts.\n */\nexport class EoaExecutionStrategy implements ExecutionStrategy {\n public async execute(\n transactionData: StellarTransactionData,\n executionConfig: ExecutionConfig,\n networkConfig: StellarNetworkConfig,\n onStatusChange: (status: TxStatus, details: TransactionStatusUpdate) => void,\n // runtimeApiKey is unused in EOA strategy but required by the interface\n _runtimeApiKey?: string\n ): Promise<{ txHash: string }> {\n logger.info(SYSTEM_LOG_TAG, 'Using Stellar EOA execution strategy');\n\n // Validate execution config is for EOA\n if (executionConfig.method !== 'eoa') {\n throw new Error(`Expected EOA execution config, got: ${executionConfig.method}`);\n }\n\n return this.executeEoaTransaction(transactionData, networkConfig, onStatusChange);\n }\n\n private async executeEoaTransaction(\n txData: StellarTransactionData,\n stellarConfig: StellarNetworkConfig,\n onStatusChange: (status: TxStatus, details: TransactionStatusUpdate) => void\n ): Promise<{ txHash: string }> {\n try {\n // --- Step 1: Get RPC Server and Connected Wallet Address --- //\n const rpcServer = getSorobanRpcServer(stellarConfig);\n const connectedAddress = this.getConnectedWalletAddress();\n\n logger.info(SYSTEM_LOG_TAG, `Connected address: ${connectedAddress}`);\n\n // --- Step 2: Get Account Details --- //\n let sourceAccount: Account;\n try {\n const accountResponse = await rpcServer.getAccount(connectedAddress);\n sourceAccount = new Account(connectedAddress, accountResponse.sequenceNumber());\n } catch (error) {\n throw new Error(`Failed to load account details: ${(error as Error).message}`);\n }\n\n // --- Step 3: Build Transaction --- //\n const contract = new Contract(txData.contractAddress);\n\n const transactionBuilder = new TransactionBuilder(sourceAccount, {\n fee: BASE_FEE,\n networkPassphrase: stellarConfig.networkPassphrase,\n });\n\n // Add the contract call operation (convert args to ScVal with comprehensive type support)\n const scValArgs = txData.args.map((arg, index) => {\n const argType = txData.argTypes[index];\n const argSchema = txData.argSchema?.[index]; // Pass schema for struct field type resolution\n\n return valueToScVal(arg, argType, argSchema);\n });\n\n transactionBuilder.addOperation(contract.call(txData.functionName, ...scValArgs));\n\n // Set timeout (default 30 seconds)\n transactionBuilder.setTimeout(30);\n\n let transaction = transactionBuilder.build();\n\n // --- Step 4: Simulate Transaction First --- //\n try {\n const simulation = await rpcServer.simulateTransaction(transaction);\n\n if (StellarRpc.Api.isSimulationError(simulation)) {\n throw new Error(`Transaction simulation failed: ${simulation.error}`);\n }\n\n // Prepare the transaction with simulation results\n transaction = await rpcServer.prepareTransaction(transaction);\n } catch (error) {\n throw new Error(`Transaction simulation/preparation failed: ${(error as Error).message}`);\n }\n\n onStatusChange('pendingSignature', {});\n\n // --- Step 5: Sign Transaction --- //\n try {\n const signResult = await signTransaction(transaction.toXDR(), connectedAddress);\n const signedTx = TransactionBuilder.fromXDR(\n signResult.signedTxXdr,\n stellarConfig.networkPassphrase\n );\n\n // Type guard to ensure we have a regular Transaction, not a FeeBumpTransaction\n if ('memo' in signedTx && 'sequence' in signedTx) {\n transaction = signedTx;\n } else {\n throw new Error('Unexpected transaction type returned from signing');\n }\n } catch (error) {\n if ((error as Error).message.includes('User declined')) {\n throw new Error('Transaction was rejected by user');\n }\n throw new Error(`Failed to sign transaction: ${(error as Error).message}`);\n }\n\n onStatusChange('pendingConfirmation', {});\n\n // --- Step 6: Send Transaction --- //\n let sendResult: StellarRpc.Api.SendTransactionResponse;\n try {\n sendResult = await rpcServer.sendTransaction(transaction);\n } catch (error) {\n throw new Error(`Failed to broadcast transaction: ${(error as Error).message}`);\n }\n\n if (sendResult.status !== 'PENDING') {\n throw new Error(`Transaction failed to submit: ${sendResult.status}`);\n }\n\n const txHash = sendResult.hash;\n logger.info(SYSTEM_LOG_TAG, `Transaction submitted successfully: ${txHash}`);\n\n // Status remains 'pendingConfirmation' during confirmation wait\n\n // --- Step 7: Wait for Confirmation --- //\n try {\n let txResponse;\n const MAX_ATTEMPTS = 10;\n let attempts = 0;\n\n while (attempts++ < MAX_ATTEMPTS && txResponse?.status !== 'SUCCESS') {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n txResponse = await rpcServer.getTransaction(txHash);\n\n switch (txResponse.status) {\n case 'FAILED':\n throw new Error(`Transaction failed: ${JSON.stringify(txResponse.resultXdr)}`);\n case 'NOT_FOUND':\n continue;\n case 'SUCCESS':\n break;\n default:\n // Continue waiting\n }\n }\n\n if (attempts >= MAX_ATTEMPTS || txResponse?.status !== 'SUCCESS') {\n logger.warn(SYSTEM_LOG_TAG, `Transaction confirmation timeout for ${txHash}`);\n // Don't throw error, just return the hash - transaction might still succeed\n }\n } catch (confirmError) {\n // Log the error but don't fail the transaction - it was already submitted\n logger.error(SYSTEM_LOG_TAG, 'Error waiting for confirmation:', confirmError);\n }\n\n onStatusChange('success', {\n txHash,\n });\n\n return { txHash };\n } catch (error) {\n const errorMessage = `Failed to execute Stellar EOA transaction: ${(error as Error).message}`;\n logger.error(SYSTEM_LOG_TAG, errorMessage, error);\n\n onStatusChange('error', {});\n\n throw new Error(errorMessage);\n }\n }\n\n private getConnectedWalletAddress(): string {\n const connectionStatus = getStellarWalletConnectionStatus();\n\n if (!connectionStatus.isConnected || !connectionStatus.address) {\n throw new Error('No connected wallet found. Please connect your Stellar wallet first.');\n }\n\n return connectionStatus.address;\n }\n}\n","import type { ISupportedWallet } from '@creit.tech/stellar-wallets-kit';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\n\nimport type { UiKitConfiguration } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport {\n connectStellarWallet,\n disconnectStellarWallet,\n getStellarAvailableConnectors,\n getStellarWalletConnectionStatus,\n onStellarWalletConnectionChange,\n} from '../connection';\nimport {\n StellarWalletContext,\n type StellarWalletContextType,\n} from '../context/StellarWalletContext';\nimport { stellarUiKitManager, type StellarUiKitManagerState } from '../stellar-wallets-kit';\n\n/**\n * Props for the StellarWalletUiRoot provider\n */\ninterface StellarWalletUiRootProps {\n children: ReactNode;\n /** UI kit configuration */\n uiKitConfig?: UiKitConfiguration;\n}\n\n/**\n * Stellar wallet UI root provider component\n * This component manages the wallet connection state and provides it to child components\n */\nexport function StellarWalletUiRoot({ children, uiKitConfig }: StellarWalletUiRootProps) {\n // UI Kit manager state\n const [uiKitManagerState, setUiKitManagerState] = useState<StellarUiKitManagerState>(\n stellarUiKitManager.getState()\n );\n\n // Connection state\n const [address, setAddress] = useState<string | null>(null);\n const [isConnecting, setIsConnecting] = useState(false);\n const [availableWallets, setAvailableWallets] = useState<ISupportedWallet[]>([]);\n\n // Initialize UI kit on mount\n useEffect(() => {\n // Only configure if a specific UI kit config is provided or if not already configured\n const currentState = stellarUiKitManager.getState();\n\n if (uiKitConfig || !currentState.currentFullUiKitConfig) {\n const configToUse = uiKitConfig || { kitName: 'custom' as const, kitConfig: {} };\n\n logger.debug('StellarWalletUiRoot', 'Configuring UI kit with:', configToUse);\n\n stellarUiKitManager.configure(configToUse).catch((error) => {\n logger.error('Failed to configure Stellar UI kit:', error);\n });\n }\n }, [uiKitConfig]);\n\n // Subscribe to UI kit state changes\n useEffect(() => {\n const unsubscribe = stellarUiKitManager.subscribe(() => {\n setUiKitManagerState(stellarUiKitManager.getState());\n });\n\n return unsubscribe;\n }, []);\n\n // Event-driven connection status updates\n useEffect(() => {\n const unsubscribeFromConnectionChanges = onStellarWalletConnectionChange(\n (currentStatus, _previousStatus) => {\n setAddress(currentStatus.address || null);\n logger.debug(\n 'StellarWalletUiRoot',\n `Connection status changed: ${currentStatus.isConnected ? 'connected' : 'disconnected'}`,\n currentStatus.address\n );\n }\n );\n\n // Initial update to sync current state\n const initialStatus = getStellarWalletConnectionStatus();\n setAddress(initialStatus.address || null);\n\n return () => {\n unsubscribeFromConnectionChanges();\n };\n }, [address]);\n\n // Load available wallets\n useEffect(() => {\n const loadWallets = async () => {\n try {\n const connectors = await getStellarAvailableConnectors();\n setAvailableWallets(connectors as unknown as ISupportedWallet[]);\n } catch (error) {\n logger.error('Failed to load available wallets:', String(error));\n }\n };\n\n if (!uiKitManagerState.isInitializing && uiKitManagerState.stellarKitProvider) {\n loadWallets();\n }\n }, [uiKitManagerState.isInitializing, uiKitManagerState.stellarKitProvider]);\n\n /**\n * Connect to a wallet\n */\n const connect = useCallback(async (walletId: string) => {\n setIsConnecting(true);\n\n try {\n const result = await connectStellarWallet(walletId);\n\n if (result.connected && result.address) {\n setAddress(result.address);\n } else {\n throw new Error(result.error || 'Failed to connect wallet');\n }\n } catch (error) {\n logger.error('Failed to connect:', String(error));\n throw error;\n } finally {\n setIsConnecting(false);\n }\n }, []);\n\n /**\n * Disconnect from the current wallet\n */\n const disconnect = useCallback(async () => {\n try {\n const result = await disconnectStellarWallet();\n\n if (result.disconnected) {\n setAddress(null);\n } else {\n throw new Error(result.error || 'Failed to disconnect wallet');\n }\n } catch (error) {\n logger.error('Failed to disconnect:', String(error));\n throw error;\n }\n }, []);\n\n const contextValue: StellarWalletContextType = {\n address,\n isConnected: address !== null,\n isConnecting,\n availableWallets,\n connect,\n disconnect,\n uiKitManagerState,\n kit: uiKitManagerState.stellarKitProvider,\n };\n\n return (\n <StellarWalletContext.Provider value={contextValue}>{children}</StellarWalletContext.Provider>\n );\n}\n","import type { ISupportedWallet, StellarWalletsKit } from '@creit.tech/stellar-wallets-kit';\nimport { createContext } from 'react';\n\nimport type { StellarUiKitManagerState } from '../stellar-wallets-kit';\n\n/**\n * Stellar wallet context type\n */\nexport interface StellarWalletContextType {\n // Connection state\n address: string | null;\n isConnected: boolean;\n isConnecting: boolean;\n\n // Available wallets\n availableWallets: ISupportedWallet[];\n\n // Connection methods\n connect: (walletId: string) => Promise<void>;\n disconnect: () => Promise<void>;\n\n // UI Kit manager state\n uiKitManagerState: StellarUiKitManagerState;\n\n // Kit instance (for advanced usage)\n kit: StellarWalletsKit | null;\n}\n\n/**\n * Create the context with undefined default value\n */\nexport const StellarWalletContext = createContext<StellarWalletContextType | undefined>(undefined);\n","import { useContext } from 'react';\n\nimport { StellarWalletContext, type StellarWalletContextType } from './StellarWalletContext';\n\n/**\n * Hook to use the Stellar wallet context\n * @throws Error if used outside of StellarWalletUiRoot\n */\nexport function useStellarWalletContext(): StellarWalletContextType {\n const context = useContext(StellarWalletContext);\n\n if (context === undefined) {\n throw new Error('useStellarWalletContext must be used within a StellarWalletUiRoot');\n }\n\n return context;\n}\n","import { useStellarWalletContext } from '../context';\n\n/**\n * Account information returned by the hook\n */\nexport interface StellarAccountInfo {\n /** The connected wallet address */\n address: string | null;\n /** Whether a wallet is currently connected */\n isConnected: boolean;\n /** Whether a connection is in progress */\n isConnecting: boolean;\n}\n\n/**\n * Hook to get the current Stellar account information\n * @returns Account information including address and connection status\n */\nexport function useStellarAccount(): StellarAccountInfo {\n const { address, isConnected, isConnecting } = useStellarWalletContext();\n\n return {\n address,\n isConnected,\n isConnecting,\n };\n}\n","import type { ISupportedWallet } from '@creit.tech/stellar-wallets-kit';\nimport { useCallback, useState } from 'react';\n\nimport type { Connector } from '@openzeppelin/contracts-ui-builder-types';\n\nimport { useStellarWalletContext } from '../context';\n\n/**\n * Connect hook return type - matches what react-core expects\n */\nexport interface StellarConnectReturnType {\n connect: (args: { connector: Connector }) => Promise<void>;\n connectors: Connector[];\n isLoading: boolean;\n isPending: boolean;\n error: Error | null;\n}\n\n/**\n * Hook to get the wallet connect function and status\n * @returns An object with connect function and connection status\n */\nexport function useStellarConnect(): StellarConnectReturnType {\n const { connect, isConnecting, availableWallets } = useStellarWalletContext();\n const [error, setError] = useState<Error | null>(null);\n\n const connectFunction = useCallback(\n async ({ connector }: { connector: Connector }) => {\n try {\n // Clear any previous errors\n setError(null);\n await connect(connector.id);\n } catch (err) {\n // Store the error for access by the consumer\n const connectError = err instanceof Error ? err : new Error(String(err));\n setError(connectError);\n // Re-throw to maintain the same behavior for error handling in UI components\n throw connectError;\n }\n },\n [connect]\n );\n\n // Convert ISupportedWallet[] to Connector[]\n const connectors: Connector[] = availableWallets.map((wallet: ISupportedWallet) => ({\n id: wallet.id,\n name: wallet.name,\n icon: wallet.icon,\n installed: wallet.isAvailable,\n type: (wallet.type as string) || 'browser',\n }));\n\n return {\n connect: connectFunction,\n connectors,\n isLoading: isConnecting,\n isPending: isConnecting,\n error,\n };\n}\n","import { useCallback, useState } from 'react';\n\nimport { useStellarWalletContext } from '../context';\n\n/**\n * Disconnect hook return type - matches what react-core expects\n */\nexport interface StellarDisconnectReturnType {\n disconnect: () => Promise<void>;\n isLoading: boolean;\n isPending: boolean;\n error: Error | null;\n}\n\n/**\n * Hook to get the wallet disconnect function and status\n * @returns An object with disconnect function and disconnection status\n */\nexport function useStellarDisconnect(): StellarDisconnectReturnType {\n const { disconnect } = useStellarWalletContext();\n const [isDisconnecting, setIsDisconnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const disconnectFunction = useCallback(async () => {\n try {\n // Clear any previous errors\n setError(null);\n setIsDisconnecting(true);\n await disconnect();\n } catch (err) {\n // Store the error for access by the consumer\n const disconnectError = err instanceof Error ? err : new Error(String(err));\n setError(disconnectError);\n // Re-throw to maintain the same behavior for error handling in UI components\n throw disconnectError;\n } finally {\n setIsDisconnecting(false);\n }\n }, [disconnect]);\n\n return {\n disconnect: disconnectFunction,\n isLoading: isDisconnecting,\n isPending: isDisconnecting,\n error,\n };\n}\n","import type { EcosystemSpecificReactHooks } from '@openzeppelin/contracts-ui-builder-types';\n\nimport { useStellarAccount } from './useStellarAccount';\nimport { useStellarConnect } from './useStellarConnect';\nimport { useStellarDisconnect } from './useStellarDisconnect';\n\n/**\n * Stellar-specific facade hooks following the EcosystemSpecificReactHooks interface\n * These hooks provide a standardized interface for wallet operations in the Stellar ecosystem\n */\nexport const stellarFacadeHooks: EcosystemSpecificReactHooks = {\n // Account management\n useAccount: useStellarAccount,\n\n // Connection management\n useConnect: useStellarConnect,\n useDisconnect: useStellarDisconnect,\n\n // Stellar doesn't have the same network switching capabilities as EVM\n // These are included for interface compatibility but may not be fully functional\n useSwitchChain: () => ({ switchChain: undefined }),\n useChainId: () => 'stellar',\n useChains: () => [],\n\n // Transaction and signing hooks - to be implemented as needed\n useBalance: () => ({ data: undefined, isLoading: false }),\n useSendTransaction: () => ({ sendTransaction: undefined }),\n useWaitForTransactionReceipt: () => ({ data: undefined }),\n useSignMessage: () => ({ signMessage: undefined }),\n useSignTypedData: () => ({ signTypedData: undefined }),\n};\n","import type { UiKitConfiguration } from '@openzeppelin/contracts-ui-builder-types';\nimport { appConfigService, logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n/**\n * Default configuration when no specific configuration is provided\n */\nconst defaultConfig: UiKitConfiguration = {\n kitName: 'custom', // Default to using our custom implementation for Stellar\n kitConfig: {},\n};\n\n/**\n * Loads the initial UI kit configuration from the AppConfigService\n * @returns The UI kit configuration from app.config.local.json or defaults\n */\nexport function loadInitialConfigFromAppService(): UiKitConfiguration {\n logger.debug(\n 'stellar:useUiKitConfig',\n 'Attempting to load initial config from AppConfigService...'\n );\n const configObj = appConfigService.getWalletUIConfig<UiKitConfiguration>('stellar');\n\n if (configObj && configObj.kitName) {\n logger.info(\n 'stellar:useUiKitConfig',\n `Loaded initial config from AppConfigService: kitName=${configObj.kitName}`,\n configObj.kitConfig\n );\n // Merge with defaults to ensure all base keys are present if AppConfigService only provides partial config\n return {\n kitName: configObj.kitName,\n kitConfig: { ...defaultConfig.kitConfig, ...(configObj.kitConfig || {}) },\n };\n }\n logger.debug(\n 'stellar:useUiKitConfig',\n 'No initial config found in AppConfigService, using module default.'\n );\n return { ...defaultConfig };\n}\n","import { Loader2, Wallet } from 'lucide-react';\nimport React, { useEffect, useState } from 'react';\n\nimport type { BaseComponentProps } from '@openzeppelin/contracts-ui-builder-types';\nimport { Button } from '@openzeppelin/contracts-ui-builder-ui';\nimport { cn } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { useStellarAccount } from '../../hooks';\nimport { ConnectorDialog } from './ConnectorDialog';\n\n/**\n * A button that allows users to connect their wallet.\n * Opens a dialog to select from available connectors.\n * @param hideWhenConnected - Whether to hide the button when wallet is connected (default: true)\n */\nexport interface ConnectButtonProps extends BaseComponentProps {\n hideWhenConnected?: boolean;\n}\n\nexport const CustomConnectButton: React.FC<ConnectButtonProps> = ({\n className,\n hideWhenConnected = true,\n}) => {\n const [dialogOpen, setDialogOpen] = useState(false);\n const { isConnected, isConnecting } = useStellarAccount();\n\n // Local state to indicate the button has been clicked and dialog is open, awaiting user selection\n const [isManuallyInitiated, setIsManuallyInitiated] = useState(false);\n\n useEffect(() => {\n if (isConnected && hideWhenConnected) {\n setDialogOpen(false);\n setIsManuallyInitiated(false); // Reset if dialog closes due to connection\n }\n }, [isConnected, hideWhenConnected]);\n\n // If dialog is closed, reset manual initiation state\n useEffect(() => {\n if (!dialogOpen) {\n setIsManuallyInitiated(false);\n }\n }, [dialogOpen]);\n\n // If wallet reports it's connecting, we no longer need our manual pending state\n useEffect(() => {\n if (isConnecting) {\n setIsManuallyInitiated(false);\n }\n }, [isConnecting]);\n\n const handleConnectClick = () => {\n if (!isConnected) {\n setIsManuallyInitiated(true); // User clicked, show pending on button\n setDialogOpen(true);\n }\n };\n\n if (isConnected && hideWhenConnected) {\n return null;\n }\n\n // Button shows loading if either hook reports connecting OR if user just clicked to open dialog\n const showButtonLoading = isConnecting || isManuallyInitiated;\n\n return (\n <div className={cn('flex items-center', className)}>\n <Button\n onClick={handleConnectClick}\n disabled={showButtonLoading || isConnected}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 px-2 text-xs\"\n title={isConnected ? 'Connected' : 'Connect Wallet'}\n >\n {showButtonLoading ? (\n <Loader2 className=\"size-3.5 animate-spin mr-1\" />\n ) : (\n <Wallet className=\"size-3.5 mr-1\" />\n )}\n {showButtonLoading ? 'Connecting...' : 'Connect Wallet'}\n </Button>\n\n <ConnectorDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n // If dialog is closed manually by user before selection, reset manual initiation\n if (!open) {\n setIsManuallyInitiated(false);\n }\n }}\n />\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\n\nimport type { Connector } from '@openzeppelin/contracts-ui-builder-types';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@openzeppelin/contracts-ui-builder-ui';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { getStellarAvailableConnectors } from '../../connection';\nimport { useStellarAccount, useStellarConnect } from '../../hooks';\n\n/**\n * Dialog component for selecting a wallet connector\n */\ninterface ConnectorDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport const ConnectorDialog: React.FC<ConnectorDialogProps> = ({ open, onOpenChange }) => {\n const { connect } = useStellarConnect();\n const { isConnected, isConnecting } = useStellarAccount();\n const [connectingId, setConnectingId] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [connectors, setConnectors] = useState<Connector[]>([]);\n const [loadingConnectors, setLoadingConnectors] = useState(true);\n\n // Load available connectors\n useEffect(() => {\n const loadConnectors = async () => {\n try {\n const availableConnectors = await getStellarAvailableConnectors();\n setConnectors(availableConnectors);\n } catch (err) {\n logger.error('Failed to load Stellar connectors:', String(err));\n setError('Failed to load available wallets');\n } finally {\n setLoadingConnectors(false);\n }\n };\n\n if (open) {\n loadConnectors();\n }\n }, [open]);\n\n // Track connection attempts for dialog closure\n useEffect(() => {\n // If we're connected and there was a connection attempt, close the dialog\n if (isConnected && connectingId) {\n onOpenChange(false);\n setConnectingId(null);\n setError(null);\n }\n }, [isConnected, connectingId, onOpenChange]);\n\n // If connect function itself is not available\n if (!connect) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-[425px]\">\n <DialogHeader>\n <DialogTitle>Error</DialogTitle>\n </DialogHeader>\n <p>Wallet connection function is not available.</p>\n </DialogContent>\n </Dialog>\n );\n }\n\n const handleConnectorSelect = async (selectedConnector: Connector) => {\n setConnectingId(selectedConnector.id);\n setError(null);\n\n try {\n await connect({ connector: selectedConnector });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to connect');\n setConnectingId(null);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-[425px]\">\n <DialogHeader>\n <DialogTitle>Connect Wallet</DialogTitle>\n <DialogDescription>\n Select a wallet provider to connect with this application.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"grid gap-4 py-4\">\n {loadingConnectors ? (\n <p className=\"text-center text-muted-foreground\">Loading available wallets...</p>\n ) : connectors.length === 0 ? (\n <p className=\"text-center text-muted-foreground\">No wallet connectors available.</p>\n ) : (\n connectors.map((connector: Connector) => (\n <Button\n key={connector.id}\n onClick={() => handleConnectorSelect(connector)}\n disabled={isConnecting && connectingId === connector.id}\n variant=\"outline\"\n className=\"flex justify-between items-center w-full py-6\"\n >\n <span>{connector.name}</span>\n {isConnecting && connectingId === connector.id && (\n <span className=\"ml-2 text-xs\">Connecting...</span>\n )}\n </Button>\n ))\n )}\n </div>\n\n {error && <p className=\"text-sm text-red-500 mt-1\">{error}</p>}\n </DialogContent>\n </Dialog>\n );\n};\n","import { LogOut } from 'lucide-react';\nimport React from 'react';\n\nimport type { BaseComponentProps } from '@openzeppelin/contracts-ui-builder-types';\nimport { Button } from '@openzeppelin/contracts-ui-builder-ui';\nimport { cn, truncateMiddle } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { useStellarAccount, useStellarDisconnect } from '../../hooks';\n\n/**\n * A component that displays the connected account address.\n * Also includes a disconnect button.\n */\nexport const CustomAccountDisplay: React.FC<BaseComponentProps> = ({ className }) => {\n const { isConnected, address } = useStellarAccount();\n const { disconnect } = useStellarDisconnect();\n\n if (!isConnected || !address || !disconnect) {\n return null;\n }\n\n return (\n <div className={cn('flex items-center gap-2', className)}>\n <div className=\"flex flex-col\">\n <span className=\"text-xs font-medium\">{truncateMiddle(address, 4, 4)}</span>\n <span className=\"text-[9px] text-muted-foreground -mt-0.5\">Stellar Account</span>\n </div>\n <Button\n onClick={() => disconnect()}\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 p-0\"\n title=\"Disconnect wallet\"\n >\n <LogOut className=\"size-3.5\" />\n </Button>\n </div>\n );\n};\n","import type {\n EcosystemWalletComponents,\n UiKitConfiguration,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { ECOSYSTEM_WALLET_COMPONENT_KEYS } from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n/**\n * Filters a set of wallet components based on an exclusion list.\n *\n * @param allPossibleComponents - An object containing all potential components for a kit.\n * @param exclusions - An array of component keys to exclude.\n * @param kitName - The name of the kit being filtered (for logging purposes).\n * @returns The filtered EcosystemWalletComponents object, or undefined if all components are excluded.\n */\nexport function filterWalletComponents(\n allPossibleComponents: EcosystemWalletComponents,\n exclusions: Array<keyof EcosystemWalletComponents>,\n kitName: string = 'custom' // Default to custom for logging context\n): EcosystemWalletComponents | undefined {\n logger.debug(\n 'filterWalletComponents',\n `Filtering components for kit: ${kitName}. Exclusions: ${exclusions.join(', ')}.`\n );\n if (!allPossibleComponents || Object.keys(allPossibleComponents).length === 0) {\n logger.debug('filterWalletComponents', `No components provided to filter for kit: ${kitName}.`);\n return undefined;\n }\n\n if (exclusions.length === 0) {\n logger.debug(\n 'filterWalletComponents',\n `Providing all components for kit: ${kitName}.`,\n allPossibleComponents\n );\n return allPossibleComponents;\n }\n\n const filteredComponents: Partial<EcosystemWalletComponents> = {};\n let componentCount = 0;\n for (const key in allPossibleComponents) {\n const componentKey = key as keyof EcosystemWalletComponents;\n if (!exclusions.includes(componentKey)) {\n if (allPossibleComponents[componentKey]) {\n // Ensure the component actually exists before adding\n filteredComponents[componentKey] = allPossibleComponents[componentKey];\n componentCount++;\n }\n }\n }\n\n if (componentCount > 0) {\n logger.debug(\n 'filterWalletComponents',\n `Providing filtered components for kit: ${kitName} after exclusions (${exclusions.join(', ')}).`,\n filteredComponents\n );\n return filteredComponents as EcosystemWalletComponents;\n }\n\n logger.debug('filterWalletComponents', `All components were excluded for kit: ${kitName}.`);\n return undefined;\n}\n\n/**\n * Extracts the component exclusion list from a UI kit configuration object.\n *\n * @param kitConfig - The `kitConfig` object from `UiKitConfiguration`.\n * @returns An array of component keys to exclude, or an empty array if none are specified or config is invalid.\n */\nexport function getComponentExclusionsFromConfig(\n kitConfig: UiKitConfiguration['kitConfig']\n): Array<keyof EcosystemWalletComponents> {\n if (kitConfig && typeof kitConfig === 'object' && 'components' in kitConfig) {\n const componentsCfg = kitConfig.components;\n if (\n componentsCfg &&\n typeof componentsCfg === 'object' &&\n 'exclude' in componentsCfg &&\n Array.isArray(componentsCfg.exclude)\n ) {\n // Ensure all elements are valid keys of EcosystemWalletComponents\n // This provides a bit more type safety at runtime if the config comes from an untyped source\n return componentsCfg.exclude.filter(\n (key): key is keyof EcosystemWalletComponents =>\n typeof key === 'string' &&\n (ECOSYSTEM_WALLET_COMPONENT_KEYS as readonly string[]).includes(key)\n ) as Array<keyof EcosystemWalletComponents>;\n }\n }\n return [];\n}\n","import type {\n EcosystemWalletComponents,\n UiKitConfiguration,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\nimport { CustomAccountDisplay, CustomConnectButton } from '../components';\nimport { StellarWalletsKitConnectButton } from '../stellar-wallets-kit';\nimport { filterWalletComponents, getComponentExclusionsFromConfig } from './filterWalletComponents';\n\n/**\n * Determines the final set of wallet components to be provided by the Stellar adapter\n * based on the UI kit configuration.\n *\n * @param uiKitConfiguration - The UiKitConfiguration from the adapter instance.\n * @returns The EcosystemWalletComponents object or undefined.\n */\nexport function getResolvedWalletComponents(\n uiKitConfiguration: UiKitConfiguration\n): EcosystemWalletComponents | undefined {\n logger.debug(\n 'stellar:uiKitService:getResolvedWalletComponents',\n 'Received uiKitConfiguration:',\n JSON.stringify(uiKitConfiguration)\n );\n\n const currentKitName = uiKitConfiguration.kitName || 'custom';\n\n if (currentKitName === 'none') {\n logger.info(\n 'stellar:uiKitService',\n 'UI Kit set to \"none\" for getResolvedWalletComponents, not providing wallet components.'\n );\n return undefined;\n }\n\n const exclusions = getComponentExclusionsFromConfig(uiKitConfiguration.kitConfig);\n logger.debug(\n 'stellar:uiKitService',\n `Extracted component exclusions for ${currentKitName}: ${exclusions.join(', ') || 'none'}.`\n );\n\n // For 'custom' kit, we provide our custom components\n if (currentKitName === 'custom') {\n const allCustomComponents: EcosystemWalletComponents = {\n ConnectButton: CustomConnectButton,\n AccountDisplay: CustomAccountDisplay,\n // NetworkSwitcher is not included as Stellar doesn't support network switching\n };\n\n logger.info(\n 'stellar:uiKitService',\n `Providing custom Stellar wallet components for kit: ${currentKitName}`\n );\n\n return filterWalletComponents(allCustomComponents, exclusions, currentKitName);\n }\n\n // For 'stellar-wallets-kit', use the kit's native button with built-in UI\n if (currentKitName === 'stellar-wallets-kit') {\n const stellarKitComponents: EcosystemWalletComponents = {\n ConnectButton: StellarWalletsKitConnectButton,\n // The kit's native button handles account display internally\n AccountDisplay: undefined,\n };\n\n logger.info('stellar:uiKitService', 'Using Stellar Wallets Kit native button');\n\n return stellarKitComponents;\n }\n\n logger.warn(\n 'stellar:uiKitService',\n `UI Kit \"${currentKitName}\" for getResolvedWalletComponents not explicitly supported. No components provided.`\n );\n return undefined;\n}\n","import type {\n NativeConfigLoader,\n UiKitConfiguration,\n} from '@openzeppelin/contracts-ui-builder-types';\nimport { logger } from '@openzeppelin/contracts-ui-builder-utils';\n\n/**\n * Resolves the final, complete UiKitConfiguration for Stellar by merging various sources.\n *\n * Note: Unlike the EVM adapter, Stellar has limited UI kit options, so this is simpler.\n * We don't currently support loading native TypeScript config files for Stellar.\n *\n * @param programmaticOverrides - Overrides passed directly to the configureUiKit call.\n * @param initialAppServiceKitName - The kitName noted from AppConfigService when the adapter instance was constructed.\n * @param currentAppServiceConfig - The full UiKitConfiguration from AppConfigService, re-fetched at the time of the call.\n * @param options - Options, including the callback to load user's native config file (currently unused for Stellar).\n * @returns A Promise resolving to the final UiKitConfiguration.\n */\nexport async function resolveFullUiKitConfiguration(\n programmaticOverrides: Partial<UiKitConfiguration>,\n initialAppServiceKitName: UiKitConfiguration['kitName'],\n currentAppServiceConfig: UiKitConfiguration,\n options?: {\n loadUiKitNativeConfig?: NativeConfigLoader;\n }\n): Promise<UiKitConfiguration> {\n logger.debug(\n 'stellar:configResolutionService:resolveFullUiKitConfiguration',\n 'Starting resolution with:',\n {\n programmaticOverrides,\n initialAppServiceKitName,\n currentAppServiceConfig,\n hasLoadNativeCallback: !!options?.loadUiKitNativeConfig,\n }\n );\n\n // Note: We currently don't support loading native TypeScript config files for Stellar\n // This could be added in the future if needed\n if (options?.loadUiKitNativeConfig) {\n logger.debug(\n 'stellar:configResolutionService',\n 'Native config loader provided but not currently supported for Stellar adapter'\n );\n }\n\n const effectiveKitName: UiKitConfiguration['kitName'] =\n programmaticOverrides.kitName ||\n currentAppServiceConfig.kitName ||\n initialAppServiceKitName ||\n 'custom';\n\n const finalFullConfig: UiKitConfiguration = {\n kitName: effectiveKitName,\n kitConfig: {\n ...(currentAppServiceConfig.kitConfig || {}),\n ...(programmaticOverrides.kitConfig || {}),\n },\n };\n\n logger.debug(\n 'stellar:configResolutionService:resolveFullUiKitConfiguration',\n 'Resolved finalFullConfig:',\n finalFullConfig\n );\n\n return finalFullConfig;\n}\n","import { StellarNetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\n\n// Stellar Public Network (Mainnet)\nexport const stellarPublic: StellarNetworkConfig = {\n id: 'stellar-public',\n exportConstName: 'stellarPublic',\n name: 'Stellar',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'mainnet',\n isTestnet: false,\n horizonUrl: 'https://horizon.stellar.org',\n sorobanRpcUrl: 'https://mainnet.sorobanrpc.com',\n networkPassphrase: 'Public Global Stellar Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/public',\n icon: 'stellar',\n};\n","import { StellarNetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\n\n// Stellar Testnet\nexport const stellarTestnet: StellarNetworkConfig = {\n id: 'stellar-testnet',\n exportConstName: 'stellarTestnet',\n name: 'Stellar Testnet',\n ecosystem: 'stellar',\n network: 'stellar',\n type: 'testnet',\n isTestnet: true,\n horizonUrl: 'https://horizon-testnet.stellar.org',\n sorobanRpcUrl: 'https://soroban-testnet.stellar.org',\n networkPassphrase: 'Test SDF Network ; September 2015',\n explorerUrl: 'https://stellar.expert/explorer/testnet',\n icon: 'stellar',\n};\n","import { StellarNetworkConfig } from '@openzeppelin/contracts-ui-builder-types';\n\nimport { stellarPublic } from './mainnet';\nimport { stellarTestnet } from './testnet';\n\n// All mainnet networks\nexport const stellarMainnetNetworks: StellarNetworkConfig[] = [stellarPublic];\n\n// All testnet networks\nexport const stellarTestnetNetworks: StellarNetworkConfig[] = [stellarTestnet];\n\n// All Stellar networks\nexport const stellarNetworks: StellarNetworkConfig[] = [\n ...stellarMainnetNetworks,\n ...stellarTestnetNetworks,\n];\n\n// Export individual networks as well\nexport { stellarPublic, stellarTestnet };\n","/**\n * Configuration for the Stellar adapter\n *\n * This file defines the dependencies required by the Stellar adapter\n * when generating exported projects. It follows the AdapterConfig\n * interface to provide a structured approach to dependency management.\n */\nimport type { AdapterConfig } from '@openzeppelin/contracts-ui-builder-types';\n\nexport const stellarAdapterConfig: AdapterConfig = {\n /**\n * Dependencies required by the Stellar adapter\n * These will be included in exported projects that use this adapter\n */\n dependencies: {\n // Runtime dependencies\n runtime: {\n // Core Stellar libraries\n '@stellar/stellar-sdk': '^14.1.1',\n\n // Wallet connection and integration\n '@creit.tech/stellar-wallets-kit': '^1.9.5',\n\n // OpenZeppelin Relayer integration (optional, for gasless transactions)\n '@openzeppelin/relayer-sdk': '1.1.0',\n\n // React integration for wallet components\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n },\n\n // Development dependencies\n dev: {\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n },\n },\n};\n"],"mappings":"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","names":["import_contracts_ui_builder_types","import_contracts_ui_builder_utils","StellarSdk","import_contracts_ui_builder_utils","import_stellar_sdk","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_stellar_sdk","import_contracts_ui_builder_utils","import_contracts_ui_builder_types","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","SYSTEM_LOG_TAG","import_stellar_sdk","import_contracts_ui_builder_utils","SYSTEM_LOG_TAG","import_stellar_sdk","import_contracts_ui_builder_utils","import_stellar_sdk","import_contracts_ui_builder_utils","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","import_stellar_sdk","import_contracts_ui_builder_types","import_stellar_sdk","import_contracts_ui_builder_utils","SYSTEM_LOG_TAG","isStructType","isStructType","SYSTEM_LOG_TAG","import_stellar_sdk","import_contracts_ui_builder_utils","StellarRpc","contract","import_react","import_contracts_ui_builder_ui","import_contracts_ui_builder_ui","import_jsx_runtime","import_contracts_ui_builder_ui","import_jsx_runtime","import_react_hook_form","import_jsx_runtime","React","import_stellar_sdk","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","xdr","LOG_SYSTEM","import_stellar_wallets_kit","import_contracts_ui_builder_utils","import_react","import_contracts_ui_builder_utils","import_jsx_runtime","state","xdr","contract","StellarRpc","import_contracts_ui_builder_utils","SYSTEM_LOG_TAG","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_stellar_sdk","import_contracts_ui_builder_utils","import_stellar_sdk","import_contracts_ui_builder_types","import_contracts_ui_builder_utils","import_stellar_sdk","import_contracts_ui_builder_utils","import_stellar_sdk","import_contracts_ui_builder_utils","SYSTEM_LOG_TAG","getSorobanRpcServer","StellarRpc","contract","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","import_react","import_contracts_ui_builder_utils","import_react","import_jsx_runtime","import_react","import_react","import_react","import_contracts_ui_builder_utils","import_lucide_react","import_react","import_contracts_ui_builder_ui","import_contracts_ui_builder_utils","import_react","import_contracts_ui_builder_ui","import_contracts_ui_builder_utils","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_contracts_ui_builder_ui","import_contracts_ui_builder_utils","import_jsx_runtime","import_contracts_ui_builder_types","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils","import_contracts_ui_builder_utils"]}