@openzeppelin/ui-builder-adapter-stellar 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +47 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +49 -15
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/getDefaultServiceConfig.test.ts +105 -0
- package/src/adapter.ts +8 -0
- package/src/configuration/network-services.ts +36 -1
- package/src/wallet/components/account/AccountDisplay.tsx +20 -9
- package/src/wallet/components/connect/ConnectButton.tsx +12 -7
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/access-control/onchain-reader.ts","../src/query/handler.ts","../src/transform/parsers/index.ts","../src/utils/type-detection.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/utils/xdr-ordering.ts","../src/transform/parsers/scval-converter.ts","../src/utils/stellar-types.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/access-control/service.ts","../src/transaction/sender.ts","../src/transaction/eoa.ts","../src/access-control/actions.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/transaction/relayer.ts","../src/access-control/feature-detection.ts","../src/access-control/indexer-client.ts","../src/access-control/validation.ts","../src/validation/address.ts","../src/configuration/network-services.ts","../src/configuration/rpc.ts","../src/contract/loader.ts","../src/validation/eoa.ts","../src/validation/relayer.ts","../src/configuration/explorer.ts","../src/mapping/struct-fields.ts","../src/sac/spec-cache.ts","../src/sac/spec-source.ts","../src/sac/xdr.ts","../src/contract/type.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/configuration/execution.ts","../src/mapping/constants.ts","../src/mapping/type-mapper.ts","../src/mapping/field-generator.ts","../src/mapping/enum-metadata.ts","../src/mapping/tuple-components.ts","../src/transaction/formatter.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 AccessControlService,\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 NetworkServiceForm,\n RelayerDetails,\n RelayerDetailsRich,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n TypeMappingInfo,\n UiKitConfiguration,\n UserRpcProviderConfig,\n WalletConnectionStatus,\n} from '@openzeppelin/ui-types';\nimport { isStellarNetworkConfig } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { getCurrentLedger } from './access-control/onchain-reader';\nimport { createStellarAccessControlService } from './access-control/service';\nimport {\n getStellarNetworkServiceForms,\n testStellarNetworkServiceConnection,\n validateStellarNetworkServiceConfig,\n} from './configuration/network-services';\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 getStellarTypeMappingInfo,\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 */\nexport class StellarAdapter implements ContractAdapter {\n readonly networkConfig: StellarNetworkConfig;\n readonly initialAppServiceKitName: UiKitConfiguration['kitName'];\n private readonly accessControlService: AccessControlService;\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 // Initialize Access Control Service\n this.accessControlService = createStellarAccessControlService(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 /**\n * @inheritdoc\n */\n public getNetworkServiceForms(): NetworkServiceForm[] {\n return getStellarNetworkServiceForms();\n }\n\n /**\n * @inheritdoc\n */\n public async validateNetworkServiceConfig(\n serviceId: string,\n values: Record<string, unknown>\n ): Promise<boolean> {\n return validateStellarNetworkServiceConfig(serviceId, values);\n }\n\n /**\n * @inheritdoc\n */\n public async testNetworkServiceConnection(\n serviceId: string,\n values: Record<string, unknown>\n ): Promise<{ success: boolean; latency?: number; error?: string }> {\n return testStellarNetworkServiceConnection(serviceId, values);\n }\n\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 /**\n * @inheritdoc\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 /**\n * @inheritdoc\n */\n getWritableFunctions(contractSchema: ContractSchema): ContractSchema['functions'] {\n return getStellarWritableFunctions(contractSchema);\n }\n\n /**\n * @inheritdoc\n */\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 /**\n * @inheritdoc\n */\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 /**\n * @inheritdoc\n */\n isViewFunction(functionDetails: ContractFunction): boolean {\n return isStellarViewFunction(functionDetails);\n }\n\n /**\n * @inheritdoc\n */\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 /**\n * @inheritdoc\n */\n formatFunctionResult(decodedValue: unknown, functionDetails: ContractFunction): string {\n return formatStellarFunctionResult(decodedValue, functionDetails);\n }\n\n /**\n * @inheritdoc\n */\n supportsWalletConnection(): boolean {\n return supportsStellarWalletConnection();\n }\n\n /**\n * @inheritdoc\n */\n async getAvailableConnectors(): Promise<Connector[]> {\n return getStellarAvailableConnectors();\n }\n\n /**\n * @inheritdoc\n */\n async connectWallet(\n connectorId: string\n ): Promise<{ connected: boolean; address?: string; error?: string }> {\n return connectStellarWallet(connectorId);\n }\n\n /**\n * @inheritdoc\n */\n async disconnectWallet(): Promise<{ disconnected: boolean; error?: string }> {\n return disconnectStellarWallet();\n }\n\n /**\n * @inheritdoc\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 /**\n * @inheritdoc\n */\n async getSupportedExecutionMethods(): Promise<ExecutionMethodDetail[]> {\n return getStellarSupportedExecutionMethods();\n }\n\n /**\n * @inheritdoc\n */\n async validateExecutionConfig(config: ExecutionConfig): Promise<true | string> {\n const walletStatus = this.getWalletConnectionStatus();\n return validateStellarExecutionConfig(config, walletStatus);\n }\n\n /**\n * @inheritdoc\n */\n getExplorerUrl(address: string): string | null {\n return getStellarExplorerAddressUrl(address, this.networkConfig);\n }\n\n /**\n * @inheritdoc\n */\n getExplorerTxUrl?(txHash: string): string | null {\n if (getStellarExplorerTxUrl) {\n return getStellarExplorerTxUrl(txHash, this.networkConfig);\n }\n return null;\n }\n\n /**\n * @inheritdoc\n */\n async getCurrentBlock(): Promise<number> {\n return getCurrentLedger(this.networkConfig);\n }\n\n /**\n * @inheritdoc\n */\n isValidAddress(address: string, addressType?: string): boolean {\n return isStellarValidAddress(address, addressType as StellarAddressType);\n }\n\n /**\n * @inheritdoc\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 /**\n * @inheritdoc\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 /**\n * @inheritdoc\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 * @inheritdoc\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 * @inheritdoc\n */\n public getAccessControlService(): AccessControlService {\n return this.accessControlService;\n }\n\n /**\n * @inheritdoc\n */\n public getTypeMappingInfo(): TypeMappingInfo {\n return getStellarTypeMappingInfo();\n }\n}\n\n// Also export as default to ensure compatibility with various import styles\nexport default StellarAdapter;\n","/**\n * On-Chain Reader Module\n *\n * Reads current access control state (ownership and roles) from Stellar (Soroban) contracts\n * using on-chain queries. Supports both Ownable and AccessControl patterns.\n */\n\nimport { rpc as StellarRpc } from '@stellar/stellar-sdk';\n\nimport type {\n ContractSchema,\n OwnershipInfo,\n RoleAssignment,\n RoleIdentifier,\n StellarNetworkConfig,\n} from '@openzeppelin/ui-types';\nimport { OperationFailed } from '@openzeppelin/ui-types';\nimport { DEFAULT_CONCURRENCY_LIMIT, logger, promiseAllWithLimit } from '@openzeppelin/ui-utils';\n\nimport { queryStellarViewFunction } from '../query/handler';\n\n/**\n * Helper to load a minimal contract schema for access control functions\n * This allows us to use the existing query infrastructure\n */\nfunction createMinimalSchema(\n contractAddress: string,\n functionName: string,\n inputs: Array<{ name: string; type: string }> = [],\n outputType = 'Val'\n): ContractSchema {\n return {\n ecosystem: 'stellar',\n address: contractAddress,\n functions: [\n {\n id: functionName,\n name: functionName,\n displayName: functionName,\n type: 'function',\n inputs,\n outputs: [{ name: 'result', type: outputType }],\n modifiesState: false,\n stateMutability: 'view',\n },\n ],\n };\n}\n\n/**\n * Simple wrapper around queryStellarViewFunction for access control queries\n */\nasync function queryAccessControlFunction(\n contractAddress: string,\n functionName: string,\n params: unknown[],\n networkConfig: StellarNetworkConfig,\n inputs: Array<{ name: string; type: string }> = []\n): Promise<unknown> {\n const schema = createMinimalSchema(contractAddress, functionName, inputs);\n return queryStellarViewFunction(contractAddress, functionName, networkConfig, params, schema);\n}\n\n/**\n * Reads the current owner from an Ownable contract\n *\n * @param contractAddress The contract address\n * @param networkConfig The network configuration\n * @returns Ownership information\n */\nexport async function readOwnership(\n contractAddress: string,\n networkConfig: StellarNetworkConfig\n): Promise<OwnershipInfo> {\n logger.info('readOwnership', `Reading owner for contract ${contractAddress}`);\n\n try {\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_owner',\n [],\n networkConfig\n );\n\n // get_owner returns Option<Address>\n if (result === undefined || result === null) {\n return { owner: null };\n }\n\n const ownerAddress = typeof result === 'string' ? result : String(result);\n logger.debug('readOwnership', `Owner: ${ownerAddress}`);\n\n return { owner: ownerAddress };\n } catch (error) {\n logger.error('readOwnership', 'Failed to read ownership:', error);\n throw new OperationFailed(\n `Failed to read ownership: ${(error as Error).message}`,\n contractAddress,\n 'readOwnership',\n error as Error\n );\n }\n}\n\n/**\n * Checks if an account has a specific role\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param account The account address to check\n * @param networkConfig The network configuration\n * @returns True if the account has the role, false otherwise\n */\nexport async function hasRole(\n contractAddress: string,\n roleId: string,\n account: string,\n networkConfig: StellarNetworkConfig\n): Promise<boolean> {\n logger.debug('hasRole', `Checking role ${roleId} for ${account}`);\n\n try {\n const inputs = [\n { name: 'account', type: 'Address' },\n { name: 'role', type: 'Symbol' },\n ];\n const result = await queryAccessControlFunction(\n contractAddress,\n 'has_role',\n [account, roleId],\n networkConfig,\n inputs\n );\n\n // has_role returns Option<u32> (Some(index) if has role, None otherwise)\n return typeof result === 'number';\n } catch (error) {\n logger.error('hasRole', `Failed to check role ${roleId}:`, error);\n return false;\n }\n}\n\n/**\n * Gets the count of members for a specific role\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param networkConfig The network configuration\n * @returns The count of role members\n */\nexport async function getRoleMemberCount(\n contractAddress: string,\n roleId: string,\n networkConfig: StellarNetworkConfig\n): Promise<number> {\n logger.debug('getRoleMemberCount', `Getting member count for role ${roleId}`);\n\n try {\n const inputs = [{ name: 'role', type: 'Symbol' }];\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_role_member_count',\n [roleId],\n networkConfig,\n inputs\n );\n\n // Handle both number and string results (formatter may return string for large numbers)\n if (typeof result === 'number') {\n return result;\n }\n if (typeof result === 'string') {\n const parsed = parseInt(result, 10);\n return isNaN(parsed) ? 0 : parsed;\n }\n return 0;\n } catch (error) {\n logger.error('getRoleMemberCount', `Failed to get member count for role ${roleId}:`, error);\n return 0;\n }\n}\n\n/**\n * Gets the member address at a specific index for a role\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param index The index of the member to retrieve\n * @param networkConfig The network configuration\n * @returns The member address, or null if index out of bounds\n */\nexport async function getRoleMember(\n contractAddress: string,\n roleId: string,\n index: number,\n networkConfig: StellarNetworkConfig\n): Promise<string | null> {\n logger.debug('getRoleMember', `Getting member at index ${index} for role ${roleId}`);\n\n try {\n const inputs = [\n { name: 'role', type: 'Symbol' },\n { name: 'index', type: 'u32' },\n ];\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_role_member',\n [roleId, index],\n networkConfig,\n inputs\n );\n\n if (result === undefined || result === null) {\n return null;\n }\n\n return String(result);\n } catch (error) {\n logger.error('getRoleMember', `Failed to get role member at index ${index}:`, error);\n return null;\n }\n}\n\n/**\n * Enumerates all members of a specific role\n *\n * Fetches all members in parallel with controlled concurrency for improved\n * performance while avoiding overwhelming RPC endpoints.\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param networkConfig The network configuration\n * @returns Array of member addresses\n */\nexport async function enumerateRoleMembers(\n contractAddress: string,\n roleId: string,\n networkConfig: StellarNetworkConfig\n): Promise<string[]> {\n logger.info('enumerateRoleMembers', `Enumerating members for role ${roleId}`);\n\n try {\n // Get the count of members\n const count = await getRoleMemberCount(contractAddress, roleId, networkConfig);\n\n logger.debug('enumerateRoleMembers', `Role ${roleId} has ${count} members`);\n\n if (count === 0) {\n return [];\n }\n\n // Create task functions for controlled concurrent execution\n const memberTasks = Array.from(\n { length: count },\n (_, i) => () => getRoleMember(contractAddress, roleId, i, networkConfig)\n );\n\n // Fetch members with concurrency limit to avoid overwhelming RPC endpoints\n const results = await promiseAllWithLimit(memberTasks, DEFAULT_CONCURRENCY_LIMIT);\n\n // Filter out null results and return valid members\n const members = results.filter((m): m is string => m !== null);\n\n logger.debug('enumerateRoleMembers', `Retrieved ${members.length} members for role ${roleId}`);\n\n return members;\n } catch (error) {\n logger.error('enumerateRoleMembers', `Failed to enumerate role ${roleId}:`, error);\n throw new OperationFailed(\n `Failed to enumerate role members: ${(error as Error).message}`,\n contractAddress,\n 'enumerateRoleMembers',\n error as Error\n );\n }\n}\n\n/**\n * Reads all current role assignments for a contract\n *\n * Fetches all roles in parallel for improved performance.\n *\n * @param contractAddress The contract address\n * @param roleIds Array of role identifiers to query\n * @param networkConfig The network configuration\n * @returns Array of role assignments\n */\nexport async function readCurrentRoles(\n contractAddress: string,\n roleIds: string[],\n networkConfig: StellarNetworkConfig\n): Promise<RoleAssignment[]> {\n logger.info(\n 'readCurrentRoles',\n `Reading ${roleIds.length} roles for contract ${contractAddress}`\n );\n\n if (roleIds.length === 0) {\n return [];\n }\n\n // Process all roles in parallel for improved performance\n const assignmentPromises = roleIds.map(async (roleId) => {\n const role: RoleIdentifier = {\n id: roleId,\n label: roleId.replace(/_/g, ' ').toLowerCase(),\n };\n\n try {\n const members = await enumerateRoleMembers(contractAddress, roleId, networkConfig);\n\n logger.debug('readCurrentRoles', `Role ${roleId} has ${members.length} members`);\n\n return {\n role,\n members,\n };\n } catch (error) {\n logger.warn('readCurrentRoles', `Failed to read role ${roleId}:`, error);\n // Return role with empty members array to maintain array length consistency\n return {\n role,\n members: [],\n };\n }\n });\n\n const assignments = await Promise.all(assignmentPromises);\n\n logger.info(\n 'readCurrentRoles',\n `Completed reading ${assignments.length} roles with ${assignments.reduce((sum, a) => sum + a.members.length, 0)} total members`\n );\n\n return assignments;\n}\n\n/**\n * Gets the admin role for a specific role\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param networkConfig The network configuration\n * @returns The admin role identifier, or null if no admin role set\n */\nexport async function getRoleAdmin(\n contractAddress: string,\n roleId: string,\n networkConfig: StellarNetworkConfig\n): Promise<string | null> {\n logger.debug('getRoleAdmin', `Getting admin role for ${roleId}`);\n\n try {\n const inputs = [{ name: 'role', type: 'Symbol' }];\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_role_admin',\n [roleId],\n networkConfig,\n inputs\n );\n\n // get_role_admin returns Option<Symbol>\n if (result === undefined || result === null) {\n return null;\n }\n\n return String(result);\n } catch (error) {\n logger.error('getRoleAdmin', `Failed to get admin role for ${roleId}:`, error);\n return null;\n }\n}\n\n/**\n * Gets the top-level admin account\n *\n * @param contractAddress The contract address\n * @param networkConfig The network configuration\n * @returns The admin address, or null if no admin set\n */\nexport async function getAdmin(\n contractAddress: string,\n networkConfig: StellarNetworkConfig\n): Promise<string | null> {\n logger.info('getAdmin', `Reading admin for contract ${contractAddress}`);\n\n try {\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_admin',\n [],\n networkConfig\n );\n\n // get_admin returns Option<Address>\n if (result === undefined || result === null) {\n return null;\n }\n\n return String(result);\n } catch (error) {\n logger.error('getAdmin', 'Failed to read admin:', error);\n return null;\n }\n}\n\n/**\n * Gets the current ledger sequence number from the Soroban RPC\n *\n * Used for two-step Ownable contracts to:\n * - Calculate appropriate expiration ledgers for ownership transfers\n * - Validate expiration ledgers before submitting transactions\n * - Determine if pending ownership transfers have expired\n *\n * @param networkConfig The network configuration containing the Soroban RPC URL\n * @returns Promise resolving to the current ledger sequence number\n * @throws OperationFailed if the RPC call fails\n *\n * @example\n * ```typescript\n * const currentLedger = await getCurrentLedger(networkConfig);\n * // Set expiration to ~1 hour from now (~720 ledgers at 5s/ledger)\n * const expirationLedger = currentLedger + 720;\n * ```\n */\nexport async function getCurrentLedger(networkConfig: StellarNetworkConfig): Promise<number> {\n logger.info('getCurrentLedger', `Fetching current ledger from ${networkConfig.sorobanRpcUrl}`);\n\n try {\n const server = new StellarRpc.Server(networkConfig.sorobanRpcUrl);\n const latestLedger = await server.getLatestLedger();\n\n logger.debug('getCurrentLedger', `Current ledger: ${latestLedger.sequence}`);\n\n return latestLedger.sequence;\n } catch (error) {\n logger.error('getCurrentLedger', 'Failed to fetch current ledger:', error);\n throw new OperationFailed(\n `Failed to get current ledger: ${(error as Error).message}`,\n networkConfig.sorobanRpcUrl,\n 'getCurrentLedger',\n error as Error\n );\n }\n}\n","import {\n Account,\n Address,\n BASE_FEE,\n Contract,\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/ui-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/ui-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 // For simulations, we only need a valid public key - no private key required.\n // Using a hardcoded test public key avoids Keypair.random() issues in test environments\n // where @noble/curves crypto may not work correctly.\n // This is a valid Stellar public key (the \"zero\" key derived from 32 zero bytes).\n const SIMULATION_PUBLIC_KEY = 'GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF';\n const sourceAccount = new Account(SIMULATION_PUBLIC_KEY, '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/ui-types';\nimport { isPlainObject, logger } from '@openzeppelin/ui-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 // Accept array-shaped values for struct-like types (e.g., tuple structs with numeric keys).\n // RHF treats numeric path segments as arrays, so a struct with fields \"0\", \"1\" can arrive as an array.\n // Pass through; valueToScVal/convertStructToScVal will serialize correctly using the schema.\n if (Array.isArray(value)) {\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 * as StellarSdk from '@stellar/stellar-sdk';\n\nimport { isDevelopmentOrTestEnvironment, logger } from '@openzeppelin/ui-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\nexport function isBytesNType(parameterType: string): boolean {\n return /^BytesN<\\d+>$/.test(parameterType);\n}\n","import { isMapEntryArray } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { detectBytesEncoding, logger, stringToBytes } from '@openzeppelin/ui-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/ui-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 * Safely extracts the element types from a Stellar Tuple type.\n *\n * @param parameterType - The parameter type (e.g., 'Tuple<U32, Bool>')\n * @returns Array of element types or null if not a Tuple type\n */\nexport function extractTupleTypes(parameterType: string): ExtractionResult<string[]> {\n if (!isValidTypeString(parameterType) || !parameterType.startsWith('Tuple<')) {\n return null;\n }\n\n const innerContent = extractGenericInnerType(parameterType, 'Tuple');\n if (!innerContent) {\n return null;\n }\n\n const parts = splitTopLevelTypes(innerContent);\n if (parts.length === 0) {\n return null;\n }\n\n return parts;\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\n/**\n * Splits a comma-separated list of types while respecting nested generics.\n */\nfunction splitTopLevelTypes(content: string): string[] {\n const types: string[] = [];\n let start = 0;\n let level = 0;\n\n for (let i = 0; i < content.length; i += 1) {\n const char = content[i];\n if (char === '<') {\n level += 1;\n } else if (char === '>') {\n level -= 1;\n } else if (char === ',' && level === 0) {\n const segment = content.slice(start, i).trim();\n if (segment) {\n types.push(segment);\n }\n start = i + 1;\n }\n }\n\n const lastSegment = content.slice(start).trim();\n if (lastSegment) {\n types.push(lastSegment);\n }\n\n return types;\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 if (/^BytesN<\\d+>$/.test(stellarType)) {\n return 'bytes';\n }\n return stellarType.toLowerCase();\n }\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport { detectBytesEncoding, logger, stringToBytes } from '@openzeppelin/ui-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';\nimport { compareScValsByXdr } from './xdr-ordering';\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 sortedEntries = [...mapArray].sort((a, b) => {\n const aKey = getScValFromPrimitive(a['0'] as SorobanArgumentValue);\n const bKey = getScValFromPrimitive(b['0'] as SorobanArgumentValue);\n return compareScValsByXdr(aKey, bKey);\n });\n\n const mapVal = sortedEntries.reduce((acc: Record<string, unknown>, pair) => {\n const key = String(pair['0'].value);\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 if (pair['1'].type === 'bool') {\n if (typeof value === 'boolean') {\n acc[key] = value;\n } else if (typeof value === 'string') {\n acc[key] = value === 'true';\n } else {\n acc[key] = Boolean(value);\n }\n } else {\n acc[key] = value;\n }\n }\n return acc;\n }, {});\n\n const mapType = sortedEntries.reduce((acc: Record<string, string[]>, pair) => {\n const key = String(pair['0'].value);\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 { xdr } from '@stellar/stellar-sdk';\n\n/**\n * Compare two ScVals based on their XDR encoding without relying on Node's Buffer.\n */\nexport function compareScValsByXdr(a: xdr.ScVal, b: xdr.ScVal): number {\n const aBytes = getBytes(a);\n const bBytes = getBytes(b);\n\n const minLength = Math.min(aBytes.length, bBytes.length);\n for (let index = 0; index < minLength; index += 1) {\n const diff = aBytes[index] - bBytes[index];\n if (diff !== 0) {\n return diff;\n }\n }\n\n return aBytes.length - bBytes.length;\n}\n\nfunction getBytes(scVal: xdr.ScVal): Uint8Array {\n const xdrValue = scVal.toXDR();\n\n // In browsers, toXDR may already return a Uint8Array (Buffer is a Uint8Array subclass in Node).\n if (xdrValue instanceof Uint8Array) {\n return xdrValue;\n }\n\n // Handle array-like objects (e.g., Buffer in Node.js)\n const arrayLike = xdrValue as ArrayLike<number>;\n const result = new Uint8Array(arrayLike.length);\n for (let index = 0; index < arrayLike.length; index += 1) {\n result[index] = arrayLike[index];\n }\n return result;\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport { isEnumValue, type FunctionParameter } from '@openzeppelin/ui-types';\n\nimport { convertStellarTypeToScValType } from '../../utils/formatting';\nimport { convertEnumToScVal } from '../../utils/input-parsing';\nimport { isPrimitiveParamType } from '../../utils/stellar-types';\nimport { isBytesNType, isLikelyEnumType } from '../../utils/type-detection';\nimport { compareScValsByXdr } from '../../utils/xdr-ordering';\nimport { parseGenericType } from './generic-parser';\nimport { parsePrimitive } from './primitive-parser';\nimport { convertStructToScVal, isStructType } from './struct-parser';\nimport type { SorobanEnumValue } from './types';\n\n// FunctionParameter already includes enumMetadata in its type definition (from @openzeppelin/ui-types)\n// No need for a separate type wrapper\ntype EnumAwareFunctionParameter = FunctionParameter;\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 // Helper: detect SorobanArgumentValue wrapper { type, value }\n const isTypedWrapper = (v: unknown): v is { type: string; value: unknown } =>\n !!v &&\n typeof v === 'object' &&\n 'type' in (v as Record<string, unknown>) &&\n 'value' in (v as Record<string, unknown>);\n\n const enumMetadata = (paramSchema as EnumAwareFunctionParameter | undefined)?.enumMetadata;\n const possibleEnumValue =\n typeof value === 'string' && (enumMetadata || isLikelyEnumType(parameterType))\n ? { tag: value }\n : value;\n\n if (!genericInfo) {\n // Integer-only enums (discriminant enums) → encode as u32 (matches Lab behavior)\n if (enumMetadata && enumMetadata.variants.every((v) => v.type === 'integer')) {\n // Derive numeric discriminant from name, tag, or numeric input\n let numericValue: number | undefined;\n if (typeof value === 'string') {\n const byName = enumMetadata.variants.find((v) => v.name === value);\n numericValue = byName?.value ?? Number(value);\n } else if (typeof value === 'number') {\n numericValue = value;\n } else if (isEnumValue(value)) {\n const byTag = enumMetadata.variants.find((v) => v.name === value.tag);\n numericValue = byTag?.value;\n }\n if (numericValue === undefined || Number.isNaN(numericValue)) {\n const validNames = enumMetadata.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Invalid integer enum value for ${parameterType}: ${String(value)}. Expected one of: ${validNames}`\n );\n }\n return nativeToScVal(numericValue, { type: 'u32' });\n }\n // If a typed wrapper is provided, convert directly using the wrapped type/value\n if (isTypedWrapper(possibleEnumValue)) {\n const wrapped = possibleEnumValue;\n const parsed = parsePrimitive(wrapped.value, wrapped.type);\n const finalVal = parsed !== null ? parsed : wrapped.value;\n const scValType = convertStellarTypeToScValType(wrapped.type);\n const typeHint = Array.isArray(scValType) ? scValType[0] : scValType;\n return nativeToScVal(finalVal, { type: typeHint });\n }\n\n // Check if this is an enum object (has 'tag' or 'enum' property)\n if (\n isEnumValue(possibleEnumValue) ||\n (typeof possibleEnumValue === 'object' &&\n possibleEnumValue !== null &&\n 'enum' in possibleEnumValue)\n ) {\n const enumValue = possibleEnumValue as { tag: string; values?: unknown[]; enum?: number };\n\n // Handle integer enums\n if ('enum' in enumValue && typeof enumValue.enum === 'number') {\n return nativeToScVal(enumValue.enum, { type: 'u32' });\n }\n\n // Handle tagged enums with metadata for proper type conversion\n const tagSymbol = nativeToScVal(enumValue.tag, { type: 'symbol' });\n\n if (!enumValue.values || enumValue.values.length === 0) {\n // Unit variant - ScVec containing single ScSymbol\n return xdr.ScVal.scvVec([tagSymbol]);\n }\n\n const payloadValues = enumValue.values as unknown[];\n\n // Tuple variant - convert each payload value with proper types\n let payloadScVals: xdr.ScVal[];\n // Use the variant type from EnumAwareFunctionParameter's enumMetadata\n type EnumVariant = NonNullable<\n EnumAwareFunctionParameter['enumMetadata']\n >['variants'][number];\n let variant: EnumVariant | undefined;\n\n if (enumMetadata) {\n variant = enumMetadata.variants.find((variantEntry) => variantEntry.name === enumValue.tag);\n if (!variant || !variant.payloadTypes) {\n // No variant metadata or payloadTypes - use convertEnumToScVal fallback\n return convertEnumToScVal(enumValue as SorobanEnumValue);\n }\n // Convert each payload value with its corresponding type\n // variant is guaranteed to be defined here due to the check above\n const payloadTypes = variant.payloadTypes;\n const payloadComponents = variant.payloadComponents;\n payloadScVals = payloadTypes.map((payloadType, index) => {\n const payloadSchema = payloadComponents?.[index]\n ? {\n name: `payload_${index}`,\n type: payloadType,\n components: payloadComponents[index],\n }\n : { name: `payload_${index}`, type: payloadType };\n\n const val = payloadValues[index];\n return valueToScVal(val, payloadType, payloadSchema, parseValue);\n });\n } else {\n // No enum metadata - use convertEnumToScVal fallback\n return convertEnumToScVal(enumValue as SorobanEnumValue);\n }\n\n // For single Tuple payload, wrap all payload ScVals in another ScVec\n // Example: Some((Address, i128)) → ScVec([Symbol(\"Some\"), ScVec([Address, I128])])\n if (variant?.isSingleTuplePayload) {\n const tuplePayloadVec = xdr.ScVal.scvVec(payloadScVals);\n return xdr.ScVal.scvVec([tagSymbol, tuplePayloadVec]);\n }\n\n // Return ScVec with tag symbol followed by payload values\n return xdr.ScVal.scvVec([tagSymbol, ...payloadScVals]);\n }\n\n // Check if this is a struct or tuple type\n // Accept array-shaped values for tuple-structs when schema components are provided\n if (\n Array.isArray(possibleEnumValue) &&\n paramSchema?.components &&\n paramSchema.components.length\n ) {\n // Runtime validation: ensure array length matches schema components\n if (possibleEnumValue.length !== paramSchema.components.length) {\n throw new Error(\n `Tuple-struct value length (${possibleEnumValue.length}) does not match schema components (${paramSchema.components.length}) for type ${parameterType}`\n );\n }\n return convertStructToScVal(\n possibleEnumValue as unknown as Record<string, unknown>,\n parameterType,\n paramSchema,\n parseValue,\n (innerValue, innerType, innerSchema) =>\n valueToScVal(innerValue, innerType, innerSchema, parseInnerValue)\n );\n }\n\n if (!isPrimitiveParamType(parameterType) && isStructType(value, parameterType)) {\n return convertStructToScVal(\n value as Record<string, unknown>,\n parameterType,\n paramSchema,\n parseValue,\n (innerValue, innerType, innerSchema) =>\n valueToScVal(innerValue, innerType, innerSchema, parseInnerValue)\n );\n }\n\n // Non-generic types - use existing logic\n if (parameterType === 'Bool' || parameterType === 'Bytes') {\n return nativeToScVal(value);\n }\n if (isBytesNType(parameterType)) {\n const match = parameterType.match(/^BytesN<(\\d+)>$/);\n if (!match) {\n throw new Error(`Invalid BytesN parameterType format: ${parameterType}`);\n }\n const expectedBytes = Number.parseInt(match[1], 10);\n const decoded = parsePrimitive(value, 'Bytes');\n const bytesValue = decoded instanceof Uint8Array ? decoded : (decoded ?? value);\n\n if (\n Number.isFinite(expectedBytes) &&\n bytesValue instanceof Uint8Array &&\n bytesValue.length !== expectedBytes\n ) {\n throw new Error(\n `BytesN value must be exactly ${expectedBytes} bytes, received ${bytesValue.length}`\n );\n }\n\n return nativeToScVal(bytesValue);\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 // For enum element types, we need to pass enum metadata\n // Check if paramSchema has enumMetadata or components that should be used for elements\n let elementSchema: FunctionParameter | undefined;\n if (enumMetadata) {\n // This Vec is of enum type - pass the enum metadata to each element\n elementSchema = {\n name: 'element',\n type: innerType,\n enumMetadata,\n } as EnumAwareFunctionParameter;\n } else if (paramSchema?.components) {\n // This Vec is of struct type - pass the components to each element\n elementSchema = {\n name: 'element',\n type: innerType,\n components: paramSchema.components,\n };\n }\n\n const convertedElements = value.map((element) =>\n valueToScVal(element, innerType, elementSchema, parseValue)\n );\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 mapEntries: xdr.ScMapEntry[] = [];\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 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 // Create ScVals for key and value\n const keyScValType = convertStellarTypeToScValType(entry[0].type);\n const keyTypeHint = Array.isArray(keyScValType) ? keyScValType[0] : keyScValType;\n const keyScVal = nativeToScVal(processedKey, { type: keyTypeHint });\n\n const valueScValType = convertStellarTypeToScValType(entry[1].type);\n const valueTypeHint = Array.isArray(valueScValType)\n ? valueScValType[0]\n : valueScValType;\n const valueScVal = nativeToScVal(processedValue, { type: valueTypeHint });\n\n mapEntries.push(\n new xdr.ScMapEntry({\n key: keyScVal,\n val: valueScVal,\n })\n );\n }\n );\n\n // Sort map entries by XDR-encoded keys (required by Soroban)\n const sortedMapEntries = mapEntries.sort((a, b) => compareScValsByXdr(a.key(), b.key()));\n return xdr.ScVal.scvMap(sortedMapEntries);\n }\n\n return nativeToScVal(value);\n }\n\n case 'Tuple': {\n if (!paramSchema?.components || paramSchema.components.length === 0) {\n throw new Error(\n `Tuple parameter \"${paramSchema?.name ?? 'unknown'}\" is missing component metadata`\n );\n }\n\n const tupleComponents = paramSchema.components;\n const tupleValues: xdr.ScVal[] = [];\n\n tupleComponents.forEach((component, index) => {\n const key = component.name ?? `item_${index}`;\n let elementValue: unknown;\n\n if (Array.isArray(value)) {\n elementValue = value[index];\n } else if (value && typeof value === 'object') {\n elementValue = (value as Record<string, unknown>)[key];\n }\n\n if (typeof elementValue === 'undefined') {\n const expectedTypes = tupleComponents.map((c) => c.type).join(', ');\n throw new Error(\n `Missing tuple value for \"${key}\" in parameter \"${paramSchema.name ?? 'unknown'}\". Expected ${tupleComponents.length} values of types [${expectedTypes}] but received: ${JSON.stringify(value)}`\n );\n }\n\n if (typeof elementValue === 'string' && isLikelyEnumType(component.type)) {\n elementValue = { tag: elementValue };\n }\n\n tupleValues.push(valueToScVal(elementValue, component.type, component, parseInnerValue));\n });\n\n return xdr.ScVal.scvVec(tupleValues);\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 let innerSchema: FunctionParameter | undefined;\n if (enumMetadata) {\n innerSchema = {\n name: 'inner',\n type: innerType,\n ...({ enumMetadata } as unknown as Record<string, unknown>),\n } as unknown as FunctionParameter;\n } else if (paramSchema?.components) {\n innerSchema = {\n name: 'inner',\n type: innerType,\n components: paramSchema.components,\n };\n }\n return valueToScVal(value, innerType, innerSchema, parseInnerValue);\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","/**\n * Set of primitive Stellar/Soroban parameter types.\n * These types do not have nested components and can be directly serialized.\n *\n * Used to distinguish primitive types from complex types (structs, enums, tuples, maps, vecs)\n * when processing parameters for serialization and validation.\n */\nexport const PRIMITIVE_STELLAR_TYPES = new Set([\n 'Bool',\n 'ScString',\n 'ScSymbol',\n 'Address',\n 'Bytes',\n 'U8',\n 'U16',\n 'U32',\n 'U64',\n 'U128',\n 'U256',\n 'I8',\n 'I16',\n 'I32',\n 'I64',\n 'I128',\n 'I256',\n]);\n\n/**\n * Check if a Stellar type is a primitive type.\n * @param type - The Stellar type to check\n * @returns True if the type is primitive, false otherwise\n */\nexport function isPrimitiveParamType(type: string): boolean {\n return PRIMITIVE_STELLAR_TYPES.has(type);\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport { isEnumValue, type FunctionParameter } from '@openzeppelin/ui-types';\nimport { isPlainObject, logger } from '@openzeppelin/ui-utils';\n\nimport { convertStellarTypeToScValType } from '../../utils/formatting';\nimport { isLikelyEnumType } from '../../utils/type-detection';\nimport { compareScValsByXdr } from '../../utils/xdr-ordering';\nimport { parseGenericType } from './generic-parser';\n\nconst SYSTEM_LOG_TAG = 'StructParser';\n\nfunction isTupleStructSchema(schema: FunctionParameter | undefined): boolean {\n if (!schema?.components || schema.components.length === 0) {\n return false;\n }\n\n return schema.components.every((component, index) => component.name === index.toString());\n}\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 * @param convertToScVal - Optional function to recursively convert values to ScVal (for tuple structs)\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 convertToScVal?: (\n value: unknown,\n type: string,\n schema?: FunctionParameter,\n parseValue?: (val: unknown, type: string) => unknown\n ) => xdr.ScVal\n): xdr.ScVal {\n // Laboratory-style struct conversion with proper type hint handling\n\n // Check if this is a tuple struct (numeric field names like \"0\", \"1\", \"2\")\n // Tuple structs in Soroban need to be serialized as vectors, not maps\n if (isTupleStructSchema(paramSchema) && paramSchema && convertToScVal) {\n const tupleValues = paramSchema.components!.map((component, index) => {\n const key = component.name ?? index.toString();\n let elementValue = structObj[key];\n\n if (typeof elementValue === 'undefined') {\n throw new Error(\n `Missing tuple value for \"${key}\" in struct type \"${parameterType}\". Received: ${JSON.stringify(structObj)}`\n );\n }\n\n // If the element is a string and its type is likely an enum, wrap it as { tag: value }\n if (typeof elementValue === 'string' && isLikelyEnumType(component.type)) {\n elementValue = { tag: elementValue };\n }\n\n return convertToScVal(elementValue, component.type, component, parseInnerValue);\n });\n\n return xdr.ScVal.scvVec(tupleValues);\n }\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 if (typeof parsedValue === 'string' && isLikelyEnumType(fieldType)) {\n parsedValue = { tag: parsedValue };\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 // Check if this is a Vec or other generic type that needs special handling\n if (convertToScVal && (fieldType.startsWith('Vec<') || isEnumValue(parsedValue))) {\n const fieldSchema = paramSchema?.components?.find((c) => c.name === fieldName);\n // Use valueToScVal for Vec and enum fields to ensure proper conversion\n convertedValue[fieldName] = convertToScVal(\n parsedValue,\n fieldType,\n fieldSchema,\n parseInnerValue\n );\n typeHints[fieldName] = ['symbol', 'scval'];\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 }\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 // Check if any fields are enums that need special conversion\n const hasEnumFields = paramSchema?.components?.some((comp) => {\n const fieldValue = convertedValue[comp.name];\n return isEnumValue(fieldValue);\n });\n\n let scVal: xdr.ScVal;\n\n if (hasEnumFields && convertToScVal && paramSchema?.components) {\n // Manually build the ScMap with proper enum conversion\n const mapEntries: xdr.ScMapEntry[] = [];\n\n for (const fieldSchema of paramSchema.components) {\n const fieldName = fieldSchema.name;\n const fieldValue = convertedValue[fieldName];\n\n // Create key\n const keyScVal = nativeToScVal(fieldName, { type: 'symbol' });\n\n // Create value - check if it's an enum\n let valueScVal: xdr.ScVal;\n if (isEnumValue(fieldValue)) {\n valueScVal = convertToScVal(fieldValue, fieldSchema.type, fieldSchema, parseInnerValue);\n } else {\n // Use nativeToScVal for non-enum fields\n const fieldTypeHint = typeHints[fieldName];\n if (fieldTypeHint && Array.isArray(fieldTypeHint) && fieldTypeHint.length > 1) {\n valueScVal = nativeToScVal(fieldValue, { type: fieldTypeHint[1] });\n } else {\n valueScVal = nativeToScVal(fieldValue);\n }\n }\n\n mapEntries.push(\n new xdr.ScMapEntry({\n key: keyScVal,\n val: valueScVal,\n })\n );\n }\n\n // Sort map entries by XDR-encoded keys (required by Soroban)\n const sortedMapEntries = mapEntries.sort((a, b) => compareScValsByXdr(a.key(), b.key()));\n\n scVal = xdr.ScVal.scvMap(sortedMapEntries);\n } else {\n scVal = nativeToScVal(convertedValue, { type: typeHints });\n }\n\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/ui-types';\nimport { bytesToHex, logger } from '@openzeppelin/ui-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/ui-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","/**\n * Stellar Access Control Service\n *\n * Implements the AccessControlService interface for Stellar (Soroban) contracts.\n * Provides methods to inspect and manage access control (Ownable/AccessControl) on contracts.\n */\n\nimport type {\n AccessControlCapabilities,\n AccessControlService,\n AccessSnapshot,\n AdminInfo,\n ContractSchema,\n EnrichedRoleAssignment,\n EnrichedRoleMember,\n ExecutionConfig,\n HistoryQueryOptions,\n OperationResult,\n OwnershipInfo,\n PaginatedHistoryResult,\n RoleAssignment,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n} from '@openzeppelin/ui-types';\nimport { ConfigurationInvalid, OperationFailed } from '@openzeppelin/ui-types';\nimport { logger, validateSnapshot } from '@openzeppelin/ui-utils';\n\nimport { signAndBroadcastStellarTransaction } from '../transaction/sender';\nimport {\n assembleAcceptAdminTransferAction,\n assembleAcceptOwnershipAction,\n assembleGrantRoleAction,\n assembleRevokeRoleAction,\n assembleTransferAdminRoleAction,\n assembleTransferOwnershipAction,\n} from './actions';\nimport { detectAccessControlCapabilities } from './feature-detection';\nimport { createIndexerClient, StellarIndexerClient } from './indexer-client';\nimport { getAdmin, getCurrentLedger, readCurrentRoles, readOwnership } from './onchain-reader';\nimport {\n validateAccountAddress,\n validateAddress,\n validateContractAddress,\n validateExpirationLedger,\n validateRoleIds,\n} from './validation';\n\n/**\n * Context for Stellar Access Control operations\n * Stores contract schema and role information for a specific contract\n */\ninterface StellarAccessControlContext {\n contractSchema: ContractSchema;\n /** Role IDs explicitly provided via registerContract() */\n knownRoleIds?: string[];\n /** Role IDs discovered via indexer query (cached) */\n discoveredRoleIds?: string[];\n /** Flag to prevent repeated discovery attempts when indexer is unavailable */\n roleDiscoveryAttempted?: boolean;\n}\n\n/**\n * Stellar implementation of AccessControlService\n */\nexport class StellarAccessControlService implements AccessControlService {\n private readonly contractContexts = new Map<string, StellarAccessControlContext>();\n private readonly indexerClient: StellarIndexerClient;\n\n constructor(private readonly networkConfig: StellarNetworkConfig) {\n this.indexerClient = createIndexerClient(networkConfig);\n }\n\n /**\n * Registers a contract with its schema and known roles\n *\n * @param contractAddress The contract address\n * @param contractSchema The contract schema (required for capability detection)\n * @param knownRoleIds Optional array of known role identifiers\n * @throws ConfigurationInvalid if the contract address or role IDs are invalid\n */\n registerContract(\n contractAddress: string,\n contractSchema: ContractSchema,\n knownRoleIds?: string[]\n ): void {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n // Validate and deduplicate role IDs if provided\n const validatedRoleIds = knownRoleIds ? validateRoleIds(knownRoleIds) : undefined;\n\n this.contractContexts.set(contractAddress, {\n contractSchema,\n knownRoleIds: validatedRoleIds,\n });\n\n logger.debug('StellarAccessControlService.registerContract', `Registered ${contractAddress}`, {\n roleCount: validatedRoleIds?.length || 0,\n });\n }\n\n /**\n * Adds additional known role IDs to a registered contract\n *\n * This method allows consumers to manually add role IDs that may not have been\n * discovered via the indexer (e.g., newly created roles that haven't been granted yet).\n * Role IDs are validated and deduplicated before being added.\n *\n * @param contractAddress The contract address\n * @param roleIds Array of role identifiers to add\n * @throws ConfigurationInvalid if the contract address is invalid, contract not registered, or role IDs are invalid\n * @returns The updated array of all known role IDs for the contract\n */\n addKnownRoleIds(contractAddress: string, roleIds: string[]): string[] {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n const context = this.contractContexts.get(contractAddress);\n if (!context) {\n throw new ConfigurationInvalid(\n 'Contract not registered. Call registerContract() first.',\n contractAddress,\n 'contractAddress'\n );\n }\n\n // Validate the new role IDs\n const validatedNewRoleIds = validateRoleIds(roleIds);\n\n if (validatedNewRoleIds.length === 0) {\n logger.debug(\n 'StellarAccessControlService.addKnownRoleIds',\n `No valid role IDs to add for ${contractAddress}`\n );\n return context.knownRoleIds || context.discoveredRoleIds || [];\n }\n\n // Merge with existing role IDs (prioritize knownRoleIds over discoveredRoleIds)\n const existingRoleIds = context.knownRoleIds || context.discoveredRoleIds || [];\n const mergedRoleIds = [...new Set([...existingRoleIds, ...validatedNewRoleIds])];\n\n // Update the context - always store as knownRoleIds since user is explicitly providing them\n context.knownRoleIds = mergedRoleIds;\n\n logger.info(\n 'StellarAccessControlService.addKnownRoleIds',\n `Added ${validatedNewRoleIds.length} role ID(s) for ${contractAddress}`,\n {\n added: validatedNewRoleIds,\n total: mergedRoleIds.length,\n }\n );\n\n return mergedRoleIds;\n }\n\n /**\n * Gets the access control capabilities of a contract\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to capabilities\n * @throws ConfigurationInvalid if the contract address is invalid or contract not registered\n */\n async getCapabilities(contractAddress: string): Promise<AccessControlCapabilities> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getCapabilities',\n `Detecting capabilities for ${contractAddress}`\n );\n\n const context = this.contractContexts.get(contractAddress);\n if (!context) {\n throw new ConfigurationInvalid(\n 'Contract not registered. Call registerContract() first.',\n contractAddress,\n 'contractAddress'\n );\n }\n\n // Check if indexer is configured\n const indexerAvailable = await this.indexerClient.checkAvailability();\n\n const capabilities = detectAccessControlCapabilities(context.contractSchema, indexerAvailable);\n\n logger.debug('StellarAccessControlService.getCapabilities', 'Detected capabilities:', {\n hasOwnable: capabilities.hasOwnable,\n hasAccessControl: capabilities.hasAccessControl,\n hasEnumerableRoles: capabilities.hasEnumerableRoles,\n supportsHistory: capabilities.supportsHistory,\n verifiedAgainstOZInterfaces: capabilities.verifiedAgainstOZInterfaces,\n });\n\n return capabilities;\n }\n\n /**\n * Gets the current owner and ownership state of an Ownable contract\n *\n * Retrieves the current owner via on-chain query, then checks for pending\n * two-step transfers via indexer to determine the ownership state:\n * - 'owned': Has owner, no pending transfer\n * - 'pending': Has owner, pending transfer not yet expired\n * - 'expired': Has owner, pending transfer has expired\n * - 'renounced': No owner (null)\n *\n * Gracefully degrades when indexer is unavailable, returning basic ownership\n * info with 'owned' state and logging a warning.\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to ownership information with state\n * @throws ConfigurationInvalid if the contract address is invalid\n *\n * @example\n * ```typescript\n * const ownership = await service.getOwnership(contractAddress);\n *\n * console.log('Owner:', ownership.owner);\n * console.log('State:', ownership.state); // 'owned' | 'pending' | 'expired' | 'renounced'\n *\n * if (ownership.state === 'pending' && ownership.pendingTransfer) {\n * console.log('Pending owner:', ownership.pendingTransfer.pendingOwner);\n * console.log('Expires at ledger:', ownership.pendingTransfer.expirationBlock);\n * }\n * ```\n */\n async getOwnership(contractAddress: string): Promise<OwnershipInfo> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n // T025: INFO logging for ownership queries per NFR-004\n logger.info(\n 'StellarAccessControlService.getOwnership',\n `Reading ownership status for ${contractAddress}`\n );\n\n // T020: Call get_owner() for current owner\n const basicOwnership = await readOwnership(contractAddress, this.networkConfig);\n\n // T018/T023: Renounced state - owner is null\n if (basicOwnership.owner === null) {\n logger.debug(\n 'StellarAccessControlService.getOwnership',\n `Contract ${contractAddress} has renounced ownership`\n );\n return {\n owner: null,\n state: 'renounced',\n };\n }\n\n // T024/T019: Check indexer availability for pending transfer detection\n const indexerAvailable = await this.indexerClient.checkAvailability();\n\n if (!indexerAvailable) {\n // T026: WARN logging for indexer unavailability per NFR-006\n logger.warn(\n 'StellarAccessControlService.getOwnership',\n `Indexer unavailable for ${this.networkConfig.id}: pending transfer status cannot be determined`\n );\n // T024: Graceful degradation - return basic ownership with 'owned' state\n return {\n owner: basicOwnership.owner,\n state: 'owned',\n };\n }\n\n // T021: Query indexer for pending transfer (includes liveUntilLedger)\n let pendingTransfer;\n try {\n pendingTransfer = await this.indexerClient.queryPendingOwnershipTransfer(contractAddress);\n } catch (error) {\n // T026: Graceful degradation on indexer query error\n logger.warn(\n 'StellarAccessControlService.getOwnership',\n `Failed to query pending transfer: ${error instanceof Error ? error.message : String(error)}`\n );\n return {\n owner: basicOwnership.owner,\n state: 'owned',\n };\n }\n\n // T015/T023: No pending transfer in indexer - state is 'owned'\n if (!pendingTransfer) {\n logger.debug(\n 'StellarAccessControlService.getOwnership',\n `Contract ${contractAddress} has owner with no pending transfer`\n );\n return {\n owner: basicOwnership.owner,\n state: 'owned',\n };\n }\n\n // T022: Get current ledger to check expiration\n let currentLedger: number;\n try {\n currentLedger = await getCurrentLedger(this.networkConfig);\n } catch (error) {\n // Graceful degradation if ledger query fails\n logger.warn(\n 'StellarAccessControlService.getOwnership',\n `Failed to get current ledger: ${error instanceof Error ? error.message : String(error)}`\n );\n // Return owned state since we can't determine expiration\n return {\n owner: basicOwnership.owner,\n state: 'owned',\n };\n }\n\n // Use indexer's liveUntilLedger for expiration check\n const liveUntilLedger = pendingTransfer.liveUntilLedger;\n\n // T022/T023: Determine state based on expiration\n // Per FR-020: expirationLedger must be > currentLedger, so >= means expired\n const isExpired = currentLedger >= liveUntilLedger;\n\n // Build pending transfer info for the response\n const pendingTransferInfo = {\n pendingOwner: pendingTransfer.pendingOwner,\n expirationBlock: liveUntilLedger,\n initiatedAt: pendingTransfer.timestamp,\n initiatedTxId: pendingTransfer.txHash,\n initiatedBlock: pendingTransfer.ledger,\n };\n\n if (isExpired) {\n // T017/T023: Expired state\n logger.debug(\n 'StellarAccessControlService.getOwnership',\n `Contract ${contractAddress} has expired pending transfer (current: ${currentLedger}, expiration: ${liveUntilLedger})`\n );\n return {\n owner: basicOwnership.owner,\n state: 'expired',\n pendingTransfer: pendingTransferInfo,\n };\n }\n\n // T016/T023: Pending state\n logger.debug(\n 'StellarAccessControlService.getOwnership',\n `Contract ${contractAddress} has pending transfer to ${pendingTransfer.pendingOwner} (expires at ledger ${liveUntilLedger})`\n );\n return {\n owner: basicOwnership.owner,\n state: 'pending',\n pendingTransfer: pendingTransferInfo,\n };\n }\n\n /**\n * Gets current role assignments for a contract\n *\n * Uses the known role IDs registered with the contract. If no role IDs were provided\n * via registerContract(), attempts to discover them dynamically via the indexer.\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to array of role assignments\n * @throws ConfigurationInvalid if the contract address is invalid or contract not registered\n */\n async getCurrentRoles(contractAddress: string): Promise<RoleAssignment[]> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getCurrentRoles',\n `Reading roles for ${contractAddress}`\n );\n\n const context = this.contractContexts.get(contractAddress);\n if (!context) {\n throw new ConfigurationInvalid(\n 'Contract not registered. Call registerContract() first.',\n contractAddress,\n 'contractAddress'\n );\n }\n\n // Use known role IDs if provided, otherwise attempt discovery\n let roleIds = context.knownRoleIds || [];\n\n if (roleIds.length === 0) {\n // Attempt to discover roles via indexer\n logger.debug(\n 'StellarAccessControlService.getCurrentRoles',\n 'No role IDs provided, attempting discovery via indexer'\n );\n roleIds = await this.discoverKnownRoleIds(contractAddress);\n }\n\n if (roleIds.length === 0) {\n logger.warn(\n 'StellarAccessControlService.getCurrentRoles',\n 'No role IDs available (neither provided nor discoverable), returning empty array'\n );\n return [];\n }\n\n return readCurrentRoles(contractAddress, roleIds, this.networkConfig);\n }\n\n /**\n * Gets current role assignments with enriched member information including grant timestamps\n *\n * This method returns role assignments with detailed metadata about when each member\n * was granted the role. If the indexer is unavailable, it gracefully degrades to\n * returning members without timestamp information.\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to array of enriched role assignments\n * @throws ConfigurationInvalid if the contract address is invalid or contract not registered\n */\n async getCurrentRolesEnriched(contractAddress: string): Promise<EnrichedRoleAssignment[]> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getCurrentRolesEnriched',\n `Reading enriched roles for ${contractAddress}`\n );\n\n // First, get the current role assignments via on-chain queries\n const currentRoles = await this.getCurrentRoles(contractAddress);\n\n if (currentRoles.length === 0) {\n return [];\n }\n\n // Check indexer availability for enrichment\n const indexerAvailable = await this.indexerClient.checkAvailability();\n\n if (!indexerAvailable) {\n logger.debug(\n 'StellarAccessControlService.getCurrentRolesEnriched',\n 'Indexer not available, returning roles without timestamps'\n );\n // Graceful degradation: return enriched structure without timestamps\n return this.convertToEnrichedWithoutTimestamps(currentRoles);\n }\n\n // Enrich all roles in parallel for improved performance\n const enrichmentPromises = currentRoles.map(async (roleAssignment) => {\n const enrichedMembers = await this.enrichMembersWithGrantInfo(\n contractAddress,\n roleAssignment.role.id,\n roleAssignment.members\n );\n\n return {\n role: roleAssignment.role,\n members: enrichedMembers,\n };\n });\n\n const enrichedAssignments = await Promise.all(enrichmentPromises);\n\n logger.debug(\n 'StellarAccessControlService.getCurrentRolesEnriched',\n `Enriched ${enrichedAssignments.length} role(s) with grant timestamps`\n );\n\n return enrichedAssignments;\n }\n\n /**\n * Converts standard role assignments to enriched format without timestamps\n * Used when indexer is unavailable (graceful degradation)\n */\n private convertToEnrichedWithoutTimestamps(\n roleAssignments: RoleAssignment[]\n ): EnrichedRoleAssignment[] {\n return roleAssignments.map((assignment) => ({\n role: assignment.role,\n members: assignment.members.map((address) => ({\n address,\n // Timestamps are undefined when indexer is unavailable\n })),\n }));\n }\n\n /**\n * Enriches member addresses with grant information from the indexer\n */\n private async enrichMembersWithGrantInfo(\n contractAddress: string,\n roleId: string,\n memberAddresses: string[]\n ): Promise<EnrichedRoleMember[]> {\n if (memberAddresses.length === 0) {\n return [];\n }\n\n try {\n // Query indexer for grant information\n const grantInfoMap = await this.indexerClient.queryLatestGrants(\n contractAddress,\n roleId,\n memberAddresses\n );\n\n // Build enriched members, using grant info when available\n return memberAddresses.map((address) => {\n const grantInfo = grantInfoMap.get(address);\n if (grantInfo) {\n return {\n address,\n grantedAt: grantInfo.timestamp,\n grantedTxId: grantInfo.txId,\n grantedLedger: grantInfo.ledger,\n };\n }\n // No grant info found (shouldn't happen for current members, but handle gracefully)\n return { address };\n });\n } catch (error) {\n logger.warn(\n 'StellarAccessControlService.enrichMembersWithGrantInfo',\n `Failed to fetch grant info for role ${roleId}, returning members without timestamps: ${error instanceof Error ? error.message : String(error)}`\n );\n // Graceful degradation on error\n return memberAddresses.map((address) => ({ address }));\n }\n }\n\n /**\n * Grants a role to an account\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier\n * @param account The account to grant the role to\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result\n * @throws ConfigurationInvalid if addresses are invalid\n */\n async grantRole(\n contractAddress: string,\n roleId: string,\n account: string,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate addresses\n validateContractAddress(contractAddress);\n validateAccountAddress(account, 'account');\n\n logger.info(\n 'StellarAccessControlService.grantRole',\n `Granting role ${roleId} to ${account} on ${contractAddress}`\n );\n\n // Assemble the transaction data\n const txData = assembleGrantRoleAction(contractAddress, roleId, account);\n\n logger.debug('StellarAccessControlService.grantRole', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n argTypes: txData.argTypes,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info('StellarAccessControlService.grantRole', `Role granted. TxHash: ${result.txHash}`);\n\n return { id: result.txHash };\n }\n\n /**\n * Revokes a role from an account\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier\n * @param account The account to revoke the role from\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result\n * @throws ConfigurationInvalid if addresses are invalid\n */\n async revokeRole(\n contractAddress: string,\n roleId: string,\n account: string,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate addresses\n validateContractAddress(contractAddress);\n validateAccountAddress(account, 'account');\n\n logger.info(\n 'StellarAccessControlService.revokeRole',\n `Revoking role ${roleId} from ${account} on ${contractAddress}`\n );\n\n // Assemble the transaction data\n const txData = assembleRevokeRoleAction(contractAddress, roleId, account);\n\n logger.debug('StellarAccessControlService.revokeRole', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n argTypes: txData.argTypes,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info('StellarAccessControlService.revokeRole', `Role revoked. TxHash: ${result.txHash}`);\n\n return { id: result.txHash };\n }\n\n /**\n * Transfers ownership of the contract using two-step transfer\n *\n * Initiates a two-step ownership transfer with an expiration ledger.\n * The pending owner must call acceptOwnership() before the expiration\n * ledger to complete the transfer.\n *\n * @param contractAddress The contract address\n * @param newOwner The new owner address (pending owner)\n * @param expirationLedger The ledger sequence by which the transfer must be accepted\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result with transaction ID\n * @throws ConfigurationInvalid if addresses are invalid or expiration is invalid\n *\n * @example\n * ```typescript\n * // Calculate expiration ~12 hours from now (Stellar ledgers advance ~5s each)\n * const currentLedger = await getCurrentLedger(networkConfig);\n * const expirationLedger = currentLedger + 8640; // 12 * 60 * 60 / 5\n *\n * const result = await service.transferOwnership(\n * contractAddress,\n * newOwnerAddress,\n * expirationLedger,\n * executionConfig\n * );\n * console.log('Transfer initiated, txHash:', result.id);\n * ```\n */\n async transferOwnership(\n contractAddress: string,\n newOwner: string,\n expirationLedger: number,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate addresses\n // newOwner can be either an account address (G...) or contract address (C...)\n validateContractAddress(contractAddress);\n validateAddress(newOwner, 'newOwner');\n\n // T037: INFO logging for transfer initiation per NFR-004\n logger.info(\n 'StellarAccessControlService.transferOwnership',\n `Initiating two-step ownership transfer to ${newOwner} on ${contractAddress} with expiration at ledger ${expirationLedger}`\n );\n\n // T034/T035: Client-side expiration validation (must be > current ledger)\n const currentLedger = await getCurrentLedger(this.networkConfig);\n const validationResult = validateExpirationLedger(expirationLedger, currentLedger);\n\n if (!validationResult.valid) {\n // T036: Specific error messages per FR-018\n throw new ConfigurationInvalid(\n validationResult.error ||\n `Expiration ledger ${expirationLedger} must be strictly greater than current ledger ${currentLedger}.`,\n String(expirationLedger),\n 'expirationLedger'\n );\n }\n\n // Assemble the transaction data with live_until_ledger parameter\n const txData = assembleTransferOwnershipAction(contractAddress, newOwner, expirationLedger);\n\n logger.debug('StellarAccessControlService.transferOwnership', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n argTypes: txData.argTypes,\n expirationLedger,\n currentLedger,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info(\n 'StellarAccessControlService.transferOwnership',\n `Ownership transfer initiated. TxHash: ${result.txHash}, pending owner: ${newOwner}, expires at ledger: ${expirationLedger}`\n );\n\n return { id: result.txHash };\n }\n\n /**\n * Accepts a pending ownership transfer (two-step transfer)\n *\n * Must be called by the pending owner (the address specified in transferOwnership)\n * before the expiration ledger. The on-chain contract validates:\n * 1. Caller is the pending owner\n * 2. Transfer has not expired\n *\n * @param contractAddress The contract address\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result with transaction ID\n * @throws ConfigurationInvalid if contract address is invalid\n * @throws OperationFailed if on-chain rejection (expired or unauthorized)\n *\n * @example\n * ```typescript\n * // Check ownership state before accepting\n * const ownership = await service.getOwnership(contractAddress);\n * if (ownership.state === 'pending') {\n * const result = await service.acceptOwnership(contractAddress, executionConfig);\n * console.log('Ownership accepted, txHash:', result.id);\n * }\n * ```\n */\n async acceptOwnership(\n contractAddress: string,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n // T047: INFO logging for acceptance operations per NFR-004\n logger.info(\n 'StellarAccessControlService.acceptOwnership',\n `Accepting pending ownership transfer for ${contractAddress}`\n );\n\n // T045: Per spec clarification, expiration is enforced on-chain\n // No pre-check required - the contract will reject if expired or caller is not pending owner\n\n // T043: Assemble the accept_ownership transaction data\n const txData = assembleAcceptOwnershipAction(contractAddress);\n\n logger.debug('StellarAccessControlService.acceptOwnership', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info(\n 'StellarAccessControlService.acceptOwnership',\n `Ownership transfer accepted. TxHash: ${result.txHash}`\n );\n\n return { id: result.txHash };\n }\n\n /**\n * Gets the current admin and admin transfer state of an AccessControl contract\n *\n * Retrieves the current admin via on-chain query, then checks for pending\n * two-step admin transfers via indexer to determine the admin state:\n * - 'active': Has admin, no pending transfer\n * - 'pending': Has admin, pending transfer not yet expired\n * - 'expired': Has admin, pending transfer has expired\n * - 'renounced': No admin (null)\n *\n * Gracefully degrades when indexer is unavailable, returning basic admin\n * info with 'active' state and logging a warning.\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to admin information with state\n * @throws ConfigurationInvalid if the contract address is invalid\n *\n * @example\n * ```typescript\n * const adminInfo = await service.getAdminInfo(contractAddress);\n * console.log('Admin:', adminInfo.admin);\n * console.log('State:', adminInfo.state); // 'active' | 'pending' | 'expired' | 'renounced'\n *\n * if (adminInfo.state === 'pending' && adminInfo.pendingTransfer) {\n * console.log('Pending admin:', adminInfo.pendingTransfer.pendingAdmin);\n * console.log('Expires at ledger:', adminInfo.pendingTransfer.expirationBlock);\n * }\n * ```\n */\n async getAdminInfo(contractAddress: string): Promise<AdminInfo> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getAdminInfo',\n `Reading admin status for ${contractAddress}`\n );\n\n // Call get_admin() for current admin\n const currentAdmin = await getAdmin(contractAddress, this.networkConfig);\n\n // Renounced state - admin is null\n if (currentAdmin === null) {\n logger.debug(\n 'StellarAccessControlService.getAdminInfo',\n `Contract ${contractAddress} has renounced admin`\n );\n return {\n admin: null,\n state: 'renounced',\n };\n }\n\n // Check indexer availability for pending transfer detection\n const indexerAvailable = await this.indexerClient.checkAvailability();\n\n if (!indexerAvailable) {\n logger.warn(\n 'StellarAccessControlService.getAdminInfo',\n `Indexer unavailable for ${this.networkConfig.id}: pending admin transfer status cannot be determined`\n );\n // Graceful degradation - return basic admin with 'active' state\n return {\n admin: currentAdmin,\n state: 'active',\n };\n }\n\n // Query indexer for pending admin transfer\n let pendingTransfer;\n try {\n pendingTransfer = await this.indexerClient.queryPendingAdminTransfer(contractAddress);\n } catch (error) {\n // Graceful degradation on indexer query error\n logger.warn(\n 'StellarAccessControlService.getAdminInfo',\n `Failed to query pending admin transfer: ${error instanceof Error ? error.message : String(error)}`\n );\n return {\n admin: currentAdmin,\n state: 'active',\n };\n }\n\n // No pending transfer in indexer - state is 'active'\n if (!pendingTransfer) {\n logger.debug(\n 'StellarAccessControlService.getAdminInfo',\n `Contract ${contractAddress} has admin with no pending transfer`\n );\n return {\n admin: currentAdmin,\n state: 'active',\n };\n }\n\n // Get current ledger to check expiration\n let currentLedger: number;\n try {\n currentLedger = await getCurrentLedger(this.networkConfig);\n } catch (error) {\n // Graceful degradation if ledger query fails\n logger.warn(\n 'StellarAccessControlService.getAdminInfo',\n `Failed to get current ledger: ${error instanceof Error ? error.message : String(error)}`\n );\n // Return active state since we can't determine expiration\n return {\n admin: currentAdmin,\n state: 'active',\n };\n }\n\n // Use indexer's liveUntilLedger for expiration check\n const liveUntilLedger = pendingTransfer.liveUntilLedger;\n\n // Determine state based on expiration\n // expirationLedger must be > currentLedger, so >= means expired\n const isExpired = currentLedger >= liveUntilLedger;\n\n // Build pending transfer info for the response\n const pendingTransferInfo = {\n pendingAdmin: pendingTransfer.pendingAdmin,\n expirationBlock: liveUntilLedger,\n initiatedAt: pendingTransfer.timestamp,\n initiatedTxId: pendingTransfer.txHash,\n initiatedBlock: pendingTransfer.ledger,\n };\n\n if (isExpired) {\n // Expired state\n logger.debug(\n 'StellarAccessControlService.getAdminInfo',\n `Contract ${contractAddress} has expired pending admin transfer (current: ${currentLedger}, expiration: ${liveUntilLedger})`\n );\n return {\n admin: currentAdmin,\n state: 'expired',\n pendingTransfer: pendingTransferInfo,\n };\n }\n\n // Pending state\n logger.debug(\n 'StellarAccessControlService.getAdminInfo',\n `Contract ${contractAddress} has pending admin transfer to ${pendingTransfer.pendingAdmin} (expires at ledger ${liveUntilLedger})`\n );\n return {\n admin: currentAdmin,\n state: 'pending',\n pendingTransfer: pendingTransferInfo,\n };\n }\n\n /**\n * Initiates an admin role transfer using two-step transfer\n *\n * Initiates a two-step admin transfer with an expiration ledger.\n * The pending admin must call acceptAdminTransfer() before the expiration\n * ledger to complete the transfer.\n *\n * @param contractAddress The contract address\n * @param newAdmin The new admin address (pending admin)\n * @param expirationLedger The ledger sequence by which the transfer must be accepted\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result with transaction ID\n * @throws ConfigurationInvalid if addresses are invalid or expiration is invalid\n *\n * @example\n * ```typescript\n * // Calculate expiration ~12 hours from now (Stellar ledgers advance ~5s each)\n * const currentLedger = await getCurrentLedger(networkConfig);\n * const expirationLedger = currentLedger + 8640; // 12 * 60 * 60 / 5\n *\n * const result = await service.transferAdminRole(\n * contractAddress,\n * newAdminAddress,\n * expirationLedger,\n * executionConfig\n * );\n * console.log('Admin transfer initiated, txHash:', result.id);\n * ```\n */\n async transferAdminRole(\n contractAddress: string,\n newAdmin: string,\n expirationLedger: number,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate addresses\n // newAdmin can be either an account address (G...) or contract address (C...)\n validateContractAddress(contractAddress);\n validateAddress(newAdmin, 'newAdmin');\n\n logger.info(\n 'StellarAccessControlService.transferAdminRole',\n `Initiating two-step admin transfer to ${newAdmin} on ${contractAddress} with expiration at ledger ${expirationLedger}`\n );\n\n // Client-side expiration validation (must be > current ledger)\n const currentLedger = await getCurrentLedger(this.networkConfig);\n const validationResult = validateExpirationLedger(expirationLedger, currentLedger);\n\n if (!validationResult.valid) {\n throw new ConfigurationInvalid(\n validationResult.error ||\n `Expiration ledger ${expirationLedger} must be strictly greater than current ledger ${currentLedger}.`,\n String(expirationLedger),\n 'expirationLedger'\n );\n }\n\n // Assemble the transaction data with live_until_ledger parameter\n const txData = assembleTransferAdminRoleAction(contractAddress, newAdmin, expirationLedger);\n\n logger.debug('StellarAccessControlService.transferAdminRole', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n argTypes: txData.argTypes,\n expirationLedger,\n currentLedger,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info(\n 'StellarAccessControlService.transferAdminRole',\n `Admin transfer initiated. TxHash: ${result.txHash}, pending admin: ${newAdmin}, expires at ledger: ${expirationLedger}`\n );\n\n return { id: result.txHash };\n }\n\n /**\n * Accepts a pending admin transfer (two-step transfer)\n *\n * Must be called by the pending admin (the address specified in transferAdminRole)\n * before the expiration ledger. The on-chain contract validates:\n * 1. Caller is the pending admin\n * 2. Transfer has not expired\n *\n * @param contractAddress The contract address\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result with transaction ID\n * @throws ConfigurationInvalid if contract address is invalid\n * @throws OperationFailed if on-chain rejection (expired or unauthorized)\n *\n * @example\n * ```typescript\n * // Check admin state before accepting\n * const adminInfo = await service.getAdminInfo(contractAddress);\n * if (adminInfo.state === 'pending') {\n * const result = await service.acceptAdminTransfer(contractAddress, executionConfig);\n * console.log('Admin transfer accepted, txHash:', result.id);\n * }\n * ```\n */\n async acceptAdminTransfer(\n contractAddress: string,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.acceptAdminTransfer',\n `Accepting pending admin transfer for ${contractAddress}`\n );\n\n // Expiration is enforced on-chain\n // No pre-check required - the contract will reject if expired or caller is not pending admin\n\n // Assemble the accept_admin_transfer transaction data\n const txData = assembleAcceptAdminTransferAction(contractAddress);\n\n logger.debug('StellarAccessControlService.acceptAdminTransfer', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info(\n 'StellarAccessControlService.acceptAdminTransfer',\n `Admin transfer accepted. TxHash: ${result.txHash}`\n );\n\n return { id: result.txHash };\n }\n\n /**\n * Exports a snapshot of current access control state\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to access snapshot\n * @throws Error if snapshot validation fails\n * @throws ConfigurationInvalid if the contract address is invalid\n */\n async exportSnapshot(contractAddress: string): Promise<AccessSnapshot> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.exportSnapshot',\n `Exporting snapshot for ${contractAddress}`\n );\n\n // Read ownership (if supported)\n let ownership: OwnershipInfo | undefined;\n try {\n ownership = await this.getOwnership(contractAddress);\n } catch (error) {\n logger.debug('StellarAccessControlService.exportSnapshot', 'Ownership not available:', error);\n // Contract may not be Ownable, continue without ownership\n }\n\n // Read roles (if contract is registered and has roles)\n let roles: RoleAssignment[] = [];\n try {\n roles = await this.getCurrentRoles(contractAddress);\n } catch (error) {\n logger.debug('StellarAccessControlService.exportSnapshot', 'Roles not available:', error);\n // Contract may not be registered or have no roles, continue with empty roles array\n }\n\n const snapshot: AccessSnapshot = {\n roles,\n ownership,\n };\n\n // Validate snapshot using utils\n if (!validateSnapshot(snapshot)) {\n const errorMsg = `Invalid snapshot structure for contract ${contractAddress}`;\n logger.error('StellarAccessControlService.exportSnapshot', errorMsg);\n throw new OperationFailed(errorMsg, contractAddress, 'exportSnapshot');\n }\n\n logger.debug('StellarAccessControlService.exportSnapshot', 'Snapshot created and validated:', {\n hasOwnership: !!ownership?.owner,\n roleCount: roles.length,\n totalMembers: roles.reduce((sum, r) => sum + r.members.length, 0),\n });\n\n return snapshot;\n }\n\n /**\n * Gets history of role changes with pagination support\n *\n * Supports cursor-based pagination. Use `pageInfo.endCursor` from the response\n * as the `cursor` option in subsequent calls to fetch more pages.\n *\n * @param contractAddress The contract address\n * @param options Optional filtering and pagination options\n * @returns Promise resolving to paginated history result, or empty result if not supported\n * @throws ConfigurationInvalid if the contract address is invalid\n */\n async getHistory(\n contractAddress: string,\n options?: HistoryQueryOptions\n ): Promise<PaginatedHistoryResult> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n // Validate account if provided\n if (options?.account) {\n validateAccountAddress(options.account, 'options.account');\n }\n\n logger.info(\n 'StellarAccessControlService.getHistory',\n `Fetching history for ${contractAddress}`,\n options\n );\n\n const isAvailable = await this.indexerClient.checkAvailability();\n if (!isAvailable) {\n logger.warn(\n 'StellarAccessControlService.getHistory',\n `Indexer not available for network ${this.networkConfig.id}, returning empty history`\n );\n return {\n items: [],\n pageInfo: { hasNextPage: false },\n };\n }\n\n return this.indexerClient.queryHistory(contractAddress, options);\n }\n\n /**\n * Helper to get the admin account (AccessControl contracts only)\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to admin address or null\n * @throws ConfigurationInvalid if the contract address is invalid\n */\n async getAdminAccount(contractAddress: string): Promise<string | null> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getAdminAccount',\n `Reading admin for ${contractAddress}`\n );\n\n return getAdmin(contractAddress, this.networkConfig);\n }\n\n /**\n * Discovers known role IDs for a contract by querying historical events from the indexer\n *\n * This method queries all role_granted and role_revoked events from the indexer and\n * extracts unique role identifiers. Results are cached to avoid repeated queries.\n *\n * If knownRoleIds were provided via registerContract(), those take precedence and\n * this method returns them without querying the indexer.\n *\n * @param contractAddress The contract address to discover roles for\n * @returns Promise resolving to array of unique role identifiers\n * @throws ConfigurationInvalid if contract address is invalid or contract not registered\n */\n async discoverKnownRoleIds(contractAddress: string): Promise<string[]> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n const context = this.contractContexts.get(contractAddress);\n if (!context) {\n throw new ConfigurationInvalid(\n 'Contract not registered. Call registerContract() first.',\n contractAddress,\n 'contractAddress'\n );\n }\n\n // If knownRoleIds were explicitly provided, return them (they take precedence)\n if (context.knownRoleIds && context.knownRoleIds.length > 0) {\n logger.debug(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Using ${context.knownRoleIds.length} explicitly provided role IDs for ${contractAddress}`\n );\n return context.knownRoleIds;\n }\n\n // Return cached discovered roles if available\n if (context.discoveredRoleIds) {\n logger.debug(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Using ${context.discoveredRoleIds.length} cached discovered role IDs for ${contractAddress}`\n );\n return context.discoveredRoleIds;\n }\n\n // If we already attempted discovery and found nothing, don't retry\n if (context.roleDiscoveryAttempted) {\n logger.debug(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Discovery already attempted for ${contractAddress}, returning empty array`\n );\n return [];\n }\n\n logger.info(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Discovering role IDs via indexer for ${contractAddress}`\n );\n\n // Check if indexer is available\n const isAvailable = await this.indexerClient.checkAvailability();\n if (!isAvailable) {\n logger.warn(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Indexer not available for network ${this.networkConfig.id}, cannot discover roles`\n );\n // Mark as attempted so we don't retry\n context.roleDiscoveryAttempted = true;\n return [];\n }\n\n try {\n // Query indexer for unique role IDs\n const roleIds = await this.indexerClient.discoverRoleIds(contractAddress);\n\n // Cache the results\n context.discoveredRoleIds = roleIds;\n context.roleDiscoveryAttempted = true;\n\n logger.info(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Discovered ${roleIds.length} role(s) for ${contractAddress}`,\n { roles: roleIds }\n );\n\n return roleIds;\n } catch (error) {\n logger.error(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Failed to discover roles: ${error instanceof Error ? error.message : String(error)}`\n );\n // Mark as attempted so we don't retry on transient errors\n context.roleDiscoveryAttempted = true;\n return [];\n }\n }\n\n /**\n * Disposes of the service and cleans up resources.\n *\n * Cleans up the indexer client's subscriptions to prevent memory leaks.\n * Call this method when the service is no longer needed.\n *\n * Note: In typical usage where the service is application-scoped and lives\n * for the duration of the application, calling dispose is not strictly necessary.\n * However, it should be called if the service is created/destroyed dynamically\n * (e.g., in tests or when switching networks).\n */\n dispose(): void {\n this.indexerClient.dispose();\n logger.debug('StellarAccessControlService.dispose', 'Service disposed');\n }\n}\n\n/**\n * Factory function to create a StellarAccessControlService instance\n *\n * Creates a service instance configured for a specific Stellar network.\n * The service supports both Ownable and AccessControl patterns including\n * two-step ownership transfers with ledger-based expiration.\n *\n * @param networkConfig The Stellar network configuration\n * @returns A new StellarAccessControlService instance\n *\n * @example\n * ```typescript\n * import { createStellarAccessControlService } from '@openzeppelin/ui-builder-adapter-stellar';\n *\n * const service = createStellarAccessControlService(networkConfig);\n * service.registerContract(contractAddress, contractSchema);\n *\n * const ownership = await service.getOwnership(contractAddress);\n * ```\n */\nexport function createStellarAccessControlService(\n networkConfig: StellarNetworkConfig\n): StellarAccessControlService {\n return new StellarAccessControlService(networkConfig);\n}\n","import { rpc as StellarRpc } from '@stellar/stellar-sdk';\n\nimport type {\n ExecutionConfig,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n} from '@openzeppelin/ui-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/ui-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/ui-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/ui-utils';\n\nimport { CALLER_PLACEHOLDER } from '../access-control/actions';\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 // Replace CALLER_PLACEHOLDER with the connected wallet address\n // This supports OpenZeppelin Stellar access control functions that require a caller parameter\n const resolvedArgs = txData.args.map((arg) =>\n arg === CALLER_PLACEHOLDER ? connectedAddress : arg\n );\n\n // Add the contract call operation (convert args to ScVal with comprehensive type support)\n const scValArgs = resolvedArgs.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","/**\n * Access Control Actions Module\n *\n * Assembles transaction data for access control operations (grant/revoke roles, transfer ownership)\n * on Stellar (Soroban) contracts. These actions prepare transaction data that can be executed\n * via the standard Stellar transaction execution flow.\n */\n\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport type { StellarTransactionData } from '../transaction/formatter';\n\n/**\n * Special placeholder value that gets replaced with the connected wallet address\n * at transaction execution time. Used when the caller parameter should be the\n * transaction sender (connected wallet).\n *\n * @see EoaExecutionStrategy - replaces this placeholder before building the transaction\n * @see RelayerExecutionStrategy - also replaces this placeholder before building the transaction\n */\nexport const CALLER_PLACEHOLDER = '__CALLER__';\n\n/**\n * Assembles transaction data for granting a role to an account\n *\n * Note: OpenZeppelin Stellar AccessControl (v0.5.x) requires a `caller` parameter for authorization.\n * The caller is the address authorizing the role grant (must have admin privileges).\n * Use CALLER_PLACEHOLDER to use the connected wallet address as the caller.\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param account The account address to grant the role to\n * @param caller The address authorizing the grant (defaults to CALLER_PLACEHOLDER for connected wallet)\n * @returns Transaction data ready for execution\n */\nexport function assembleGrantRoleAction(\n contractAddress: string,\n roleId: string,\n account: string,\n caller: string = CALLER_PLACEHOLDER\n): StellarTransactionData {\n logger.info(\n 'assembleGrantRoleAction',\n `Assembling grant_role action for ${roleId} to ${account} (caller: ${caller})`\n );\n\n // Arguments for grant_role(caller: Address, account: Address, role: Symbol) - v0.5.x signature\n // Note: args are raw values that will be converted to ScVal by the transaction execution flow\n // The caller parameter is required by OpenZeppelin Stellar AccessControl for authorization\n return {\n contractAddress,\n functionName: 'grant_role',\n args: [caller, account, roleId],\n argTypes: ['Address', 'Address', 'Symbol'],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for revoking a role from an account\n *\n * Note: OpenZeppelin Stellar AccessControl (v0.5.x) requires a `caller` parameter for authorization.\n * The caller is the address authorizing the role revocation (must have admin privileges).\n * Use CALLER_PLACEHOLDER to use the connected wallet address as the caller.\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param account The account address to revoke the role from\n * @param caller The address authorizing the revocation (defaults to CALLER_PLACEHOLDER for connected wallet)\n * @returns Transaction data ready for execution\n */\nexport function assembleRevokeRoleAction(\n contractAddress: string,\n roleId: string,\n account: string,\n caller: string = CALLER_PLACEHOLDER\n): StellarTransactionData {\n logger.info(\n 'assembleRevokeRoleAction',\n `Assembling revoke_role action for ${roleId} from ${account} (caller: ${caller})`\n );\n\n // Arguments for revoke_role(caller: Address, account: Address, role: Symbol) - v0.5.x signature\n // Note: args are raw values that will be converted to ScVal by the transaction execution flow\n // The caller parameter is required by OpenZeppelin Stellar AccessControl for authorization\n return {\n contractAddress,\n functionName: 'revoke_role',\n args: [caller, account, roleId],\n argTypes: ['Address', 'Address', 'Symbol'],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for transferring ownership of a contract\n *\n * For two-step Ownable contracts, this initiates a transfer that must be accepted\n * by the pending owner before the expiration ledger.\n *\n * @param contractAddress The contract address\n * @param newOwner The new owner address\n * @param liveUntilLedger The ledger sequence by which the transfer must be accepted\n * @returns Transaction data ready for execution\n */\nexport function assembleTransferOwnershipAction(\n contractAddress: string,\n newOwner: string,\n liveUntilLedger: number\n): StellarTransactionData {\n logger.info(\n 'assembleTransferOwnershipAction',\n `Assembling transfer_ownership action to ${newOwner} with expiration at ledger ${liveUntilLedger}`\n );\n\n // Arguments for transfer_ownership(new_owner: Address, live_until_ledger: u32)\n // Note: args are raw values that will be converted to ScVal by the transaction execution flow\n return {\n contractAddress,\n functionName: 'transfer_ownership',\n args: [newOwner, liveUntilLedger],\n argTypes: ['Address', 'u32'],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for accepting a pending ownership transfer\n *\n * For two-step Ownable contracts, this completes a pending transfer initiated by\n * the current owner. Must be called by the pending owner before the expiration ledger.\n *\n * @param contractAddress The contract address\n * @returns Transaction data ready for execution\n */\nexport function assembleAcceptOwnershipAction(contractAddress: string): StellarTransactionData {\n logger.info(\n 'assembleAcceptOwnershipAction',\n `Assembling accept_ownership action for ${contractAddress}`\n );\n\n // accept_ownership() has no arguments - caller must be the pending owner\n return {\n contractAddress,\n functionName: 'accept_ownership',\n args: [],\n argTypes: [],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for initiating an admin role transfer\n *\n * For two-step AccessControl contracts, this initiates an admin transfer that must\n * be accepted by the pending admin before the expiration ledger.\n *\n * @param contractAddress The contract address\n * @param newAdmin The new admin address\n * @param liveUntilLedger The ledger sequence by which the transfer must be accepted\n * @returns Transaction data ready for execution\n */\nexport function assembleTransferAdminRoleAction(\n contractAddress: string,\n newAdmin: string,\n liveUntilLedger: number\n): StellarTransactionData {\n logger.info(\n 'assembleTransferAdminRoleAction',\n `Assembling transfer_admin_role action to ${newAdmin} with expiration at ledger ${liveUntilLedger}`\n );\n\n // Arguments for transfer_admin_role(new_admin: Address, live_until_ledger: u32)\n // Note: args are raw values that will be converted to ScVal by the transaction execution flow\n return {\n contractAddress,\n functionName: 'transfer_admin_role',\n args: [newAdmin, liveUntilLedger],\n argTypes: ['Address', 'u32'],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for accepting a pending admin transfer\n *\n * For two-step AccessControl contracts, this completes a pending admin transfer\n * initiated by the current admin. Must be called by the pending admin before the\n * expiration ledger.\n *\n * @param contractAddress The contract address\n * @returns Transaction data ready for execution\n */\nexport function assembleAcceptAdminTransferAction(contractAddress: string): StellarTransactionData {\n logger.info(\n 'assembleAcceptAdminTransferAction',\n `Assembling accept_admin_transfer action for ${contractAddress}`\n );\n\n // accept_admin_transfer() has no arguments - caller must be the pending admin\n return {\n contractAddress,\n functionName: 'accept_admin_transfer',\n args: [],\n argTypes: [],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n","import type { Connector } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { StellarNetworkConfig, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { appConfigService, logger } from '@openzeppelin/ui-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 { Connector, StellarNetworkConfig, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { StellarNetworkConfig, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { getStellarWalletImplementation } from '../utils/stellarWalletImplementationManager';\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\n // Wire the active kit into the wallet implementation\n // This ensures signing and other operations use the correct kit instance\n if (state.networkConfig) {\n try {\n const impl = await getStellarWalletImplementation(state.networkConfig);\n impl.setActiveStellarKit(kit);\n logger.debug(\n 'StellarUiKitManager:configure',\n 'Active kit wired into wallet implementation for stellar-wallets-kit'\n );\n } catch (error) {\n logger.warn(\n 'StellarUiKitManager:configure',\n 'Failed to attach active kit to wallet implementation:',\n error\n );\n }\n }\n\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\n // Wire the active kit into the wallet implementation\n // This ensures signing and other operations use the correct kit instance\n if (state.networkConfig) {\n try {\n const impl = await getStellarWalletImplementation(state.networkConfig);\n impl.setActiveStellarKit(kit);\n logger.debug(\n 'StellarUiKitManager:configure',\n 'Active kit wired into wallet implementation for custom'\n );\n } catch (error) {\n logger.warn(\n 'StellarUiKitManager:configure',\n 'Failed to attach active kit to wallet implementation:',\n error\n );\n }\n }\n\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\n // Clear the active kit from the wallet implementation\n if (state.networkConfig) {\n try {\n const impl = await getStellarWalletImplementation(state.networkConfig);\n impl.setActiveStellarKit(null);\n logger.debug(\n 'StellarUiKitManager:configure',\n 'Active kit cleared from wallet implementation for none'\n );\n } catch (error) {\n logger.warn(\n 'StellarUiKitManager:configure',\n 'Failed to clear active kit from wallet implementation:',\n error\n );\n }\n }\n\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/ui-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} 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\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/ui-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/ui-utils';\n\nimport { setStellarConnectedAddress } from '../connection';\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 // Inform the adapter's wallet implementation so the context updates\n // This ensures the Execute Transaction button and other components\n // recognize the wallet connection state\n try {\n setStellarConnectedAddress(address ?? null);\n } catch (error) {\n logger.warn(\n 'StellarWalletsKitConnectButton',\n 'Failed to set connected address in adapter implementation:',\n error\n );\n }\n },\n onDisconnect: () => {\n logger.info('StellarWalletsKitConnectButton', 'Disconnected');\n // Inform the implementation we are no longer connected\n try {\n setStellarConnectedAddress(null);\n } catch (error) {\n logger.warn(\n 'StellarWalletsKitConnectButton',\n 'Failed to clear connected address in adapter implementation:',\n error\n );\n }\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 {\n Account,\n BASE_FEE,\n Contract,\n rpc as StellarRpc,\n TransactionBuilder,\n xdr,\n} from '@stellar/stellar-sdk';\n\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';\nimport type {\n ExecutionConfig,\n RelayerDetails,\n RelayerDetailsRich,\n RelayerExecutionConfig,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n} from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { CALLER_PLACEHOLDER } from '../access-control/actions';\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 // Replace CALLER_PLACEHOLDER with the connected wallet address\n // This supports OpenZeppelin Stellar access control functions that require a caller parameter\n const resolvedArgs = txData.args.map((arg) =>\n arg === CALLER_PLACEHOLDER ? connectedAddress : arg\n );\n\n const scValArgs = resolvedArgs.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","/**\n * Feature Detection Module\n *\n * Detects access control capabilities of Stellar (Soroban) contracts by analyzing\n * their function interfaces. Supports detection of Ownable and AccessControl patterns\n * from OpenZeppelin Stellar Contracts.\n */\n\nimport type { AccessControlCapabilities, ContractSchema } from '@openzeppelin/ui-types';\nimport { UnsupportedContractFeatures } from '@openzeppelin/ui-types';\n\n/**\n * Known OpenZeppelin Ownable function signatures\n */\nconst OWNABLE_FUNCTIONS = {\n required: ['get_owner'],\n optional: ['transfer_ownership', 'accept_ownership', 'renounce_ownership'],\n} as const;\n\n/**\n * Known OpenZeppelin AccessControl function signatures\n */\nconst ACCESS_CONTROL_FUNCTIONS = {\n required: ['has_role', 'grant_role', 'revoke_role'],\n optional: [\n 'get_role_admin',\n 'set_role_admin',\n 'get_admin',\n 'transfer_admin_role',\n 'accept_admin_transfer',\n 'renounce_admin',\n 'renounce_role',\n ],\n} as const;\n\n/**\n * Functions that indicate role enumeration support\n */\nconst ENUMERATION_FUNCTIONS = ['get_role_member_count', 'get_role_member'] as const;\n\n/**\n * Detects access control capabilities of a Stellar contract\n *\n * @param contractSchema The contract schema to analyze\n * @param indexerAvailable Whether an indexer is configured and available\n * @returns Detected capabilities\n */\nexport function detectAccessControlCapabilities(\n contractSchema: ContractSchema,\n indexerAvailable = false\n): AccessControlCapabilities {\n const functionNames = new Set(contractSchema.functions.map((fn) => fn.name));\n\n // Detect Ownable\n const hasOwnable = OWNABLE_FUNCTIONS.required.every((fnName) => functionNames.has(fnName));\n\n // Detect two-step Ownable (has accept_ownership function)\n const hasTwoStepOwnable = hasOwnable && functionNames.has('accept_ownership');\n\n // Detect AccessControl\n const hasAccessControl = ACCESS_CONTROL_FUNCTIONS.required.every((fnName) =>\n functionNames.has(fnName)\n );\n\n // Detect two-step admin transfer (has accept_admin_transfer function)\n const hasTwoStepAdmin = hasAccessControl && functionNames.has('accept_admin_transfer');\n\n // Detect enumerable roles\n const hasEnumerableRoles = ENUMERATION_FUNCTIONS.every((fnName) => functionNames.has(fnName));\n\n // History is only available when indexer is configured\n const supportsHistory = indexerAvailable;\n\n // Verify the contract against OZ interfaces\n const verifiedAgainstOZInterfaces = verifyOZInterface(\n functionNames,\n hasOwnable,\n hasAccessControl,\n hasTwoStepOwnable,\n hasTwoStepAdmin\n );\n\n // Collect notes about detected capabilities\n const notes: string[] = [];\n\n if (hasOwnable) {\n if (hasTwoStepOwnable) {\n notes.push('OpenZeppelin two-step Ownable interface detected (with accept_ownership)');\n } else {\n notes.push('OpenZeppelin Ownable interface detected');\n }\n }\n\n if (hasAccessControl) {\n if (hasTwoStepAdmin) {\n notes.push(\n 'OpenZeppelin two-step AccessControl interface detected (with accept_admin_transfer)'\n );\n } else {\n notes.push('OpenZeppelin AccessControl interface detected');\n }\n }\n\n if (hasEnumerableRoles) {\n notes.push('Role enumeration supported (get_role_member_count, get_role_member)');\n } else if (hasAccessControl) {\n notes.push('Role enumeration not available - requires event reconstruction');\n }\n\n if (!indexerAvailable && (hasOwnable || hasAccessControl)) {\n notes.push('History queries unavailable without indexer configuration');\n }\n\n if (!hasOwnable && !hasAccessControl) {\n notes.push('No OpenZeppelin access control interfaces detected');\n }\n\n return {\n hasOwnable,\n hasTwoStepOwnable,\n hasAccessControl,\n hasTwoStepAdmin,\n hasEnumerableRoles,\n supportsHistory,\n verifiedAgainstOZInterfaces,\n notes: notes.length > 0 ? notes : undefined,\n };\n}\n\n/**\n * Verifies that the contract conforms to OpenZeppelin interfaces\n *\n * @param functionNames Set of function names in the contract\n * @param hasOwnable Whether Ownable was detected\n * @param hasAccessControl Whether AccessControl was detected\n * @param hasTwoStepOwnable Whether two-step Ownable was detected\n * @param hasTwoStepAdmin Whether two-step admin was detected\n * @returns True if verified against OZ interfaces\n */\nfunction verifyOZInterface(\n functionNames: Set<string>,\n hasOwnable: boolean,\n hasAccessControl: boolean,\n hasTwoStepOwnable = false,\n hasTwoStepAdmin = false\n): boolean {\n // If no OZ patterns detected, not applicable\n if (!hasOwnable && !hasAccessControl) {\n return false;\n }\n\n // Verify Ownable optional functions\n // For two-step Ownable, require at least 3 of 4 optional functions\n // For basic Ownable, at least 2 of 3 (excluding accept_ownership)\n if (hasOwnable) {\n const ownableOptionalCount = OWNABLE_FUNCTIONS.optional.filter((fnName) =>\n functionNames.has(fnName)\n ).length;\n\n if (hasTwoStepOwnable) {\n // Two-step Ownable should have at least 3 of 4 optional functions\n // (transfer_ownership, accept_ownership, renounce_ownership, and accept_ownership is guaranteed)\n if (ownableOptionalCount < 3) {\n return false;\n }\n } else {\n // Basic Ownable should have at least 2 of 3 optional functions\n if (ownableOptionalCount < 2) {\n return false;\n }\n }\n }\n\n // Verify AccessControl optional functions\n // For two-step admin, require at least 5 of 7 optional functions\n // For basic AccessControl, at least 4 of 7 should be present\n if (hasAccessControl) {\n const accessControlOptionalCount = ACCESS_CONTROL_FUNCTIONS.optional.filter((fnName) =>\n functionNames.has(fnName)\n ).length;\n\n if (hasTwoStepAdmin) {\n // Two-step admin should have at least 5 of 7 optional functions\n // (transfer_admin_role, accept_admin_transfer guaranteed, plus others)\n if (accessControlOptionalCount < 5) {\n return false;\n }\n } else {\n // Basic AccessControl should have at least 4 of 7 optional functions\n if (accessControlOptionalCount < 4) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Validates that a contract supports access control operations\n *\n * @param capabilities The detected capabilities\n * @param contractAddress Optional contract address for error context\n * @throws UnsupportedContractFeatures if contract doesn't support required operations\n */\nexport function validateAccessControlSupport(\n capabilities: AccessControlCapabilities,\n contractAddress?: string\n): asserts capabilities is\n | (AccessControlCapabilities & { hasOwnable: true })\n | (AccessControlCapabilities & { hasAccessControl: true }) {\n if (!capabilities.hasOwnable && !capabilities.hasAccessControl) {\n throw new UnsupportedContractFeatures(\n 'Contract does not implement OpenZeppelin Ownable or AccessControl interfaces',\n contractAddress,\n ['Ownable', 'AccessControl']\n );\n }\n\n if (!capabilities.verifiedAgainstOZInterfaces) {\n throw new UnsupportedContractFeatures(\n 'Contract interfaces do not conform to OpenZeppelin standards',\n contractAddress\n );\n }\n}\n","/**\n * Stellar Indexer Client\n *\n * Provides access to historical access control events via a GraphQL indexer.\n * Implements config precedence: runtime override > network-config default > derived-from-RPC (if safe) > none.\n */\n\nimport type {\n HistoryChangeType,\n HistoryEntry,\n HistoryQueryOptions,\n IndexerEndpointConfig,\n PageInfo,\n PaginatedHistoryResult,\n RoleIdentifier,\n StellarNetworkConfig,\n} from '@openzeppelin/ui-types';\nimport { ConfigurationInvalid, IndexerUnavailable, OperationFailed } from '@openzeppelin/ui-types';\nimport {\n appConfigService,\n isValidUrl,\n logger,\n userNetworkServiceConfigService,\n} from '@openzeppelin/ui-utils';\n\nconst LOG_SYSTEM = 'StellarIndexerClient';\n\n/**\n * Extracts the user-configured indexer endpoints from UserNetworkServiceConfigService.\n * Validates URLs before returning them to prevent invalid URLs from causing runtime errors.\n *\n * @param networkId - The network ID to get the indexer config for\n * @returns The indexer endpoint config if configured and valid, undefined otherwise\n */\nfunction getUserIndexerEndpoints(networkId: string): IndexerEndpointConfig | undefined {\n const svcCfg = userNetworkServiceConfigService.get(networkId, 'indexer');\n if (!svcCfg || typeof svcCfg !== 'object') {\n return undefined;\n }\n\n const endpoints: IndexerEndpointConfig = {};\n\n // Check for indexerUri field (HTTP endpoint) and validate\n if ('indexerUri' in svcCfg && svcCfg.indexerUri) {\n const httpUrl = String(svcCfg.indexerUri).trim();\n if (httpUrl && isValidUrl(httpUrl)) {\n endpoints.http = httpUrl;\n } else if (httpUrl) {\n logger.warn(\n LOG_SYSTEM,\n `User-configured indexer HTTP URL for ${networkId} is invalid: ${httpUrl}. Ignoring.`\n );\n }\n }\n\n // Check for indexerWsUri field (WebSocket endpoint) and validate\n if ('indexerWsUri' in svcCfg && svcCfg.indexerWsUri) {\n const wsUrl = String(svcCfg.indexerWsUri).trim();\n if (wsUrl && isValidUrl(wsUrl)) {\n endpoints.ws = wsUrl;\n } else if (wsUrl) {\n logger.warn(\n LOG_SYSTEM,\n `User-configured indexer WebSocket URL for ${networkId} is invalid: ${wsUrl}. Ignoring.`\n );\n }\n }\n\n // Return undefined if no valid endpoints were found\n if (!endpoints.http && !endpoints.ws) {\n return undefined;\n }\n\n return endpoints;\n}\n\n/**\n * GraphQL query response types for indexer\n */\ninterface IndexerHistoryEntry {\n id: string;\n role?: string; // Nullable for Ownership/Admin events\n account: string;\n type:\n | 'ROLE_GRANTED'\n | 'ROLE_REVOKED'\n | 'OWNERSHIP_TRANSFER_COMPLETED'\n | 'OWNERSHIP_TRANSFER_STARTED'\n | 'ADMIN_TRANSFER_INITIATED'\n | 'ADMIN_TRANSFER_COMPLETED';\n txHash: string;\n timestamp: string;\n blockHeight: string;\n /** Ledger sequence of the event */\n ledger?: string;\n /** Admin/owner who initiated the transfer (for OWNERSHIP_TRANSFER_STARTED, ADMIN_TRANSFER_INITIATED) */\n admin?: string;\n /** Expiration ledger for pending transfers (OWNERSHIP_TRANSFER_STARTED, ADMIN_TRANSFER_INITIATED) */\n liveUntilLedger?: number;\n}\n\n/**\n * Ownership Transfer Started Event\n *\n * Contains details about a pending two-step ownership transfer from the indexer.\n * Includes the expiration ledger (`liveUntilLedger`) for determining if the\n * transfer has expired without requiring an additional on-chain query.\n */\nexport interface OwnershipTransferStartedEvent {\n /** Previous owner (admin) who initiated the transfer */\n previousOwner: string;\n /** Pending owner address (account) - the new owner */\n pendingOwner: string;\n /** Transaction hash of the initiation */\n txHash: string;\n /** ISO8601 timestamp of the event */\n timestamp: string;\n /** Ledger sequence of the event */\n ledger: number;\n /** Expiration ledger - transfer must be accepted before this ledger */\n liveUntilLedger: number;\n}\n\n/**\n * Admin Transfer Initiated Event\n *\n * Contains details about a pending two-step admin transfer from the indexer.\n * Includes the expiration ledger (`liveUntilLedger`) for determining if the\n * transfer has expired without requiring an additional on-chain query.\n */\nexport interface AdminTransferInitiatedEvent {\n /** Previous admin who initiated the transfer */\n previousAdmin: string;\n /** Pending admin address (account) - the new admin */\n pendingAdmin: string;\n /** Transaction hash of the initiation */\n txHash: string;\n /** ISO8601 timestamp of the event */\n timestamp: string;\n /** Ledger sequence of the event */\n ledger: number;\n /** Expiration ledger - transfer must be accepted before this ledger */\n liveUntilLedger: number;\n}\n\ninterface IndexerPageInfo {\n hasNextPage: boolean;\n endCursor?: string;\n}\n\ninterface IndexerHistoryResponse {\n data?: {\n accessControlEvents?: {\n nodes: IndexerHistoryEntry[];\n pageInfo: IndexerPageInfo;\n };\n };\n errors?: Array<{\n message: string;\n }>;\n}\n\n/**\n * Response type for ownership transfer queries\n */\ninterface IndexerOwnershipTransferResponse {\n data?: {\n accessControlEvents?: {\n nodes: IndexerHistoryEntry[];\n pageInfo?: IndexerPageInfo;\n };\n };\n errors?: Array<{\n message: string;\n }>;\n}\n\n/**\n * Response type for role discovery query\n */\ninterface IndexerRoleDiscoveryResponse {\n data?: {\n accessControlEvents?: {\n nodes: Array<{\n role: string | null;\n }>;\n };\n };\n errors?: Array<{\n message: string;\n }>;\n}\n\n/**\n * Grant information for a specific member\n */\nexport interface GrantInfo {\n /** ISO8601 timestamp of the grant */\n timestamp: string;\n /** Transaction ID of the grant */\n txId: string;\n /** Block/ledger number of the grant */\n ledger: number;\n}\n\n/**\n * Stellar Indexer Client\n * Handles GraphQL queries to the configured indexer for historical access control data\n */\nexport class StellarIndexerClient {\n private readonly networkConfig: StellarNetworkConfig;\n private resolvedEndpoints: IndexerEndpointConfig | null = null;\n private availabilityChecked = false;\n private isAvailable = false;\n private readonly unsubscribeFromConfigChanges: () => void;\n\n constructor(networkConfig: StellarNetworkConfig) {\n this.networkConfig = networkConfig;\n\n // Subscribe to indexer config changes to reset cache when user updates settings\n this.unsubscribeFromConfigChanges = userNetworkServiceConfigService.subscribe(\n networkConfig.id,\n 'indexer',\n () => {\n logger.info(\n LOG_SYSTEM,\n `User indexer config changed for ${networkConfig.id}, resetting cache`\n );\n this.resetCache();\n }\n );\n }\n\n /**\n * Resets the resolved endpoints and availability cache.\n * Called when user configuration changes to force re-resolution.\n */\n private resetCache(): void {\n this.resolvedEndpoints = null;\n this.availabilityChecked = false;\n this.isAvailable = false;\n }\n\n /**\n * Cleans up subscriptions when the client is no longer needed.\n * Call this method when disposing of the client to prevent memory leaks.\n */\n public dispose(): void {\n this.unsubscribeFromConfigChanges();\n }\n\n /**\n * Check if indexer is available and configured\n * @returns True if indexer endpoints are configured and reachable\n */\n async checkAvailability(): Promise<boolean> {\n if (this.availabilityChecked) {\n return this.isAvailable;\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n logger.info(LOG_SYSTEM, `No indexer configured for network ${this.networkConfig.id}`);\n this.availabilityChecked = true;\n this.isAvailable = false;\n return false;\n }\n\n try {\n // Simple connectivity check with a minimal query\n const response = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n query: '{ __typename }',\n }),\n });\n\n if (response.ok) {\n logger.info(\n LOG_SYSTEM,\n `Indexer available for network ${this.networkConfig.id} at ${endpoints.http}`\n );\n this.isAvailable = true;\n } else {\n logger.warn(\n LOG_SYSTEM,\n `Indexer endpoint ${endpoints.http} returned status ${response.status}`\n );\n this.isAvailable = false;\n }\n } catch (error) {\n logger.warn(\n LOG_SYSTEM,\n `Failed to connect to indexer at ${endpoints.http}: ${error instanceof Error ? error.message : String(error)}`\n );\n this.isAvailable = false;\n }\n\n this.availabilityChecked = true;\n return this.isAvailable;\n }\n\n /**\n * Query history entries for a contract with pagination support\n * @param contractAddress The contract address to query\n * @param options Optional filtering and pagination options\n * @returns Promise resolving to paginated history result\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n */\n async queryHistory(\n contractAddress: string,\n options?: HistoryQueryOptions\n ): Promise<PaginatedHistoryResult> {\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n // Build query with server-side filtering and pagination\n const query = this.buildHistoryQuery(contractAddress, options);\n const variables = this.buildQueryVariables(contractAddress, options);\n\n try {\n const response = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${response.status}`,\n contractAddress,\n 'queryHistory'\n );\n }\n\n const result = (await response.json()) as IndexerHistoryResponse;\n\n if (result.errors && result.errors.length > 0) {\n const errorMessages = result.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'queryHistory'\n );\n }\n\n if (!result.data?.accessControlEvents?.nodes) {\n logger.debug(LOG_SYSTEM, `No history data returned for contract ${contractAddress}`);\n return {\n items: [],\n pageInfo: { hasNextPage: false },\n };\n }\n\n const items = this.transformIndexerEntries(result.data.accessControlEvents.nodes);\n const pageInfo: PageInfo = {\n hasNextPage: result.data.accessControlEvents.pageInfo.hasNextPage,\n endCursor: result.data.accessControlEvents.pageInfo.endCursor,\n };\n\n return { items, pageInfo };\n } catch (error) {\n logger.error(\n LOG_SYSTEM,\n `Failed to query indexer history: ${error instanceof Error ? error.message : String(error)}`\n );\n throw error;\n }\n }\n\n /**\n * Discover all unique role identifiers for a contract by querying historical events\n *\n * Queries all ROLE_GRANTED and ROLE_REVOKED events and extracts unique role values.\n * This enables role enumeration even when knownRoleIds are not provided.\n *\n * @param contractAddress The contract address to discover roles for\n * @returns Promise resolving to array of unique role identifiers\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n */\n async discoverRoleIds(contractAddress: string): Promise<string[]> {\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n logger.info(LOG_SYSTEM, `Discovering role IDs for contract ${contractAddress}`);\n\n const query = this.buildRoleDiscoveryQuery();\n const variables = { contract: contractAddress };\n\n try {\n const response = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${response.status}`,\n contractAddress,\n 'discoverRoleIds'\n );\n }\n\n const result = (await response.json()) as IndexerRoleDiscoveryResponse;\n\n if (result.errors && result.errors.length > 0) {\n const errorMessages = result.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'discoverRoleIds'\n );\n }\n\n if (!result.data?.accessControlEvents?.nodes) {\n logger.debug(LOG_SYSTEM, `No role events found for contract ${contractAddress}`);\n return [];\n }\n\n // Extract unique role IDs, filtering out null/undefined values (ownership events)\n const uniqueRoles = new Set<string>();\n for (const node of result.data.accessControlEvents.nodes) {\n if (node.role) {\n uniqueRoles.add(node.role);\n }\n }\n\n const roleIds = Array.from(uniqueRoles);\n logger.info(\n LOG_SYSTEM,\n `Discovered ${roleIds.length} unique role(s) for ${contractAddress}`,\n {\n roles: roleIds,\n }\n );\n\n return roleIds;\n } catch (error) {\n logger.error(\n LOG_SYSTEM,\n `Failed to discover role IDs: ${error instanceof Error ? error.message : String(error)}`\n );\n throw error;\n }\n }\n\n /**\n * Query the latest grant events for a set of members with a specific role\n *\n * Returns the most recent ROLE_GRANTED event for each member address.\n * This is used to enrich role assignments with grant timestamps.\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier to query\n * @param memberAddresses Array of member addresses to look up\n * @returns Promise resolving to a Map of address -> GrantInfo\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n */\n async queryLatestGrants(\n contractAddress: string,\n roleId: string,\n memberAddresses: string[]\n ): Promise<Map<string, GrantInfo>> {\n if (memberAddresses.length === 0) {\n return new Map();\n }\n\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n logger.debug(\n LOG_SYSTEM,\n `Querying latest grants for ${memberAddresses.length} member(s) with role ${roleId}`\n );\n\n const query = this.buildLatestGrantsQuery();\n const variables = {\n contract: contractAddress,\n role: roleId,\n accounts: memberAddresses,\n };\n\n try {\n const response = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${response.status}`,\n contractAddress,\n 'queryLatestGrants'\n );\n }\n\n const result = (await response.json()) as IndexerHistoryResponse;\n\n if (result.errors && result.errors.length > 0) {\n const errorMessages = result.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'queryLatestGrants'\n );\n }\n\n if (!result.data?.accessControlEvents?.nodes) {\n logger.debug(LOG_SYSTEM, `No grant events found for role ${roleId}`);\n return new Map();\n }\n\n // Build map of address -> latest grant info\n // Since we order by TIMESTAMP_DESC, we take the first occurrence per account\n const grantMap = new Map<string, GrantInfo>();\n for (const entry of result.data.accessControlEvents.nodes) {\n if (!grantMap.has(entry.account)) {\n grantMap.set(entry.account, {\n timestamp: entry.timestamp,\n txId: entry.txHash,\n ledger: parseInt(entry.blockHeight, 10),\n });\n }\n }\n\n logger.debug(\n LOG_SYSTEM,\n `Found grant info for ${grantMap.size} of ${memberAddresses.length} member(s)`\n );\n\n return grantMap;\n } catch (error) {\n logger.error(\n LOG_SYSTEM,\n `Failed to query latest grants: ${error instanceof Error ? error.message : String(error)}`\n );\n throw error;\n }\n }\n\n /**\n * Query the latest pending ownership transfer for a contract\n *\n * Queries the indexer for `OWNERSHIP_TRANSFER_INITIATED` events and checks if\n * a corresponding `OWNERSHIP_TRANSFER_COMPLETED` event exists after the initiation.\n * If no completion event exists, returns the pending transfer details.\n *\n * @param contractAddress The contract address to query\n * @returns Promise resolving to pending transfer info, or null if no pending transfer\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n *\n * @example\n * ```typescript\n * const pending = await client.queryPendingOwnershipTransfer('CABC...XYZ');\n * if (pending) {\n * console.log(`Pending owner: ${pending.pendingOwner}`);\n * console.log(`Transfer started at ledger: ${pending.ledger}`);\n * }\n * ```\n */\n async queryPendingOwnershipTransfer(\n contractAddress: string\n ): Promise<OwnershipTransferStartedEvent | null> {\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n logger.info(LOG_SYSTEM, `Querying pending ownership transfer for ${contractAddress}`);\n\n // Step 1: Query latest OWNERSHIP_TRANSFER_STARTED event\n const initiationQuery = this.buildOwnershipTransferStartedQuery();\n const initiationVariables = { contract: contractAddress };\n\n try {\n const initiationResponse = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: initiationQuery, variables: initiationVariables }),\n });\n\n if (!initiationResponse.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${initiationResponse.status}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n\n const initiationResult =\n (await initiationResponse.json()) as IndexerOwnershipTransferResponse;\n\n if (initiationResult.errors && initiationResult.errors.length > 0) {\n const errorMessages = initiationResult.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n\n const initiatedNodes = initiationResult.data?.accessControlEvents?.nodes;\n if (!initiatedNodes || initiatedNodes.length === 0) {\n logger.debug(LOG_SYSTEM, `No ownership transfer initiated for ${contractAddress}`);\n return null;\n }\n\n const latestInitiation = initiatedNodes[0];\n\n // Step 2: Check if a completion event exists after the initiation\n const completionQuery = this.buildOwnershipTransferCompletedQuery();\n const completionVariables = {\n contract: contractAddress,\n afterTimestamp: latestInitiation.timestamp,\n };\n\n const completionResponse = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: completionQuery, variables: completionVariables }),\n });\n\n if (!completionResponse.ok) {\n throw new OperationFailed(\n `Indexer completion query failed with status ${completionResponse.status}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n\n const completionResult =\n (await completionResponse.json()) as IndexerOwnershipTransferResponse;\n\n // Check for GraphQL errors in completion query (same as initiation query)\n if (completionResult.errors && completionResult.errors.length > 0) {\n const errorMessages = completionResult.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer completion query errors: ${errorMessages}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n\n const completedNodes = completionResult.data?.accessControlEvents?.nodes;\n if (completedNodes && completedNodes.length > 0) {\n // Transfer was completed after initiation - no pending transfer\n logger.debug(LOG_SYSTEM, `Ownership transfer was completed for ${contractAddress}`);\n return null;\n }\n\n // No completion - validate required fields before returning pending transfer info\n // The admin field is required for OWNERSHIP_TRANSFER_STARTED events\n if (!latestInitiation.admin) {\n logger.warn(\n LOG_SYSTEM,\n `Indexer returned OWNERSHIP_TRANSFER_STARTED event without admin field for ${contractAddress}. ` +\n `This indicates incomplete indexer data. Treating as no valid pending transfer.`\n );\n return null;\n }\n\n // Validate liveUntilLedger is present (required for expiration checking)\n if (\n latestInitiation.liveUntilLedger === undefined ||\n latestInitiation.liveUntilLedger === null\n ) {\n logger.warn(\n LOG_SYSTEM,\n `Indexer returned OWNERSHIP_TRANSFER_STARTED event without liveUntilLedger for ${contractAddress}. ` +\n `This may indicate an older indexer version. Treating as no valid pending transfer.`\n );\n return null;\n }\n\n logger.info(\n LOG_SYSTEM,\n `Found pending ownership transfer for ${contractAddress}: pending owner=${latestInitiation.account}, expires at ledger ${latestInitiation.liveUntilLedger}`\n );\n\n return {\n previousOwner: latestInitiation.admin,\n pendingOwner: latestInitiation.account,\n txHash: latestInitiation.txHash,\n timestamp: latestInitiation.timestamp,\n ledger: parseInt(latestInitiation.ledger || latestInitiation.blockHeight, 10),\n liveUntilLedger: latestInitiation.liveUntilLedger,\n };\n } catch (error) {\n if (error instanceof IndexerUnavailable || error instanceof OperationFailed) {\n throw error;\n }\n logger.error(\n LOG_SYSTEM,\n `Failed to query pending ownership transfer: ${error instanceof Error ? error.message : String(error)}`\n );\n throw new OperationFailed(\n `Failed to query pending ownership transfer: ${(error as Error).message}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n }\n\n /**\n * Query the latest pending admin transfer for a contract\n *\n * Queries the indexer for `ADMIN_TRANSFER_INITIATED` events and checks if\n * a corresponding `ADMIN_TRANSFER_COMPLETED` event exists after the initiation.\n * If no completion event exists, returns the pending transfer details.\n *\n * @param contractAddress The contract address to query\n * @returns Promise resolving to pending transfer info, or null if no pending transfer\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n *\n * @example\n * ```typescript\n * const pending = await client.queryPendingAdminTransfer('CABC...XYZ');\n * if (pending) {\n * console.log(`Pending admin: ${pending.pendingAdmin}`);\n * console.log(`Transfer started at ledger: ${pending.ledger}`);\n * }\n * ```\n */\n async queryPendingAdminTransfer(\n contractAddress: string\n ): Promise<AdminTransferInitiatedEvent | null> {\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n logger.info(LOG_SYSTEM, `Querying pending admin transfer for ${contractAddress}`);\n\n // Step 1: Query latest ADMIN_TRANSFER_INITIATED event\n const initiationQuery = this.buildAdminTransferInitiatedQuery();\n const initiationVariables = { contract: contractAddress };\n\n try {\n const initiationResponse = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: initiationQuery, variables: initiationVariables }),\n });\n\n if (!initiationResponse.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${initiationResponse.status}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n\n const initiationResult =\n (await initiationResponse.json()) as IndexerOwnershipTransferResponse;\n\n if (initiationResult.errors && initiationResult.errors.length > 0) {\n const errorMessages = initiationResult.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n\n const initiatedNodes = initiationResult.data?.accessControlEvents?.nodes;\n if (!initiatedNodes || initiatedNodes.length === 0) {\n logger.debug(LOG_SYSTEM, `No admin transfer initiated for ${contractAddress}`);\n return null;\n }\n\n const latestInitiation = initiatedNodes[0];\n\n // Step 2: Check if a completion event exists after the initiation\n const completionQuery = this.buildAdminTransferCompletedQuery();\n const completionVariables = {\n contract: contractAddress,\n afterTimestamp: latestInitiation.timestamp,\n };\n\n const completionResponse = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: completionQuery, variables: completionVariables }),\n });\n\n if (!completionResponse.ok) {\n throw new OperationFailed(\n `Indexer completion query failed with status ${completionResponse.status}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n\n const completionResult =\n (await completionResponse.json()) as IndexerOwnershipTransferResponse;\n\n // Check for GraphQL errors in completion query\n if (completionResult.errors && completionResult.errors.length > 0) {\n const errorMessages = completionResult.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer completion query errors: ${errorMessages}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n\n const completedNodes = completionResult.data?.accessControlEvents?.nodes;\n if (completedNodes && completedNodes.length > 0) {\n // Transfer was completed after initiation - no pending transfer\n logger.debug(LOG_SYSTEM, `Admin transfer was completed for ${contractAddress}`);\n return null;\n }\n\n // No completion - validate required fields before returning pending transfer info\n // The admin field is required for ADMIN_TRANSFER_INITIATED events\n if (!latestInitiation.admin) {\n logger.warn(\n LOG_SYSTEM,\n `Indexer returned ADMIN_TRANSFER_INITIATED event without admin field for ${contractAddress}. ` +\n `This indicates incomplete indexer data. Treating as no valid pending transfer.`\n );\n return null;\n }\n\n // Validate liveUntilLedger is present (required for expiration checking)\n if (\n latestInitiation.liveUntilLedger === undefined ||\n latestInitiation.liveUntilLedger === null\n ) {\n logger.warn(\n LOG_SYSTEM,\n `Indexer returned ADMIN_TRANSFER_INITIATED event without liveUntilLedger for ${contractAddress}. ` +\n `This may indicate an older indexer version. Treating as no valid pending transfer.`\n );\n return null;\n }\n\n logger.info(\n LOG_SYSTEM,\n `Found pending admin transfer for ${contractAddress}: pending admin=${latestInitiation.account}, expires at ledger ${latestInitiation.liveUntilLedger}`\n );\n\n return {\n previousAdmin: latestInitiation.admin,\n pendingAdmin: latestInitiation.account,\n txHash: latestInitiation.txHash,\n timestamp: latestInitiation.timestamp,\n ledger: parseInt(latestInitiation.ledger || latestInitiation.blockHeight, 10),\n liveUntilLedger: latestInitiation.liveUntilLedger,\n };\n } catch (error) {\n if (error instanceof IndexerUnavailable || error instanceof OperationFailed) {\n throw error;\n }\n logger.error(\n LOG_SYSTEM,\n `Failed to query pending admin transfer: ${error instanceof Error ? error.message : String(error)}`\n );\n throw new OperationFailed(\n `Failed to query pending admin transfer: ${(error as Error).message}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n }\n\n /**\n * Build GraphQL query for OWNERSHIP_TRANSFER_STARTED events\n *\n * Note: The OpenZeppelin Stellar contract emits `ownership_transfer` event\n * which is indexed as `OWNERSHIP_TRANSFER_STARTED`.\n *\n * Schema mapping:\n * - `account`: pending new owner\n * - `admin`: current owner who initiated the transfer\n * - `ledger`: block height of the event\n * - `liveUntilLedger`: expiration ledger for the pending transfer\n */\n private buildOwnershipTransferStartedQuery(): string {\n return `\n query GetOwnershipTransferStarted($contract: String!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { equalTo: OWNERSHIP_TRANSFER_STARTED }\n }\n orderBy: TIMESTAMP_DESC\n first: 1\n ) {\n nodes {\n id\n account\n admin\n txHash\n timestamp\n ledger\n blockHeight\n liveUntilLedger\n }\n }\n }\n `;\n }\n\n /**\n * Build GraphQL query for OWNERSHIP_TRANSFER_COMPLETED events after a given timestamp\n */\n private buildOwnershipTransferCompletedQuery(): string {\n return `\n query GetOwnershipTransferCompleted($contract: String!, $afterTimestamp: Datetime!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { equalTo: OWNERSHIP_TRANSFER_COMPLETED }\n timestamp: { greaterThan: $afterTimestamp }\n }\n orderBy: TIMESTAMP_DESC\n first: 1\n ) {\n nodes {\n id\n txHash\n timestamp\n }\n }\n }\n `;\n }\n\n /**\n * Build GraphQL query for ADMIN_TRANSFER_INITIATED events\n *\n * Note: The OpenZeppelin Stellar contract emits `admin_transfer_initiated` event\n * which is indexed as `ADMIN_TRANSFER_INITIATED`.\n *\n * Schema mapping:\n * - `account`: pending new admin\n * - `admin`: current admin who initiated the transfer\n * - `ledger`: block height of the event\n * - `liveUntilLedger`: expiration ledger for the pending transfer\n */\n private buildAdminTransferInitiatedQuery(): string {\n return `\n query GetAdminTransferInitiated($contract: String!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { equalTo: ADMIN_TRANSFER_INITIATED }\n }\n orderBy: TIMESTAMP_DESC\n first: 1\n ) {\n nodes {\n id\n account\n admin\n txHash\n timestamp\n ledger\n blockHeight\n liveUntilLedger\n }\n }\n }\n `;\n }\n\n /**\n * Build GraphQL query for ADMIN_TRANSFER_COMPLETED events after a given timestamp\n */\n private buildAdminTransferCompletedQuery(): string {\n return `\n query GetAdminTransferCompleted($contract: String!, $afterTimestamp: Datetime!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { equalTo: ADMIN_TRANSFER_COMPLETED }\n timestamp: { greaterThan: $afterTimestamp }\n }\n orderBy: TIMESTAMP_DESC\n first: 1\n ) {\n nodes {\n id\n txHash\n timestamp\n }\n }\n }\n `;\n }\n\n /**\n * Resolve indexer endpoints with config precedence\n * Priority:\n * 1. User-configured indexer from UserNetworkServiceConfigService (localStorage)\n * 2. Runtime override from AppConfigService (environment/JSON config)\n * 3. Network config defaults (indexerUri/indexerWsUri)\n * 4. Derived from RPC (if safe pattern exists)\n * 5. None (returns empty object)\n *\n * @returns Resolved indexer endpoints\n */\n private resolveIndexerEndpoints(): IndexerEndpointConfig {\n if (this.resolvedEndpoints) {\n return this.resolvedEndpoints;\n }\n\n const networkId = this.networkConfig.id;\n const endpoints: IndexerEndpointConfig = {};\n\n // Priority 1: Check user-configured indexer from localStorage\n const userIndexerConfig = getUserIndexerEndpoints(networkId);\n if (userIndexerConfig) {\n if (userIndexerConfig.http) {\n endpoints.http = userIndexerConfig.http;\n }\n if (userIndexerConfig.ws) {\n endpoints.ws = userIndexerConfig.ws;\n }\n if (endpoints.http || endpoints.ws) {\n logger.info(\n LOG_SYSTEM,\n `Using user-configured indexer for ${networkId}: http=${endpoints.http}, ws=${endpoints.ws}`\n );\n this.resolvedEndpoints = endpoints;\n return endpoints;\n }\n }\n\n // Priority 2: Check AppConfigService for runtime override\n const indexerOverride = appConfigService.getIndexerEndpointOverride(networkId);\n if (indexerOverride) {\n if (typeof indexerOverride === 'string') {\n endpoints.http = indexerOverride;\n logger.info(\n LOG_SYSTEM,\n `Using runtime indexer override for ${networkId}: ${indexerOverride}`\n );\n } else if (typeof indexerOverride === 'object') {\n if ('http' in indexerOverride && indexerOverride.http) {\n endpoints.http = indexerOverride.http;\n }\n if ('ws' in indexerOverride && indexerOverride.ws) {\n endpoints.ws = indexerOverride.ws;\n }\n logger.info(\n LOG_SYSTEM,\n `Using runtime indexer override for ${networkId}: http=${endpoints.http}, ws=${endpoints.ws}`\n );\n }\n this.resolvedEndpoints = endpoints;\n return endpoints;\n }\n\n // Priority 3: Network config defaults\n if (this.networkConfig.indexerUri) {\n endpoints.http = this.networkConfig.indexerUri;\n logger.info(\n LOG_SYSTEM,\n `Using network config indexer URI for ${networkId}: ${endpoints.http}`\n );\n }\n if (this.networkConfig.indexerWsUri) {\n endpoints.ws = this.networkConfig.indexerWsUri;\n logger.debug(\n LOG_SYSTEM,\n `Using network config indexer WS URI for ${networkId}: ${endpoints.ws}`\n );\n }\n\n if (endpoints.http || endpoints.ws) {\n this.resolvedEndpoints = endpoints;\n return endpoints;\n }\n\n // Priority 4: Derive from RPC (only if safe, known pattern exists)\n // Currently DISABLED - no safe derivation pattern implemented\n // This would be enabled in the future when indexer/RPC relationship is well-defined\n logger.debug(LOG_SYSTEM, `No indexer derivation pattern available for ${networkId}`);\n\n // Priority 4: None - no indexer configured\n logger.debug(LOG_SYSTEM, `No indexer endpoints configured for ${networkId}`);\n this.resolvedEndpoints = endpoints;\n return endpoints;\n }\n\n /**\n * Maps internal changeType to GraphQL EventType enum\n * GraphQL enum values: ROLE_GRANTED, ROLE_REVOKED, OWNERSHIP_TRANSFER_STARTED,\n * OWNERSHIP_TRANSFER_COMPLETED, ADMIN_TRANSFER_INITIATED, ADMIN_TRANSFER_COMPLETED\n */\n private mapChangeTypeToGraphQLEnum(changeType: HistoryChangeType): string {\n const mapping: Record<HistoryChangeType, string> = {\n GRANTED: 'ROLE_GRANTED',\n REVOKED: 'ROLE_REVOKED',\n OWNERSHIP_TRANSFER_STARTED: 'OWNERSHIP_TRANSFER_STARTED',\n OWNERSHIP_TRANSFER_COMPLETED: 'OWNERSHIP_TRANSFER_COMPLETED',\n ADMIN_TRANSFER_INITIATED: 'ADMIN_TRANSFER_INITIATED',\n ADMIN_TRANSFER_COMPLETED: 'ADMIN_TRANSFER_COMPLETED',\n UNKNOWN: 'UNKNOWN',\n };\n return mapping[changeType];\n }\n\n /**\n * Build GraphQL query for history with SubQuery filtering and pagination\n */\n private buildHistoryQuery(_contractAddress: string, options?: HistoryQueryOptions): string {\n const roleFilter = options?.roleId ? ', role: { equalTo: $role }' : '';\n const accountFilter = options?.account ? ', account: { equalTo: $account }' : '';\n // Type filter uses inline enum value (consistent with buildLatestGrantsQuery pattern)\n const typeFilter = options?.changeType\n ? `, type: { equalTo: ${this.mapChangeTypeToGraphQLEnum(options.changeType)} }`\n : '';\n const txFilter = options?.txId ? ', txHash: { equalTo: $txHash }' : '';\n // Build combined timestamp filter to avoid duplicate keys\n const timestampConditions: string[] = [];\n if (options?.timestampFrom) {\n timestampConditions.push('greaterThanOrEqualTo: $timestampFrom');\n }\n if (options?.timestampTo) {\n timestampConditions.push('lessThanOrEqualTo: $timestampTo');\n }\n const timestampFilter =\n timestampConditions.length > 0 ? `, timestamp: { ${timestampConditions.join(', ')} }` : '';\n const ledgerFilter = options?.ledger ? ', blockHeight: { equalTo: $blockHeight }' : '';\n const limitClause = options?.limit ? ', first: $limit' : '';\n const cursorClause = options?.cursor ? ', after: $cursor' : '';\n\n // Build variable declarations\n // Note: SubQuery uses Datetime for timestamp filters and BigFloat for blockHeight filtering\n const varDeclarations = [\n '$contract: String!',\n options?.roleId ? '$role: String' : '',\n options?.account ? '$account: String' : '',\n options?.txId ? '$txHash: String' : '',\n options?.timestampFrom ? '$timestampFrom: Datetime' : '',\n options?.timestampTo ? '$timestampTo: Datetime' : '',\n options?.ledger ? '$blockHeight: BigFloat' : '',\n options?.limit ? '$limit: Int' : '',\n options?.cursor ? '$cursor: Cursor' : '',\n ]\n .filter(Boolean)\n .join(', ');\n\n return `\n query GetHistory(${varDeclarations}) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }${roleFilter}${accountFilter}${typeFilter}${txFilter}${timestampFilter}${ledgerFilter}\n }\n orderBy: TIMESTAMP_DESC${limitClause}${cursorClause}\n ) {\n nodes {\n id\n role\n account\n type\n txHash\n timestamp\n blockHeight\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n `;\n }\n\n /**\n * Build query variables including pagination cursor\n */\n private buildQueryVariables(\n contractAddress: string,\n options?: HistoryQueryOptions\n ): Record<string, unknown> {\n const variables: Record<string, unknown> = {\n contract: contractAddress,\n };\n\n if (options?.roleId) {\n variables.role = options.roleId;\n }\n if (options?.account) {\n variables.account = options.account;\n }\n if (options?.txId) {\n variables.txHash = options.txId;\n }\n if (options?.timestampFrom) {\n variables.timestampFrom = options.timestampFrom;\n }\n if (options?.timestampTo) {\n variables.timestampTo = options.timestampTo;\n }\n if (options?.ledger) {\n // GraphQL expects blockHeight as string\n variables.blockHeight = String(options.ledger);\n }\n if (options?.limit) {\n variables.limit = options.limit;\n }\n if (options?.cursor) {\n variables.cursor = options.cursor;\n }\n\n return variables;\n }\n\n /**\n * Build GraphQL query for role discovery\n * Queries all ROLE_GRANTED and ROLE_REVOKED events to extract unique role identifiers\n * Note: EventType is a GraphQL enum, so values must not be quoted\n */\n private buildRoleDiscoveryQuery(): string {\n return `\n query DiscoverRoles($contract: String!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { in: [ROLE_GRANTED, ROLE_REVOKED] }\n }\n ) {\n nodes {\n role\n }\n }\n }\n `;\n }\n\n /**\n * Build GraphQL query for latest grants\n * Queries ROLE_GRANTED events for a specific role and set of accounts\n * Ordered by timestamp descending so first occurrence per account is the latest\n */\n private buildLatestGrantsQuery(): string {\n return `\n query LatestGrants($contract: String!, $role: String!, $accounts: [String!]!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n role: { equalTo: $role }\n account: { in: $accounts }\n type: { equalTo: ROLE_GRANTED }\n }\n orderBy: TIMESTAMP_DESC\n ) {\n nodes {\n account\n txHash\n timestamp\n blockHeight\n }\n }\n }\n `;\n }\n\n /**\n * Transform indexer entries to standard HistoryEntry format\n */\n private transformIndexerEntries(entries: IndexerHistoryEntry[]): HistoryEntry[] {\n return entries.map((entry) => {\n const role: RoleIdentifier = {\n id: entry.role || 'OWNER', // Map ownership events to special role\n };\n\n // Map SubQuery event types to internal types\n let changeType: HistoryChangeType;\n switch (entry.type) {\n case 'ROLE_GRANTED':\n changeType = 'GRANTED';\n break;\n case 'ROLE_REVOKED':\n changeType = 'REVOKED';\n break;\n case 'OWNERSHIP_TRANSFER_STARTED':\n changeType = 'OWNERSHIP_TRANSFER_STARTED';\n break;\n case 'OWNERSHIP_TRANSFER_COMPLETED':\n changeType = 'OWNERSHIP_TRANSFER_COMPLETED';\n break;\n case 'ADMIN_TRANSFER_INITIATED':\n changeType = 'ADMIN_TRANSFER_INITIATED';\n break;\n case 'ADMIN_TRANSFER_COMPLETED':\n changeType = 'ADMIN_TRANSFER_COMPLETED';\n break;\n default:\n // Use UNKNOWN for unrecognized types to make indexer schema issues visible\n logger.warn(\n LOG_SYSTEM,\n `Unknown event type: ${entry.type}, assigning changeType to UNKNOWN`\n );\n changeType = 'UNKNOWN';\n }\n\n return {\n role,\n account: entry.account,\n changeType,\n txId: entry.txHash,\n timestamp: entry.timestamp,\n ledger: parseInt(entry.blockHeight, 10),\n };\n });\n }\n}\n\n/**\n * Factory function to create an indexer client for a network\n * @param networkConfig The Stellar network configuration\n * @returns A new indexer client instance\n */\nexport function createIndexerClient(networkConfig: StellarNetworkConfig): StellarIndexerClient {\n return new StellarIndexerClient(networkConfig);\n}\n","/**\n * Address Validation Module for Access Control\n *\n * Centralizes address validation for access control operations.\n * Uses Stellar-specific validation from the validation module and\n * shared normalization utilities from @openzeppelin/ui-utils.\n */\n\nimport { ConfigurationInvalid } from '@openzeppelin/ui-types';\nimport { normalizeAddress } from '@openzeppelin/ui-utils';\n\nimport { isValidAccountAddress, isValidContractAddress } from '../validation/address';\n\n/**\n * Validates a Stellar contract address\n *\n * @param address The contract address to validate\n * @param paramName Optional parameter name for error messages (defaults to 'contractAddress')\n * @throws ConfigurationInvalid if the address is invalid\n */\nexport function validateContractAddress(address: string, paramName = 'contractAddress'): void {\n if (!address || typeof address !== 'string' || address.trim() === '') {\n throw new ConfigurationInvalid(\n `${paramName} is required and must be a non-empty string`,\n address,\n paramName\n );\n }\n\n if (!isValidContractAddress(address)) {\n throw new ConfigurationInvalid(\n `Invalid Stellar contract address: ${address}. Contract addresses must start with 'C' and be valid StrKey format.`,\n address,\n paramName\n );\n }\n}\n\n/**\n * Validates a Stellar account address (for role grants, ownership transfers, etc.)\n *\n * @param address The account address to validate\n * @param paramName Optional parameter name for error messages (defaults to 'account')\n * @throws ConfigurationInvalid if the address is invalid\n */\nexport function validateAccountAddress(address: string, paramName = 'account'): void {\n if (!address || typeof address !== 'string' || address.trim() === '') {\n throw new ConfigurationInvalid(\n `${paramName} is required and must be a non-empty string`,\n address,\n paramName\n );\n }\n\n if (!isValidAccountAddress(address)) {\n throw new ConfigurationInvalid(\n `Invalid Stellar account address: ${address}. Account addresses must start with 'G' and be valid Ed25519 public keys.`,\n address,\n paramName\n );\n }\n}\n\n/**\n * Validates a Stellar address that can be either an account or contract address\n * (e.g., for ownership transfers where the new owner can be either type)\n *\n * @param address The address to validate (account or contract)\n * @param paramName Optional parameter name for error messages (defaults to 'address')\n * @throws ConfigurationInvalid if the address is invalid\n */\nexport function validateAddress(address: string, paramName = 'address'): void {\n if (!address || typeof address !== 'string' || address.trim() === '') {\n throw new ConfigurationInvalid(\n `${paramName} is required and must be a non-empty string`,\n address,\n paramName\n );\n }\n\n // Check if it's a valid account address OR contract address\n if (!isValidAccountAddress(address) && !isValidContractAddress(address)) {\n throw new ConfigurationInvalid(\n `Invalid Stellar address: ${address}. Address must be a valid account address (starts with 'G') or contract address (starts with 'C').`,\n address,\n paramName\n );\n }\n}\n\n/**\n * Validates both contract and account addresses for operations\n *\n * @param contractAddress The contract address\n * @param accountAddress The account address\n * @throws ConfigurationInvalid if either address is invalid\n */\nexport function validateAddresses(contractAddress: string, accountAddress: string): void {\n validateContractAddress(contractAddress);\n validateAccountAddress(accountAddress);\n}\n\n/**\n * Normalizes a Stellar address using shared utils\n * This is useful for case-insensitive and whitespace-insensitive comparison\n *\n * @param address The address to normalize\n * @returns The normalized address\n */\nexport function normalizeStellarAddress(address: string): string {\n return normalizeAddress(address);\n}\n\n/**\n * Maximum length for a Soroban Symbol (role identifier)\n * Soroban symbols are limited to 32 characters\n */\nconst MAX_ROLE_ID_LENGTH = 32;\n\n/**\n * Valid pattern for Soroban Symbol characters\n * Symbols can contain alphanumeric characters and underscores\n */\nconst VALID_ROLE_ID_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n/**\n * Validates a role identifier (Soroban Symbol)\n *\n * Role IDs must be:\n * - Non-empty strings\n * - Max 32 characters (Soroban Symbol limit)\n * - Start with a letter or underscore\n * - Contain only alphanumeric characters and underscores\n *\n * @param roleId The role identifier to validate\n * @param paramName Optional parameter name for error messages\n * @throws ConfigurationInvalid if the role ID is invalid\n */\nexport function validateRoleId(roleId: string, paramName = 'roleId'): void {\n if (!roleId || typeof roleId !== 'string') {\n throw new ConfigurationInvalid(\n `${paramName} is required and must be a non-empty string`,\n roleId,\n paramName\n );\n }\n\n const trimmed = roleId.trim();\n if (trimmed === '') {\n throw new ConfigurationInvalid(\n `${paramName} cannot be empty or whitespace-only`,\n roleId,\n paramName\n );\n }\n\n if (trimmed.length > MAX_ROLE_ID_LENGTH) {\n throw new ConfigurationInvalid(\n `${paramName} exceeds maximum length of ${MAX_ROLE_ID_LENGTH} characters: \"${trimmed}\" (${trimmed.length} chars)`,\n roleId,\n paramName\n );\n }\n\n if (!VALID_ROLE_ID_PATTERN.test(trimmed)) {\n throw new ConfigurationInvalid(\n `${paramName} contains invalid characters: \"${trimmed}\". Role IDs must start with a letter or underscore and contain only alphanumeric characters and underscores.`,\n roleId,\n paramName\n );\n }\n}\n\n/**\n * Validates an array of role identifiers\n *\n * @param roleIds The array of role identifiers to validate\n * @param paramName Optional parameter name for error messages\n * @throws ConfigurationInvalid if any role ID is invalid or if the array is invalid\n * @returns The validated and deduplicated array of role IDs\n */\nexport function validateRoleIds(roleIds: string[], paramName = 'roleIds'): string[] {\n if (!Array.isArray(roleIds)) {\n throw new ConfigurationInvalid(`${paramName} must be an array`, String(roleIds), paramName);\n }\n\n // Validate each role ID\n for (let i = 0; i < roleIds.length; i++) {\n validateRoleId(roleIds[i], `${paramName}[${i}]`);\n }\n\n // Deduplicate and return\n return [...new Set(roleIds.map((r) => r.trim()))];\n}\n\n/**\n * Result of expiration ledger validation\n *\n * Returned by {@link validateExpirationLedger} to indicate whether\n * a proposed expiration ledger is valid for a two-step ownership transfer.\n *\n * @example\n * ```typescript\n * const currentLedger = await getCurrentLedger(networkConfig);\n * const result = validateExpirationLedger(expirationLedger, currentLedger);\n * if (!result.valid) {\n * throw new ConfigurationInvalid(result.error!, String(expirationLedger), 'expirationLedger');\n * }\n * ```\n */\nexport interface ExpirationValidationResult {\n /** Whether the expiration ledger is valid (must be strictly greater than current ledger) */\n valid: boolean;\n /** The current ledger sequence used for comparison */\n currentLedger: number;\n /** Human-readable error message if validation failed */\n error?: string;\n}\n\n/**\n * Validates an expiration ledger against the current ledger sequence\n *\n * For two-step Ownable contracts, the expiration ledger must be strictly greater\n * than the current ledger (per FR-020: expirationLedger == currentLedger is invalid).\n *\n * @param expirationLedger The proposed expiration ledger sequence\n * @param currentLedger The current ledger sequence number\n * @returns Validation result with valid flag, currentLedger, and optional error message\n *\n * @example\n * ```typescript\n * const currentLedger = await getCurrentLedger(networkConfig);\n * const result = validateExpirationLedger(expirationLedger, currentLedger);\n * if (!result.valid) {\n * throw new ConfigurationInvalid(result.error, 'expirationLedger');\n * }\n * ```\n */\nexport function validateExpirationLedger(\n expirationLedger: number,\n currentLedger: number\n): ExpirationValidationResult {\n // Per FR-020: expirationLedger must be strictly greater than currentLedger\n if (expirationLedger <= currentLedger) {\n return {\n valid: false,\n currentLedger,\n error: `Expiration ledger ${expirationLedger} has already passed or equals current ledger. Current ledger is ${currentLedger}. Expiration must be strictly greater than current ledger.`,\n };\n }\n\n return {\n valid: true,\n currentLedger,\n };\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 type { NetworkServiceForm, UserRpcProviderConfig } from '@openzeppelin/ui-types';\nimport { isValidUrl } from '@openzeppelin/ui-utils';\n\nimport { testStellarRpcConnection, validateStellarRpcEndpoint } from './rpc';\n\n/**\n * Returns the network service forms for Stellar networks.\n * Defines the UI configuration for the RPC and Indexer services.\n *\n * @param exclude Optional array of service IDs to exclude from the returned forms\n * @returns Array of network service forms\n */\nexport function getStellarNetworkServiceForms(exclude: string[] = []): NetworkServiceForm[] {\n const forms: NetworkServiceForm[] = [\n {\n id: 'rpc',\n label: 'RPC Provider',\n fields: [\n {\n id: 'stellar-rpc-url',\n name: 'sorobanRpcUrl',\n type: 'text',\n label: 'Soroban RPC URL',\n placeholder: 'https://soroban.stellar.org',\n validation: { required: true, pattern: '^https?://.+' },\n width: 'full',\n },\n ],\n },\n {\n id: 'indexer',\n label: 'Indexer',\n description: 'Optional GraphQL indexer endpoint for historical access control data',\n supportsConnectionTest: true,\n fields: [\n {\n id: 'stellar-indexer-uri',\n name: 'indexerUri',\n type: 'text',\n label: 'Indexer GraphQL HTTP Endpoint',\n placeholder: 'https://indexer.example.com/graphql',\n validation: { required: false, pattern: '^https?://.+' },\n width: 'full',\n helperText: 'Optional. Used for querying historical access control events.',\n },\n {\n id: 'stellar-indexer-ws-uri',\n name: 'indexerWsUri',\n type: 'text',\n label: 'Indexer GraphQL WebSocket Endpoint',\n placeholder: 'wss://indexer.example.com/graphql',\n validation: { required: false, pattern: '^wss?://.+' },\n width: 'full',\n helperText: 'Optional. Used for real-time subscriptions.',\n },\n ],\n },\n ];\n\n return forms.filter((form) => !exclude.includes(form.id));\n}\n\n/**\n * Validates a network service configuration for Stellar networks.\n */\nexport async function validateStellarNetworkServiceConfig(\n serviceId: string,\n values: Record<string, unknown>\n): Promise<boolean> {\n if (serviceId === 'rpc') {\n const cfg = {\n url: String(values.sorobanRpcUrl || ''),\n isCustom: true,\n } as UserRpcProviderConfig;\n return validateStellarRpcEndpoint(cfg);\n }\n\n if (serviceId === 'indexer') {\n // Validate indexerUri if provided\n if (values.indexerUri !== undefined && values.indexerUri !== null && values.indexerUri !== '') {\n if (!isValidUrl(String(values.indexerUri))) {\n return false;\n }\n }\n\n // Validate indexerWsUri if provided\n if (\n values.indexerWsUri !== undefined &&\n values.indexerWsUri !== null &&\n values.indexerWsUri !== ''\n ) {\n if (!isValidUrl(String(values.indexerWsUri))) {\n return false;\n }\n }\n\n return true;\n }\n\n return true;\n}\n\n/**\n * Tests a network service connection for Stellar networks.\n */\nexport async function testStellarNetworkServiceConnection(\n serviceId: string,\n values: Record<string, unknown>\n): Promise<{ success: boolean; latency?: number; error?: string }> {\n if (serviceId === 'rpc') {\n const cfg = {\n url: String(values.sorobanRpcUrl || ''),\n isCustom: true,\n } as UserRpcProviderConfig;\n return testStellarRpcConnection(cfg);\n }\n\n if (serviceId === 'indexer') {\n const indexerUri = values.indexerUri;\n\n // If no indexer URI is provided, indexer is optional - return success (nothing to test)\n if (!indexerUri || typeof indexerUri !== 'string' || indexerUri.trim() === '') {\n return { success: true };\n }\n\n if (!isValidUrl(indexerUri)) {\n return { success: false, error: 'Invalid indexer URI format' };\n }\n\n try {\n const startTime = Date.now();\n // Perform a simple GraphQL introspection query to test connectivity\n const response = await fetch(indexerUri, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: '{ __typename }',\n }),\n });\n\n const latency = Date.now() - startTime;\n\n if (!response.ok) {\n return {\n success: false,\n latency,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const data = await response.json();\n if (data.errors) {\n return {\n success: false,\n latency,\n error: `GraphQL errors: ${JSON.stringify(data.errors)}`,\n };\n }\n\n return { success: true, latency };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n return { success: true };\n}\n","import type { StellarNetworkConfig, UserRpcProviderConfig } from '@openzeppelin/ui-types';\nimport { appConfigService, isValidUrl, logger, userRpcConfigService } from '@openzeppelin/ui-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 * 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/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { getStellarExplorerAddressUrl } from '../configuration/explorer';\nimport { extractStructFields, isStructType } from '../mapping/struct-fields';\nimport { checkStellarFunctionStateMutability } from '../query/handler';\nimport { getSacSpecArtifacts } from '../sac/spec-cache';\nimport type { StellarContractArtifacts } from '../types/artifacts';\nimport { extractSorobanTypeFromScSpec } from '../utils/type-detection';\nimport { getStellarContractType } from './type';\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 // Special-case: detect SAC and construct spec locally\n try {\n const execType = await getStellarContractType(contractAddress, networkConfig);\n\n if (execType === 'contractExecutableStellarAsset') {\n const { base64Entries, specEntries } = await getSacSpecArtifacts();\n const spec = new StellarSdk.contract.Spec(base64Entries);\n\n const functions = await extractFunctionsFromSpec(\n spec,\n contractAddress,\n specEntries,\n networkConfig\n );\n\n return {\n name: `Stellar Asset Contract ${contractAddress.slice(0, 8)}...`,\n ecosystem: 'stellar',\n functions,\n metadata: {\n specEntries,\n },\n };\n }\n } catch (e) {\n // If detection path fails unexpectedly, fall back to SDK client path below\n logger.warn(\n 'loadStellarContractFromAddress',\n 'SAC detection failed, falling back to regular client:',\n e\n );\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 { EoaExecutionConfig } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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/ui-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/ui-types';\nimport type { UserExplorerConfig } from '@openzeppelin/ui-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/ui-types';\nimport { logger } from '@openzeppelin/ui-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 const fieldParam: FunctionParameter = {\n name: fieldName,\n type: fieldType,\n };\n\n // Recursively extract nested struct components\n if (isStructType(entries, fieldType)) {\n const nestedFields = extractStructFields(entries, fieldType);\n if (nestedFields && nestedFields.length > 0) {\n fieldParam.components = nestedFields;\n }\n }\n\n structFields.push(fieldParam);\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 type { xdr } from '@stellar/stellar-sdk';\n\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport type { SacSpecSourceConfig } from './spec-source';\nimport { fetchSacSpecJson, getSacSpecUrl } from './spec-source';\nimport { encodeSacSpecEntries, toScSpecEntries } from './xdr';\n\ninterface SacSpecCacheEntry {\n base64Entries: string[];\n specEntries: xdr.ScSpecEntry[];\n}\n\nconst sacSpecCache = new Map<string, SacSpecCacheEntry>();\nconst sacSpecInflight = new Map<string, Promise<SacSpecCacheEntry>>();\n\n/**\n * Returns cached SAC spec artifacts (base64 and decoded entries) for the given source config.\n * Ensures fetch/encode work is performed at most once per config.\n */\nexport async function getSacSpecArtifacts(\n cfg: SacSpecSourceConfig = {}\n): Promise<SacSpecCacheEntry> {\n const cacheKey = getSacSpecUrl(cfg);\n\n const cached = sacSpecCache.get(cacheKey);\n if (cached) {\n logger.debug('stellar:sac:spec-cache', 'Returning cached SAC spec artifacts');\n return cached;\n }\n\n const inflight = sacSpecInflight.get(cacheKey);\n if (inflight) {\n return inflight;\n }\n\n const promise = (async () => {\n const json = await fetchSacSpecJson(cfg);\n const base64Entries = await encodeSacSpecEntries(json);\n const specEntries = toScSpecEntries(base64Entries);\n\n const entry: SacSpecCacheEntry = {\n base64Entries,\n specEntries,\n };\n\n sacSpecCache.set(cacheKey, entry);\n sacSpecInflight.delete(cacheKey);\n\n logger.debug('stellar:sac:spec-cache', 'Cached SAC spec artifacts for future re-use');\n\n return entry;\n })().catch((error) => {\n sacSpecInflight.delete(cacheKey);\n throw error;\n });\n\n sacSpecInflight.set(cacheKey, promise);\n return promise;\n}\n\n/**\n * Clears cached SAC spec artifacts. Intended for test environments.\n */\nexport function clearSacSpecArtifactsCache(): void {\n sacSpecCache.clear();\n sacSpecInflight.clear();\n}\n","import { logger } from '@openzeppelin/ui-utils';\n\nexport const DEFAULT_SPEC = {\n repo: 'stellar/stellar-asset-contract-spec',\n path: 'refs/heads/main',\n file: 'stellar-asset-spec.json',\n};\n\nexport interface SacSpecSourceConfig {\n repo?: string;\n path?: string;\n file?: string;\n}\n\nexport function getSacSpecUrl(cfg: SacSpecSourceConfig = {}): string {\n const repo = cfg.repo || DEFAULT_SPEC.repo;\n const path = cfg.path || DEFAULT_SPEC.path;\n const file = cfg.file || DEFAULT_SPEC.file;\n return `https://raw.githubusercontent.com/${repo}/${path}/${file}`;\n}\n\n/** Fetches the SAC JSON spec from GitHub raw. */\nexport async function fetchSacSpecJson(cfg: SacSpecSourceConfig = {}): Promise<string> {\n const url = getSacSpecUrl(cfg);\n try {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n return await res.text();\n } catch (error) {\n logger.error('stellar:sac:spec-source', 'Failed to fetch SAC spec:', url, error);\n throw new Error('Failed to load Stellar Asset Contract spec. Please try again later.');\n }\n}\n","import { xdr } from '@stellar/stellar-sdk';\nimport stellarXdrJsonPackage from '@stellar/stellar-xdr-json/package.json' with { type: 'json' };\nimport { parse, stringify } from 'lossless-json';\n\nimport { logger } from '@openzeppelin/ui-utils';\n\n/**\n * CDN URL for the stellar-xdr-json WASM module.\n *\n * Why CDN instead of bundling?\n * 1. Vite bundling issues: The WASM file requires special handling in Vite. We tried multiple\n * approaches including vite-plugin-wasm, vite-plugin-top-level-await, ?url imports, and\n * various configurations, but consistently hit WebAssembly.instantiate errors where the\n * browser received HTML instead of the WASM binary (magic word 00 61 73 6d expected,\n * but got 3c 21 64 6f which is \"<!do\" in HTML).\n * 2. Bundle size: The WASM file is ~3MB, which would significantly increase bundle size\n * for all users, even those who never use SAC contracts.\n * 3. Dynamic loading: With CDN + dynamic imports, the WASM only loads when actually needed\n * (when a SAC contract is detected), keeping the initial bundle lean.\n * 4. Simplicity: After trying complex Vite configurations and WASM plugins without success,\n * the CDN approach is simpler and more reliable.\n *\n * Trade-off: Requires internet connection for SAC contracts, but this is acceptable since\n * SAC specs are already fetched from GitHub anyway.\n */\ntype PackageJson = { version?: string };\n\nconst stellarXdrJsonVersion = (stellarXdrJsonPackage as PackageJson).version ?? '23.0.0';\n\nconst CDN_WASM_URL = `https://unpkg.com/@stellar/stellar-xdr-json@${stellarXdrJsonVersion}/stellar_xdr_json_bg.wasm`;\n\n// Dynamically import the WASM module only when needed\nlet initialized = false;\nlet encode: ((type: string, value: string) => string) | null = null;\n\n/**\n * Initializes the stellar-xdr-json WASM module for XDR encoding.\n *\n * This uses dynamic imports to only load the WASM when SAC contracts are actually used,\n * avoiding the 3MB overhead for users who don't need SAC support.\n *\n * The WASM is loaded from CDN to keep bundle size minimal.\n */\nexport async function ensureXdrJsonInitialized(): Promise<void> {\n if (initialized) return;\n\n try {\n // Dynamic import - only loads when SAC is actually used\n const stellarXdrJson = await import('@stellar/stellar-xdr-json');\n const init = stellarXdrJson.default;\n\n // Load WASM from CDN\n await init(CDN_WASM_URL);\n encode = stellarXdrJson.encode;\n initialized = true;\n } catch (error) {\n logger.error('stellar:sac:xdr', 'Failed to initialize WASM module:', error);\n throw error;\n }\n}\n\n/**\n * Converts the SAC JSON spec content into Base64 XDR entries for ScSpecEntry[]\n */\nexport async function encodeSacSpecEntries(jsonString: string): Promise<string[]> {\n await ensureXdrJsonInitialized();\n\n if (!encode) {\n throw new Error('WASM module not properly initialized');\n }\n\n try {\n const jsonData = parse(jsonString) as unknown[];\n const result: string[] = [];\n for (const entry of jsonData) {\n const stringified = stringify(entry);\n if (!stringified) {\n throw new Error('Failed to stringify SAC spec entry before XDR encoding.');\n }\n const encoded = encode('ScSpecEntry', stringified);\n result.push(encoded);\n }\n return result;\n } catch (error) {\n logger.error('stellar:sac:xdr', 'Failed to encode SAC spec to XDR', error);\n throw new Error('Failed to process SAC spec.');\n }\n}\n\n/** Utility to convert base64 strings to xdr.ScSpecEntry[] */\nexport function toScSpecEntries(base64Entries: string[]): xdr.ScSpecEntry[] {\n return base64Entries.map((b64) => xdr.ScSpecEntry.fromXDR(b64, 'base64'));\n}\n\n/**\n * Reset the initialization state (mainly for testing)\n */\nexport function resetXdrInitialization(): void {\n initialized = false;\n encode = null;\n}\n","import { Contract, rpc as StellarRpc, xdr } from '@stellar/stellar-sdk';\n\nimport type { StellarNetworkConfig } from '@openzeppelin/ui-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/ui-utils';\n\n/**\n * Returns a Soroban RPC server instance honoring user overrides.\n */\nfunction getSorobanRpcServer(networkConfig: StellarNetworkConfig): StellarRpc.Server {\n const customRpcConfig = userRpcConfigService.getUserRpcConfig(networkConfig.id);\n const rpcUrl = customRpcConfig?.url || 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\nexport type StellarContractExecutableType =\n | 'contractExecutableWasm'\n | 'contractExecutableStellarAsset'\n | null;\n\n/**\n * Detects executable type for a given Stellar contract ID via RPC ledger entries.\n */\nexport async function getStellarContractType(\n contractId: string,\n networkConfig: StellarNetworkConfig\n): Promise<StellarContractExecutableType> {\n try {\n if (!contractId) {\n return null;\n }\n\n const rpcServer = getSorobanRpcServer(networkConfig);\n\n // Build ledger key footprint for the contract\n const ledgerKey = new Contract(contractId).getFootprint();\n const ledgerEntries = await rpcServer.getLedgerEntries(ledgerKey);\n\n const first = ledgerEntries?.entries?.[0]?.val;\n if (!first) {\n throw new Error('Could not obtain contract data from server.');\n }\n\n const executable = first.contractData()?.val()?.instance()?.executable();\n if (!executable) {\n throw new Error('Could not get executable from contract data.');\n }\n\n const execWasmType = xdr.ContractExecutableType.contractExecutableWasm().name;\n const execStellarAssetType = xdr.ContractExecutableType.contractExecutableStellarAsset().name;\n const detected = executable.switch()?.name as string | undefined;\n\n if (detected === execWasmType) return 'contractExecutableWasm';\n if (detected === execStellarAssetType) return 'contractExecutableStellarAsset';\n return null;\n } catch (error) {\n logger.error('stellar:contract-type', 'Failed to detect contract type:', error);\n throw new Error(\n `Something went wrong getting contract type by contract ID. ${(error as Error).message}`\n );\n }\n}\n","import React from 'react';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@openzeppelin/ui-components';\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/ui-components';\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/ui-components';\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/ui-components';\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 type {\n EoaExecutionConfig,\n ExecutionConfig,\n ExecutionMethodDetail,\n MultisigExecutionConfig,\n RelayerExecutionConfig,\n} from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { FieldType, TypeMappingInfo } from '@openzeppelin/ui-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 *\n * Note: Large integer types (U64, U128, U256, I64, I128, I256) are mapped to 'bigint'\n * instead of 'number' to avoid JavaScript's Number precision limitations.\n * JavaScript's Number type can only safely represent integers up to 2^53 - 1,\n * but these types can hold much larger values. The BigIntField component stores values\n * as strings and the Stellar adapter handles conversion automatically.\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: 'bigint',\n U128: 'bigint',\n U256: 'bigint',\n\n // Numeric types - signed integers\n I32: 'number',\n I64: 'bigint',\n I128: 'bigint',\n I256: 'bigint',\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\n/**\n * Stellar dynamic type patterns handled through pattern matching.\n */\nconst STELLAR_DYNAMIC_PATTERNS: TypeMappingInfo['dynamicPatterns'] = [\n { name: 'vec', syntax: 'Vec<T>', mapsTo: null, description: 'Array (maps based on inner type)' },\n { name: 'map', syntax: 'Map<K,V>', mapsTo: 'map', description: 'Key-value map' },\n {\n name: 'option',\n syntax: 'Option<T>',\n mapsTo: 'unwrap',\n description: 'Optional, resolves to inner type',\n },\n {\n name: 'result',\n syntax: 'Result<T>',\n mapsTo: 'unwrap',\n description: 'Result, resolves to inner type',\n },\n { name: 'bytes-n', syntax: 'BytesN<N>', mapsTo: 'bytes', description: 'Fixed-size byte array' },\n {\n name: 'struct',\n syntax: 'StructName',\n mapsTo: 'object',\n description: 'Custom struct (PascalCase)',\n },\n { name: 'enum', syntax: 'EnumName', mapsTo: 'select', description: 'Enum type' },\n];\n\n/**\n * Returns complete type mapping information for Stellar.\n */\nexport function getStellarTypeMappingInfo(): TypeMappingInfo {\n return {\n primitives: { ...STELLAR_TYPE_TO_FIELD_TYPE },\n dynamicPatterns: STELLAR_DYNAMIC_PATTERNS,\n };\n}\n","import type { FieldType } from '@openzeppelin/ui-types';\n\nimport { isBytesNType, 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 (isBytesNType(parameterType)) {\n return 'bytes';\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 if (isBytesNType(parameterType)) {\n return ['bytes', '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: ['bigint', 'number', 'amount', 'text'],\n U128: ['bigint', 'number', 'amount', 'text'],\n U256: ['bigint', 'number', 'amount', 'text'],\n\n // Signed integers\n I32: ['number', 'amount', 'text'],\n I64: ['bigint', 'number', 'text'],\n I128: ['bigint', 'number', 'text'],\n I256: ['bigint', 'number', '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/ui-types';\nimport {\n enhanceNumericValidation,\n getDefaultValueForType,\n logger,\n type NumericBoundsMap,\n} from '@openzeppelin/ui-utils';\n\nimport { extractMapTypes, extractVecElementType } from '../utils/safe-type-parser';\nimport { isBytesNType, isLikelyEnumType } from '../utils/type-detection';\nimport { extractEnumVariants, isEnumType, type EnumMetadata } from './enum-metadata';\nimport { extractStructFields, isStructType } from './struct-fields';\nimport { buildTupleComponents } from './tuple-components';\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 * Stellar/Soroban numeric type bounds.\n * Maps Stellar type names to their min/max value constraints.\n *\n * Note: U64, U128, U256, I64, I128, and I256 are not included here because they exceed\n * JavaScript's Number.MAX_SAFE_INTEGER (2^53 - 1). These types are mapped to 'bigint' field type\n * and handle validation through BigIntField component's internal validation mechanism.\n */\nconst STELLAR_NUMERIC_BOUNDS: NumericBoundsMap = {\n U8: { min: 0, max: 255 },\n U16: { min: 0, max: 65_535 },\n U32: { min: 0, max: 4_294_967_295 },\n I8: { min: -128, max: 127 },\n I16: { min: -32_768, max: 32_767 },\n I32: { min: -2_147_483_648, max: 2_147_483_647 },\n};\n\n/**\n * Generate default form configuration for a Stellar function parameter. Supports:\n * - WASM artifacts: parameters arrive with baked-in enum metadata and struct components.\n * - SAC runtime specs: metadata is fetched on demand, so we reconstruct the same shape from\n * `metadata.specEntries` to keep the UI identical across contract types.\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 // WASM artifacts still include `components` on struct inputs because we bake them during\n // the build step. SAC contracts fetch their spec at runtime, so struct parameters show up\n // without that data. Cache whatever the SAC spec gives us so the final field mirrors the\n // WASM experience.\n let structComponents: FunctionParameter[] | null = null;\n let finalFieldType = fieldType;\n let options: { label: string; value: string }[] | undefined;\n\n // Check if this parameter is an enum type (by spec or heuristic) and extract metadata\n const enumDetectedBySpec = !!(specEntries && isEnumType(specEntries, parameter.type));\n const enumDetectedHeuristic = isLikelyEnumType(parameter.type);\n if (enumDetectedBySpec || enumDetectedHeuristic) {\n if (enumDetectedBySpec) {\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 // Same story here: WASM schemas already embed struct components, but SAC schemas only\n // expose them inside the downloaded spec. Pull them out up front so the UI sees the\n // same shape regardless of how the metadata was sourced.\n if (specEntries && isStructType(specEntries, parameter.type)) {\n const structFields = extractStructFields(specEntries, parameter.type);\n if (structFields && structFields.length > 0) {\n structComponents = structFields;\n }\n }\n\n if (!structComponents) {\n const tupleComponents = buildTupleComponents(parameter.type, specEntries);\n if (tupleComponents && tupleComponents.length > 0) {\n structComponents = tupleComponents;\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 baseField.validation = enhanceNumericValidation(\n baseField.validation,\n parameter.type,\n STELLAR_NUMERIC_BOUNDS\n );\n\n // Propagate max byte length for BytesN types so the UI can enforce it\n if (isBytesNType(parameter.type)) {\n const sizeMatch = parameter.type.match(/^BytesN<(\\d+)>$/);\n const maxBytes = sizeMatch ? Number.parseInt(sizeMatch[1], 10) : undefined;\n\n if (!Number.isNaN(maxBytes) && Number.isFinite(maxBytes)) {\n baseField.metadata = {\n ...(baseField.metadata ?? {}),\n maxBytes,\n };\n }\n }\n\n // For array types (including arrays of complex types), provide element type information\n if (fieldType === 'array' || fieldType === 'array-object') {\n const elementType = extractVecElementType(parameter.type);\n if (elementType) {\n const elementFieldType = mapStellarParameterTypeToFieldType(elementType);\n\n // Check if the element type is an enum or struct and needs additional metadata\n let elementEnumMetadata: EnumMetadata | undefined;\n let elementComponents: FunctionParameter[] | undefined;\n let finalElementFieldType = elementFieldType;\n\n // Extract enum metadata for array elements\n if (isLikelyEnumType(elementType)) {\n if (specEntries && isEnumType(specEntries, elementType)) {\n elementEnumMetadata = extractEnumVariants(specEntries, elementType) ?? undefined;\n if (elementEnumMetadata) {\n // Override field type based on enum characteristics\n finalElementFieldType = elementEnumMetadata.isUnitOnly ? 'select' : 'enum';\n }\n }\n }\n\n // Extract struct components for array elements\n if (specEntries && isStructType(specEntries, elementType)) {\n const structFields = extractStructFields(specEntries, elementType);\n if (structFields && structFields.length > 0) {\n elementComponents = structFields;\n finalElementFieldType = 'object';\n }\n }\n\n // For array-object, if we have components from the parameter, use them\n if (fieldType === 'array-object' && parameter.components) {\n elementComponents = parameter.components;\n finalElementFieldType = 'object';\n }\n\n // Build element validation with bounds\n let elementValidation: FieldValidation = { required: true };\n elementValidation = enhanceNumericValidation(\n elementValidation,\n elementType,\n STELLAR_NUMERIC_BOUNDS\n );\n\n // Add array-specific properties with full element metadata\n const arrayField = {\n ...baseField,\n type: 'array' as FieldType, // Always use 'array' as the field type\n elementType: finalElementFieldType,\n elementFieldConfig: {\n type: finalElementFieldType,\n validation: elementValidation,\n placeholder: `Enter ${elementType}`,\n originalParameterType: elementType,\n ...(elementEnumMetadata && { enumMetadata: elementEnumMetadata }),\n ...(elementComponents && { components: elementComponents }),\n },\n };\n return arrayField as unknown as FormFieldType<T>;\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: enhanceNumericValidation(\n { required: true },\n mapTypes.keyType,\n STELLAR_NUMERIC_BOUNDS\n ),\n placeholder: `Enter ${mapTypes.keyType}`,\n originalParameterType: mapTypes.keyType,\n },\n valueFieldConfig: {\n type: valueFieldType,\n validation: enhanceNumericValidation(\n { required: true },\n mapTypes.valueType,\n STELLAR_NUMERIC_BOUNDS\n ),\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 (fieldType === 'object' || fieldType === 'array-object') {\n const componentsToUse = parameter.components || structComponents;\n if (componentsToUse) {\n // Prefer the baked-in WASM components, otherwise fall back to the SAC-derived\n // components we cached above.\n const result = {\n ...baseField,\n components: componentsToUse,\n };\n return result;\n }\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 type { FunctionParameter } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\n// Import the type extraction utility from the shared utils module\nimport { extractSorobanTypeFromScSpec } from '../utils/type-detection';\nimport { extractStructFields, isStructType } from './struct-fields';\nimport { buildTupleComponents } from './tuple-components';\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 /** Optional detailed component metadata for payload types */\n payloadComponents?: (FunctionParameter[] | undefined)[];\n /** For integer variants: the numeric value */\n value?: number;\n /** Flag indicating if this variant has a single Tuple payload that needs wrapping during serialization */\n isSingleTuplePayload?: boolean;\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 * Helper function to flatten a single payload type.\n * Handles tuples, structs, and primitive types differently.\n *\n * @param payloadType - The type to flatten\n * @param entries - Spec entries for struct/enum resolution\n * @param flattenedTypes - Array to accumulate flattened type names\n * @param flattenedComponents - Array to accumulate component metadata\n */\nfunction flattenPayloadType(\n payloadType: string,\n entries: xdr.ScSpecEntry[],\n flattenedTypes: string[],\n flattenedComponents: (FunctionParameter[] | undefined)[]\n): void {\n if (payloadType.startsWith('Tuple<')) {\n // Extract tuple components and add them individually for UI rendering\n const tupleComponents = buildTupleComponents(payloadType, entries);\n if (tupleComponents && tupleComponents.length > 0) {\n tupleComponents.forEach((component) => {\n flattenedTypes.push(component.type);\n if (isStructType(entries, component.type)) {\n flattenedComponents.push(extractStructFields(entries, component.type) ?? undefined);\n } else {\n flattenedComponents.push(component.components);\n }\n });\n } else {\n flattenedTypes.push(payloadType);\n flattenedComponents.push(undefined);\n }\n } else if (isStructType(entries, payloadType)) {\n flattenedTypes.push(payloadType);\n flattenedComponents.push(extractStructFields(entries, payloadType) ?? undefined);\n } else {\n flattenedTypes.push(payloadType);\n flattenedComponents.push(undefined);\n }\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 rawPayloadTypes = tupleCase\n .type()\n .map((typeDef) => extractSorobanTypeFromScSpec(typeDef));\n\n // Track if we have a single Tuple payload that needs special handling\n const isSingleTuplePayload =\n rawPayloadTypes.length === 1 && rawPayloadTypes[0].startsWith('Tuple<');\n\n // Flatten tuple payloads for UI rendering\n // Example: Some((Address, i128)) → payloadTypes: ['Address', 'I128'] for UI\n // But we keep the original structure info for serialization\n const flattenedPayloadTypes: string[] = [];\n const flattenedPayloadComponents: (FunctionParameter[] | undefined)[] = [];\n\n for (const payloadType of rawPayloadTypes) {\n flattenPayloadType(\n payloadType,\n entries,\n flattenedPayloadTypes,\n flattenedPayloadComponents\n );\n }\n\n variants.push({\n name: tupleCase.name().toString(),\n type: 'tuple',\n payloadTypes: flattenedPayloadTypes,\n ...(flattenedPayloadComponents.some(\n (components) => components && components.length > 0\n ) && {\n payloadComponents: flattenedPayloadComponents,\n }),\n // Store metadata about whether this needs tuple wrapping during serialization\n ...(isSingleTuplePayload && { isSingleTuplePayload: true }),\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 { xdr } from '@stellar/stellar-sdk';\n\nimport type { FunctionParameter } from '@openzeppelin/ui-types';\n\nimport { extractTupleTypes } from '../utils/safe-type-parser';\nimport { extractStructFields, isStructType } from './struct-fields';\n\n/**\n * Builds synthetic FunctionParameter definitions for tuple types so they can be rendered\n * using the existing object field UI.\n */\nexport function buildTupleComponents(\n parameterType: string,\n specEntries?: xdr.ScSpecEntry[]\n): FunctionParameter[] | null {\n const tupleElements = extractTupleTypes(parameterType);\n if (!tupleElements || tupleElements.length === 0) {\n return null;\n }\n\n return tupleElements.map((elementType, index) => {\n let nestedComponents: FunctionParameter[] | undefined;\n\n if (specEntries && isStructType(specEntries, elementType)) {\n const structFields = extractStructFields(specEntries, elementType);\n if (structFields && structFields.length > 0) {\n nestedComponents = structFields;\n }\n } else if (elementType.startsWith('Tuple<')) {\n const tupleStruct = buildTupleComponents(elementType, specEntries);\n if (tupleStruct && tupleStruct.length > 0) {\n nestedComponents = tupleStruct;\n }\n }\n\n return {\n name: `item_${index}`,\n type: elementType,\n displayName: `Value ${index + 1} (${elementType})`,\n ...(nestedComponents && { components: nestedComponents }),\n };\n });\n}\n","import { Address, xdr } from '@stellar/stellar-sdk';\n\nimport type {\n ContractSchema,\n EnumValue,\n FormFieldType,\n FunctionParameter,\n} from '@openzeppelin/ui-types';\nimport { isEnumValue } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { extractEnumVariants, isEnumType } from '../mapping/enum-metadata';\nimport { parseStellarInput } from '../transform';\nimport { isPrimitiveParamType } from '../utils/stellar-types';\nimport { isBytesNType, isLikelyEnumType } from '../utils/type-detection';\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 * Recursively enriches a parameter with enum metadata from specEntries.\n * This ensures enum types get the metadata they need for proper ScVal conversion.\n */\nfunction enrichParameterWithEnumMetadata(\n param: FunctionParameter,\n specEntries: xdr.ScSpecEntry[] | undefined\n): FunctionParameter {\n if (!specEntries) {\n return param;\n }\n\n const enriched: FunctionParameter = { ...param };\n\n // Add enum metadata if this is an enum type\n if (isLikelyEnumType(param.type) && isEnumType(specEntries, param.type)) {\n const enumMetadata = extractEnumVariants(specEntries, param.type);\n if (enumMetadata) {\n enriched.enumMetadata = enumMetadata;\n }\n }\n\n // For Vec<EnumType>, extract the element type's enum metadata\n const vecMatch = param.type.match(/^Vec<([^>]+)>$/);\n if (vecMatch) {\n const elementType = vecMatch[1];\n if (isLikelyEnumType(elementType) && isEnumType(specEntries, elementType)) {\n const enumMetadata = extractEnumVariants(specEntries, elementType);\n if (enumMetadata) {\n enriched.enumMetadata = enumMetadata;\n }\n }\n }\n\n // Recursively process components for struct types\n if (enriched.components && enriched.components.length > 0) {\n enriched.components = enriched.components.map((component) =>\n enrichParameterWithEnumMetadata(component, specEntries)\n );\n }\n\n return enriched;\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 return rawValue;\n }\n const processedValue = parseStellarInput(rawValue, expectedType);\n // Keep SorobanArgumentValue wrapper for primitive payloads to satisfy tests and simple paths.\n // For complex payloads (structs/tuples/maps/vec/enums), return raw values and let valueToScVal handle serialization.\n const isPrimitivePayload =\n isPrimitiveParamType(expectedType) || isBytesNType(expectedType);\n\n if (isPrimitivePayload) {\n return { type: expectedType, value: processedValue };\n }\n return processedValue;\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 fieldByName = new Map<string, FormFieldType>();\n fields.forEach((field) => fieldByName.set(field.name, field));\n\n // Extract specEntries from contract metadata for enum enrichment\n const specEntries = contractSchema.metadata?.specEntries as xdr.ScSpecEntry[] | undefined;\n\n const argSchemaWithComponents = functionDetails.inputs.map((param) => {\n const field = fieldByName.get(param.name);\n\n // Build enhanced schema with components and enum metadata from the field\n const enhanced: FunctionParameter = { ...param };\n\n // Prefer existing components from param, otherwise use field components\n if (param.components && param.components.length > 0) {\n enhanced.components = param.components;\n } else if (field?.components && field.components.length > 0) {\n enhanced.components = field.components;\n }\n\n // Add enum metadata from field if available\n if (field?.enumMetadata) {\n enhanced.enumMetadata = field.enumMetadata;\n }\n\n // For array fields, check if elementFieldConfig has enum metadata or components\n // This is needed for Vec<EnumType> or Vec<StructType>\n if (param.type.startsWith('Vec<') && field?.elementFieldConfig) {\n if (field.elementFieldConfig.enumMetadata) {\n enhanced.enumMetadata = field.elementFieldConfig.enumMetadata;\n }\n if (field.elementFieldConfig.components) {\n enhanced.components = field.elementFieldConfig.components;\n }\n }\n\n // For struct fields, enrich the components with enum metadata from nested fields\n if (enhanced.components && enhanced.components.length > 0) {\n enhanced.components = enhanced.components.map((component) => {\n // Build the nested field name (e.g., \"complex_struct.base_asset\")\n const nestedFieldName = `${param.name}.${component.name}`;\n const nestedField = fieldByName.get(nestedFieldName);\n\n if (nestedField) {\n const enrichedComponent: FunctionParameter = { ...component };\n\n // Add enum metadata from nested field\n if (nestedField.enumMetadata) {\n enrichedComponent.enumMetadata = nestedField.enumMetadata;\n }\n\n // Add components from nested field\n if (nestedField.components) {\n enrichedComponent.components = nestedField.components;\n }\n\n // For nested array fields, extract elementFieldConfig metadata\n if (component.type.startsWith('Vec<') && nestedField.elementFieldConfig) {\n if (nestedField.elementFieldConfig.enumMetadata) {\n enrichedComponent.enumMetadata = nestedField.elementFieldConfig.enumMetadata;\n }\n if (nestedField.elementFieldConfig.components) {\n enrichedComponent.components = nestedField.elementFieldConfig.components;\n }\n }\n\n return enrichedComponent;\n }\n\n return component;\n });\n }\n\n // Use specEntries to enrich with enum metadata for any enum types that weren't in the fields\n // This handles nested enums in structs where the nested fields aren't in the fields array\n const finalEnhanced = enrichParameterWithEnumMetadata(enhanced, specEntries);\n\n return finalEnhanced;\n });\n\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: argSchemaWithComponents, // Include full parameter schema with struct/tuple 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 type { ISupportedWallet } from '@creit.tech/stellar-wallets-kit';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\n\nimport type { UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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/ui-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/ui-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/ui-types';\nimport { appConfigService, logger } from '@openzeppelin/ui-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 { Button } from '@openzeppelin/ui-components';\nimport type { BaseComponentProps } from '@openzeppelin/ui-types';\nimport { cn } from '@openzeppelin/ui-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 {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@openzeppelin/ui-components';\nimport type { Connector } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { Button } from '@openzeppelin/ui-components';\nimport type { BaseComponentProps } from '@openzeppelin/ui-types';\nimport { cn, truncateMiddle } from '@openzeppelin/ui-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 { EcosystemWalletComponents, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { ECOSYSTEM_WALLET_COMPONENT_KEYS } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { EcosystemWalletComponents, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { NativeConfigLoader, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-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 iconComponent: NetworkStellar,\n indexerUri: 'https://openzeppelin-stellar-mainnet.graphql.subquery.network/',\n};\n","import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-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 iconComponent: NetworkStellar,\n indexerUri: 'https://openzepplin-stellar-testnet.graphql.subquery.network',\n};\n","import { StellarNetworkConfig } from '@openzeppelin/ui-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/ui-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 // SAC (Stellar Asset Contract) support - dynamically loaded from CDN\n // These are needed for XDR encoding when working with SAC contracts\n '@stellar/stellar-xdr-json': '^23.0.0',\n 'lossless-json': '^4.0.2',\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_ui_types","import_ui_utils","import_stellar_sdk","import_ui_types","import_ui_utils","import_stellar_sdk","import_ui_utils","import_ui_types","import_ui_utils","import_ui_utils","import_ui_utils","SYSTEM_LOG_TAG","import_stellar_sdk","import_ui_utils","import_stellar_sdk","import_ui_utils","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","import_stellar_sdk","import_ui_types","import_stellar_sdk","import_ui_types","import_ui_utils","SYSTEM_LOG_TAG","scValType","typeHint","SYSTEM_LOG_TAG","import_stellar_sdk","import_ui_utils","StellarRpc","contract","StellarRpc","import_ui_types","import_ui_utils","import_stellar_sdk","import_ui_utils","import_stellar_sdk","import_ui_utils","import_ui_utils","import_ui_utils","import_ui_utils","import_ui_utils","xdr","LOG_SYSTEM","import_stellar_wallets_kit","import_ui_utils","import_ui_utils","state","xdr","SYSTEM_LOG_TAG","getSorobanRpcServer","StellarRpc","contract","import_stellar_sdk","import_ui_utils","contract","StellarRpc","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","import_ui_types","import_ui_types","import_ui_utils","LOG_SYSTEM","import_ui_types","import_ui_utils","import_stellar_sdk","import_ui_utils","import_ui_utils","StellarSdk","import_ui_utils","import_ui_utils","SYSTEM_LOG_TAG","import_stellar_sdk","import_ui_utils","isStructType","import_ui_utils","import_ui_utils","import_stellar_sdk","import_ui_utils","stellarXdrJsonPackage","import_stellar_sdk","import_ui_utils","getSorobanRpcServer","StellarRpc","specEntries","functions","isStructType","import_react","import_ui_components","import_jsx_runtime","import_ui_components","import_jsx_runtime","import_ui_components","import_jsx_runtime","import_react","import_react_hook_form","import_jsx_runtime","React","import_ui_utils","SYSTEM_LOG_TAG","import_ui_utils","import_stellar_sdk","import_ui_utils","isStructType","isStructType","isStructType","import_stellar_sdk","import_ui_types","import_ui_utils","specEntries","import_react","import_ui_utils","import_react","import_jsx_runtime","import_react","import_react","import_react","import_ui_utils","import_lucide_react","import_react","import_ui_components","import_ui_utils","import_react","import_ui_components","import_ui_utils","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_ui_components","import_ui_utils","import_jsx_runtime","import_ui_types","import_ui_utils","import_ui_utils","import_ui_utils","import_react","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/adapter.ts","../src/access-control/onchain-reader.ts","../src/query/handler.ts","../src/transform/parsers/index.ts","../src/utils/type-detection.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/utils/xdr-ordering.ts","../src/transform/parsers/scval-converter.ts","../src/utils/stellar-types.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/access-control/service.ts","../src/transaction/sender.ts","../src/transaction/eoa.ts","../src/access-control/actions.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/transaction/relayer.ts","../src/access-control/feature-detection.ts","../src/access-control/indexer-client.ts","../src/access-control/validation.ts","../src/validation/address.ts","../src/configuration/network-services.ts","../src/configuration/rpc.ts","../src/contract/loader.ts","../src/validation/eoa.ts","../src/validation/relayer.ts","../src/configuration/explorer.ts","../src/mapping/struct-fields.ts","../src/sac/spec-cache.ts","../src/sac/spec-source.ts","../src/sac/xdr.ts","../src/contract/type.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/configuration/execution.ts","../src/mapping/constants.ts","../src/mapping/type-mapper.ts","../src/mapping/field-generator.ts","../src/mapping/enum-metadata.ts","../src/mapping/tuple-components.ts","../src/transaction/formatter.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 AccessControlService,\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 NetworkServiceForm,\n RelayerDetails,\n RelayerDetailsRich,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n TypeMappingInfo,\n UiKitConfiguration,\n UserRpcProviderConfig,\n WalletConnectionStatus,\n} from '@openzeppelin/ui-types';\nimport { isStellarNetworkConfig } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { getCurrentLedger } from './access-control/onchain-reader';\nimport { createStellarAccessControlService } from './access-control/service';\nimport {\n getStellarDefaultServiceConfig,\n getStellarNetworkServiceForms,\n testStellarNetworkServiceConnection,\n validateStellarNetworkServiceConfig,\n} from './configuration/network-services';\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 getStellarTypeMappingInfo,\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 */\nexport class StellarAdapter implements ContractAdapter {\n readonly networkConfig: StellarNetworkConfig;\n readonly initialAppServiceKitName: UiKitConfiguration['kitName'];\n private readonly accessControlService: AccessControlService;\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 // Initialize Access Control Service\n this.accessControlService = createStellarAccessControlService(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 /**\n * @inheritdoc\n */\n public getNetworkServiceForms(): NetworkServiceForm[] {\n return getStellarNetworkServiceForms();\n }\n\n /**\n * @inheritdoc\n */\n public async validateNetworkServiceConfig(\n serviceId: string,\n values: Record<string, unknown>\n ): Promise<boolean> {\n return validateStellarNetworkServiceConfig(serviceId, values);\n }\n\n /**\n * @inheritdoc\n */\n public async testNetworkServiceConnection(\n serviceId: string,\n values: Record<string, unknown>\n ): Promise<{ success: boolean; latency?: number; error?: string }> {\n return testStellarNetworkServiceConnection(serviceId, values);\n }\n\n /**\n * @inheritdoc\n */\n public getDefaultServiceConfig(serviceId: string): Record<string, unknown> | null {\n return getStellarDefaultServiceConfig(this.networkConfig, serviceId);\n }\n\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 /**\n * @inheritdoc\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 /**\n * @inheritdoc\n */\n getWritableFunctions(contractSchema: ContractSchema): ContractSchema['functions'] {\n return getStellarWritableFunctions(contractSchema);\n }\n\n /**\n * @inheritdoc\n */\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 /**\n * @inheritdoc\n */\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 /**\n * @inheritdoc\n */\n isViewFunction(functionDetails: ContractFunction): boolean {\n return isStellarViewFunction(functionDetails);\n }\n\n /**\n * @inheritdoc\n */\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 /**\n * @inheritdoc\n */\n formatFunctionResult(decodedValue: unknown, functionDetails: ContractFunction): string {\n return formatStellarFunctionResult(decodedValue, functionDetails);\n }\n\n /**\n * @inheritdoc\n */\n supportsWalletConnection(): boolean {\n return supportsStellarWalletConnection();\n }\n\n /**\n * @inheritdoc\n */\n async getAvailableConnectors(): Promise<Connector[]> {\n return getStellarAvailableConnectors();\n }\n\n /**\n * @inheritdoc\n */\n async connectWallet(\n connectorId: string\n ): Promise<{ connected: boolean; address?: string; error?: string }> {\n return connectStellarWallet(connectorId);\n }\n\n /**\n * @inheritdoc\n */\n async disconnectWallet(): Promise<{ disconnected: boolean; error?: string }> {\n return disconnectStellarWallet();\n }\n\n /**\n * @inheritdoc\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 /**\n * @inheritdoc\n */\n async getSupportedExecutionMethods(): Promise<ExecutionMethodDetail[]> {\n return getStellarSupportedExecutionMethods();\n }\n\n /**\n * @inheritdoc\n */\n async validateExecutionConfig(config: ExecutionConfig): Promise<true | string> {\n const walletStatus = this.getWalletConnectionStatus();\n return validateStellarExecutionConfig(config, walletStatus);\n }\n\n /**\n * @inheritdoc\n */\n getExplorerUrl(address: string): string | null {\n return getStellarExplorerAddressUrl(address, this.networkConfig);\n }\n\n /**\n * @inheritdoc\n */\n getExplorerTxUrl?(txHash: string): string | null {\n if (getStellarExplorerTxUrl) {\n return getStellarExplorerTxUrl(txHash, this.networkConfig);\n }\n return null;\n }\n\n /**\n * @inheritdoc\n */\n async getCurrentBlock(): Promise<number> {\n return getCurrentLedger(this.networkConfig);\n }\n\n /**\n * @inheritdoc\n */\n isValidAddress(address: string, addressType?: string): boolean {\n return isStellarValidAddress(address, addressType as StellarAddressType);\n }\n\n /**\n * @inheritdoc\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 /**\n * @inheritdoc\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 /**\n * @inheritdoc\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 * @inheritdoc\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 * @inheritdoc\n */\n public getAccessControlService(): AccessControlService {\n return this.accessControlService;\n }\n\n /**\n * @inheritdoc\n */\n public getTypeMappingInfo(): TypeMappingInfo {\n return getStellarTypeMappingInfo();\n }\n}\n\n// Also export as default to ensure compatibility with various import styles\nexport default StellarAdapter;\n","/**\n * On-Chain Reader Module\n *\n * Reads current access control state (ownership and roles) from Stellar (Soroban) contracts\n * using on-chain queries. Supports both Ownable and AccessControl patterns.\n */\n\nimport { rpc as StellarRpc } from '@stellar/stellar-sdk';\n\nimport type {\n ContractSchema,\n OwnershipInfo,\n RoleAssignment,\n RoleIdentifier,\n StellarNetworkConfig,\n} from '@openzeppelin/ui-types';\nimport { OperationFailed } from '@openzeppelin/ui-types';\nimport { DEFAULT_CONCURRENCY_LIMIT, logger, promiseAllWithLimit } from '@openzeppelin/ui-utils';\n\nimport { queryStellarViewFunction } from '../query/handler';\n\n/**\n * Helper to load a minimal contract schema for access control functions\n * This allows us to use the existing query infrastructure\n */\nfunction createMinimalSchema(\n contractAddress: string,\n functionName: string,\n inputs: Array<{ name: string; type: string }> = [],\n outputType = 'Val'\n): ContractSchema {\n return {\n ecosystem: 'stellar',\n address: contractAddress,\n functions: [\n {\n id: functionName,\n name: functionName,\n displayName: functionName,\n type: 'function',\n inputs,\n outputs: [{ name: 'result', type: outputType }],\n modifiesState: false,\n stateMutability: 'view',\n },\n ],\n };\n}\n\n/**\n * Simple wrapper around queryStellarViewFunction for access control queries\n */\nasync function queryAccessControlFunction(\n contractAddress: string,\n functionName: string,\n params: unknown[],\n networkConfig: StellarNetworkConfig,\n inputs: Array<{ name: string; type: string }> = []\n): Promise<unknown> {\n const schema = createMinimalSchema(contractAddress, functionName, inputs);\n return queryStellarViewFunction(contractAddress, functionName, networkConfig, params, schema);\n}\n\n/**\n * Reads the current owner from an Ownable contract\n *\n * @param contractAddress The contract address\n * @param networkConfig The network configuration\n * @returns Ownership information\n */\nexport async function readOwnership(\n contractAddress: string,\n networkConfig: StellarNetworkConfig\n): Promise<OwnershipInfo> {\n logger.info('readOwnership', `Reading owner for contract ${contractAddress}`);\n\n try {\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_owner',\n [],\n networkConfig\n );\n\n // get_owner returns Option<Address>\n if (result === undefined || result === null) {\n return { owner: null };\n }\n\n const ownerAddress = typeof result === 'string' ? result : String(result);\n logger.debug('readOwnership', `Owner: ${ownerAddress}`);\n\n return { owner: ownerAddress };\n } catch (error) {\n logger.error('readOwnership', 'Failed to read ownership:', error);\n throw new OperationFailed(\n `Failed to read ownership: ${(error as Error).message}`,\n contractAddress,\n 'readOwnership',\n error as Error\n );\n }\n}\n\n/**\n * Checks if an account has a specific role\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param account The account address to check\n * @param networkConfig The network configuration\n * @returns True if the account has the role, false otherwise\n */\nexport async function hasRole(\n contractAddress: string,\n roleId: string,\n account: string,\n networkConfig: StellarNetworkConfig\n): Promise<boolean> {\n logger.debug('hasRole', `Checking role ${roleId} for ${account}`);\n\n try {\n const inputs = [\n { name: 'account', type: 'Address' },\n { name: 'role', type: 'Symbol' },\n ];\n const result = await queryAccessControlFunction(\n contractAddress,\n 'has_role',\n [account, roleId],\n networkConfig,\n inputs\n );\n\n // has_role returns Option<u32> (Some(index) if has role, None otherwise)\n return typeof result === 'number';\n } catch (error) {\n logger.error('hasRole', `Failed to check role ${roleId}:`, error);\n return false;\n }\n}\n\n/**\n * Gets the count of members for a specific role\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param networkConfig The network configuration\n * @returns The count of role members\n */\nexport async function getRoleMemberCount(\n contractAddress: string,\n roleId: string,\n networkConfig: StellarNetworkConfig\n): Promise<number> {\n logger.debug('getRoleMemberCount', `Getting member count for role ${roleId}`);\n\n try {\n const inputs = [{ name: 'role', type: 'Symbol' }];\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_role_member_count',\n [roleId],\n networkConfig,\n inputs\n );\n\n // Handle both number and string results (formatter may return string for large numbers)\n if (typeof result === 'number') {\n return result;\n }\n if (typeof result === 'string') {\n const parsed = parseInt(result, 10);\n return isNaN(parsed) ? 0 : parsed;\n }\n return 0;\n } catch (error) {\n logger.error('getRoleMemberCount', `Failed to get member count for role ${roleId}:`, error);\n return 0;\n }\n}\n\n/**\n * Gets the member address at a specific index for a role\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param index The index of the member to retrieve\n * @param networkConfig The network configuration\n * @returns The member address, or null if index out of bounds\n */\nexport async function getRoleMember(\n contractAddress: string,\n roleId: string,\n index: number,\n networkConfig: StellarNetworkConfig\n): Promise<string | null> {\n logger.debug('getRoleMember', `Getting member at index ${index} for role ${roleId}`);\n\n try {\n const inputs = [\n { name: 'role', type: 'Symbol' },\n { name: 'index', type: 'u32' },\n ];\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_role_member',\n [roleId, index],\n networkConfig,\n inputs\n );\n\n if (result === undefined || result === null) {\n return null;\n }\n\n return String(result);\n } catch (error) {\n logger.error('getRoleMember', `Failed to get role member at index ${index}:`, error);\n return null;\n }\n}\n\n/**\n * Enumerates all members of a specific role\n *\n * Fetches all members in parallel with controlled concurrency for improved\n * performance while avoiding overwhelming RPC endpoints.\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param networkConfig The network configuration\n * @returns Array of member addresses\n */\nexport async function enumerateRoleMembers(\n contractAddress: string,\n roleId: string,\n networkConfig: StellarNetworkConfig\n): Promise<string[]> {\n logger.info('enumerateRoleMembers', `Enumerating members for role ${roleId}`);\n\n try {\n // Get the count of members\n const count = await getRoleMemberCount(contractAddress, roleId, networkConfig);\n\n logger.debug('enumerateRoleMembers', `Role ${roleId} has ${count} members`);\n\n if (count === 0) {\n return [];\n }\n\n // Create task functions for controlled concurrent execution\n const memberTasks = Array.from(\n { length: count },\n (_, i) => () => getRoleMember(contractAddress, roleId, i, networkConfig)\n );\n\n // Fetch members with concurrency limit to avoid overwhelming RPC endpoints\n const results = await promiseAllWithLimit(memberTasks, DEFAULT_CONCURRENCY_LIMIT);\n\n // Filter out null results and return valid members\n const members = results.filter((m): m is string => m !== null);\n\n logger.debug('enumerateRoleMembers', `Retrieved ${members.length} members for role ${roleId}`);\n\n return members;\n } catch (error) {\n logger.error('enumerateRoleMembers', `Failed to enumerate role ${roleId}:`, error);\n throw new OperationFailed(\n `Failed to enumerate role members: ${(error as Error).message}`,\n contractAddress,\n 'enumerateRoleMembers',\n error as Error\n );\n }\n}\n\n/**\n * Reads all current role assignments for a contract\n *\n * Fetches all roles in parallel for improved performance.\n *\n * @param contractAddress The contract address\n * @param roleIds Array of role identifiers to query\n * @param networkConfig The network configuration\n * @returns Array of role assignments\n */\nexport async function readCurrentRoles(\n contractAddress: string,\n roleIds: string[],\n networkConfig: StellarNetworkConfig\n): Promise<RoleAssignment[]> {\n logger.info(\n 'readCurrentRoles',\n `Reading ${roleIds.length} roles for contract ${contractAddress}`\n );\n\n if (roleIds.length === 0) {\n return [];\n }\n\n // Process all roles in parallel for improved performance\n const assignmentPromises = roleIds.map(async (roleId) => {\n const role: RoleIdentifier = {\n id: roleId,\n label: roleId.replace(/_/g, ' ').toLowerCase(),\n };\n\n try {\n const members = await enumerateRoleMembers(contractAddress, roleId, networkConfig);\n\n logger.debug('readCurrentRoles', `Role ${roleId} has ${members.length} members`);\n\n return {\n role,\n members,\n };\n } catch (error) {\n logger.warn('readCurrentRoles', `Failed to read role ${roleId}:`, error);\n // Return role with empty members array to maintain array length consistency\n return {\n role,\n members: [],\n };\n }\n });\n\n const assignments = await Promise.all(assignmentPromises);\n\n logger.info(\n 'readCurrentRoles',\n `Completed reading ${assignments.length} roles with ${assignments.reduce((sum, a) => sum + a.members.length, 0)} total members`\n );\n\n return assignments;\n}\n\n/**\n * Gets the admin role for a specific role\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param networkConfig The network configuration\n * @returns The admin role identifier, or null if no admin role set\n */\nexport async function getRoleAdmin(\n contractAddress: string,\n roleId: string,\n networkConfig: StellarNetworkConfig\n): Promise<string | null> {\n logger.debug('getRoleAdmin', `Getting admin role for ${roleId}`);\n\n try {\n const inputs = [{ name: 'role', type: 'Symbol' }];\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_role_admin',\n [roleId],\n networkConfig,\n inputs\n );\n\n // get_role_admin returns Option<Symbol>\n if (result === undefined || result === null) {\n return null;\n }\n\n return String(result);\n } catch (error) {\n logger.error('getRoleAdmin', `Failed to get admin role for ${roleId}:`, error);\n return null;\n }\n}\n\n/**\n * Gets the top-level admin account\n *\n * @param contractAddress The contract address\n * @param networkConfig The network configuration\n * @returns The admin address, or null if no admin set\n */\nexport async function getAdmin(\n contractAddress: string,\n networkConfig: StellarNetworkConfig\n): Promise<string | null> {\n logger.info('getAdmin', `Reading admin for contract ${contractAddress}`);\n\n try {\n const result = await queryAccessControlFunction(\n contractAddress,\n 'get_admin',\n [],\n networkConfig\n );\n\n // get_admin returns Option<Address>\n if (result === undefined || result === null) {\n return null;\n }\n\n return String(result);\n } catch (error) {\n logger.error('getAdmin', 'Failed to read admin:', error);\n return null;\n }\n}\n\n/**\n * Gets the current ledger sequence number from the Soroban RPC\n *\n * Used for two-step Ownable contracts to:\n * - Calculate appropriate expiration ledgers for ownership transfers\n * - Validate expiration ledgers before submitting transactions\n * - Determine if pending ownership transfers have expired\n *\n * @param networkConfig The network configuration containing the Soroban RPC URL\n * @returns Promise resolving to the current ledger sequence number\n * @throws OperationFailed if the RPC call fails\n *\n * @example\n * ```typescript\n * const currentLedger = await getCurrentLedger(networkConfig);\n * // Set expiration to ~1 hour from now (~720 ledgers at 5s/ledger)\n * const expirationLedger = currentLedger + 720;\n * ```\n */\nexport async function getCurrentLedger(networkConfig: StellarNetworkConfig): Promise<number> {\n logger.info('getCurrentLedger', `Fetching current ledger from ${networkConfig.sorobanRpcUrl}`);\n\n try {\n const server = new StellarRpc.Server(networkConfig.sorobanRpcUrl);\n const latestLedger = await server.getLatestLedger();\n\n logger.debug('getCurrentLedger', `Current ledger: ${latestLedger.sequence}`);\n\n return latestLedger.sequence;\n } catch (error) {\n logger.error('getCurrentLedger', 'Failed to fetch current ledger:', error);\n throw new OperationFailed(\n `Failed to get current ledger: ${(error as Error).message}`,\n networkConfig.sorobanRpcUrl,\n 'getCurrentLedger',\n error as Error\n );\n }\n}\n","import {\n Account,\n Address,\n BASE_FEE,\n Contract,\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/ui-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/ui-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 // For simulations, we only need a valid public key - no private key required.\n // Using a hardcoded test public key avoids Keypair.random() issues in test environments\n // where @noble/curves crypto may not work correctly.\n // This is a valid Stellar public key (the \"zero\" key derived from 32 zero bytes).\n const SIMULATION_PUBLIC_KEY = 'GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF';\n const sourceAccount = new Account(SIMULATION_PUBLIC_KEY, '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/ui-types';\nimport { isPlainObject, logger } from '@openzeppelin/ui-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 // Accept array-shaped values for struct-like types (e.g., tuple structs with numeric keys).\n // RHF treats numeric path segments as arrays, so a struct with fields \"0\", \"1\" can arrive as an array.\n // Pass through; valueToScVal/convertStructToScVal will serialize correctly using the schema.\n if (Array.isArray(value)) {\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 * as StellarSdk from '@stellar/stellar-sdk';\n\nimport { isDevelopmentOrTestEnvironment, logger } from '@openzeppelin/ui-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\nexport function isBytesNType(parameterType: string): boolean {\n return /^BytesN<\\d+>$/.test(parameterType);\n}\n","import { isMapEntryArray } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { detectBytesEncoding, logger, stringToBytes } from '@openzeppelin/ui-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/ui-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 * Safely extracts the element types from a Stellar Tuple type.\n *\n * @param parameterType - The parameter type (e.g., 'Tuple<U32, Bool>')\n * @returns Array of element types or null if not a Tuple type\n */\nexport function extractTupleTypes(parameterType: string): ExtractionResult<string[]> {\n if (!isValidTypeString(parameterType) || !parameterType.startsWith('Tuple<')) {\n return null;\n }\n\n const innerContent = extractGenericInnerType(parameterType, 'Tuple');\n if (!innerContent) {\n return null;\n }\n\n const parts = splitTopLevelTypes(innerContent);\n if (parts.length === 0) {\n return null;\n }\n\n return parts;\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\n/**\n * Splits a comma-separated list of types while respecting nested generics.\n */\nfunction splitTopLevelTypes(content: string): string[] {\n const types: string[] = [];\n let start = 0;\n let level = 0;\n\n for (let i = 0; i < content.length; i += 1) {\n const char = content[i];\n if (char === '<') {\n level += 1;\n } else if (char === '>') {\n level -= 1;\n } else if (char === ',' && level === 0) {\n const segment = content.slice(start, i).trim();\n if (segment) {\n types.push(segment);\n }\n start = i + 1;\n }\n }\n\n const lastSegment = content.slice(start).trim();\n if (lastSegment) {\n types.push(lastSegment);\n }\n\n return types;\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 if (/^BytesN<\\d+>$/.test(stellarType)) {\n return 'bytes';\n }\n return stellarType.toLowerCase();\n }\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport { detectBytesEncoding, logger, stringToBytes } from '@openzeppelin/ui-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';\nimport { compareScValsByXdr } from './xdr-ordering';\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 sortedEntries = [...mapArray].sort((a, b) => {\n const aKey = getScValFromPrimitive(a['0'] as SorobanArgumentValue);\n const bKey = getScValFromPrimitive(b['0'] as SorobanArgumentValue);\n return compareScValsByXdr(aKey, bKey);\n });\n\n const mapVal = sortedEntries.reduce((acc: Record<string, unknown>, pair) => {\n const key = String(pair['0'].value);\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 if (pair['1'].type === 'bool') {\n if (typeof value === 'boolean') {\n acc[key] = value;\n } else if (typeof value === 'string') {\n acc[key] = value === 'true';\n } else {\n acc[key] = Boolean(value);\n }\n } else {\n acc[key] = value;\n }\n }\n return acc;\n }, {});\n\n const mapType = sortedEntries.reduce((acc: Record<string, string[]>, pair) => {\n const key = String(pair['0'].value);\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 { xdr } from '@stellar/stellar-sdk';\n\n/**\n * Compare two ScVals based on their XDR encoding without relying on Node's Buffer.\n */\nexport function compareScValsByXdr(a: xdr.ScVal, b: xdr.ScVal): number {\n const aBytes = getBytes(a);\n const bBytes = getBytes(b);\n\n const minLength = Math.min(aBytes.length, bBytes.length);\n for (let index = 0; index < minLength; index += 1) {\n const diff = aBytes[index] - bBytes[index];\n if (diff !== 0) {\n return diff;\n }\n }\n\n return aBytes.length - bBytes.length;\n}\n\nfunction getBytes(scVal: xdr.ScVal): Uint8Array {\n const xdrValue = scVal.toXDR();\n\n // In browsers, toXDR may already return a Uint8Array (Buffer is a Uint8Array subclass in Node).\n if (xdrValue instanceof Uint8Array) {\n return xdrValue;\n }\n\n // Handle array-like objects (e.g., Buffer in Node.js)\n const arrayLike = xdrValue as ArrayLike<number>;\n const result = new Uint8Array(arrayLike.length);\n for (let index = 0; index < arrayLike.length; index += 1) {\n result[index] = arrayLike[index];\n }\n return result;\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport { isEnumValue, type FunctionParameter } from '@openzeppelin/ui-types';\n\nimport { convertStellarTypeToScValType } from '../../utils/formatting';\nimport { convertEnumToScVal } from '../../utils/input-parsing';\nimport { isPrimitiveParamType } from '../../utils/stellar-types';\nimport { isBytesNType, isLikelyEnumType } from '../../utils/type-detection';\nimport { compareScValsByXdr } from '../../utils/xdr-ordering';\nimport { parseGenericType } from './generic-parser';\nimport { parsePrimitive } from './primitive-parser';\nimport { convertStructToScVal, isStructType } from './struct-parser';\nimport type { SorobanEnumValue } from './types';\n\n// FunctionParameter already includes enumMetadata in its type definition (from @openzeppelin/ui-types)\n// No need for a separate type wrapper\ntype EnumAwareFunctionParameter = FunctionParameter;\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 // Helper: detect SorobanArgumentValue wrapper { type, value }\n const isTypedWrapper = (v: unknown): v is { type: string; value: unknown } =>\n !!v &&\n typeof v === 'object' &&\n 'type' in (v as Record<string, unknown>) &&\n 'value' in (v as Record<string, unknown>);\n\n const enumMetadata = (paramSchema as EnumAwareFunctionParameter | undefined)?.enumMetadata;\n const possibleEnumValue =\n typeof value === 'string' && (enumMetadata || isLikelyEnumType(parameterType))\n ? { tag: value }\n : value;\n\n if (!genericInfo) {\n // Integer-only enums (discriminant enums) → encode as u32 (matches Lab behavior)\n if (enumMetadata && enumMetadata.variants.every((v) => v.type === 'integer')) {\n // Derive numeric discriminant from name, tag, or numeric input\n let numericValue: number | undefined;\n if (typeof value === 'string') {\n const byName = enumMetadata.variants.find((v) => v.name === value);\n numericValue = byName?.value ?? Number(value);\n } else if (typeof value === 'number') {\n numericValue = value;\n } else if (isEnumValue(value)) {\n const byTag = enumMetadata.variants.find((v) => v.name === value.tag);\n numericValue = byTag?.value;\n }\n if (numericValue === undefined || Number.isNaN(numericValue)) {\n const validNames = enumMetadata.variants.map((v) => v.name).join(', ');\n throw new Error(\n `Invalid integer enum value for ${parameterType}: ${String(value)}. Expected one of: ${validNames}`\n );\n }\n return nativeToScVal(numericValue, { type: 'u32' });\n }\n // If a typed wrapper is provided, convert directly using the wrapped type/value\n if (isTypedWrapper(possibleEnumValue)) {\n const wrapped = possibleEnumValue;\n const parsed = parsePrimitive(wrapped.value, wrapped.type);\n const finalVal = parsed !== null ? parsed : wrapped.value;\n const scValType = convertStellarTypeToScValType(wrapped.type);\n const typeHint = Array.isArray(scValType) ? scValType[0] : scValType;\n return nativeToScVal(finalVal, { type: typeHint });\n }\n\n // Check if this is an enum object (has 'tag' or 'enum' property)\n if (\n isEnumValue(possibleEnumValue) ||\n (typeof possibleEnumValue === 'object' &&\n possibleEnumValue !== null &&\n 'enum' in possibleEnumValue)\n ) {\n const enumValue = possibleEnumValue as { tag: string; values?: unknown[]; enum?: number };\n\n // Handle integer enums\n if ('enum' in enumValue && typeof enumValue.enum === 'number') {\n return nativeToScVal(enumValue.enum, { type: 'u32' });\n }\n\n // Handle tagged enums with metadata for proper type conversion\n const tagSymbol = nativeToScVal(enumValue.tag, { type: 'symbol' });\n\n if (!enumValue.values || enumValue.values.length === 0) {\n // Unit variant - ScVec containing single ScSymbol\n return xdr.ScVal.scvVec([tagSymbol]);\n }\n\n const payloadValues = enumValue.values as unknown[];\n\n // Tuple variant - convert each payload value with proper types\n let payloadScVals: xdr.ScVal[];\n // Use the variant type from EnumAwareFunctionParameter's enumMetadata\n type EnumVariant = NonNullable<\n EnumAwareFunctionParameter['enumMetadata']\n >['variants'][number];\n let variant: EnumVariant | undefined;\n\n if (enumMetadata) {\n variant = enumMetadata.variants.find((variantEntry) => variantEntry.name === enumValue.tag);\n if (!variant || !variant.payloadTypes) {\n // No variant metadata or payloadTypes - use convertEnumToScVal fallback\n return convertEnumToScVal(enumValue as SorobanEnumValue);\n }\n // Convert each payload value with its corresponding type\n // variant is guaranteed to be defined here due to the check above\n const payloadTypes = variant.payloadTypes;\n const payloadComponents = variant.payloadComponents;\n payloadScVals = payloadTypes.map((payloadType, index) => {\n const payloadSchema = payloadComponents?.[index]\n ? {\n name: `payload_${index}`,\n type: payloadType,\n components: payloadComponents[index],\n }\n : { name: `payload_${index}`, type: payloadType };\n\n const val = payloadValues[index];\n return valueToScVal(val, payloadType, payloadSchema, parseValue);\n });\n } else {\n // No enum metadata - use convertEnumToScVal fallback\n return convertEnumToScVal(enumValue as SorobanEnumValue);\n }\n\n // For single Tuple payload, wrap all payload ScVals in another ScVec\n // Example: Some((Address, i128)) → ScVec([Symbol(\"Some\"), ScVec([Address, I128])])\n if (variant?.isSingleTuplePayload) {\n const tuplePayloadVec = xdr.ScVal.scvVec(payloadScVals);\n return xdr.ScVal.scvVec([tagSymbol, tuplePayloadVec]);\n }\n\n // Return ScVec with tag symbol followed by payload values\n return xdr.ScVal.scvVec([tagSymbol, ...payloadScVals]);\n }\n\n // Check if this is a struct or tuple type\n // Accept array-shaped values for tuple-structs when schema components are provided\n if (\n Array.isArray(possibleEnumValue) &&\n paramSchema?.components &&\n paramSchema.components.length\n ) {\n // Runtime validation: ensure array length matches schema components\n if (possibleEnumValue.length !== paramSchema.components.length) {\n throw new Error(\n `Tuple-struct value length (${possibleEnumValue.length}) does not match schema components (${paramSchema.components.length}) for type ${parameterType}`\n );\n }\n return convertStructToScVal(\n possibleEnumValue as unknown as Record<string, unknown>,\n parameterType,\n paramSchema,\n parseValue,\n (innerValue, innerType, innerSchema) =>\n valueToScVal(innerValue, innerType, innerSchema, parseInnerValue)\n );\n }\n\n if (!isPrimitiveParamType(parameterType) && isStructType(value, parameterType)) {\n return convertStructToScVal(\n value as Record<string, unknown>,\n parameterType,\n paramSchema,\n parseValue,\n (innerValue, innerType, innerSchema) =>\n valueToScVal(innerValue, innerType, innerSchema, parseInnerValue)\n );\n }\n\n // Non-generic types - use existing logic\n if (parameterType === 'Bool' || parameterType === 'Bytes') {\n return nativeToScVal(value);\n }\n if (isBytesNType(parameterType)) {\n const match = parameterType.match(/^BytesN<(\\d+)>$/);\n if (!match) {\n throw new Error(`Invalid BytesN parameterType format: ${parameterType}`);\n }\n const expectedBytes = Number.parseInt(match[1], 10);\n const decoded = parsePrimitive(value, 'Bytes');\n const bytesValue = decoded instanceof Uint8Array ? decoded : (decoded ?? value);\n\n if (\n Number.isFinite(expectedBytes) &&\n bytesValue instanceof Uint8Array &&\n bytesValue.length !== expectedBytes\n ) {\n throw new Error(\n `BytesN value must be exactly ${expectedBytes} bytes, received ${bytesValue.length}`\n );\n }\n\n return nativeToScVal(bytesValue);\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 // For enum element types, we need to pass enum metadata\n // Check if paramSchema has enumMetadata or components that should be used for elements\n let elementSchema: FunctionParameter | undefined;\n if (enumMetadata) {\n // This Vec is of enum type - pass the enum metadata to each element\n elementSchema = {\n name: 'element',\n type: innerType,\n enumMetadata,\n } as EnumAwareFunctionParameter;\n } else if (paramSchema?.components) {\n // This Vec is of struct type - pass the components to each element\n elementSchema = {\n name: 'element',\n type: innerType,\n components: paramSchema.components,\n };\n }\n\n const convertedElements = value.map((element) =>\n valueToScVal(element, innerType, elementSchema, parseValue)\n );\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 mapEntries: xdr.ScMapEntry[] = [];\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 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 // Create ScVals for key and value\n const keyScValType = convertStellarTypeToScValType(entry[0].type);\n const keyTypeHint = Array.isArray(keyScValType) ? keyScValType[0] : keyScValType;\n const keyScVal = nativeToScVal(processedKey, { type: keyTypeHint });\n\n const valueScValType = convertStellarTypeToScValType(entry[1].type);\n const valueTypeHint = Array.isArray(valueScValType)\n ? valueScValType[0]\n : valueScValType;\n const valueScVal = nativeToScVal(processedValue, { type: valueTypeHint });\n\n mapEntries.push(\n new xdr.ScMapEntry({\n key: keyScVal,\n val: valueScVal,\n })\n );\n }\n );\n\n // Sort map entries by XDR-encoded keys (required by Soroban)\n const sortedMapEntries = mapEntries.sort((a, b) => compareScValsByXdr(a.key(), b.key()));\n return xdr.ScVal.scvMap(sortedMapEntries);\n }\n\n return nativeToScVal(value);\n }\n\n case 'Tuple': {\n if (!paramSchema?.components || paramSchema.components.length === 0) {\n throw new Error(\n `Tuple parameter \"${paramSchema?.name ?? 'unknown'}\" is missing component metadata`\n );\n }\n\n const tupleComponents = paramSchema.components;\n const tupleValues: xdr.ScVal[] = [];\n\n tupleComponents.forEach((component, index) => {\n const key = component.name ?? `item_${index}`;\n let elementValue: unknown;\n\n if (Array.isArray(value)) {\n elementValue = value[index];\n } else if (value && typeof value === 'object') {\n elementValue = (value as Record<string, unknown>)[key];\n }\n\n if (typeof elementValue === 'undefined') {\n const expectedTypes = tupleComponents.map((c) => c.type).join(', ');\n throw new Error(\n `Missing tuple value for \"${key}\" in parameter \"${paramSchema.name ?? 'unknown'}\". Expected ${tupleComponents.length} values of types [${expectedTypes}] but received: ${JSON.stringify(value)}`\n );\n }\n\n if (typeof elementValue === 'string' && isLikelyEnumType(component.type)) {\n elementValue = { tag: elementValue };\n }\n\n tupleValues.push(valueToScVal(elementValue, component.type, component, parseInnerValue));\n });\n\n return xdr.ScVal.scvVec(tupleValues);\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 let innerSchema: FunctionParameter | undefined;\n if (enumMetadata) {\n innerSchema = {\n name: 'inner',\n type: innerType,\n ...({ enumMetadata } as unknown as Record<string, unknown>),\n } as unknown as FunctionParameter;\n } else if (paramSchema?.components) {\n innerSchema = {\n name: 'inner',\n type: innerType,\n components: paramSchema.components,\n };\n }\n return valueToScVal(value, innerType, innerSchema, parseInnerValue);\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","/**\n * Set of primitive Stellar/Soroban parameter types.\n * These types do not have nested components and can be directly serialized.\n *\n * Used to distinguish primitive types from complex types (structs, enums, tuples, maps, vecs)\n * when processing parameters for serialization and validation.\n */\nexport const PRIMITIVE_STELLAR_TYPES = new Set([\n 'Bool',\n 'ScString',\n 'ScSymbol',\n 'Address',\n 'Bytes',\n 'U8',\n 'U16',\n 'U32',\n 'U64',\n 'U128',\n 'U256',\n 'I8',\n 'I16',\n 'I32',\n 'I64',\n 'I128',\n 'I256',\n]);\n\n/**\n * Check if a Stellar type is a primitive type.\n * @param type - The Stellar type to check\n * @returns True if the type is primitive, false otherwise\n */\nexport function isPrimitiveParamType(type: string): boolean {\n return PRIMITIVE_STELLAR_TYPES.has(type);\n}\n","import { nativeToScVal, xdr } from '@stellar/stellar-sdk';\n\nimport { isEnumValue, type FunctionParameter } from '@openzeppelin/ui-types';\nimport { isPlainObject, logger } from '@openzeppelin/ui-utils';\n\nimport { convertStellarTypeToScValType } from '../../utils/formatting';\nimport { isLikelyEnumType } from '../../utils/type-detection';\nimport { compareScValsByXdr } from '../../utils/xdr-ordering';\nimport { parseGenericType } from './generic-parser';\n\nconst SYSTEM_LOG_TAG = 'StructParser';\n\nfunction isTupleStructSchema(schema: FunctionParameter | undefined): boolean {\n if (!schema?.components || schema.components.length === 0) {\n return false;\n }\n\n return schema.components.every((component, index) => component.name === index.toString());\n}\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 * @param convertToScVal - Optional function to recursively convert values to ScVal (for tuple structs)\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 convertToScVal?: (\n value: unknown,\n type: string,\n schema?: FunctionParameter,\n parseValue?: (val: unknown, type: string) => unknown\n ) => xdr.ScVal\n): xdr.ScVal {\n // Laboratory-style struct conversion with proper type hint handling\n\n // Check if this is a tuple struct (numeric field names like \"0\", \"1\", \"2\")\n // Tuple structs in Soroban need to be serialized as vectors, not maps\n if (isTupleStructSchema(paramSchema) && paramSchema && convertToScVal) {\n const tupleValues = paramSchema.components!.map((component, index) => {\n const key = component.name ?? index.toString();\n let elementValue = structObj[key];\n\n if (typeof elementValue === 'undefined') {\n throw new Error(\n `Missing tuple value for \"${key}\" in struct type \"${parameterType}\". Received: ${JSON.stringify(structObj)}`\n );\n }\n\n // If the element is a string and its type is likely an enum, wrap it as { tag: value }\n if (typeof elementValue === 'string' && isLikelyEnumType(component.type)) {\n elementValue = { tag: elementValue };\n }\n\n return convertToScVal(elementValue, component.type, component, parseInnerValue);\n });\n\n return xdr.ScVal.scvVec(tupleValues);\n }\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 if (typeof parsedValue === 'string' && isLikelyEnumType(fieldType)) {\n parsedValue = { tag: parsedValue };\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 // Check if this is a Vec or other generic type that needs special handling\n if (convertToScVal && (fieldType.startsWith('Vec<') || isEnumValue(parsedValue))) {\n const fieldSchema = paramSchema?.components?.find((c) => c.name === fieldName);\n // Use valueToScVal for Vec and enum fields to ensure proper conversion\n convertedValue[fieldName] = convertToScVal(\n parsedValue,\n fieldType,\n fieldSchema,\n parseInnerValue\n );\n typeHints[fieldName] = ['symbol', 'scval'];\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 }\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 // Check if any fields are enums that need special conversion\n const hasEnumFields = paramSchema?.components?.some((comp) => {\n const fieldValue = convertedValue[comp.name];\n return isEnumValue(fieldValue);\n });\n\n let scVal: xdr.ScVal;\n\n if (hasEnumFields && convertToScVal && paramSchema?.components) {\n // Manually build the ScMap with proper enum conversion\n const mapEntries: xdr.ScMapEntry[] = [];\n\n for (const fieldSchema of paramSchema.components) {\n const fieldName = fieldSchema.name;\n const fieldValue = convertedValue[fieldName];\n\n // Create key\n const keyScVal = nativeToScVal(fieldName, { type: 'symbol' });\n\n // Create value - check if it's an enum\n let valueScVal: xdr.ScVal;\n if (isEnumValue(fieldValue)) {\n valueScVal = convertToScVal(fieldValue, fieldSchema.type, fieldSchema, parseInnerValue);\n } else {\n // Use nativeToScVal for non-enum fields\n const fieldTypeHint = typeHints[fieldName];\n if (fieldTypeHint && Array.isArray(fieldTypeHint) && fieldTypeHint.length > 1) {\n valueScVal = nativeToScVal(fieldValue, { type: fieldTypeHint[1] });\n } else {\n valueScVal = nativeToScVal(fieldValue);\n }\n }\n\n mapEntries.push(\n new xdr.ScMapEntry({\n key: keyScVal,\n val: valueScVal,\n })\n );\n }\n\n // Sort map entries by XDR-encoded keys (required by Soroban)\n const sortedMapEntries = mapEntries.sort((a, b) => compareScValsByXdr(a.key(), b.key()));\n\n scVal = xdr.ScVal.scvMap(sortedMapEntries);\n } else {\n scVal = nativeToScVal(convertedValue, { type: typeHints });\n }\n\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/ui-types';\nimport { bytesToHex, logger } from '@openzeppelin/ui-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/ui-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","/**\n * Stellar Access Control Service\n *\n * Implements the AccessControlService interface for Stellar (Soroban) contracts.\n * Provides methods to inspect and manage access control (Ownable/AccessControl) on contracts.\n */\n\nimport type {\n AccessControlCapabilities,\n AccessControlService,\n AccessSnapshot,\n AdminInfo,\n ContractSchema,\n EnrichedRoleAssignment,\n EnrichedRoleMember,\n ExecutionConfig,\n HistoryQueryOptions,\n OperationResult,\n OwnershipInfo,\n PaginatedHistoryResult,\n RoleAssignment,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n} from '@openzeppelin/ui-types';\nimport { ConfigurationInvalid, OperationFailed } from '@openzeppelin/ui-types';\nimport { logger, validateSnapshot } from '@openzeppelin/ui-utils';\n\nimport { signAndBroadcastStellarTransaction } from '../transaction/sender';\nimport {\n assembleAcceptAdminTransferAction,\n assembleAcceptOwnershipAction,\n assembleGrantRoleAction,\n assembleRevokeRoleAction,\n assembleTransferAdminRoleAction,\n assembleTransferOwnershipAction,\n} from './actions';\nimport { detectAccessControlCapabilities } from './feature-detection';\nimport { createIndexerClient, StellarIndexerClient } from './indexer-client';\nimport { getAdmin, getCurrentLedger, readCurrentRoles, readOwnership } from './onchain-reader';\nimport {\n validateAccountAddress,\n validateAddress,\n validateContractAddress,\n validateExpirationLedger,\n validateRoleIds,\n} from './validation';\n\n/**\n * Context for Stellar Access Control operations\n * Stores contract schema and role information for a specific contract\n */\ninterface StellarAccessControlContext {\n contractSchema: ContractSchema;\n /** Role IDs explicitly provided via registerContract() */\n knownRoleIds?: string[];\n /** Role IDs discovered via indexer query (cached) */\n discoveredRoleIds?: string[];\n /** Flag to prevent repeated discovery attempts when indexer is unavailable */\n roleDiscoveryAttempted?: boolean;\n}\n\n/**\n * Stellar implementation of AccessControlService\n */\nexport class StellarAccessControlService implements AccessControlService {\n private readonly contractContexts = new Map<string, StellarAccessControlContext>();\n private readonly indexerClient: StellarIndexerClient;\n\n constructor(private readonly networkConfig: StellarNetworkConfig) {\n this.indexerClient = createIndexerClient(networkConfig);\n }\n\n /**\n * Registers a contract with its schema and known roles\n *\n * @param contractAddress The contract address\n * @param contractSchema The contract schema (required for capability detection)\n * @param knownRoleIds Optional array of known role identifiers\n * @throws ConfigurationInvalid if the contract address or role IDs are invalid\n */\n registerContract(\n contractAddress: string,\n contractSchema: ContractSchema,\n knownRoleIds?: string[]\n ): void {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n // Validate and deduplicate role IDs if provided\n const validatedRoleIds = knownRoleIds ? validateRoleIds(knownRoleIds) : undefined;\n\n this.contractContexts.set(contractAddress, {\n contractSchema,\n knownRoleIds: validatedRoleIds,\n });\n\n logger.debug('StellarAccessControlService.registerContract', `Registered ${contractAddress}`, {\n roleCount: validatedRoleIds?.length || 0,\n });\n }\n\n /**\n * Adds additional known role IDs to a registered contract\n *\n * This method allows consumers to manually add role IDs that may not have been\n * discovered via the indexer (e.g., newly created roles that haven't been granted yet).\n * Role IDs are validated and deduplicated before being added.\n *\n * @param contractAddress The contract address\n * @param roleIds Array of role identifiers to add\n * @throws ConfigurationInvalid if the contract address is invalid, contract not registered, or role IDs are invalid\n * @returns The updated array of all known role IDs for the contract\n */\n addKnownRoleIds(contractAddress: string, roleIds: string[]): string[] {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n const context = this.contractContexts.get(contractAddress);\n if (!context) {\n throw new ConfigurationInvalid(\n 'Contract not registered. Call registerContract() first.',\n contractAddress,\n 'contractAddress'\n );\n }\n\n // Validate the new role IDs\n const validatedNewRoleIds = validateRoleIds(roleIds);\n\n if (validatedNewRoleIds.length === 0) {\n logger.debug(\n 'StellarAccessControlService.addKnownRoleIds',\n `No valid role IDs to add for ${contractAddress}`\n );\n return context.knownRoleIds || context.discoveredRoleIds || [];\n }\n\n // Merge with existing role IDs (prioritize knownRoleIds over discoveredRoleIds)\n const existingRoleIds = context.knownRoleIds || context.discoveredRoleIds || [];\n const mergedRoleIds = [...new Set([...existingRoleIds, ...validatedNewRoleIds])];\n\n // Update the context - always store as knownRoleIds since user is explicitly providing them\n context.knownRoleIds = mergedRoleIds;\n\n logger.info(\n 'StellarAccessControlService.addKnownRoleIds',\n `Added ${validatedNewRoleIds.length} role ID(s) for ${contractAddress}`,\n {\n added: validatedNewRoleIds,\n total: mergedRoleIds.length,\n }\n );\n\n return mergedRoleIds;\n }\n\n /**\n * Gets the access control capabilities of a contract\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to capabilities\n * @throws ConfigurationInvalid if the contract address is invalid or contract not registered\n */\n async getCapabilities(contractAddress: string): Promise<AccessControlCapabilities> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getCapabilities',\n `Detecting capabilities for ${contractAddress}`\n );\n\n const context = this.contractContexts.get(contractAddress);\n if (!context) {\n throw new ConfigurationInvalid(\n 'Contract not registered. Call registerContract() first.',\n contractAddress,\n 'contractAddress'\n );\n }\n\n // Check if indexer is configured\n const indexerAvailable = await this.indexerClient.checkAvailability();\n\n const capabilities = detectAccessControlCapabilities(context.contractSchema, indexerAvailable);\n\n logger.debug('StellarAccessControlService.getCapabilities', 'Detected capabilities:', {\n hasOwnable: capabilities.hasOwnable,\n hasAccessControl: capabilities.hasAccessControl,\n hasEnumerableRoles: capabilities.hasEnumerableRoles,\n supportsHistory: capabilities.supportsHistory,\n verifiedAgainstOZInterfaces: capabilities.verifiedAgainstOZInterfaces,\n });\n\n return capabilities;\n }\n\n /**\n * Gets the current owner and ownership state of an Ownable contract\n *\n * Retrieves the current owner via on-chain query, then checks for pending\n * two-step transfers via indexer to determine the ownership state:\n * - 'owned': Has owner, no pending transfer\n * - 'pending': Has owner, pending transfer not yet expired\n * - 'expired': Has owner, pending transfer has expired\n * - 'renounced': No owner (null)\n *\n * Gracefully degrades when indexer is unavailable, returning basic ownership\n * info with 'owned' state and logging a warning.\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to ownership information with state\n * @throws ConfigurationInvalid if the contract address is invalid\n *\n * @example\n * ```typescript\n * const ownership = await service.getOwnership(contractAddress);\n *\n * console.log('Owner:', ownership.owner);\n * console.log('State:', ownership.state); // 'owned' | 'pending' | 'expired' | 'renounced'\n *\n * if (ownership.state === 'pending' && ownership.pendingTransfer) {\n * console.log('Pending owner:', ownership.pendingTransfer.pendingOwner);\n * console.log('Expires at ledger:', ownership.pendingTransfer.expirationBlock);\n * }\n * ```\n */\n async getOwnership(contractAddress: string): Promise<OwnershipInfo> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n // T025: INFO logging for ownership queries per NFR-004\n logger.info(\n 'StellarAccessControlService.getOwnership',\n `Reading ownership status for ${contractAddress}`\n );\n\n // T020: Call get_owner() for current owner\n const basicOwnership = await readOwnership(contractAddress, this.networkConfig);\n\n // T018/T023: Renounced state - owner is null\n if (basicOwnership.owner === null) {\n logger.debug(\n 'StellarAccessControlService.getOwnership',\n `Contract ${contractAddress} has renounced ownership`\n );\n return {\n owner: null,\n state: 'renounced',\n };\n }\n\n // T024/T019: Check indexer availability for pending transfer detection\n const indexerAvailable = await this.indexerClient.checkAvailability();\n\n if (!indexerAvailable) {\n // T026: WARN logging for indexer unavailability per NFR-006\n logger.warn(\n 'StellarAccessControlService.getOwnership',\n `Indexer unavailable for ${this.networkConfig.id}: pending transfer status cannot be determined`\n );\n // T024: Graceful degradation - return basic ownership with 'owned' state\n return {\n owner: basicOwnership.owner,\n state: 'owned',\n };\n }\n\n // T021: Query indexer for pending transfer (includes liveUntilLedger)\n let pendingTransfer;\n try {\n pendingTransfer = await this.indexerClient.queryPendingOwnershipTransfer(contractAddress);\n } catch (error) {\n // T026: Graceful degradation on indexer query error\n logger.warn(\n 'StellarAccessControlService.getOwnership',\n `Failed to query pending transfer: ${error instanceof Error ? error.message : String(error)}`\n );\n return {\n owner: basicOwnership.owner,\n state: 'owned',\n };\n }\n\n // T015/T023: No pending transfer in indexer - state is 'owned'\n if (!pendingTransfer) {\n logger.debug(\n 'StellarAccessControlService.getOwnership',\n `Contract ${contractAddress} has owner with no pending transfer`\n );\n return {\n owner: basicOwnership.owner,\n state: 'owned',\n };\n }\n\n // T022: Get current ledger to check expiration\n let currentLedger: number;\n try {\n currentLedger = await getCurrentLedger(this.networkConfig);\n } catch (error) {\n // Graceful degradation if ledger query fails\n logger.warn(\n 'StellarAccessControlService.getOwnership',\n `Failed to get current ledger: ${error instanceof Error ? error.message : String(error)}`\n );\n // Return owned state since we can't determine expiration\n return {\n owner: basicOwnership.owner,\n state: 'owned',\n };\n }\n\n // Use indexer's liveUntilLedger for expiration check\n const liveUntilLedger = pendingTransfer.liveUntilLedger;\n\n // T022/T023: Determine state based on expiration\n // Per FR-020: expirationLedger must be > currentLedger, so >= means expired\n const isExpired = currentLedger >= liveUntilLedger;\n\n // Build pending transfer info for the response\n const pendingTransferInfo = {\n pendingOwner: pendingTransfer.pendingOwner,\n expirationBlock: liveUntilLedger,\n initiatedAt: pendingTransfer.timestamp,\n initiatedTxId: pendingTransfer.txHash,\n initiatedBlock: pendingTransfer.ledger,\n };\n\n if (isExpired) {\n // T017/T023: Expired state\n logger.debug(\n 'StellarAccessControlService.getOwnership',\n `Contract ${contractAddress} has expired pending transfer (current: ${currentLedger}, expiration: ${liveUntilLedger})`\n );\n return {\n owner: basicOwnership.owner,\n state: 'expired',\n pendingTransfer: pendingTransferInfo,\n };\n }\n\n // T016/T023: Pending state\n logger.debug(\n 'StellarAccessControlService.getOwnership',\n `Contract ${contractAddress} has pending transfer to ${pendingTransfer.pendingOwner} (expires at ledger ${liveUntilLedger})`\n );\n return {\n owner: basicOwnership.owner,\n state: 'pending',\n pendingTransfer: pendingTransferInfo,\n };\n }\n\n /**\n * Gets current role assignments for a contract\n *\n * Uses the known role IDs registered with the contract. If no role IDs were provided\n * via registerContract(), attempts to discover them dynamically via the indexer.\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to array of role assignments\n * @throws ConfigurationInvalid if the contract address is invalid or contract not registered\n */\n async getCurrentRoles(contractAddress: string): Promise<RoleAssignment[]> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getCurrentRoles',\n `Reading roles for ${contractAddress}`\n );\n\n const context = this.contractContexts.get(contractAddress);\n if (!context) {\n throw new ConfigurationInvalid(\n 'Contract not registered. Call registerContract() first.',\n contractAddress,\n 'contractAddress'\n );\n }\n\n // Use known role IDs if provided, otherwise attempt discovery\n let roleIds = context.knownRoleIds || [];\n\n if (roleIds.length === 0) {\n // Attempt to discover roles via indexer\n logger.debug(\n 'StellarAccessControlService.getCurrentRoles',\n 'No role IDs provided, attempting discovery via indexer'\n );\n roleIds = await this.discoverKnownRoleIds(contractAddress);\n }\n\n if (roleIds.length === 0) {\n logger.warn(\n 'StellarAccessControlService.getCurrentRoles',\n 'No role IDs available (neither provided nor discoverable), returning empty array'\n );\n return [];\n }\n\n return readCurrentRoles(contractAddress, roleIds, this.networkConfig);\n }\n\n /**\n * Gets current role assignments with enriched member information including grant timestamps\n *\n * This method returns role assignments with detailed metadata about when each member\n * was granted the role. If the indexer is unavailable, it gracefully degrades to\n * returning members without timestamp information.\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to array of enriched role assignments\n * @throws ConfigurationInvalid if the contract address is invalid or contract not registered\n */\n async getCurrentRolesEnriched(contractAddress: string): Promise<EnrichedRoleAssignment[]> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getCurrentRolesEnriched',\n `Reading enriched roles for ${contractAddress}`\n );\n\n // First, get the current role assignments via on-chain queries\n const currentRoles = await this.getCurrentRoles(contractAddress);\n\n if (currentRoles.length === 0) {\n return [];\n }\n\n // Check indexer availability for enrichment\n const indexerAvailable = await this.indexerClient.checkAvailability();\n\n if (!indexerAvailable) {\n logger.debug(\n 'StellarAccessControlService.getCurrentRolesEnriched',\n 'Indexer not available, returning roles without timestamps'\n );\n // Graceful degradation: return enriched structure without timestamps\n return this.convertToEnrichedWithoutTimestamps(currentRoles);\n }\n\n // Enrich all roles in parallel for improved performance\n const enrichmentPromises = currentRoles.map(async (roleAssignment) => {\n const enrichedMembers = await this.enrichMembersWithGrantInfo(\n contractAddress,\n roleAssignment.role.id,\n roleAssignment.members\n );\n\n return {\n role: roleAssignment.role,\n members: enrichedMembers,\n };\n });\n\n const enrichedAssignments = await Promise.all(enrichmentPromises);\n\n logger.debug(\n 'StellarAccessControlService.getCurrentRolesEnriched',\n `Enriched ${enrichedAssignments.length} role(s) with grant timestamps`\n );\n\n return enrichedAssignments;\n }\n\n /**\n * Converts standard role assignments to enriched format without timestamps\n * Used when indexer is unavailable (graceful degradation)\n */\n private convertToEnrichedWithoutTimestamps(\n roleAssignments: RoleAssignment[]\n ): EnrichedRoleAssignment[] {\n return roleAssignments.map((assignment) => ({\n role: assignment.role,\n members: assignment.members.map((address) => ({\n address,\n // Timestamps are undefined when indexer is unavailable\n })),\n }));\n }\n\n /**\n * Enriches member addresses with grant information from the indexer\n */\n private async enrichMembersWithGrantInfo(\n contractAddress: string,\n roleId: string,\n memberAddresses: string[]\n ): Promise<EnrichedRoleMember[]> {\n if (memberAddresses.length === 0) {\n return [];\n }\n\n try {\n // Query indexer for grant information\n const grantInfoMap = await this.indexerClient.queryLatestGrants(\n contractAddress,\n roleId,\n memberAddresses\n );\n\n // Build enriched members, using grant info when available\n return memberAddresses.map((address) => {\n const grantInfo = grantInfoMap.get(address);\n if (grantInfo) {\n return {\n address,\n grantedAt: grantInfo.timestamp,\n grantedTxId: grantInfo.txId,\n grantedLedger: grantInfo.ledger,\n };\n }\n // No grant info found (shouldn't happen for current members, but handle gracefully)\n return { address };\n });\n } catch (error) {\n logger.warn(\n 'StellarAccessControlService.enrichMembersWithGrantInfo',\n `Failed to fetch grant info for role ${roleId}, returning members without timestamps: ${error instanceof Error ? error.message : String(error)}`\n );\n // Graceful degradation on error\n return memberAddresses.map((address) => ({ address }));\n }\n }\n\n /**\n * Grants a role to an account\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier\n * @param account The account to grant the role to\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result\n * @throws ConfigurationInvalid if addresses are invalid\n */\n async grantRole(\n contractAddress: string,\n roleId: string,\n account: string,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate addresses\n validateContractAddress(contractAddress);\n validateAccountAddress(account, 'account');\n\n logger.info(\n 'StellarAccessControlService.grantRole',\n `Granting role ${roleId} to ${account} on ${contractAddress}`\n );\n\n // Assemble the transaction data\n const txData = assembleGrantRoleAction(contractAddress, roleId, account);\n\n logger.debug('StellarAccessControlService.grantRole', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n argTypes: txData.argTypes,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info('StellarAccessControlService.grantRole', `Role granted. TxHash: ${result.txHash}`);\n\n return { id: result.txHash };\n }\n\n /**\n * Revokes a role from an account\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier\n * @param account The account to revoke the role from\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result\n * @throws ConfigurationInvalid if addresses are invalid\n */\n async revokeRole(\n contractAddress: string,\n roleId: string,\n account: string,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate addresses\n validateContractAddress(contractAddress);\n validateAccountAddress(account, 'account');\n\n logger.info(\n 'StellarAccessControlService.revokeRole',\n `Revoking role ${roleId} from ${account} on ${contractAddress}`\n );\n\n // Assemble the transaction data\n const txData = assembleRevokeRoleAction(contractAddress, roleId, account);\n\n logger.debug('StellarAccessControlService.revokeRole', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n argTypes: txData.argTypes,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info('StellarAccessControlService.revokeRole', `Role revoked. TxHash: ${result.txHash}`);\n\n return { id: result.txHash };\n }\n\n /**\n * Transfers ownership of the contract using two-step transfer\n *\n * Initiates a two-step ownership transfer with an expiration ledger.\n * The pending owner must call acceptOwnership() before the expiration\n * ledger to complete the transfer.\n *\n * @param contractAddress The contract address\n * @param newOwner The new owner address (pending owner)\n * @param expirationLedger The ledger sequence by which the transfer must be accepted\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result with transaction ID\n * @throws ConfigurationInvalid if addresses are invalid or expiration is invalid\n *\n * @example\n * ```typescript\n * // Calculate expiration ~12 hours from now (Stellar ledgers advance ~5s each)\n * const currentLedger = await getCurrentLedger(networkConfig);\n * const expirationLedger = currentLedger + 8640; // 12 * 60 * 60 / 5\n *\n * const result = await service.transferOwnership(\n * contractAddress,\n * newOwnerAddress,\n * expirationLedger,\n * executionConfig\n * );\n * console.log('Transfer initiated, txHash:', result.id);\n * ```\n */\n async transferOwnership(\n contractAddress: string,\n newOwner: string,\n expirationLedger: number,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate addresses\n // newOwner can be either an account address (G...) or contract address (C...)\n validateContractAddress(contractAddress);\n validateAddress(newOwner, 'newOwner');\n\n // T037: INFO logging for transfer initiation per NFR-004\n logger.info(\n 'StellarAccessControlService.transferOwnership',\n `Initiating two-step ownership transfer to ${newOwner} on ${contractAddress} with expiration at ledger ${expirationLedger}`\n );\n\n // T034/T035: Client-side expiration validation (must be > current ledger)\n const currentLedger = await getCurrentLedger(this.networkConfig);\n const validationResult = validateExpirationLedger(expirationLedger, currentLedger);\n\n if (!validationResult.valid) {\n // T036: Specific error messages per FR-018\n throw new ConfigurationInvalid(\n validationResult.error ||\n `Expiration ledger ${expirationLedger} must be strictly greater than current ledger ${currentLedger}.`,\n String(expirationLedger),\n 'expirationLedger'\n );\n }\n\n // Assemble the transaction data with live_until_ledger parameter\n const txData = assembleTransferOwnershipAction(contractAddress, newOwner, expirationLedger);\n\n logger.debug('StellarAccessControlService.transferOwnership', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n argTypes: txData.argTypes,\n expirationLedger,\n currentLedger,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info(\n 'StellarAccessControlService.transferOwnership',\n `Ownership transfer initiated. TxHash: ${result.txHash}, pending owner: ${newOwner}, expires at ledger: ${expirationLedger}`\n );\n\n return { id: result.txHash };\n }\n\n /**\n * Accepts a pending ownership transfer (two-step transfer)\n *\n * Must be called by the pending owner (the address specified in transferOwnership)\n * before the expiration ledger. The on-chain contract validates:\n * 1. Caller is the pending owner\n * 2. Transfer has not expired\n *\n * @param contractAddress The contract address\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result with transaction ID\n * @throws ConfigurationInvalid if contract address is invalid\n * @throws OperationFailed if on-chain rejection (expired or unauthorized)\n *\n * @example\n * ```typescript\n * // Check ownership state before accepting\n * const ownership = await service.getOwnership(contractAddress);\n * if (ownership.state === 'pending') {\n * const result = await service.acceptOwnership(contractAddress, executionConfig);\n * console.log('Ownership accepted, txHash:', result.id);\n * }\n * ```\n */\n async acceptOwnership(\n contractAddress: string,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n // T047: INFO logging for acceptance operations per NFR-004\n logger.info(\n 'StellarAccessControlService.acceptOwnership',\n `Accepting pending ownership transfer for ${contractAddress}`\n );\n\n // T045: Per spec clarification, expiration is enforced on-chain\n // No pre-check required - the contract will reject if expired or caller is not pending owner\n\n // T043: Assemble the accept_ownership transaction data\n const txData = assembleAcceptOwnershipAction(contractAddress);\n\n logger.debug('StellarAccessControlService.acceptOwnership', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info(\n 'StellarAccessControlService.acceptOwnership',\n `Ownership transfer accepted. TxHash: ${result.txHash}`\n );\n\n return { id: result.txHash };\n }\n\n /**\n * Gets the current admin and admin transfer state of an AccessControl contract\n *\n * Retrieves the current admin via on-chain query, then checks for pending\n * two-step admin transfers via indexer to determine the admin state:\n * - 'active': Has admin, no pending transfer\n * - 'pending': Has admin, pending transfer not yet expired\n * - 'expired': Has admin, pending transfer has expired\n * - 'renounced': No admin (null)\n *\n * Gracefully degrades when indexer is unavailable, returning basic admin\n * info with 'active' state and logging a warning.\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to admin information with state\n * @throws ConfigurationInvalid if the contract address is invalid\n *\n * @example\n * ```typescript\n * const adminInfo = await service.getAdminInfo(contractAddress);\n * console.log('Admin:', adminInfo.admin);\n * console.log('State:', adminInfo.state); // 'active' | 'pending' | 'expired' | 'renounced'\n *\n * if (adminInfo.state === 'pending' && adminInfo.pendingTransfer) {\n * console.log('Pending admin:', adminInfo.pendingTransfer.pendingAdmin);\n * console.log('Expires at ledger:', adminInfo.pendingTransfer.expirationBlock);\n * }\n * ```\n */\n async getAdminInfo(contractAddress: string): Promise<AdminInfo> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getAdminInfo',\n `Reading admin status for ${contractAddress}`\n );\n\n // Call get_admin() for current admin\n const currentAdmin = await getAdmin(contractAddress, this.networkConfig);\n\n // Renounced state - admin is null\n if (currentAdmin === null) {\n logger.debug(\n 'StellarAccessControlService.getAdminInfo',\n `Contract ${contractAddress} has renounced admin`\n );\n return {\n admin: null,\n state: 'renounced',\n };\n }\n\n // Check indexer availability for pending transfer detection\n const indexerAvailable = await this.indexerClient.checkAvailability();\n\n if (!indexerAvailable) {\n logger.warn(\n 'StellarAccessControlService.getAdminInfo',\n `Indexer unavailable for ${this.networkConfig.id}: pending admin transfer status cannot be determined`\n );\n // Graceful degradation - return basic admin with 'active' state\n return {\n admin: currentAdmin,\n state: 'active',\n };\n }\n\n // Query indexer for pending admin transfer\n let pendingTransfer;\n try {\n pendingTransfer = await this.indexerClient.queryPendingAdminTransfer(contractAddress);\n } catch (error) {\n // Graceful degradation on indexer query error\n logger.warn(\n 'StellarAccessControlService.getAdminInfo',\n `Failed to query pending admin transfer: ${error instanceof Error ? error.message : String(error)}`\n );\n return {\n admin: currentAdmin,\n state: 'active',\n };\n }\n\n // No pending transfer in indexer - state is 'active'\n if (!pendingTransfer) {\n logger.debug(\n 'StellarAccessControlService.getAdminInfo',\n `Contract ${contractAddress} has admin with no pending transfer`\n );\n return {\n admin: currentAdmin,\n state: 'active',\n };\n }\n\n // Get current ledger to check expiration\n let currentLedger: number;\n try {\n currentLedger = await getCurrentLedger(this.networkConfig);\n } catch (error) {\n // Graceful degradation if ledger query fails\n logger.warn(\n 'StellarAccessControlService.getAdminInfo',\n `Failed to get current ledger: ${error instanceof Error ? error.message : String(error)}`\n );\n // Return active state since we can't determine expiration\n return {\n admin: currentAdmin,\n state: 'active',\n };\n }\n\n // Use indexer's liveUntilLedger for expiration check\n const liveUntilLedger = pendingTransfer.liveUntilLedger;\n\n // Determine state based on expiration\n // expirationLedger must be > currentLedger, so >= means expired\n const isExpired = currentLedger >= liveUntilLedger;\n\n // Build pending transfer info for the response\n const pendingTransferInfo = {\n pendingAdmin: pendingTransfer.pendingAdmin,\n expirationBlock: liveUntilLedger,\n initiatedAt: pendingTransfer.timestamp,\n initiatedTxId: pendingTransfer.txHash,\n initiatedBlock: pendingTransfer.ledger,\n };\n\n if (isExpired) {\n // Expired state\n logger.debug(\n 'StellarAccessControlService.getAdminInfo',\n `Contract ${contractAddress} has expired pending admin transfer (current: ${currentLedger}, expiration: ${liveUntilLedger})`\n );\n return {\n admin: currentAdmin,\n state: 'expired',\n pendingTransfer: pendingTransferInfo,\n };\n }\n\n // Pending state\n logger.debug(\n 'StellarAccessControlService.getAdminInfo',\n `Contract ${contractAddress} has pending admin transfer to ${pendingTransfer.pendingAdmin} (expires at ledger ${liveUntilLedger})`\n );\n return {\n admin: currentAdmin,\n state: 'pending',\n pendingTransfer: pendingTransferInfo,\n };\n }\n\n /**\n * Initiates an admin role transfer using two-step transfer\n *\n * Initiates a two-step admin transfer with an expiration ledger.\n * The pending admin must call acceptAdminTransfer() before the expiration\n * ledger to complete the transfer.\n *\n * @param contractAddress The contract address\n * @param newAdmin The new admin address (pending admin)\n * @param expirationLedger The ledger sequence by which the transfer must be accepted\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result with transaction ID\n * @throws ConfigurationInvalid if addresses are invalid or expiration is invalid\n *\n * @example\n * ```typescript\n * // Calculate expiration ~12 hours from now (Stellar ledgers advance ~5s each)\n * const currentLedger = await getCurrentLedger(networkConfig);\n * const expirationLedger = currentLedger + 8640; // 12 * 60 * 60 / 5\n *\n * const result = await service.transferAdminRole(\n * contractAddress,\n * newAdminAddress,\n * expirationLedger,\n * executionConfig\n * );\n * console.log('Admin transfer initiated, txHash:', result.id);\n * ```\n */\n async transferAdminRole(\n contractAddress: string,\n newAdmin: string,\n expirationLedger: number,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate addresses\n // newAdmin can be either an account address (G...) or contract address (C...)\n validateContractAddress(contractAddress);\n validateAddress(newAdmin, 'newAdmin');\n\n logger.info(\n 'StellarAccessControlService.transferAdminRole',\n `Initiating two-step admin transfer to ${newAdmin} on ${contractAddress} with expiration at ledger ${expirationLedger}`\n );\n\n // Client-side expiration validation (must be > current ledger)\n const currentLedger = await getCurrentLedger(this.networkConfig);\n const validationResult = validateExpirationLedger(expirationLedger, currentLedger);\n\n if (!validationResult.valid) {\n throw new ConfigurationInvalid(\n validationResult.error ||\n `Expiration ledger ${expirationLedger} must be strictly greater than current ledger ${currentLedger}.`,\n String(expirationLedger),\n 'expirationLedger'\n );\n }\n\n // Assemble the transaction data with live_until_ledger parameter\n const txData = assembleTransferAdminRoleAction(contractAddress, newAdmin, expirationLedger);\n\n logger.debug('StellarAccessControlService.transferAdminRole', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n argTypes: txData.argTypes,\n expirationLedger,\n currentLedger,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info(\n 'StellarAccessControlService.transferAdminRole',\n `Admin transfer initiated. TxHash: ${result.txHash}, pending admin: ${newAdmin}, expires at ledger: ${expirationLedger}`\n );\n\n return { id: result.txHash };\n }\n\n /**\n * Accepts a pending admin transfer (two-step transfer)\n *\n * Must be called by the pending admin (the address specified in transferAdminRole)\n * before the expiration ledger. The on-chain contract validates:\n * 1. Caller is the pending admin\n * 2. Transfer has not expired\n *\n * @param contractAddress The contract address\n * @param executionConfig Execution configuration specifying method (eoa, relayer, etc.)\n * @param onStatusChange Optional callback for status updates\n * @param runtimeApiKey Optional session-only API key for methods like Relayer\n * @returns Promise resolving to operation result with transaction ID\n * @throws ConfigurationInvalid if contract address is invalid\n * @throws OperationFailed if on-chain rejection (expired or unauthorized)\n *\n * @example\n * ```typescript\n * // Check admin state before accepting\n * const adminInfo = await service.getAdminInfo(contractAddress);\n * if (adminInfo.state === 'pending') {\n * const result = await service.acceptAdminTransfer(contractAddress, executionConfig);\n * console.log('Admin transfer accepted, txHash:', result.id);\n * }\n * ```\n */\n async acceptAdminTransfer(\n contractAddress: string,\n executionConfig: ExecutionConfig,\n onStatusChange?: (status: TxStatus, details: TransactionStatusUpdate) => void,\n runtimeApiKey?: string\n ): Promise<OperationResult> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.acceptAdminTransfer',\n `Accepting pending admin transfer for ${contractAddress}`\n );\n\n // Expiration is enforced on-chain\n // No pre-check required - the contract will reject if expired or caller is not pending admin\n\n // Assemble the accept_admin_transfer transaction data\n const txData = assembleAcceptAdminTransferAction(contractAddress);\n\n logger.debug('StellarAccessControlService.acceptAdminTransfer', 'Transaction data prepared:', {\n contractAddress: txData.contractAddress,\n functionName: txData.functionName,\n });\n\n // Execute the transaction\n const result = await signAndBroadcastStellarTransaction(\n txData,\n executionConfig,\n this.networkConfig,\n onStatusChange,\n runtimeApiKey\n );\n\n logger.info(\n 'StellarAccessControlService.acceptAdminTransfer',\n `Admin transfer accepted. TxHash: ${result.txHash}`\n );\n\n return { id: result.txHash };\n }\n\n /**\n * Exports a snapshot of current access control state\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to access snapshot\n * @throws Error if snapshot validation fails\n * @throws ConfigurationInvalid if the contract address is invalid\n */\n async exportSnapshot(contractAddress: string): Promise<AccessSnapshot> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.exportSnapshot',\n `Exporting snapshot for ${contractAddress}`\n );\n\n // Read ownership (if supported)\n let ownership: OwnershipInfo | undefined;\n try {\n ownership = await this.getOwnership(contractAddress);\n } catch (error) {\n logger.debug('StellarAccessControlService.exportSnapshot', 'Ownership not available:', error);\n // Contract may not be Ownable, continue without ownership\n }\n\n // Read roles (if contract is registered and has roles)\n let roles: RoleAssignment[] = [];\n try {\n roles = await this.getCurrentRoles(contractAddress);\n } catch (error) {\n logger.debug('StellarAccessControlService.exportSnapshot', 'Roles not available:', error);\n // Contract may not be registered or have no roles, continue with empty roles array\n }\n\n const snapshot: AccessSnapshot = {\n roles,\n ownership,\n };\n\n // Validate snapshot using utils\n if (!validateSnapshot(snapshot)) {\n const errorMsg = `Invalid snapshot structure for contract ${contractAddress}`;\n logger.error('StellarAccessControlService.exportSnapshot', errorMsg);\n throw new OperationFailed(errorMsg, contractAddress, 'exportSnapshot');\n }\n\n logger.debug('StellarAccessControlService.exportSnapshot', 'Snapshot created and validated:', {\n hasOwnership: !!ownership?.owner,\n roleCount: roles.length,\n totalMembers: roles.reduce((sum, r) => sum + r.members.length, 0),\n });\n\n return snapshot;\n }\n\n /**\n * Gets history of role changes with pagination support\n *\n * Supports cursor-based pagination. Use `pageInfo.endCursor` from the response\n * as the `cursor` option in subsequent calls to fetch more pages.\n *\n * @param contractAddress The contract address\n * @param options Optional filtering and pagination options\n * @returns Promise resolving to paginated history result, or empty result if not supported\n * @throws ConfigurationInvalid if the contract address is invalid\n */\n async getHistory(\n contractAddress: string,\n options?: HistoryQueryOptions\n ): Promise<PaginatedHistoryResult> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n // Validate account if provided\n if (options?.account) {\n validateAccountAddress(options.account, 'options.account');\n }\n\n logger.info(\n 'StellarAccessControlService.getHistory',\n `Fetching history for ${contractAddress}`,\n options\n );\n\n const isAvailable = await this.indexerClient.checkAvailability();\n if (!isAvailable) {\n logger.warn(\n 'StellarAccessControlService.getHistory',\n `Indexer not available for network ${this.networkConfig.id}, returning empty history`\n );\n return {\n items: [],\n pageInfo: { hasNextPage: false },\n };\n }\n\n return this.indexerClient.queryHistory(contractAddress, options);\n }\n\n /**\n * Helper to get the admin account (AccessControl contracts only)\n *\n * @param contractAddress The contract address\n * @returns Promise resolving to admin address or null\n * @throws ConfigurationInvalid if the contract address is invalid\n */\n async getAdminAccount(contractAddress: string): Promise<string | null> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n logger.info(\n 'StellarAccessControlService.getAdminAccount',\n `Reading admin for ${contractAddress}`\n );\n\n return getAdmin(contractAddress, this.networkConfig);\n }\n\n /**\n * Discovers known role IDs for a contract by querying historical events from the indexer\n *\n * This method queries all role_granted and role_revoked events from the indexer and\n * extracts unique role identifiers. Results are cached to avoid repeated queries.\n *\n * If knownRoleIds were provided via registerContract(), those take precedence and\n * this method returns them without querying the indexer.\n *\n * @param contractAddress The contract address to discover roles for\n * @returns Promise resolving to array of unique role identifiers\n * @throws ConfigurationInvalid if contract address is invalid or contract not registered\n */\n async discoverKnownRoleIds(contractAddress: string): Promise<string[]> {\n // Validate contract address\n validateContractAddress(contractAddress);\n\n const context = this.contractContexts.get(contractAddress);\n if (!context) {\n throw new ConfigurationInvalid(\n 'Contract not registered. Call registerContract() first.',\n contractAddress,\n 'contractAddress'\n );\n }\n\n // If knownRoleIds were explicitly provided, return them (they take precedence)\n if (context.knownRoleIds && context.knownRoleIds.length > 0) {\n logger.debug(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Using ${context.knownRoleIds.length} explicitly provided role IDs for ${contractAddress}`\n );\n return context.knownRoleIds;\n }\n\n // Return cached discovered roles if available\n if (context.discoveredRoleIds) {\n logger.debug(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Using ${context.discoveredRoleIds.length} cached discovered role IDs for ${contractAddress}`\n );\n return context.discoveredRoleIds;\n }\n\n // If we already attempted discovery and found nothing, don't retry\n if (context.roleDiscoveryAttempted) {\n logger.debug(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Discovery already attempted for ${contractAddress}, returning empty array`\n );\n return [];\n }\n\n logger.info(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Discovering role IDs via indexer for ${contractAddress}`\n );\n\n // Check if indexer is available\n const isAvailable = await this.indexerClient.checkAvailability();\n if (!isAvailable) {\n logger.warn(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Indexer not available for network ${this.networkConfig.id}, cannot discover roles`\n );\n // Mark as attempted so we don't retry\n context.roleDiscoveryAttempted = true;\n return [];\n }\n\n try {\n // Query indexer for unique role IDs\n const roleIds = await this.indexerClient.discoverRoleIds(contractAddress);\n\n // Cache the results\n context.discoveredRoleIds = roleIds;\n context.roleDiscoveryAttempted = true;\n\n logger.info(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Discovered ${roleIds.length} role(s) for ${contractAddress}`,\n { roles: roleIds }\n );\n\n return roleIds;\n } catch (error) {\n logger.error(\n 'StellarAccessControlService.discoverKnownRoleIds',\n `Failed to discover roles: ${error instanceof Error ? error.message : String(error)}`\n );\n // Mark as attempted so we don't retry on transient errors\n context.roleDiscoveryAttempted = true;\n return [];\n }\n }\n\n /**\n * Disposes of the service and cleans up resources.\n *\n * Cleans up the indexer client's subscriptions to prevent memory leaks.\n * Call this method when the service is no longer needed.\n *\n * Note: In typical usage where the service is application-scoped and lives\n * for the duration of the application, calling dispose is not strictly necessary.\n * However, it should be called if the service is created/destroyed dynamically\n * (e.g., in tests or when switching networks).\n */\n dispose(): void {\n this.indexerClient.dispose();\n logger.debug('StellarAccessControlService.dispose', 'Service disposed');\n }\n}\n\n/**\n * Factory function to create a StellarAccessControlService instance\n *\n * Creates a service instance configured for a specific Stellar network.\n * The service supports both Ownable and AccessControl patterns including\n * two-step ownership transfers with ledger-based expiration.\n *\n * @param networkConfig The Stellar network configuration\n * @returns A new StellarAccessControlService instance\n *\n * @example\n * ```typescript\n * import { createStellarAccessControlService } from '@openzeppelin/ui-builder-adapter-stellar';\n *\n * const service = createStellarAccessControlService(networkConfig);\n * service.registerContract(contractAddress, contractSchema);\n *\n * const ownership = await service.getOwnership(contractAddress);\n * ```\n */\nexport function createStellarAccessControlService(\n networkConfig: StellarNetworkConfig\n): StellarAccessControlService {\n return new StellarAccessControlService(networkConfig);\n}\n","import { rpc as StellarRpc } from '@stellar/stellar-sdk';\n\nimport type {\n ExecutionConfig,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n} from '@openzeppelin/ui-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/ui-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/ui-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/ui-utils';\n\nimport { CALLER_PLACEHOLDER } from '../access-control/actions';\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 // Replace CALLER_PLACEHOLDER with the connected wallet address\n // This supports OpenZeppelin Stellar access control functions that require a caller parameter\n const resolvedArgs = txData.args.map((arg) =>\n arg === CALLER_PLACEHOLDER ? connectedAddress : arg\n );\n\n // Add the contract call operation (convert args to ScVal with comprehensive type support)\n const scValArgs = resolvedArgs.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","/**\n * Access Control Actions Module\n *\n * Assembles transaction data for access control operations (grant/revoke roles, transfer ownership)\n * on Stellar (Soroban) contracts. These actions prepare transaction data that can be executed\n * via the standard Stellar transaction execution flow.\n */\n\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport type { StellarTransactionData } from '../transaction/formatter';\n\n/**\n * Special placeholder value that gets replaced with the connected wallet address\n * at transaction execution time. Used when the caller parameter should be the\n * transaction sender (connected wallet).\n *\n * @see EoaExecutionStrategy - replaces this placeholder before building the transaction\n * @see RelayerExecutionStrategy - also replaces this placeholder before building the transaction\n */\nexport const CALLER_PLACEHOLDER = '__CALLER__';\n\n/**\n * Assembles transaction data for granting a role to an account\n *\n * Note: OpenZeppelin Stellar AccessControl (v0.5.x) requires a `caller` parameter for authorization.\n * The caller is the address authorizing the role grant (must have admin privileges).\n * Use CALLER_PLACEHOLDER to use the connected wallet address as the caller.\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param account The account address to grant the role to\n * @param caller The address authorizing the grant (defaults to CALLER_PLACEHOLDER for connected wallet)\n * @returns Transaction data ready for execution\n */\nexport function assembleGrantRoleAction(\n contractAddress: string,\n roleId: string,\n account: string,\n caller: string = CALLER_PLACEHOLDER\n): StellarTransactionData {\n logger.info(\n 'assembleGrantRoleAction',\n `Assembling grant_role action for ${roleId} to ${account} (caller: ${caller})`\n );\n\n // Arguments for grant_role(caller: Address, account: Address, role: Symbol) - v0.5.x signature\n // Note: args are raw values that will be converted to ScVal by the transaction execution flow\n // The caller parameter is required by OpenZeppelin Stellar AccessControl for authorization\n return {\n contractAddress,\n functionName: 'grant_role',\n args: [caller, account, roleId],\n argTypes: ['Address', 'Address', 'Symbol'],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for revoking a role from an account\n *\n * Note: OpenZeppelin Stellar AccessControl (v0.5.x) requires a `caller` parameter for authorization.\n * The caller is the address authorizing the role revocation (must have admin privileges).\n * Use CALLER_PLACEHOLDER to use the connected wallet address as the caller.\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier (Symbol)\n * @param account The account address to revoke the role from\n * @param caller The address authorizing the revocation (defaults to CALLER_PLACEHOLDER for connected wallet)\n * @returns Transaction data ready for execution\n */\nexport function assembleRevokeRoleAction(\n contractAddress: string,\n roleId: string,\n account: string,\n caller: string = CALLER_PLACEHOLDER\n): StellarTransactionData {\n logger.info(\n 'assembleRevokeRoleAction',\n `Assembling revoke_role action for ${roleId} from ${account} (caller: ${caller})`\n );\n\n // Arguments for revoke_role(caller: Address, account: Address, role: Symbol) - v0.5.x signature\n // Note: args are raw values that will be converted to ScVal by the transaction execution flow\n // The caller parameter is required by OpenZeppelin Stellar AccessControl for authorization\n return {\n contractAddress,\n functionName: 'revoke_role',\n args: [caller, account, roleId],\n argTypes: ['Address', 'Address', 'Symbol'],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for transferring ownership of a contract\n *\n * For two-step Ownable contracts, this initiates a transfer that must be accepted\n * by the pending owner before the expiration ledger.\n *\n * @param contractAddress The contract address\n * @param newOwner The new owner address\n * @param liveUntilLedger The ledger sequence by which the transfer must be accepted\n * @returns Transaction data ready for execution\n */\nexport function assembleTransferOwnershipAction(\n contractAddress: string,\n newOwner: string,\n liveUntilLedger: number\n): StellarTransactionData {\n logger.info(\n 'assembleTransferOwnershipAction',\n `Assembling transfer_ownership action to ${newOwner} with expiration at ledger ${liveUntilLedger}`\n );\n\n // Arguments for transfer_ownership(new_owner: Address, live_until_ledger: u32)\n // Note: args are raw values that will be converted to ScVal by the transaction execution flow\n return {\n contractAddress,\n functionName: 'transfer_ownership',\n args: [newOwner, liveUntilLedger],\n argTypes: ['Address', 'u32'],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for accepting a pending ownership transfer\n *\n * For two-step Ownable contracts, this completes a pending transfer initiated by\n * the current owner. Must be called by the pending owner before the expiration ledger.\n *\n * @param contractAddress The contract address\n * @returns Transaction data ready for execution\n */\nexport function assembleAcceptOwnershipAction(contractAddress: string): StellarTransactionData {\n logger.info(\n 'assembleAcceptOwnershipAction',\n `Assembling accept_ownership action for ${contractAddress}`\n );\n\n // accept_ownership() has no arguments - caller must be the pending owner\n return {\n contractAddress,\n functionName: 'accept_ownership',\n args: [],\n argTypes: [],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for initiating an admin role transfer\n *\n * For two-step AccessControl contracts, this initiates an admin transfer that must\n * be accepted by the pending admin before the expiration ledger.\n *\n * @param contractAddress The contract address\n * @param newAdmin The new admin address\n * @param liveUntilLedger The ledger sequence by which the transfer must be accepted\n * @returns Transaction data ready for execution\n */\nexport function assembleTransferAdminRoleAction(\n contractAddress: string,\n newAdmin: string,\n liveUntilLedger: number\n): StellarTransactionData {\n logger.info(\n 'assembleTransferAdminRoleAction',\n `Assembling transfer_admin_role action to ${newAdmin} with expiration at ledger ${liveUntilLedger}`\n );\n\n // Arguments for transfer_admin_role(new_admin: Address, live_until_ledger: u32)\n // Note: args are raw values that will be converted to ScVal by the transaction execution flow\n return {\n contractAddress,\n functionName: 'transfer_admin_role',\n args: [newAdmin, liveUntilLedger],\n argTypes: ['Address', 'u32'],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n\n/**\n * Assembles transaction data for accepting a pending admin transfer\n *\n * For two-step AccessControl contracts, this completes a pending admin transfer\n * initiated by the current admin. Must be called by the pending admin before the\n * expiration ledger.\n *\n * @param contractAddress The contract address\n * @returns Transaction data ready for execution\n */\nexport function assembleAcceptAdminTransferAction(contractAddress: string): StellarTransactionData {\n logger.info(\n 'assembleAcceptAdminTransferAction',\n `Assembling accept_admin_transfer action for ${contractAddress}`\n );\n\n // accept_admin_transfer() has no arguments - caller must be the pending admin\n return {\n contractAddress,\n functionName: 'accept_admin_transfer',\n args: [],\n argTypes: [],\n argSchema: undefined,\n transactionOptions: {},\n };\n}\n","import type { Connector } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { StellarNetworkConfig, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { appConfigService, logger } from '@openzeppelin/ui-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 { Connector, StellarNetworkConfig, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { StellarNetworkConfig, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { getStellarWalletImplementation } from '../utils/stellarWalletImplementationManager';\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\n // Wire the active kit into the wallet implementation\n // This ensures signing and other operations use the correct kit instance\n if (state.networkConfig) {\n try {\n const impl = await getStellarWalletImplementation(state.networkConfig);\n impl.setActiveStellarKit(kit);\n logger.debug(\n 'StellarUiKitManager:configure',\n 'Active kit wired into wallet implementation for stellar-wallets-kit'\n );\n } catch (error) {\n logger.warn(\n 'StellarUiKitManager:configure',\n 'Failed to attach active kit to wallet implementation:',\n error\n );\n }\n }\n\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\n // Wire the active kit into the wallet implementation\n // This ensures signing and other operations use the correct kit instance\n if (state.networkConfig) {\n try {\n const impl = await getStellarWalletImplementation(state.networkConfig);\n impl.setActiveStellarKit(kit);\n logger.debug(\n 'StellarUiKitManager:configure',\n 'Active kit wired into wallet implementation for custom'\n );\n } catch (error) {\n logger.warn(\n 'StellarUiKitManager:configure',\n 'Failed to attach active kit to wallet implementation:',\n error\n );\n }\n }\n\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\n // Clear the active kit from the wallet implementation\n if (state.networkConfig) {\n try {\n const impl = await getStellarWalletImplementation(state.networkConfig);\n impl.setActiveStellarKit(null);\n logger.debug(\n 'StellarUiKitManager:configure',\n 'Active kit cleared from wallet implementation for none'\n );\n } catch (error) {\n logger.warn(\n 'StellarUiKitManager:configure',\n 'Failed to clear active kit from wallet implementation:',\n error\n );\n }\n }\n\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/ui-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} 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\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/ui-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/ui-utils';\n\nimport { setStellarConnectedAddress } from '../connection';\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 // Inform the adapter's wallet implementation so the context updates\n // This ensures the Execute Transaction button and other components\n // recognize the wallet connection state\n try {\n setStellarConnectedAddress(address ?? null);\n } catch (error) {\n logger.warn(\n 'StellarWalletsKitConnectButton',\n 'Failed to set connected address in adapter implementation:',\n error\n );\n }\n },\n onDisconnect: () => {\n logger.info('StellarWalletsKitConnectButton', 'Disconnected');\n // Inform the implementation we are no longer connected\n try {\n setStellarConnectedAddress(null);\n } catch (error) {\n logger.warn(\n 'StellarWalletsKitConnectButton',\n 'Failed to clear connected address in adapter implementation:',\n error\n );\n }\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 {\n Account,\n BASE_FEE,\n Contract,\n rpc as StellarRpc,\n TransactionBuilder,\n xdr,\n} from '@stellar/stellar-sdk';\n\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';\nimport type {\n ExecutionConfig,\n RelayerDetails,\n RelayerDetailsRich,\n RelayerExecutionConfig,\n StellarNetworkConfig,\n TransactionStatusUpdate,\n TxStatus,\n} from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { CALLER_PLACEHOLDER } from '../access-control/actions';\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 // Replace CALLER_PLACEHOLDER with the connected wallet address\n // This supports OpenZeppelin Stellar access control functions that require a caller parameter\n const resolvedArgs = txData.args.map((arg) =>\n arg === CALLER_PLACEHOLDER ? connectedAddress : arg\n );\n\n const scValArgs = resolvedArgs.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","/**\n * Feature Detection Module\n *\n * Detects access control capabilities of Stellar (Soroban) contracts by analyzing\n * their function interfaces. Supports detection of Ownable and AccessControl patterns\n * from OpenZeppelin Stellar Contracts.\n */\n\nimport type { AccessControlCapabilities, ContractSchema } from '@openzeppelin/ui-types';\nimport { UnsupportedContractFeatures } from '@openzeppelin/ui-types';\n\n/**\n * Known OpenZeppelin Ownable function signatures\n */\nconst OWNABLE_FUNCTIONS = {\n required: ['get_owner'],\n optional: ['transfer_ownership', 'accept_ownership', 'renounce_ownership'],\n} as const;\n\n/**\n * Known OpenZeppelin AccessControl function signatures\n */\nconst ACCESS_CONTROL_FUNCTIONS = {\n required: ['has_role', 'grant_role', 'revoke_role'],\n optional: [\n 'get_role_admin',\n 'set_role_admin',\n 'get_admin',\n 'transfer_admin_role',\n 'accept_admin_transfer',\n 'renounce_admin',\n 'renounce_role',\n ],\n} as const;\n\n/**\n * Functions that indicate role enumeration support\n */\nconst ENUMERATION_FUNCTIONS = ['get_role_member_count', 'get_role_member'] as const;\n\n/**\n * Detects access control capabilities of a Stellar contract\n *\n * @param contractSchema The contract schema to analyze\n * @param indexerAvailable Whether an indexer is configured and available\n * @returns Detected capabilities\n */\nexport function detectAccessControlCapabilities(\n contractSchema: ContractSchema,\n indexerAvailable = false\n): AccessControlCapabilities {\n const functionNames = new Set(contractSchema.functions.map((fn) => fn.name));\n\n // Detect Ownable\n const hasOwnable = OWNABLE_FUNCTIONS.required.every((fnName) => functionNames.has(fnName));\n\n // Detect two-step Ownable (has accept_ownership function)\n const hasTwoStepOwnable = hasOwnable && functionNames.has('accept_ownership');\n\n // Detect AccessControl\n const hasAccessControl = ACCESS_CONTROL_FUNCTIONS.required.every((fnName) =>\n functionNames.has(fnName)\n );\n\n // Detect two-step admin transfer (has accept_admin_transfer function)\n const hasTwoStepAdmin = hasAccessControl && functionNames.has('accept_admin_transfer');\n\n // Detect enumerable roles\n const hasEnumerableRoles = ENUMERATION_FUNCTIONS.every((fnName) => functionNames.has(fnName));\n\n // History is only available when indexer is configured\n const supportsHistory = indexerAvailable;\n\n // Verify the contract against OZ interfaces\n const verifiedAgainstOZInterfaces = verifyOZInterface(\n functionNames,\n hasOwnable,\n hasAccessControl,\n hasTwoStepOwnable,\n hasTwoStepAdmin\n );\n\n // Collect notes about detected capabilities\n const notes: string[] = [];\n\n if (hasOwnable) {\n if (hasTwoStepOwnable) {\n notes.push('OpenZeppelin two-step Ownable interface detected (with accept_ownership)');\n } else {\n notes.push('OpenZeppelin Ownable interface detected');\n }\n }\n\n if (hasAccessControl) {\n if (hasTwoStepAdmin) {\n notes.push(\n 'OpenZeppelin two-step AccessControl interface detected (with accept_admin_transfer)'\n );\n } else {\n notes.push('OpenZeppelin AccessControl interface detected');\n }\n }\n\n if (hasEnumerableRoles) {\n notes.push('Role enumeration supported (get_role_member_count, get_role_member)');\n } else if (hasAccessControl) {\n notes.push('Role enumeration not available - requires event reconstruction');\n }\n\n if (!indexerAvailable && (hasOwnable || hasAccessControl)) {\n notes.push('History queries unavailable without indexer configuration');\n }\n\n if (!hasOwnable && !hasAccessControl) {\n notes.push('No OpenZeppelin access control interfaces detected');\n }\n\n return {\n hasOwnable,\n hasTwoStepOwnable,\n hasAccessControl,\n hasTwoStepAdmin,\n hasEnumerableRoles,\n supportsHistory,\n verifiedAgainstOZInterfaces,\n notes: notes.length > 0 ? notes : undefined,\n };\n}\n\n/**\n * Verifies that the contract conforms to OpenZeppelin interfaces\n *\n * @param functionNames Set of function names in the contract\n * @param hasOwnable Whether Ownable was detected\n * @param hasAccessControl Whether AccessControl was detected\n * @param hasTwoStepOwnable Whether two-step Ownable was detected\n * @param hasTwoStepAdmin Whether two-step admin was detected\n * @returns True if verified against OZ interfaces\n */\nfunction verifyOZInterface(\n functionNames: Set<string>,\n hasOwnable: boolean,\n hasAccessControl: boolean,\n hasTwoStepOwnable = false,\n hasTwoStepAdmin = false\n): boolean {\n // If no OZ patterns detected, not applicable\n if (!hasOwnable && !hasAccessControl) {\n return false;\n }\n\n // Verify Ownable optional functions\n // For two-step Ownable, require at least 3 of 4 optional functions\n // For basic Ownable, at least 2 of 3 (excluding accept_ownership)\n if (hasOwnable) {\n const ownableOptionalCount = OWNABLE_FUNCTIONS.optional.filter((fnName) =>\n functionNames.has(fnName)\n ).length;\n\n if (hasTwoStepOwnable) {\n // Two-step Ownable should have at least 3 of 4 optional functions\n // (transfer_ownership, accept_ownership, renounce_ownership, and accept_ownership is guaranteed)\n if (ownableOptionalCount < 3) {\n return false;\n }\n } else {\n // Basic Ownable should have at least 2 of 3 optional functions\n if (ownableOptionalCount < 2) {\n return false;\n }\n }\n }\n\n // Verify AccessControl optional functions\n // For two-step admin, require at least 5 of 7 optional functions\n // For basic AccessControl, at least 4 of 7 should be present\n if (hasAccessControl) {\n const accessControlOptionalCount = ACCESS_CONTROL_FUNCTIONS.optional.filter((fnName) =>\n functionNames.has(fnName)\n ).length;\n\n if (hasTwoStepAdmin) {\n // Two-step admin should have at least 5 of 7 optional functions\n // (transfer_admin_role, accept_admin_transfer guaranteed, plus others)\n if (accessControlOptionalCount < 5) {\n return false;\n }\n } else {\n // Basic AccessControl should have at least 4 of 7 optional functions\n if (accessControlOptionalCount < 4) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Validates that a contract supports access control operations\n *\n * @param capabilities The detected capabilities\n * @param contractAddress Optional contract address for error context\n * @throws UnsupportedContractFeatures if contract doesn't support required operations\n */\nexport function validateAccessControlSupport(\n capabilities: AccessControlCapabilities,\n contractAddress?: string\n): asserts capabilities is\n | (AccessControlCapabilities & { hasOwnable: true })\n | (AccessControlCapabilities & { hasAccessControl: true }) {\n if (!capabilities.hasOwnable && !capabilities.hasAccessControl) {\n throw new UnsupportedContractFeatures(\n 'Contract does not implement OpenZeppelin Ownable or AccessControl interfaces',\n contractAddress,\n ['Ownable', 'AccessControl']\n );\n }\n\n if (!capabilities.verifiedAgainstOZInterfaces) {\n throw new UnsupportedContractFeatures(\n 'Contract interfaces do not conform to OpenZeppelin standards',\n contractAddress\n );\n }\n}\n","/**\n * Stellar Indexer Client\n *\n * Provides access to historical access control events via a GraphQL indexer.\n * Implements config precedence: runtime override > network-config default > derived-from-RPC (if safe) > none.\n */\n\nimport type {\n HistoryChangeType,\n HistoryEntry,\n HistoryQueryOptions,\n IndexerEndpointConfig,\n PageInfo,\n PaginatedHistoryResult,\n RoleIdentifier,\n StellarNetworkConfig,\n} from '@openzeppelin/ui-types';\nimport { ConfigurationInvalid, IndexerUnavailable, OperationFailed } from '@openzeppelin/ui-types';\nimport {\n appConfigService,\n isValidUrl,\n logger,\n userNetworkServiceConfigService,\n} from '@openzeppelin/ui-utils';\n\nconst LOG_SYSTEM = 'StellarIndexerClient';\n\n/**\n * Extracts the user-configured indexer endpoints from UserNetworkServiceConfigService.\n * Validates URLs before returning them to prevent invalid URLs from causing runtime errors.\n *\n * @param networkId - The network ID to get the indexer config for\n * @returns The indexer endpoint config if configured and valid, undefined otherwise\n */\nfunction getUserIndexerEndpoints(networkId: string): IndexerEndpointConfig | undefined {\n const svcCfg = userNetworkServiceConfigService.get(networkId, 'indexer');\n if (!svcCfg || typeof svcCfg !== 'object') {\n return undefined;\n }\n\n const endpoints: IndexerEndpointConfig = {};\n\n // Check for indexerUri field (HTTP endpoint) and validate\n if ('indexerUri' in svcCfg && svcCfg.indexerUri) {\n const httpUrl = String(svcCfg.indexerUri).trim();\n if (httpUrl && isValidUrl(httpUrl)) {\n endpoints.http = httpUrl;\n } else if (httpUrl) {\n logger.warn(\n LOG_SYSTEM,\n `User-configured indexer HTTP URL for ${networkId} is invalid: ${httpUrl}. Ignoring.`\n );\n }\n }\n\n // Check for indexerWsUri field (WebSocket endpoint) and validate\n if ('indexerWsUri' in svcCfg && svcCfg.indexerWsUri) {\n const wsUrl = String(svcCfg.indexerWsUri).trim();\n if (wsUrl && isValidUrl(wsUrl)) {\n endpoints.ws = wsUrl;\n } else if (wsUrl) {\n logger.warn(\n LOG_SYSTEM,\n `User-configured indexer WebSocket URL for ${networkId} is invalid: ${wsUrl}. Ignoring.`\n );\n }\n }\n\n // Return undefined if no valid endpoints were found\n if (!endpoints.http && !endpoints.ws) {\n return undefined;\n }\n\n return endpoints;\n}\n\n/**\n * GraphQL query response types for indexer\n */\ninterface IndexerHistoryEntry {\n id: string;\n role?: string; // Nullable for Ownership/Admin events\n account: string;\n type:\n | 'ROLE_GRANTED'\n | 'ROLE_REVOKED'\n | 'OWNERSHIP_TRANSFER_COMPLETED'\n | 'OWNERSHIP_TRANSFER_STARTED'\n | 'ADMIN_TRANSFER_INITIATED'\n | 'ADMIN_TRANSFER_COMPLETED';\n txHash: string;\n timestamp: string;\n blockHeight: string;\n /** Ledger sequence of the event */\n ledger?: string;\n /** Admin/owner who initiated the transfer (for OWNERSHIP_TRANSFER_STARTED, ADMIN_TRANSFER_INITIATED) */\n admin?: string;\n /** Expiration ledger for pending transfers (OWNERSHIP_TRANSFER_STARTED, ADMIN_TRANSFER_INITIATED) */\n liveUntilLedger?: number;\n}\n\n/**\n * Ownership Transfer Started Event\n *\n * Contains details about a pending two-step ownership transfer from the indexer.\n * Includes the expiration ledger (`liveUntilLedger`) for determining if the\n * transfer has expired without requiring an additional on-chain query.\n */\nexport interface OwnershipTransferStartedEvent {\n /** Previous owner (admin) who initiated the transfer */\n previousOwner: string;\n /** Pending owner address (account) - the new owner */\n pendingOwner: string;\n /** Transaction hash of the initiation */\n txHash: string;\n /** ISO8601 timestamp of the event */\n timestamp: string;\n /** Ledger sequence of the event */\n ledger: number;\n /** Expiration ledger - transfer must be accepted before this ledger */\n liveUntilLedger: number;\n}\n\n/**\n * Admin Transfer Initiated Event\n *\n * Contains details about a pending two-step admin transfer from the indexer.\n * Includes the expiration ledger (`liveUntilLedger`) for determining if the\n * transfer has expired without requiring an additional on-chain query.\n */\nexport interface AdminTransferInitiatedEvent {\n /** Previous admin who initiated the transfer */\n previousAdmin: string;\n /** Pending admin address (account) - the new admin */\n pendingAdmin: string;\n /** Transaction hash of the initiation */\n txHash: string;\n /** ISO8601 timestamp of the event */\n timestamp: string;\n /** Ledger sequence of the event */\n ledger: number;\n /** Expiration ledger - transfer must be accepted before this ledger */\n liveUntilLedger: number;\n}\n\ninterface IndexerPageInfo {\n hasNextPage: boolean;\n endCursor?: string;\n}\n\ninterface IndexerHistoryResponse {\n data?: {\n accessControlEvents?: {\n nodes: IndexerHistoryEntry[];\n pageInfo: IndexerPageInfo;\n };\n };\n errors?: Array<{\n message: string;\n }>;\n}\n\n/**\n * Response type for ownership transfer queries\n */\ninterface IndexerOwnershipTransferResponse {\n data?: {\n accessControlEvents?: {\n nodes: IndexerHistoryEntry[];\n pageInfo?: IndexerPageInfo;\n };\n };\n errors?: Array<{\n message: string;\n }>;\n}\n\n/**\n * Response type for role discovery query\n */\ninterface IndexerRoleDiscoveryResponse {\n data?: {\n accessControlEvents?: {\n nodes: Array<{\n role: string | null;\n }>;\n };\n };\n errors?: Array<{\n message: string;\n }>;\n}\n\n/**\n * Grant information for a specific member\n */\nexport interface GrantInfo {\n /** ISO8601 timestamp of the grant */\n timestamp: string;\n /** Transaction ID of the grant */\n txId: string;\n /** Block/ledger number of the grant */\n ledger: number;\n}\n\n/**\n * Stellar Indexer Client\n * Handles GraphQL queries to the configured indexer for historical access control data\n */\nexport class StellarIndexerClient {\n private readonly networkConfig: StellarNetworkConfig;\n private resolvedEndpoints: IndexerEndpointConfig | null = null;\n private availabilityChecked = false;\n private isAvailable = false;\n private readonly unsubscribeFromConfigChanges: () => void;\n\n constructor(networkConfig: StellarNetworkConfig) {\n this.networkConfig = networkConfig;\n\n // Subscribe to indexer config changes to reset cache when user updates settings\n this.unsubscribeFromConfigChanges = userNetworkServiceConfigService.subscribe(\n networkConfig.id,\n 'indexer',\n () => {\n logger.info(\n LOG_SYSTEM,\n `User indexer config changed for ${networkConfig.id}, resetting cache`\n );\n this.resetCache();\n }\n );\n }\n\n /**\n * Resets the resolved endpoints and availability cache.\n * Called when user configuration changes to force re-resolution.\n */\n private resetCache(): void {\n this.resolvedEndpoints = null;\n this.availabilityChecked = false;\n this.isAvailable = false;\n }\n\n /**\n * Cleans up subscriptions when the client is no longer needed.\n * Call this method when disposing of the client to prevent memory leaks.\n */\n public dispose(): void {\n this.unsubscribeFromConfigChanges();\n }\n\n /**\n * Check if indexer is available and configured\n * @returns True if indexer endpoints are configured and reachable\n */\n async checkAvailability(): Promise<boolean> {\n if (this.availabilityChecked) {\n return this.isAvailable;\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n logger.info(LOG_SYSTEM, `No indexer configured for network ${this.networkConfig.id}`);\n this.availabilityChecked = true;\n this.isAvailable = false;\n return false;\n }\n\n try {\n // Simple connectivity check with a minimal query\n const response = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n query: '{ __typename }',\n }),\n });\n\n if (response.ok) {\n logger.info(\n LOG_SYSTEM,\n `Indexer available for network ${this.networkConfig.id} at ${endpoints.http}`\n );\n this.isAvailable = true;\n } else {\n logger.warn(\n LOG_SYSTEM,\n `Indexer endpoint ${endpoints.http} returned status ${response.status}`\n );\n this.isAvailable = false;\n }\n } catch (error) {\n logger.warn(\n LOG_SYSTEM,\n `Failed to connect to indexer at ${endpoints.http}: ${error instanceof Error ? error.message : String(error)}`\n );\n this.isAvailable = false;\n }\n\n this.availabilityChecked = true;\n return this.isAvailable;\n }\n\n /**\n * Query history entries for a contract with pagination support\n * @param contractAddress The contract address to query\n * @param options Optional filtering and pagination options\n * @returns Promise resolving to paginated history result\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n */\n async queryHistory(\n contractAddress: string,\n options?: HistoryQueryOptions\n ): Promise<PaginatedHistoryResult> {\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n // Build query with server-side filtering and pagination\n const query = this.buildHistoryQuery(contractAddress, options);\n const variables = this.buildQueryVariables(contractAddress, options);\n\n try {\n const response = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${response.status}`,\n contractAddress,\n 'queryHistory'\n );\n }\n\n const result = (await response.json()) as IndexerHistoryResponse;\n\n if (result.errors && result.errors.length > 0) {\n const errorMessages = result.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'queryHistory'\n );\n }\n\n if (!result.data?.accessControlEvents?.nodes) {\n logger.debug(LOG_SYSTEM, `No history data returned for contract ${contractAddress}`);\n return {\n items: [],\n pageInfo: { hasNextPage: false },\n };\n }\n\n const items = this.transformIndexerEntries(result.data.accessControlEvents.nodes);\n const pageInfo: PageInfo = {\n hasNextPage: result.data.accessControlEvents.pageInfo.hasNextPage,\n endCursor: result.data.accessControlEvents.pageInfo.endCursor,\n };\n\n return { items, pageInfo };\n } catch (error) {\n logger.error(\n LOG_SYSTEM,\n `Failed to query indexer history: ${error instanceof Error ? error.message : String(error)}`\n );\n throw error;\n }\n }\n\n /**\n * Discover all unique role identifiers for a contract by querying historical events\n *\n * Queries all ROLE_GRANTED and ROLE_REVOKED events and extracts unique role values.\n * This enables role enumeration even when knownRoleIds are not provided.\n *\n * @param contractAddress The contract address to discover roles for\n * @returns Promise resolving to array of unique role identifiers\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n */\n async discoverRoleIds(contractAddress: string): Promise<string[]> {\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n logger.info(LOG_SYSTEM, `Discovering role IDs for contract ${contractAddress}`);\n\n const query = this.buildRoleDiscoveryQuery();\n const variables = { contract: contractAddress };\n\n try {\n const response = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${response.status}`,\n contractAddress,\n 'discoverRoleIds'\n );\n }\n\n const result = (await response.json()) as IndexerRoleDiscoveryResponse;\n\n if (result.errors && result.errors.length > 0) {\n const errorMessages = result.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'discoverRoleIds'\n );\n }\n\n if (!result.data?.accessControlEvents?.nodes) {\n logger.debug(LOG_SYSTEM, `No role events found for contract ${contractAddress}`);\n return [];\n }\n\n // Extract unique role IDs, filtering out null/undefined values (ownership events)\n const uniqueRoles = new Set<string>();\n for (const node of result.data.accessControlEvents.nodes) {\n if (node.role) {\n uniqueRoles.add(node.role);\n }\n }\n\n const roleIds = Array.from(uniqueRoles);\n logger.info(\n LOG_SYSTEM,\n `Discovered ${roleIds.length} unique role(s) for ${contractAddress}`,\n {\n roles: roleIds,\n }\n );\n\n return roleIds;\n } catch (error) {\n logger.error(\n LOG_SYSTEM,\n `Failed to discover role IDs: ${error instanceof Error ? error.message : String(error)}`\n );\n throw error;\n }\n }\n\n /**\n * Query the latest grant events for a set of members with a specific role\n *\n * Returns the most recent ROLE_GRANTED event for each member address.\n * This is used to enrich role assignments with grant timestamps.\n *\n * @param contractAddress The contract address\n * @param roleId The role identifier to query\n * @param memberAddresses Array of member addresses to look up\n * @returns Promise resolving to a Map of address -> GrantInfo\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n */\n async queryLatestGrants(\n contractAddress: string,\n roleId: string,\n memberAddresses: string[]\n ): Promise<Map<string, GrantInfo>> {\n if (memberAddresses.length === 0) {\n return new Map();\n }\n\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n logger.debug(\n LOG_SYSTEM,\n `Querying latest grants for ${memberAddresses.length} member(s) with role ${roleId}`\n );\n\n const query = this.buildLatestGrantsQuery();\n const variables = {\n contract: contractAddress,\n role: roleId,\n accounts: memberAddresses,\n };\n\n try {\n const response = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${response.status}`,\n contractAddress,\n 'queryLatestGrants'\n );\n }\n\n const result = (await response.json()) as IndexerHistoryResponse;\n\n if (result.errors && result.errors.length > 0) {\n const errorMessages = result.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'queryLatestGrants'\n );\n }\n\n if (!result.data?.accessControlEvents?.nodes) {\n logger.debug(LOG_SYSTEM, `No grant events found for role ${roleId}`);\n return new Map();\n }\n\n // Build map of address -> latest grant info\n // Since we order by TIMESTAMP_DESC, we take the first occurrence per account\n const grantMap = new Map<string, GrantInfo>();\n for (const entry of result.data.accessControlEvents.nodes) {\n if (!grantMap.has(entry.account)) {\n grantMap.set(entry.account, {\n timestamp: entry.timestamp,\n txId: entry.txHash,\n ledger: parseInt(entry.blockHeight, 10),\n });\n }\n }\n\n logger.debug(\n LOG_SYSTEM,\n `Found grant info for ${grantMap.size} of ${memberAddresses.length} member(s)`\n );\n\n return grantMap;\n } catch (error) {\n logger.error(\n LOG_SYSTEM,\n `Failed to query latest grants: ${error instanceof Error ? error.message : String(error)}`\n );\n throw error;\n }\n }\n\n /**\n * Query the latest pending ownership transfer for a contract\n *\n * Queries the indexer for `OWNERSHIP_TRANSFER_INITIATED` events and checks if\n * a corresponding `OWNERSHIP_TRANSFER_COMPLETED` event exists after the initiation.\n * If no completion event exists, returns the pending transfer details.\n *\n * @param contractAddress The contract address to query\n * @returns Promise resolving to pending transfer info, or null if no pending transfer\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n *\n * @example\n * ```typescript\n * const pending = await client.queryPendingOwnershipTransfer('CABC...XYZ');\n * if (pending) {\n * console.log(`Pending owner: ${pending.pendingOwner}`);\n * console.log(`Transfer started at ledger: ${pending.ledger}`);\n * }\n * ```\n */\n async queryPendingOwnershipTransfer(\n contractAddress: string\n ): Promise<OwnershipTransferStartedEvent | null> {\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n logger.info(LOG_SYSTEM, `Querying pending ownership transfer for ${contractAddress}`);\n\n // Step 1: Query latest OWNERSHIP_TRANSFER_STARTED event\n const initiationQuery = this.buildOwnershipTransferStartedQuery();\n const initiationVariables = { contract: contractAddress };\n\n try {\n const initiationResponse = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: initiationQuery, variables: initiationVariables }),\n });\n\n if (!initiationResponse.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${initiationResponse.status}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n\n const initiationResult =\n (await initiationResponse.json()) as IndexerOwnershipTransferResponse;\n\n if (initiationResult.errors && initiationResult.errors.length > 0) {\n const errorMessages = initiationResult.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n\n const initiatedNodes = initiationResult.data?.accessControlEvents?.nodes;\n if (!initiatedNodes || initiatedNodes.length === 0) {\n logger.debug(LOG_SYSTEM, `No ownership transfer initiated for ${contractAddress}`);\n return null;\n }\n\n const latestInitiation = initiatedNodes[0];\n\n // Step 2: Check if a completion event exists after the initiation\n const completionQuery = this.buildOwnershipTransferCompletedQuery();\n const completionVariables = {\n contract: contractAddress,\n afterTimestamp: latestInitiation.timestamp,\n };\n\n const completionResponse = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: completionQuery, variables: completionVariables }),\n });\n\n if (!completionResponse.ok) {\n throw new OperationFailed(\n `Indexer completion query failed with status ${completionResponse.status}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n\n const completionResult =\n (await completionResponse.json()) as IndexerOwnershipTransferResponse;\n\n // Check for GraphQL errors in completion query (same as initiation query)\n if (completionResult.errors && completionResult.errors.length > 0) {\n const errorMessages = completionResult.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer completion query errors: ${errorMessages}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n\n const completedNodes = completionResult.data?.accessControlEvents?.nodes;\n if (completedNodes && completedNodes.length > 0) {\n // Transfer was completed after initiation - no pending transfer\n logger.debug(LOG_SYSTEM, `Ownership transfer was completed for ${contractAddress}`);\n return null;\n }\n\n // No completion - validate required fields before returning pending transfer info\n // The admin field is required for OWNERSHIP_TRANSFER_STARTED events\n if (!latestInitiation.admin) {\n logger.warn(\n LOG_SYSTEM,\n `Indexer returned OWNERSHIP_TRANSFER_STARTED event without admin field for ${contractAddress}. ` +\n `This indicates incomplete indexer data. Treating as no valid pending transfer.`\n );\n return null;\n }\n\n // Validate liveUntilLedger is present (required for expiration checking)\n if (\n latestInitiation.liveUntilLedger === undefined ||\n latestInitiation.liveUntilLedger === null\n ) {\n logger.warn(\n LOG_SYSTEM,\n `Indexer returned OWNERSHIP_TRANSFER_STARTED event without liveUntilLedger for ${contractAddress}. ` +\n `This may indicate an older indexer version. Treating as no valid pending transfer.`\n );\n return null;\n }\n\n logger.info(\n LOG_SYSTEM,\n `Found pending ownership transfer for ${contractAddress}: pending owner=${latestInitiation.account}, expires at ledger ${latestInitiation.liveUntilLedger}`\n );\n\n return {\n previousOwner: latestInitiation.admin,\n pendingOwner: latestInitiation.account,\n txHash: latestInitiation.txHash,\n timestamp: latestInitiation.timestamp,\n ledger: parseInt(latestInitiation.ledger || latestInitiation.blockHeight, 10),\n liveUntilLedger: latestInitiation.liveUntilLedger,\n };\n } catch (error) {\n if (error instanceof IndexerUnavailable || error instanceof OperationFailed) {\n throw error;\n }\n logger.error(\n LOG_SYSTEM,\n `Failed to query pending ownership transfer: ${error instanceof Error ? error.message : String(error)}`\n );\n throw new OperationFailed(\n `Failed to query pending ownership transfer: ${(error as Error).message}`,\n contractAddress,\n 'queryPendingOwnershipTransfer'\n );\n }\n }\n\n /**\n * Query the latest pending admin transfer for a contract\n *\n * Queries the indexer for `ADMIN_TRANSFER_INITIATED` events and checks if\n * a corresponding `ADMIN_TRANSFER_COMPLETED` event exists after the initiation.\n * If no completion event exists, returns the pending transfer details.\n *\n * @param contractAddress The contract address to query\n * @returns Promise resolving to pending transfer info, or null if no pending transfer\n * @throws IndexerUnavailable if indexer is not available\n * @throws OperationFailed if query fails\n *\n * @example\n * ```typescript\n * const pending = await client.queryPendingAdminTransfer('CABC...XYZ');\n * if (pending) {\n * console.log(`Pending admin: ${pending.pendingAdmin}`);\n * console.log(`Transfer started at ledger: ${pending.ledger}`);\n * }\n * ```\n */\n async queryPendingAdminTransfer(\n contractAddress: string\n ): Promise<AdminTransferInitiatedEvent | null> {\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n throw new IndexerUnavailable(\n 'Indexer not available for this network',\n contractAddress,\n this.networkConfig.id\n );\n }\n\n const endpoints = this.resolveIndexerEndpoints();\n if (!endpoints.http) {\n throw new ConfigurationInvalid(\n 'No indexer HTTP endpoint configured',\n contractAddress,\n 'indexer.http'\n );\n }\n\n logger.info(LOG_SYSTEM, `Querying pending admin transfer for ${contractAddress}`);\n\n // Step 1: Query latest ADMIN_TRANSFER_INITIATED event\n const initiationQuery = this.buildAdminTransferInitiatedQuery();\n const initiationVariables = { contract: contractAddress };\n\n try {\n const initiationResponse = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: initiationQuery, variables: initiationVariables }),\n });\n\n if (!initiationResponse.ok) {\n throw new OperationFailed(\n `Indexer query failed with status ${initiationResponse.status}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n\n const initiationResult =\n (await initiationResponse.json()) as IndexerOwnershipTransferResponse;\n\n if (initiationResult.errors && initiationResult.errors.length > 0) {\n const errorMessages = initiationResult.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer query errors: ${errorMessages}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n\n const initiatedNodes = initiationResult.data?.accessControlEvents?.nodes;\n if (!initiatedNodes || initiatedNodes.length === 0) {\n logger.debug(LOG_SYSTEM, `No admin transfer initiated for ${contractAddress}`);\n return null;\n }\n\n const latestInitiation = initiatedNodes[0];\n\n // Step 2: Check if a completion event exists after the initiation\n const completionQuery = this.buildAdminTransferCompletedQuery();\n const completionVariables = {\n contract: contractAddress,\n afterTimestamp: latestInitiation.timestamp,\n };\n\n const completionResponse = await fetch(endpoints.http, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: completionQuery, variables: completionVariables }),\n });\n\n if (!completionResponse.ok) {\n throw new OperationFailed(\n `Indexer completion query failed with status ${completionResponse.status}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n\n const completionResult =\n (await completionResponse.json()) as IndexerOwnershipTransferResponse;\n\n // Check for GraphQL errors in completion query\n if (completionResult.errors && completionResult.errors.length > 0) {\n const errorMessages = completionResult.errors.map((e) => e.message).join('; ');\n throw new OperationFailed(\n `Indexer completion query errors: ${errorMessages}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n\n const completedNodes = completionResult.data?.accessControlEvents?.nodes;\n if (completedNodes && completedNodes.length > 0) {\n // Transfer was completed after initiation - no pending transfer\n logger.debug(LOG_SYSTEM, `Admin transfer was completed for ${contractAddress}`);\n return null;\n }\n\n // No completion - validate required fields before returning pending transfer info\n // The admin field is required for ADMIN_TRANSFER_INITIATED events\n if (!latestInitiation.admin) {\n logger.warn(\n LOG_SYSTEM,\n `Indexer returned ADMIN_TRANSFER_INITIATED event without admin field for ${contractAddress}. ` +\n `This indicates incomplete indexer data. Treating as no valid pending transfer.`\n );\n return null;\n }\n\n // Validate liveUntilLedger is present (required for expiration checking)\n if (\n latestInitiation.liveUntilLedger === undefined ||\n latestInitiation.liveUntilLedger === null\n ) {\n logger.warn(\n LOG_SYSTEM,\n `Indexer returned ADMIN_TRANSFER_INITIATED event without liveUntilLedger for ${contractAddress}. ` +\n `This may indicate an older indexer version. Treating as no valid pending transfer.`\n );\n return null;\n }\n\n logger.info(\n LOG_SYSTEM,\n `Found pending admin transfer for ${contractAddress}: pending admin=${latestInitiation.account}, expires at ledger ${latestInitiation.liveUntilLedger}`\n );\n\n return {\n previousAdmin: latestInitiation.admin,\n pendingAdmin: latestInitiation.account,\n txHash: latestInitiation.txHash,\n timestamp: latestInitiation.timestamp,\n ledger: parseInt(latestInitiation.ledger || latestInitiation.blockHeight, 10),\n liveUntilLedger: latestInitiation.liveUntilLedger,\n };\n } catch (error) {\n if (error instanceof IndexerUnavailable || error instanceof OperationFailed) {\n throw error;\n }\n logger.error(\n LOG_SYSTEM,\n `Failed to query pending admin transfer: ${error instanceof Error ? error.message : String(error)}`\n );\n throw new OperationFailed(\n `Failed to query pending admin transfer: ${(error as Error).message}`,\n contractAddress,\n 'queryPendingAdminTransfer'\n );\n }\n }\n\n /**\n * Build GraphQL query for OWNERSHIP_TRANSFER_STARTED events\n *\n * Note: The OpenZeppelin Stellar contract emits `ownership_transfer` event\n * which is indexed as `OWNERSHIP_TRANSFER_STARTED`.\n *\n * Schema mapping:\n * - `account`: pending new owner\n * - `admin`: current owner who initiated the transfer\n * - `ledger`: block height of the event\n * - `liveUntilLedger`: expiration ledger for the pending transfer\n */\n private buildOwnershipTransferStartedQuery(): string {\n return `\n query GetOwnershipTransferStarted($contract: String!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { equalTo: OWNERSHIP_TRANSFER_STARTED }\n }\n orderBy: TIMESTAMP_DESC\n first: 1\n ) {\n nodes {\n id\n account\n admin\n txHash\n timestamp\n ledger\n blockHeight\n liveUntilLedger\n }\n }\n }\n `;\n }\n\n /**\n * Build GraphQL query for OWNERSHIP_TRANSFER_COMPLETED events after a given timestamp\n */\n private buildOwnershipTransferCompletedQuery(): string {\n return `\n query GetOwnershipTransferCompleted($contract: String!, $afterTimestamp: Datetime!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { equalTo: OWNERSHIP_TRANSFER_COMPLETED }\n timestamp: { greaterThan: $afterTimestamp }\n }\n orderBy: TIMESTAMP_DESC\n first: 1\n ) {\n nodes {\n id\n txHash\n timestamp\n }\n }\n }\n `;\n }\n\n /**\n * Build GraphQL query for ADMIN_TRANSFER_INITIATED events\n *\n * Note: The OpenZeppelin Stellar contract emits `admin_transfer_initiated` event\n * which is indexed as `ADMIN_TRANSFER_INITIATED`.\n *\n * Schema mapping:\n * - `account`: pending new admin\n * - `admin`: current admin who initiated the transfer\n * - `ledger`: block height of the event\n * - `liveUntilLedger`: expiration ledger for the pending transfer\n */\n private buildAdminTransferInitiatedQuery(): string {\n return `\n query GetAdminTransferInitiated($contract: String!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { equalTo: ADMIN_TRANSFER_INITIATED }\n }\n orderBy: TIMESTAMP_DESC\n first: 1\n ) {\n nodes {\n id\n account\n admin\n txHash\n timestamp\n ledger\n blockHeight\n liveUntilLedger\n }\n }\n }\n `;\n }\n\n /**\n * Build GraphQL query for ADMIN_TRANSFER_COMPLETED events after a given timestamp\n */\n private buildAdminTransferCompletedQuery(): string {\n return `\n query GetAdminTransferCompleted($contract: String!, $afterTimestamp: Datetime!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { equalTo: ADMIN_TRANSFER_COMPLETED }\n timestamp: { greaterThan: $afterTimestamp }\n }\n orderBy: TIMESTAMP_DESC\n first: 1\n ) {\n nodes {\n id\n txHash\n timestamp\n }\n }\n }\n `;\n }\n\n /**\n * Resolve indexer endpoints with config precedence\n * Priority:\n * 1. User-configured indexer from UserNetworkServiceConfigService (localStorage)\n * 2. Runtime override from AppConfigService (environment/JSON config)\n * 3. Network config defaults (indexerUri/indexerWsUri)\n * 4. Derived from RPC (if safe pattern exists)\n * 5. None (returns empty object)\n *\n * @returns Resolved indexer endpoints\n */\n private resolveIndexerEndpoints(): IndexerEndpointConfig {\n if (this.resolvedEndpoints) {\n return this.resolvedEndpoints;\n }\n\n const networkId = this.networkConfig.id;\n const endpoints: IndexerEndpointConfig = {};\n\n // Priority 1: Check user-configured indexer from localStorage\n const userIndexerConfig = getUserIndexerEndpoints(networkId);\n if (userIndexerConfig) {\n if (userIndexerConfig.http) {\n endpoints.http = userIndexerConfig.http;\n }\n if (userIndexerConfig.ws) {\n endpoints.ws = userIndexerConfig.ws;\n }\n if (endpoints.http || endpoints.ws) {\n logger.info(\n LOG_SYSTEM,\n `Using user-configured indexer for ${networkId}: http=${endpoints.http}, ws=${endpoints.ws}`\n );\n this.resolvedEndpoints = endpoints;\n return endpoints;\n }\n }\n\n // Priority 2: Check AppConfigService for runtime override\n const indexerOverride = appConfigService.getIndexerEndpointOverride(networkId);\n if (indexerOverride) {\n if (typeof indexerOverride === 'string') {\n endpoints.http = indexerOverride;\n logger.info(\n LOG_SYSTEM,\n `Using runtime indexer override for ${networkId}: ${indexerOverride}`\n );\n } else if (typeof indexerOverride === 'object') {\n if ('http' in indexerOverride && indexerOverride.http) {\n endpoints.http = indexerOverride.http;\n }\n if ('ws' in indexerOverride && indexerOverride.ws) {\n endpoints.ws = indexerOverride.ws;\n }\n logger.info(\n LOG_SYSTEM,\n `Using runtime indexer override for ${networkId}: http=${endpoints.http}, ws=${endpoints.ws}`\n );\n }\n this.resolvedEndpoints = endpoints;\n return endpoints;\n }\n\n // Priority 3: Network config defaults\n if (this.networkConfig.indexerUri) {\n endpoints.http = this.networkConfig.indexerUri;\n logger.info(\n LOG_SYSTEM,\n `Using network config indexer URI for ${networkId}: ${endpoints.http}`\n );\n }\n if (this.networkConfig.indexerWsUri) {\n endpoints.ws = this.networkConfig.indexerWsUri;\n logger.debug(\n LOG_SYSTEM,\n `Using network config indexer WS URI for ${networkId}: ${endpoints.ws}`\n );\n }\n\n if (endpoints.http || endpoints.ws) {\n this.resolvedEndpoints = endpoints;\n return endpoints;\n }\n\n // Priority 4: Derive from RPC (only if safe, known pattern exists)\n // Currently DISABLED - no safe derivation pattern implemented\n // This would be enabled in the future when indexer/RPC relationship is well-defined\n logger.debug(LOG_SYSTEM, `No indexer derivation pattern available for ${networkId}`);\n\n // Priority 4: None - no indexer configured\n logger.debug(LOG_SYSTEM, `No indexer endpoints configured for ${networkId}`);\n this.resolvedEndpoints = endpoints;\n return endpoints;\n }\n\n /**\n * Maps internal changeType to GraphQL EventType enum\n * GraphQL enum values: ROLE_GRANTED, ROLE_REVOKED, OWNERSHIP_TRANSFER_STARTED,\n * OWNERSHIP_TRANSFER_COMPLETED, ADMIN_TRANSFER_INITIATED, ADMIN_TRANSFER_COMPLETED\n */\n private mapChangeTypeToGraphQLEnum(changeType: HistoryChangeType): string {\n const mapping: Record<HistoryChangeType, string> = {\n GRANTED: 'ROLE_GRANTED',\n REVOKED: 'ROLE_REVOKED',\n OWNERSHIP_TRANSFER_STARTED: 'OWNERSHIP_TRANSFER_STARTED',\n OWNERSHIP_TRANSFER_COMPLETED: 'OWNERSHIP_TRANSFER_COMPLETED',\n ADMIN_TRANSFER_INITIATED: 'ADMIN_TRANSFER_INITIATED',\n ADMIN_TRANSFER_COMPLETED: 'ADMIN_TRANSFER_COMPLETED',\n UNKNOWN: 'UNKNOWN',\n };\n return mapping[changeType];\n }\n\n /**\n * Build GraphQL query for history with SubQuery filtering and pagination\n */\n private buildHistoryQuery(_contractAddress: string, options?: HistoryQueryOptions): string {\n const roleFilter = options?.roleId ? ', role: { equalTo: $role }' : '';\n const accountFilter = options?.account ? ', account: { equalTo: $account }' : '';\n // Type filter uses inline enum value (consistent with buildLatestGrantsQuery pattern)\n const typeFilter = options?.changeType\n ? `, type: { equalTo: ${this.mapChangeTypeToGraphQLEnum(options.changeType)} }`\n : '';\n const txFilter = options?.txId ? ', txHash: { equalTo: $txHash }' : '';\n // Build combined timestamp filter to avoid duplicate keys\n const timestampConditions: string[] = [];\n if (options?.timestampFrom) {\n timestampConditions.push('greaterThanOrEqualTo: $timestampFrom');\n }\n if (options?.timestampTo) {\n timestampConditions.push('lessThanOrEqualTo: $timestampTo');\n }\n const timestampFilter =\n timestampConditions.length > 0 ? `, timestamp: { ${timestampConditions.join(', ')} }` : '';\n const ledgerFilter = options?.ledger ? ', blockHeight: { equalTo: $blockHeight }' : '';\n const limitClause = options?.limit ? ', first: $limit' : '';\n const cursorClause = options?.cursor ? ', after: $cursor' : '';\n\n // Build variable declarations\n // Note: SubQuery uses Datetime for timestamp filters and BigFloat for blockHeight filtering\n const varDeclarations = [\n '$contract: String!',\n options?.roleId ? '$role: String' : '',\n options?.account ? '$account: String' : '',\n options?.txId ? '$txHash: String' : '',\n options?.timestampFrom ? '$timestampFrom: Datetime' : '',\n options?.timestampTo ? '$timestampTo: Datetime' : '',\n options?.ledger ? '$blockHeight: BigFloat' : '',\n options?.limit ? '$limit: Int' : '',\n options?.cursor ? '$cursor: Cursor' : '',\n ]\n .filter(Boolean)\n .join(', ');\n\n return `\n query GetHistory(${varDeclarations}) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }${roleFilter}${accountFilter}${typeFilter}${txFilter}${timestampFilter}${ledgerFilter}\n }\n orderBy: TIMESTAMP_DESC${limitClause}${cursorClause}\n ) {\n nodes {\n id\n role\n account\n type\n txHash\n timestamp\n blockHeight\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n `;\n }\n\n /**\n * Build query variables including pagination cursor\n */\n private buildQueryVariables(\n contractAddress: string,\n options?: HistoryQueryOptions\n ): Record<string, unknown> {\n const variables: Record<string, unknown> = {\n contract: contractAddress,\n };\n\n if (options?.roleId) {\n variables.role = options.roleId;\n }\n if (options?.account) {\n variables.account = options.account;\n }\n if (options?.txId) {\n variables.txHash = options.txId;\n }\n if (options?.timestampFrom) {\n variables.timestampFrom = options.timestampFrom;\n }\n if (options?.timestampTo) {\n variables.timestampTo = options.timestampTo;\n }\n if (options?.ledger) {\n // GraphQL expects blockHeight as string\n variables.blockHeight = String(options.ledger);\n }\n if (options?.limit) {\n variables.limit = options.limit;\n }\n if (options?.cursor) {\n variables.cursor = options.cursor;\n }\n\n return variables;\n }\n\n /**\n * Build GraphQL query for role discovery\n * Queries all ROLE_GRANTED and ROLE_REVOKED events to extract unique role identifiers\n * Note: EventType is a GraphQL enum, so values must not be quoted\n */\n private buildRoleDiscoveryQuery(): string {\n return `\n query DiscoverRoles($contract: String!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n type: { in: [ROLE_GRANTED, ROLE_REVOKED] }\n }\n ) {\n nodes {\n role\n }\n }\n }\n `;\n }\n\n /**\n * Build GraphQL query for latest grants\n * Queries ROLE_GRANTED events for a specific role and set of accounts\n * Ordered by timestamp descending so first occurrence per account is the latest\n */\n private buildLatestGrantsQuery(): string {\n return `\n query LatestGrants($contract: String!, $role: String!, $accounts: [String!]!) {\n accessControlEvents(\n filter: {\n contract: { equalTo: $contract }\n role: { equalTo: $role }\n account: { in: $accounts }\n type: { equalTo: ROLE_GRANTED }\n }\n orderBy: TIMESTAMP_DESC\n ) {\n nodes {\n account\n txHash\n timestamp\n blockHeight\n }\n }\n }\n `;\n }\n\n /**\n * Transform indexer entries to standard HistoryEntry format\n */\n private transformIndexerEntries(entries: IndexerHistoryEntry[]): HistoryEntry[] {\n return entries.map((entry) => {\n const role: RoleIdentifier = {\n id: entry.role || 'OWNER', // Map ownership events to special role\n };\n\n // Map SubQuery event types to internal types\n let changeType: HistoryChangeType;\n switch (entry.type) {\n case 'ROLE_GRANTED':\n changeType = 'GRANTED';\n break;\n case 'ROLE_REVOKED':\n changeType = 'REVOKED';\n break;\n case 'OWNERSHIP_TRANSFER_STARTED':\n changeType = 'OWNERSHIP_TRANSFER_STARTED';\n break;\n case 'OWNERSHIP_TRANSFER_COMPLETED':\n changeType = 'OWNERSHIP_TRANSFER_COMPLETED';\n break;\n case 'ADMIN_TRANSFER_INITIATED':\n changeType = 'ADMIN_TRANSFER_INITIATED';\n break;\n case 'ADMIN_TRANSFER_COMPLETED':\n changeType = 'ADMIN_TRANSFER_COMPLETED';\n break;\n default:\n // Use UNKNOWN for unrecognized types to make indexer schema issues visible\n logger.warn(\n LOG_SYSTEM,\n `Unknown event type: ${entry.type}, assigning changeType to UNKNOWN`\n );\n changeType = 'UNKNOWN';\n }\n\n return {\n role,\n account: entry.account,\n changeType,\n txId: entry.txHash,\n timestamp: entry.timestamp,\n ledger: parseInt(entry.blockHeight, 10),\n };\n });\n }\n}\n\n/**\n * Factory function to create an indexer client for a network\n * @param networkConfig The Stellar network configuration\n * @returns A new indexer client instance\n */\nexport function createIndexerClient(networkConfig: StellarNetworkConfig): StellarIndexerClient {\n return new StellarIndexerClient(networkConfig);\n}\n","/**\n * Address Validation Module for Access Control\n *\n * Centralizes address validation for access control operations.\n * Uses Stellar-specific validation from the validation module and\n * shared normalization utilities from @openzeppelin/ui-utils.\n */\n\nimport { ConfigurationInvalid } from '@openzeppelin/ui-types';\nimport { normalizeAddress } from '@openzeppelin/ui-utils';\n\nimport { isValidAccountAddress, isValidContractAddress } from '../validation/address';\n\n/**\n * Validates a Stellar contract address\n *\n * @param address The contract address to validate\n * @param paramName Optional parameter name for error messages (defaults to 'contractAddress')\n * @throws ConfigurationInvalid if the address is invalid\n */\nexport function validateContractAddress(address: string, paramName = 'contractAddress'): void {\n if (!address || typeof address !== 'string' || address.trim() === '') {\n throw new ConfigurationInvalid(\n `${paramName} is required and must be a non-empty string`,\n address,\n paramName\n );\n }\n\n if (!isValidContractAddress(address)) {\n throw new ConfigurationInvalid(\n `Invalid Stellar contract address: ${address}. Contract addresses must start with 'C' and be valid StrKey format.`,\n address,\n paramName\n );\n }\n}\n\n/**\n * Validates a Stellar account address (for role grants, ownership transfers, etc.)\n *\n * @param address The account address to validate\n * @param paramName Optional parameter name for error messages (defaults to 'account')\n * @throws ConfigurationInvalid if the address is invalid\n */\nexport function validateAccountAddress(address: string, paramName = 'account'): void {\n if (!address || typeof address !== 'string' || address.trim() === '') {\n throw new ConfigurationInvalid(\n `${paramName} is required and must be a non-empty string`,\n address,\n paramName\n );\n }\n\n if (!isValidAccountAddress(address)) {\n throw new ConfigurationInvalid(\n `Invalid Stellar account address: ${address}. Account addresses must start with 'G' and be valid Ed25519 public keys.`,\n address,\n paramName\n );\n }\n}\n\n/**\n * Validates a Stellar address that can be either an account or contract address\n * (e.g., for ownership transfers where the new owner can be either type)\n *\n * @param address The address to validate (account or contract)\n * @param paramName Optional parameter name for error messages (defaults to 'address')\n * @throws ConfigurationInvalid if the address is invalid\n */\nexport function validateAddress(address: string, paramName = 'address'): void {\n if (!address || typeof address !== 'string' || address.trim() === '') {\n throw new ConfigurationInvalid(\n `${paramName} is required and must be a non-empty string`,\n address,\n paramName\n );\n }\n\n // Check if it's a valid account address OR contract address\n if (!isValidAccountAddress(address) && !isValidContractAddress(address)) {\n throw new ConfigurationInvalid(\n `Invalid Stellar address: ${address}. Address must be a valid account address (starts with 'G') or contract address (starts with 'C').`,\n address,\n paramName\n );\n }\n}\n\n/**\n * Validates both contract and account addresses for operations\n *\n * @param contractAddress The contract address\n * @param accountAddress The account address\n * @throws ConfigurationInvalid if either address is invalid\n */\nexport function validateAddresses(contractAddress: string, accountAddress: string): void {\n validateContractAddress(contractAddress);\n validateAccountAddress(accountAddress);\n}\n\n/**\n * Normalizes a Stellar address using shared utils\n * This is useful for case-insensitive and whitespace-insensitive comparison\n *\n * @param address The address to normalize\n * @returns The normalized address\n */\nexport function normalizeStellarAddress(address: string): string {\n return normalizeAddress(address);\n}\n\n/**\n * Maximum length for a Soroban Symbol (role identifier)\n * Soroban symbols are limited to 32 characters\n */\nconst MAX_ROLE_ID_LENGTH = 32;\n\n/**\n * Valid pattern for Soroban Symbol characters\n * Symbols can contain alphanumeric characters and underscores\n */\nconst VALID_ROLE_ID_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n/**\n * Validates a role identifier (Soroban Symbol)\n *\n * Role IDs must be:\n * - Non-empty strings\n * - Max 32 characters (Soroban Symbol limit)\n * - Start with a letter or underscore\n * - Contain only alphanumeric characters and underscores\n *\n * @param roleId The role identifier to validate\n * @param paramName Optional parameter name for error messages\n * @throws ConfigurationInvalid if the role ID is invalid\n */\nexport function validateRoleId(roleId: string, paramName = 'roleId'): void {\n if (!roleId || typeof roleId !== 'string') {\n throw new ConfigurationInvalid(\n `${paramName} is required and must be a non-empty string`,\n roleId,\n paramName\n );\n }\n\n const trimmed = roleId.trim();\n if (trimmed === '') {\n throw new ConfigurationInvalid(\n `${paramName} cannot be empty or whitespace-only`,\n roleId,\n paramName\n );\n }\n\n if (trimmed.length > MAX_ROLE_ID_LENGTH) {\n throw new ConfigurationInvalid(\n `${paramName} exceeds maximum length of ${MAX_ROLE_ID_LENGTH} characters: \"${trimmed}\" (${trimmed.length} chars)`,\n roleId,\n paramName\n );\n }\n\n if (!VALID_ROLE_ID_PATTERN.test(trimmed)) {\n throw new ConfigurationInvalid(\n `${paramName} contains invalid characters: \"${trimmed}\". Role IDs must start with a letter or underscore and contain only alphanumeric characters and underscores.`,\n roleId,\n paramName\n );\n }\n}\n\n/**\n * Validates an array of role identifiers\n *\n * @param roleIds The array of role identifiers to validate\n * @param paramName Optional parameter name for error messages\n * @throws ConfigurationInvalid if any role ID is invalid or if the array is invalid\n * @returns The validated and deduplicated array of role IDs\n */\nexport function validateRoleIds(roleIds: string[], paramName = 'roleIds'): string[] {\n if (!Array.isArray(roleIds)) {\n throw new ConfigurationInvalid(`${paramName} must be an array`, String(roleIds), paramName);\n }\n\n // Validate each role ID\n for (let i = 0; i < roleIds.length; i++) {\n validateRoleId(roleIds[i], `${paramName}[${i}]`);\n }\n\n // Deduplicate and return\n return [...new Set(roleIds.map((r) => r.trim()))];\n}\n\n/**\n * Result of expiration ledger validation\n *\n * Returned by {@link validateExpirationLedger} to indicate whether\n * a proposed expiration ledger is valid for a two-step ownership transfer.\n *\n * @example\n * ```typescript\n * const currentLedger = await getCurrentLedger(networkConfig);\n * const result = validateExpirationLedger(expirationLedger, currentLedger);\n * if (!result.valid) {\n * throw new ConfigurationInvalid(result.error!, String(expirationLedger), 'expirationLedger');\n * }\n * ```\n */\nexport interface ExpirationValidationResult {\n /** Whether the expiration ledger is valid (must be strictly greater than current ledger) */\n valid: boolean;\n /** The current ledger sequence used for comparison */\n currentLedger: number;\n /** Human-readable error message if validation failed */\n error?: string;\n}\n\n/**\n * Validates an expiration ledger against the current ledger sequence\n *\n * For two-step Ownable contracts, the expiration ledger must be strictly greater\n * than the current ledger (per FR-020: expirationLedger == currentLedger is invalid).\n *\n * @param expirationLedger The proposed expiration ledger sequence\n * @param currentLedger The current ledger sequence number\n * @returns Validation result with valid flag, currentLedger, and optional error message\n *\n * @example\n * ```typescript\n * const currentLedger = await getCurrentLedger(networkConfig);\n * const result = validateExpirationLedger(expirationLedger, currentLedger);\n * if (!result.valid) {\n * throw new ConfigurationInvalid(result.error, 'expirationLedger');\n * }\n * ```\n */\nexport function validateExpirationLedger(\n expirationLedger: number,\n currentLedger: number\n): ExpirationValidationResult {\n // Per FR-020: expirationLedger must be strictly greater than currentLedger\n if (expirationLedger <= currentLedger) {\n return {\n valid: false,\n currentLedger,\n error: `Expiration ledger ${expirationLedger} has already passed or equals current ledger. Current ledger is ${currentLedger}. Expiration must be strictly greater than current ledger.`,\n };\n }\n\n return {\n valid: true,\n currentLedger,\n };\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 type {\n NetworkServiceForm,\n StellarNetworkConfig,\n UserRpcProviderConfig,\n} from '@openzeppelin/ui-types';\nimport { isValidUrl } from '@openzeppelin/ui-utils';\n\nimport { testStellarRpcConnection, validateStellarRpcEndpoint } from './rpc';\n\n/**\n * Returns the default service configuration values for a given service ID.\n * Used for proactive health checks when no user overrides are configured.\n *\n * @param networkConfig The network configuration\n * @param serviceId The service identifier (e.g., 'rpc', 'indexer')\n * @returns The default configuration values, or null if not available\n */\nexport function getStellarDefaultServiceConfig(\n networkConfig: StellarNetworkConfig,\n serviceId: string\n): Record<string, unknown> | null {\n switch (serviceId) {\n case 'rpc':\n if (networkConfig.sorobanRpcUrl) {\n return { sorobanRpcUrl: networkConfig.sorobanRpcUrl };\n }\n break;\n case 'indexer':\n // Indexer is optional for Stellar - only return if both URLs are configured\n if (networkConfig.indexerUri && networkConfig.indexerWsUri) {\n return {\n indexerUri: networkConfig.indexerUri,\n indexerWsUri: networkConfig.indexerWsUri,\n };\n }\n break;\n }\n return null;\n}\n\n/**\n * Returns the network service forms for Stellar networks.\n * Defines the UI configuration for the RPC and Indexer services.\n *\n * @param exclude Optional array of service IDs to exclude from the returned forms\n * @returns Array of network service forms\n */\nexport function getStellarNetworkServiceForms(exclude: string[] = []): NetworkServiceForm[] {\n const forms: NetworkServiceForm[] = [\n {\n id: 'rpc',\n label: 'RPC Provider',\n fields: [\n {\n id: 'stellar-rpc-url',\n name: 'sorobanRpcUrl',\n type: 'text',\n label: 'Soroban RPC URL',\n placeholder: 'https://soroban.stellar.org',\n validation: { required: true, pattern: '^https?://.+' },\n width: 'full',\n },\n ],\n },\n {\n id: 'indexer',\n label: 'Indexer',\n description: 'Optional GraphQL indexer endpoint for historical access control data',\n supportsConnectionTest: true,\n fields: [\n {\n id: 'stellar-indexer-uri',\n name: 'indexerUri',\n type: 'text',\n label: 'Indexer GraphQL HTTP Endpoint',\n placeholder: 'https://indexer.example.com/graphql',\n validation: { required: false, pattern: '^https?://.+' },\n width: 'full',\n helperText: 'Optional. Used for querying historical access control events.',\n },\n {\n id: 'stellar-indexer-ws-uri',\n name: 'indexerWsUri',\n type: 'text',\n label: 'Indexer GraphQL WebSocket Endpoint',\n placeholder: 'wss://indexer.example.com/graphql',\n validation: { required: false, pattern: '^wss?://.+' },\n width: 'full',\n helperText: 'Optional. Used for real-time subscriptions.',\n },\n ],\n },\n ];\n\n return forms.filter((form) => !exclude.includes(form.id));\n}\n\n/**\n * Validates a network service configuration for Stellar networks.\n */\nexport async function validateStellarNetworkServiceConfig(\n serviceId: string,\n values: Record<string, unknown>\n): Promise<boolean> {\n if (serviceId === 'rpc') {\n const cfg = {\n url: String(values.sorobanRpcUrl || ''),\n isCustom: true,\n } as UserRpcProviderConfig;\n return validateStellarRpcEndpoint(cfg);\n }\n\n if (serviceId === 'indexer') {\n // Validate indexerUri if provided\n if (values.indexerUri !== undefined && values.indexerUri !== null && values.indexerUri !== '') {\n if (!isValidUrl(String(values.indexerUri))) {\n return false;\n }\n }\n\n // Validate indexerWsUri if provided\n if (\n values.indexerWsUri !== undefined &&\n values.indexerWsUri !== null &&\n values.indexerWsUri !== ''\n ) {\n if (!isValidUrl(String(values.indexerWsUri))) {\n return false;\n }\n }\n\n return true;\n }\n\n return true;\n}\n\n/**\n * Tests a network service connection for Stellar networks.\n */\nexport async function testStellarNetworkServiceConnection(\n serviceId: string,\n values: Record<string, unknown>\n): Promise<{ success: boolean; latency?: number; error?: string }> {\n if (serviceId === 'rpc') {\n const cfg = {\n url: String(values.sorobanRpcUrl || ''),\n isCustom: true,\n } as UserRpcProviderConfig;\n return testStellarRpcConnection(cfg);\n }\n\n if (serviceId === 'indexer') {\n const indexerUri = values.indexerUri;\n\n // If no indexer URI is provided, indexer is optional - return success (nothing to test)\n if (!indexerUri || typeof indexerUri !== 'string' || indexerUri.trim() === '') {\n return { success: true };\n }\n\n if (!isValidUrl(indexerUri)) {\n return { success: false, error: 'Invalid indexer URI format' };\n }\n\n try {\n const startTime = Date.now();\n // Perform a simple GraphQL introspection query to test connectivity\n const response = await fetch(indexerUri, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: '{ __typename }',\n }),\n });\n\n const latency = Date.now() - startTime;\n\n if (!response.ok) {\n return {\n success: false,\n latency,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const data = await response.json();\n if (data.errors) {\n return {\n success: false,\n latency,\n error: `GraphQL errors: ${JSON.stringify(data.errors)}`,\n };\n }\n\n return { success: true, latency };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n return { success: true };\n}\n","import type { StellarNetworkConfig, UserRpcProviderConfig } from '@openzeppelin/ui-types';\nimport { appConfigService, isValidUrl, logger, userRpcConfigService } from '@openzeppelin/ui-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 * 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/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { getStellarExplorerAddressUrl } from '../configuration/explorer';\nimport { extractStructFields, isStructType } from '../mapping/struct-fields';\nimport { checkStellarFunctionStateMutability } from '../query/handler';\nimport { getSacSpecArtifacts } from '../sac/spec-cache';\nimport type { StellarContractArtifacts } from '../types/artifacts';\nimport { extractSorobanTypeFromScSpec } from '../utils/type-detection';\nimport { getStellarContractType } from './type';\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 // Special-case: detect SAC and construct spec locally\n try {\n const execType = await getStellarContractType(contractAddress, networkConfig);\n\n if (execType === 'contractExecutableStellarAsset') {\n const { base64Entries, specEntries } = await getSacSpecArtifacts();\n const spec = new StellarSdk.contract.Spec(base64Entries);\n\n const functions = await extractFunctionsFromSpec(\n spec,\n contractAddress,\n specEntries,\n networkConfig\n );\n\n return {\n name: `Stellar Asset Contract ${contractAddress.slice(0, 8)}...`,\n ecosystem: 'stellar',\n functions,\n metadata: {\n specEntries,\n },\n };\n }\n } catch (e) {\n // If detection path fails unexpectedly, fall back to SDK client path below\n logger.warn(\n 'loadStellarContractFromAddress',\n 'SAC detection failed, falling back to regular client:',\n e\n );\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 { EoaExecutionConfig } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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/ui-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/ui-types';\nimport type { UserExplorerConfig } from '@openzeppelin/ui-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/ui-types';\nimport { logger } from '@openzeppelin/ui-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 const fieldParam: FunctionParameter = {\n name: fieldName,\n type: fieldType,\n };\n\n // Recursively extract nested struct components\n if (isStructType(entries, fieldType)) {\n const nestedFields = extractStructFields(entries, fieldType);\n if (nestedFields && nestedFields.length > 0) {\n fieldParam.components = nestedFields;\n }\n }\n\n structFields.push(fieldParam);\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 type { xdr } from '@stellar/stellar-sdk';\n\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport type { SacSpecSourceConfig } from './spec-source';\nimport { fetchSacSpecJson, getSacSpecUrl } from './spec-source';\nimport { encodeSacSpecEntries, toScSpecEntries } from './xdr';\n\ninterface SacSpecCacheEntry {\n base64Entries: string[];\n specEntries: xdr.ScSpecEntry[];\n}\n\nconst sacSpecCache = new Map<string, SacSpecCacheEntry>();\nconst sacSpecInflight = new Map<string, Promise<SacSpecCacheEntry>>();\n\n/**\n * Returns cached SAC spec artifacts (base64 and decoded entries) for the given source config.\n * Ensures fetch/encode work is performed at most once per config.\n */\nexport async function getSacSpecArtifacts(\n cfg: SacSpecSourceConfig = {}\n): Promise<SacSpecCacheEntry> {\n const cacheKey = getSacSpecUrl(cfg);\n\n const cached = sacSpecCache.get(cacheKey);\n if (cached) {\n logger.debug('stellar:sac:spec-cache', 'Returning cached SAC spec artifacts');\n return cached;\n }\n\n const inflight = sacSpecInflight.get(cacheKey);\n if (inflight) {\n return inflight;\n }\n\n const promise = (async () => {\n const json = await fetchSacSpecJson(cfg);\n const base64Entries = await encodeSacSpecEntries(json);\n const specEntries = toScSpecEntries(base64Entries);\n\n const entry: SacSpecCacheEntry = {\n base64Entries,\n specEntries,\n };\n\n sacSpecCache.set(cacheKey, entry);\n sacSpecInflight.delete(cacheKey);\n\n logger.debug('stellar:sac:spec-cache', 'Cached SAC spec artifacts for future re-use');\n\n return entry;\n })().catch((error) => {\n sacSpecInflight.delete(cacheKey);\n throw error;\n });\n\n sacSpecInflight.set(cacheKey, promise);\n return promise;\n}\n\n/**\n * Clears cached SAC spec artifacts. Intended for test environments.\n */\nexport function clearSacSpecArtifactsCache(): void {\n sacSpecCache.clear();\n sacSpecInflight.clear();\n}\n","import { logger } from '@openzeppelin/ui-utils';\n\nexport const DEFAULT_SPEC = {\n repo: 'stellar/stellar-asset-contract-spec',\n path: 'refs/heads/main',\n file: 'stellar-asset-spec.json',\n};\n\nexport interface SacSpecSourceConfig {\n repo?: string;\n path?: string;\n file?: string;\n}\n\nexport function getSacSpecUrl(cfg: SacSpecSourceConfig = {}): string {\n const repo = cfg.repo || DEFAULT_SPEC.repo;\n const path = cfg.path || DEFAULT_SPEC.path;\n const file = cfg.file || DEFAULT_SPEC.file;\n return `https://raw.githubusercontent.com/${repo}/${path}/${file}`;\n}\n\n/** Fetches the SAC JSON spec from GitHub raw. */\nexport async function fetchSacSpecJson(cfg: SacSpecSourceConfig = {}): Promise<string> {\n const url = getSacSpecUrl(cfg);\n try {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n return await res.text();\n } catch (error) {\n logger.error('stellar:sac:spec-source', 'Failed to fetch SAC spec:', url, error);\n throw new Error('Failed to load Stellar Asset Contract spec. Please try again later.');\n }\n}\n","import { xdr } from '@stellar/stellar-sdk';\nimport stellarXdrJsonPackage from '@stellar/stellar-xdr-json/package.json' with { type: 'json' };\nimport { parse, stringify } from 'lossless-json';\n\nimport { logger } from '@openzeppelin/ui-utils';\n\n/**\n * CDN URL for the stellar-xdr-json WASM module.\n *\n * Why CDN instead of bundling?\n * 1. Vite bundling issues: The WASM file requires special handling in Vite. We tried multiple\n * approaches including vite-plugin-wasm, vite-plugin-top-level-await, ?url imports, and\n * various configurations, but consistently hit WebAssembly.instantiate errors where the\n * browser received HTML instead of the WASM binary (magic word 00 61 73 6d expected,\n * but got 3c 21 64 6f which is \"<!do\" in HTML).\n * 2. Bundle size: The WASM file is ~3MB, which would significantly increase bundle size\n * for all users, even those who never use SAC contracts.\n * 3. Dynamic loading: With CDN + dynamic imports, the WASM only loads when actually needed\n * (when a SAC contract is detected), keeping the initial bundle lean.\n * 4. Simplicity: After trying complex Vite configurations and WASM plugins without success,\n * the CDN approach is simpler and more reliable.\n *\n * Trade-off: Requires internet connection for SAC contracts, but this is acceptable since\n * SAC specs are already fetched from GitHub anyway.\n */\ntype PackageJson = { version?: string };\n\nconst stellarXdrJsonVersion = (stellarXdrJsonPackage as PackageJson).version ?? '23.0.0';\n\nconst CDN_WASM_URL = `https://unpkg.com/@stellar/stellar-xdr-json@${stellarXdrJsonVersion}/stellar_xdr_json_bg.wasm`;\n\n// Dynamically import the WASM module only when needed\nlet initialized = false;\nlet encode: ((type: string, value: string) => string) | null = null;\n\n/**\n * Initializes the stellar-xdr-json WASM module for XDR encoding.\n *\n * This uses dynamic imports to only load the WASM when SAC contracts are actually used,\n * avoiding the 3MB overhead for users who don't need SAC support.\n *\n * The WASM is loaded from CDN to keep bundle size minimal.\n */\nexport async function ensureXdrJsonInitialized(): Promise<void> {\n if (initialized) return;\n\n try {\n // Dynamic import - only loads when SAC is actually used\n const stellarXdrJson = await import('@stellar/stellar-xdr-json');\n const init = stellarXdrJson.default;\n\n // Load WASM from CDN\n await init(CDN_WASM_URL);\n encode = stellarXdrJson.encode;\n initialized = true;\n } catch (error) {\n logger.error('stellar:sac:xdr', 'Failed to initialize WASM module:', error);\n throw error;\n }\n}\n\n/**\n * Converts the SAC JSON spec content into Base64 XDR entries for ScSpecEntry[]\n */\nexport async function encodeSacSpecEntries(jsonString: string): Promise<string[]> {\n await ensureXdrJsonInitialized();\n\n if (!encode) {\n throw new Error('WASM module not properly initialized');\n }\n\n try {\n const jsonData = parse(jsonString) as unknown[];\n const result: string[] = [];\n for (const entry of jsonData) {\n const stringified = stringify(entry);\n if (!stringified) {\n throw new Error('Failed to stringify SAC spec entry before XDR encoding.');\n }\n const encoded = encode('ScSpecEntry', stringified);\n result.push(encoded);\n }\n return result;\n } catch (error) {\n logger.error('stellar:sac:xdr', 'Failed to encode SAC spec to XDR', error);\n throw new Error('Failed to process SAC spec.');\n }\n}\n\n/** Utility to convert base64 strings to xdr.ScSpecEntry[] */\nexport function toScSpecEntries(base64Entries: string[]): xdr.ScSpecEntry[] {\n return base64Entries.map((b64) => xdr.ScSpecEntry.fromXDR(b64, 'base64'));\n}\n\n/**\n * Reset the initialization state (mainly for testing)\n */\nexport function resetXdrInitialization(): void {\n initialized = false;\n encode = null;\n}\n","import { Contract, rpc as StellarRpc, xdr } from '@stellar/stellar-sdk';\n\nimport type { StellarNetworkConfig } from '@openzeppelin/ui-types';\nimport { logger, userRpcConfigService } from '@openzeppelin/ui-utils';\n\n/**\n * Returns a Soroban RPC server instance honoring user overrides.\n */\nfunction getSorobanRpcServer(networkConfig: StellarNetworkConfig): StellarRpc.Server {\n const customRpcConfig = userRpcConfigService.getUserRpcConfig(networkConfig.id);\n const rpcUrl = customRpcConfig?.url || 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\nexport type StellarContractExecutableType =\n | 'contractExecutableWasm'\n | 'contractExecutableStellarAsset'\n | null;\n\n/**\n * Detects executable type for a given Stellar contract ID via RPC ledger entries.\n */\nexport async function getStellarContractType(\n contractId: string,\n networkConfig: StellarNetworkConfig\n): Promise<StellarContractExecutableType> {\n try {\n if (!contractId) {\n return null;\n }\n\n const rpcServer = getSorobanRpcServer(networkConfig);\n\n // Build ledger key footprint for the contract\n const ledgerKey = new Contract(contractId).getFootprint();\n const ledgerEntries = await rpcServer.getLedgerEntries(ledgerKey);\n\n const first = ledgerEntries?.entries?.[0]?.val;\n if (!first) {\n throw new Error('Could not obtain contract data from server.');\n }\n\n const executable = first.contractData()?.val()?.instance()?.executable();\n if (!executable) {\n throw new Error('Could not get executable from contract data.');\n }\n\n const execWasmType = xdr.ContractExecutableType.contractExecutableWasm().name;\n const execStellarAssetType = xdr.ContractExecutableType.contractExecutableStellarAsset().name;\n const detected = executable.switch()?.name as string | undefined;\n\n if (detected === execWasmType) return 'contractExecutableWasm';\n if (detected === execStellarAssetType) return 'contractExecutableStellarAsset';\n return null;\n } catch (error) {\n logger.error('stellar:contract-type', 'Failed to detect contract type:', error);\n throw new Error(\n `Something went wrong getting contract type by contract ID. ${(error as Error).message}`\n );\n }\n}\n","import React from 'react';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@openzeppelin/ui-components';\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/ui-components';\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/ui-components';\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/ui-components';\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 type {\n EoaExecutionConfig,\n ExecutionConfig,\n ExecutionMethodDetail,\n MultisigExecutionConfig,\n RelayerExecutionConfig,\n} from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { FieldType, TypeMappingInfo } from '@openzeppelin/ui-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 *\n * Note: Large integer types (U64, U128, U256, I64, I128, I256) are mapped to 'bigint'\n * instead of 'number' to avoid JavaScript's Number precision limitations.\n * JavaScript's Number type can only safely represent integers up to 2^53 - 1,\n * but these types can hold much larger values. The BigIntField component stores values\n * as strings and the Stellar adapter handles conversion automatically.\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: 'bigint',\n U128: 'bigint',\n U256: 'bigint',\n\n // Numeric types - signed integers\n I32: 'number',\n I64: 'bigint',\n I128: 'bigint',\n I256: 'bigint',\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\n/**\n * Stellar dynamic type patterns handled through pattern matching.\n */\nconst STELLAR_DYNAMIC_PATTERNS: TypeMappingInfo['dynamicPatterns'] = [\n { name: 'vec', syntax: 'Vec<T>', mapsTo: null, description: 'Array (maps based on inner type)' },\n { name: 'map', syntax: 'Map<K,V>', mapsTo: 'map', description: 'Key-value map' },\n {\n name: 'option',\n syntax: 'Option<T>',\n mapsTo: 'unwrap',\n description: 'Optional, resolves to inner type',\n },\n {\n name: 'result',\n syntax: 'Result<T>',\n mapsTo: 'unwrap',\n description: 'Result, resolves to inner type',\n },\n { name: 'bytes-n', syntax: 'BytesN<N>', mapsTo: 'bytes', description: 'Fixed-size byte array' },\n {\n name: 'struct',\n syntax: 'StructName',\n mapsTo: 'object',\n description: 'Custom struct (PascalCase)',\n },\n { name: 'enum', syntax: 'EnumName', mapsTo: 'select', description: 'Enum type' },\n];\n\n/**\n * Returns complete type mapping information for Stellar.\n */\nexport function getStellarTypeMappingInfo(): TypeMappingInfo {\n return {\n primitives: { ...STELLAR_TYPE_TO_FIELD_TYPE },\n dynamicPatterns: STELLAR_DYNAMIC_PATTERNS,\n };\n}\n","import type { FieldType } from '@openzeppelin/ui-types';\n\nimport { isBytesNType, 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 (isBytesNType(parameterType)) {\n return 'bytes';\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 if (isBytesNType(parameterType)) {\n return ['bytes', '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: ['bigint', 'number', 'amount', 'text'],\n U128: ['bigint', 'number', 'amount', 'text'],\n U256: ['bigint', 'number', 'amount', 'text'],\n\n // Signed integers\n I32: ['number', 'amount', 'text'],\n I64: ['bigint', 'number', 'text'],\n I128: ['bigint', 'number', 'text'],\n I256: ['bigint', 'number', '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/ui-types';\nimport {\n enhanceNumericValidation,\n getDefaultValueForType,\n logger,\n type NumericBoundsMap,\n} from '@openzeppelin/ui-utils';\n\nimport { extractMapTypes, extractVecElementType } from '../utils/safe-type-parser';\nimport { isBytesNType, isLikelyEnumType } from '../utils/type-detection';\nimport { extractEnumVariants, isEnumType, type EnumMetadata } from './enum-metadata';\nimport { extractStructFields, isStructType } from './struct-fields';\nimport { buildTupleComponents } from './tuple-components';\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 * Stellar/Soroban numeric type bounds.\n * Maps Stellar type names to their min/max value constraints.\n *\n * Note: U64, U128, U256, I64, I128, and I256 are not included here because they exceed\n * JavaScript's Number.MAX_SAFE_INTEGER (2^53 - 1). These types are mapped to 'bigint' field type\n * and handle validation through BigIntField component's internal validation mechanism.\n */\nconst STELLAR_NUMERIC_BOUNDS: NumericBoundsMap = {\n U8: { min: 0, max: 255 },\n U16: { min: 0, max: 65_535 },\n U32: { min: 0, max: 4_294_967_295 },\n I8: { min: -128, max: 127 },\n I16: { min: -32_768, max: 32_767 },\n I32: { min: -2_147_483_648, max: 2_147_483_647 },\n};\n\n/**\n * Generate default form configuration for a Stellar function parameter. Supports:\n * - WASM artifacts: parameters arrive with baked-in enum metadata and struct components.\n * - SAC runtime specs: metadata is fetched on demand, so we reconstruct the same shape from\n * `metadata.specEntries` to keep the UI identical across contract types.\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 // WASM artifacts still include `components` on struct inputs because we bake them during\n // the build step. SAC contracts fetch their spec at runtime, so struct parameters show up\n // without that data. Cache whatever the SAC spec gives us so the final field mirrors the\n // WASM experience.\n let structComponents: FunctionParameter[] | null = null;\n let finalFieldType = fieldType;\n let options: { label: string; value: string }[] | undefined;\n\n // Check if this parameter is an enum type (by spec or heuristic) and extract metadata\n const enumDetectedBySpec = !!(specEntries && isEnumType(specEntries, parameter.type));\n const enumDetectedHeuristic = isLikelyEnumType(parameter.type);\n if (enumDetectedBySpec || enumDetectedHeuristic) {\n if (enumDetectedBySpec) {\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 // Same story here: WASM schemas already embed struct components, but SAC schemas only\n // expose them inside the downloaded spec. Pull them out up front so the UI sees the\n // same shape regardless of how the metadata was sourced.\n if (specEntries && isStructType(specEntries, parameter.type)) {\n const structFields = extractStructFields(specEntries, parameter.type);\n if (structFields && structFields.length > 0) {\n structComponents = structFields;\n }\n }\n\n if (!structComponents) {\n const tupleComponents = buildTupleComponents(parameter.type, specEntries);\n if (tupleComponents && tupleComponents.length > 0) {\n structComponents = tupleComponents;\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 baseField.validation = enhanceNumericValidation(\n baseField.validation,\n parameter.type,\n STELLAR_NUMERIC_BOUNDS\n );\n\n // Propagate max byte length for BytesN types so the UI can enforce it\n if (isBytesNType(parameter.type)) {\n const sizeMatch = parameter.type.match(/^BytesN<(\\d+)>$/);\n const maxBytes = sizeMatch ? Number.parseInt(sizeMatch[1], 10) : undefined;\n\n if (!Number.isNaN(maxBytes) && Number.isFinite(maxBytes)) {\n baseField.metadata = {\n ...(baseField.metadata ?? {}),\n maxBytes,\n };\n }\n }\n\n // For array types (including arrays of complex types), provide element type information\n if (fieldType === 'array' || fieldType === 'array-object') {\n const elementType = extractVecElementType(parameter.type);\n if (elementType) {\n const elementFieldType = mapStellarParameterTypeToFieldType(elementType);\n\n // Check if the element type is an enum or struct and needs additional metadata\n let elementEnumMetadata: EnumMetadata | undefined;\n let elementComponents: FunctionParameter[] | undefined;\n let finalElementFieldType = elementFieldType;\n\n // Extract enum metadata for array elements\n if (isLikelyEnumType(elementType)) {\n if (specEntries && isEnumType(specEntries, elementType)) {\n elementEnumMetadata = extractEnumVariants(specEntries, elementType) ?? undefined;\n if (elementEnumMetadata) {\n // Override field type based on enum characteristics\n finalElementFieldType = elementEnumMetadata.isUnitOnly ? 'select' : 'enum';\n }\n }\n }\n\n // Extract struct components for array elements\n if (specEntries && isStructType(specEntries, elementType)) {\n const structFields = extractStructFields(specEntries, elementType);\n if (structFields && structFields.length > 0) {\n elementComponents = structFields;\n finalElementFieldType = 'object';\n }\n }\n\n // For array-object, if we have components from the parameter, use them\n if (fieldType === 'array-object' && parameter.components) {\n elementComponents = parameter.components;\n finalElementFieldType = 'object';\n }\n\n // Build element validation with bounds\n let elementValidation: FieldValidation = { required: true };\n elementValidation = enhanceNumericValidation(\n elementValidation,\n elementType,\n STELLAR_NUMERIC_BOUNDS\n );\n\n // Add array-specific properties with full element metadata\n const arrayField = {\n ...baseField,\n type: 'array' as FieldType, // Always use 'array' as the field type\n elementType: finalElementFieldType,\n elementFieldConfig: {\n type: finalElementFieldType,\n validation: elementValidation,\n placeholder: `Enter ${elementType}`,\n originalParameterType: elementType,\n ...(elementEnumMetadata && { enumMetadata: elementEnumMetadata }),\n ...(elementComponents && { components: elementComponents }),\n },\n };\n return arrayField as unknown as FormFieldType<T>;\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: enhanceNumericValidation(\n { required: true },\n mapTypes.keyType,\n STELLAR_NUMERIC_BOUNDS\n ),\n placeholder: `Enter ${mapTypes.keyType}`,\n originalParameterType: mapTypes.keyType,\n },\n valueFieldConfig: {\n type: valueFieldType,\n validation: enhanceNumericValidation(\n { required: true },\n mapTypes.valueType,\n STELLAR_NUMERIC_BOUNDS\n ),\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 (fieldType === 'object' || fieldType === 'array-object') {\n const componentsToUse = parameter.components || structComponents;\n if (componentsToUse) {\n // Prefer the baked-in WASM components, otherwise fall back to the SAC-derived\n // components we cached above.\n const result = {\n ...baseField,\n components: componentsToUse,\n };\n return result;\n }\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 type { FunctionParameter } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\n// Import the type extraction utility from the shared utils module\nimport { extractSorobanTypeFromScSpec } from '../utils/type-detection';\nimport { extractStructFields, isStructType } from './struct-fields';\nimport { buildTupleComponents } from './tuple-components';\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 /** Optional detailed component metadata for payload types */\n payloadComponents?: (FunctionParameter[] | undefined)[];\n /** For integer variants: the numeric value */\n value?: number;\n /** Flag indicating if this variant has a single Tuple payload that needs wrapping during serialization */\n isSingleTuplePayload?: boolean;\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 * Helper function to flatten a single payload type.\n * Handles tuples, structs, and primitive types differently.\n *\n * @param payloadType - The type to flatten\n * @param entries - Spec entries for struct/enum resolution\n * @param flattenedTypes - Array to accumulate flattened type names\n * @param flattenedComponents - Array to accumulate component metadata\n */\nfunction flattenPayloadType(\n payloadType: string,\n entries: xdr.ScSpecEntry[],\n flattenedTypes: string[],\n flattenedComponents: (FunctionParameter[] | undefined)[]\n): void {\n if (payloadType.startsWith('Tuple<')) {\n // Extract tuple components and add them individually for UI rendering\n const tupleComponents = buildTupleComponents(payloadType, entries);\n if (tupleComponents && tupleComponents.length > 0) {\n tupleComponents.forEach((component) => {\n flattenedTypes.push(component.type);\n if (isStructType(entries, component.type)) {\n flattenedComponents.push(extractStructFields(entries, component.type) ?? undefined);\n } else {\n flattenedComponents.push(component.components);\n }\n });\n } else {\n flattenedTypes.push(payloadType);\n flattenedComponents.push(undefined);\n }\n } else if (isStructType(entries, payloadType)) {\n flattenedTypes.push(payloadType);\n flattenedComponents.push(extractStructFields(entries, payloadType) ?? undefined);\n } else {\n flattenedTypes.push(payloadType);\n flattenedComponents.push(undefined);\n }\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 rawPayloadTypes = tupleCase\n .type()\n .map((typeDef) => extractSorobanTypeFromScSpec(typeDef));\n\n // Track if we have a single Tuple payload that needs special handling\n const isSingleTuplePayload =\n rawPayloadTypes.length === 1 && rawPayloadTypes[0].startsWith('Tuple<');\n\n // Flatten tuple payloads for UI rendering\n // Example: Some((Address, i128)) → payloadTypes: ['Address', 'I128'] for UI\n // But we keep the original structure info for serialization\n const flattenedPayloadTypes: string[] = [];\n const flattenedPayloadComponents: (FunctionParameter[] | undefined)[] = [];\n\n for (const payloadType of rawPayloadTypes) {\n flattenPayloadType(\n payloadType,\n entries,\n flattenedPayloadTypes,\n flattenedPayloadComponents\n );\n }\n\n variants.push({\n name: tupleCase.name().toString(),\n type: 'tuple',\n payloadTypes: flattenedPayloadTypes,\n ...(flattenedPayloadComponents.some(\n (components) => components && components.length > 0\n ) && {\n payloadComponents: flattenedPayloadComponents,\n }),\n // Store metadata about whether this needs tuple wrapping during serialization\n ...(isSingleTuplePayload && { isSingleTuplePayload: true }),\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 { xdr } from '@stellar/stellar-sdk';\n\nimport type { FunctionParameter } from '@openzeppelin/ui-types';\n\nimport { extractTupleTypes } from '../utils/safe-type-parser';\nimport { extractStructFields, isStructType } from './struct-fields';\n\n/**\n * Builds synthetic FunctionParameter definitions for tuple types so they can be rendered\n * using the existing object field UI.\n */\nexport function buildTupleComponents(\n parameterType: string,\n specEntries?: xdr.ScSpecEntry[]\n): FunctionParameter[] | null {\n const tupleElements = extractTupleTypes(parameterType);\n if (!tupleElements || tupleElements.length === 0) {\n return null;\n }\n\n return tupleElements.map((elementType, index) => {\n let nestedComponents: FunctionParameter[] | undefined;\n\n if (specEntries && isStructType(specEntries, elementType)) {\n const structFields = extractStructFields(specEntries, elementType);\n if (structFields && structFields.length > 0) {\n nestedComponents = structFields;\n }\n } else if (elementType.startsWith('Tuple<')) {\n const tupleStruct = buildTupleComponents(elementType, specEntries);\n if (tupleStruct && tupleStruct.length > 0) {\n nestedComponents = tupleStruct;\n }\n }\n\n return {\n name: `item_${index}`,\n type: elementType,\n displayName: `Value ${index + 1} (${elementType})`,\n ...(nestedComponents && { components: nestedComponents }),\n };\n });\n}\n","import { Address, xdr } from '@stellar/stellar-sdk';\n\nimport type {\n ContractSchema,\n EnumValue,\n FormFieldType,\n FunctionParameter,\n} from '@openzeppelin/ui-types';\nimport { isEnumValue } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { extractEnumVariants, isEnumType } from '../mapping/enum-metadata';\nimport { parseStellarInput } from '../transform';\nimport { isPrimitiveParamType } from '../utils/stellar-types';\nimport { isBytesNType, isLikelyEnumType } from '../utils/type-detection';\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 * Recursively enriches a parameter with enum metadata from specEntries.\n * This ensures enum types get the metadata they need for proper ScVal conversion.\n */\nfunction enrichParameterWithEnumMetadata(\n param: FunctionParameter,\n specEntries: xdr.ScSpecEntry[] | undefined\n): FunctionParameter {\n if (!specEntries) {\n return param;\n }\n\n const enriched: FunctionParameter = { ...param };\n\n // Add enum metadata if this is an enum type\n if (isLikelyEnumType(param.type) && isEnumType(specEntries, param.type)) {\n const enumMetadata = extractEnumVariants(specEntries, param.type);\n if (enumMetadata) {\n enriched.enumMetadata = enumMetadata;\n }\n }\n\n // For Vec<EnumType>, extract the element type's enum metadata\n const vecMatch = param.type.match(/^Vec<([^>]+)>$/);\n if (vecMatch) {\n const elementType = vecMatch[1];\n if (isLikelyEnumType(elementType) && isEnumType(specEntries, elementType)) {\n const enumMetadata = extractEnumVariants(specEntries, elementType);\n if (enumMetadata) {\n enriched.enumMetadata = enumMetadata;\n }\n }\n }\n\n // Recursively process components for struct types\n if (enriched.components && enriched.components.length > 0) {\n enriched.components = enriched.components.map((component) =>\n enrichParameterWithEnumMetadata(component, specEntries)\n );\n }\n\n return enriched;\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 return rawValue;\n }\n const processedValue = parseStellarInput(rawValue, expectedType);\n // Keep SorobanArgumentValue wrapper for primitive payloads to satisfy tests and simple paths.\n // For complex payloads (structs/tuples/maps/vec/enums), return raw values and let valueToScVal handle serialization.\n const isPrimitivePayload =\n isPrimitiveParamType(expectedType) || isBytesNType(expectedType);\n\n if (isPrimitivePayload) {\n return { type: expectedType, value: processedValue };\n }\n return processedValue;\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 fieldByName = new Map<string, FormFieldType>();\n fields.forEach((field) => fieldByName.set(field.name, field));\n\n // Extract specEntries from contract metadata for enum enrichment\n const specEntries = contractSchema.metadata?.specEntries as xdr.ScSpecEntry[] | undefined;\n\n const argSchemaWithComponents = functionDetails.inputs.map((param) => {\n const field = fieldByName.get(param.name);\n\n // Build enhanced schema with components and enum metadata from the field\n const enhanced: FunctionParameter = { ...param };\n\n // Prefer existing components from param, otherwise use field components\n if (param.components && param.components.length > 0) {\n enhanced.components = param.components;\n } else if (field?.components && field.components.length > 0) {\n enhanced.components = field.components;\n }\n\n // Add enum metadata from field if available\n if (field?.enumMetadata) {\n enhanced.enumMetadata = field.enumMetadata;\n }\n\n // For array fields, check if elementFieldConfig has enum metadata or components\n // This is needed for Vec<EnumType> or Vec<StructType>\n if (param.type.startsWith('Vec<') && field?.elementFieldConfig) {\n if (field.elementFieldConfig.enumMetadata) {\n enhanced.enumMetadata = field.elementFieldConfig.enumMetadata;\n }\n if (field.elementFieldConfig.components) {\n enhanced.components = field.elementFieldConfig.components;\n }\n }\n\n // For struct fields, enrich the components with enum metadata from nested fields\n if (enhanced.components && enhanced.components.length > 0) {\n enhanced.components = enhanced.components.map((component) => {\n // Build the nested field name (e.g., \"complex_struct.base_asset\")\n const nestedFieldName = `${param.name}.${component.name}`;\n const nestedField = fieldByName.get(nestedFieldName);\n\n if (nestedField) {\n const enrichedComponent: FunctionParameter = { ...component };\n\n // Add enum metadata from nested field\n if (nestedField.enumMetadata) {\n enrichedComponent.enumMetadata = nestedField.enumMetadata;\n }\n\n // Add components from nested field\n if (nestedField.components) {\n enrichedComponent.components = nestedField.components;\n }\n\n // For nested array fields, extract elementFieldConfig metadata\n if (component.type.startsWith('Vec<') && nestedField.elementFieldConfig) {\n if (nestedField.elementFieldConfig.enumMetadata) {\n enrichedComponent.enumMetadata = nestedField.elementFieldConfig.enumMetadata;\n }\n if (nestedField.elementFieldConfig.components) {\n enrichedComponent.components = nestedField.elementFieldConfig.components;\n }\n }\n\n return enrichedComponent;\n }\n\n return component;\n });\n }\n\n // Use specEntries to enrich with enum metadata for any enum types that weren't in the fields\n // This handles nested enums in structs where the nested fields aren't in the fields array\n const finalEnhanced = enrichParameterWithEnumMetadata(enhanced, specEntries);\n\n return finalEnhanced;\n });\n\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: argSchemaWithComponents, // Include full parameter schema with struct/tuple 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 type { ISupportedWallet } from '@creit.tech/stellar-wallets-kit';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\n\nimport type { UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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/ui-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/ui-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/ui-types';\nimport { appConfigService, logger } from '@openzeppelin/ui-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 { Button } from '@openzeppelin/ui-components';\nimport type { BaseComponentProps } from '@openzeppelin/ui-types';\nimport { cn, getWalletButtonSizeProps } from '@openzeppelin/ui-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 size,\n variant,\n fullWidth,\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 const sizeProps = getWalletButtonSizeProps(size);\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', fullWidth && 'w-full', className)}>\n <Button\n onClick={handleConnectClick}\n disabled={showButtonLoading || isConnected}\n variant={variant || 'outline'}\n size={sizeProps.size}\n className={cn(sizeProps.className, fullWidth && 'w-full')}\n title={isConnected ? 'Connected' : 'Connect Wallet'}\n >\n {showButtonLoading ? (\n <Loader2 className={cn(sizeProps.iconSize, 'animate-spin mr-1')} />\n ) : (\n <Wallet className={cn(sizeProps.iconSize, '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 {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@openzeppelin/ui-components';\nimport type { Connector } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { Button } from '@openzeppelin/ui-components';\nimport type { BaseComponentProps } from '@openzeppelin/ui-types';\nimport { cn, getWalletAccountDisplaySizeProps, truncateMiddle } from '@openzeppelin/ui-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> = ({\n className,\n size,\n variant,\n fullWidth,\n}) => {\n const { isConnected, address } = useStellarAccount();\n const { disconnect } = useStellarDisconnect();\n\n const sizeProps = getWalletAccountDisplaySizeProps(size);\n\n if (!isConnected || !address || !disconnect) {\n return null;\n }\n\n return (\n <div className={cn('flex items-center gap-2', fullWidth && 'w-full', className)}>\n <div className={cn('flex flex-col', fullWidth && 'flex-1')}>\n <span className={cn(sizeProps.textSize, 'font-medium')}>\n {truncateMiddle(address, 4, 4)}\n </span>\n <span className={cn(sizeProps.subTextSize, 'text-muted-foreground -mt-0.5')}>\n Stellar Account\n </span>\n </div>\n <Button\n onClick={() => disconnect()}\n variant={variant || 'ghost'}\n size=\"icon\"\n className={cn(sizeProps.iconButtonSize, 'p-0')}\n title=\"Disconnect wallet\"\n >\n <LogOut className={sizeProps.iconSize} />\n </Button>\n </div>\n );\n};\n","import type { EcosystemWalletComponents, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { ECOSYSTEM_WALLET_COMPONENT_KEYS } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { EcosystemWalletComponents, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { NativeConfigLoader, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-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 { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-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 iconComponent: NetworkStellar,\n indexerUri: 'https://openzeppelin-stellar-mainnet.graphql.subquery.network/',\n};\n","import { NetworkStellar } from '@web3icons/react';\n\nimport { StellarNetworkConfig } from '@openzeppelin/ui-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 iconComponent: NetworkStellar,\n indexerUri: 'https://openzepplin-stellar-testnet.graphql.subquery.network',\n};\n","import { StellarNetworkConfig } from '@openzeppelin/ui-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/ui-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 // SAC (Stellar Asset Contract) support - dynamically loaded from CDN\n // These are needed for XDR encoding when working with SAC contracts\n '@stellar/stellar-xdr-json': '^23.0.0',\n 'lossless-json': '^4.0.2',\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_ui_types","import_ui_utils","import_stellar_sdk","import_ui_types","import_ui_utils","import_stellar_sdk","import_ui_utils","import_ui_types","import_ui_utils","import_ui_utils","import_ui_utils","SYSTEM_LOG_TAG","import_stellar_sdk","import_ui_utils","import_stellar_sdk","import_ui_utils","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","import_stellar_sdk","import_ui_types","import_stellar_sdk","import_ui_types","import_ui_utils","SYSTEM_LOG_TAG","scValType","typeHint","SYSTEM_LOG_TAG","import_stellar_sdk","import_ui_utils","StellarRpc","contract","StellarRpc","import_ui_types","import_ui_utils","import_stellar_sdk","import_ui_utils","import_stellar_sdk","import_ui_utils","import_ui_utils","import_ui_utils","import_ui_utils","import_ui_utils","xdr","LOG_SYSTEM","import_stellar_wallets_kit","import_ui_utils","import_ui_utils","state","xdr","SYSTEM_LOG_TAG","getSorobanRpcServer","StellarRpc","contract","import_stellar_sdk","import_ui_utils","contract","StellarRpc","SYSTEM_LOG_TAG","SYSTEM_LOG_TAG","import_ui_types","import_ui_types","import_ui_utils","LOG_SYSTEM","import_ui_types","import_ui_utils","import_stellar_sdk","import_ui_utils","import_ui_utils","StellarSdk","import_ui_utils","import_ui_utils","SYSTEM_LOG_TAG","import_stellar_sdk","import_ui_utils","isStructType","import_ui_utils","import_ui_utils","import_stellar_sdk","import_ui_utils","stellarXdrJsonPackage","import_stellar_sdk","import_ui_utils","getSorobanRpcServer","StellarRpc","specEntries","functions","isStructType","import_react","import_ui_components","import_jsx_runtime","import_ui_components","import_jsx_runtime","import_ui_components","import_jsx_runtime","import_react","import_react_hook_form","import_jsx_runtime","React","import_ui_utils","SYSTEM_LOG_TAG","import_ui_utils","import_stellar_sdk","import_ui_utils","isStructType","isStructType","isStructType","import_stellar_sdk","import_ui_types","import_ui_utils","specEntries","import_react","import_ui_utils","import_react","import_jsx_runtime","import_react","import_react","import_react","import_ui_utils","import_lucide_react","import_react","import_ui_components","import_ui_utils","import_react","import_ui_components","import_ui_utils","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_ui_components","import_ui_utils","import_jsx_runtime","import_ui_types","import_ui_utils","import_ui_utils","import_ui_utils","import_react","import_react"]}
|