{"version":3,"file":"ui-kit-BxF37v--.mjs","names":["coreCreateRainbowKitComponents","createCoreUiKit","uiKitConfig"],"sources":["../src/transaction/components/AdvancedInfo.tsx","../src/transaction/components/CustomGasParameters.tsx","../src/transaction/components/SpeedSelection.tsx","../src/transaction/components/useEvmRelayerOptions.ts","../src/transaction/components/EvmRelayerOptions.tsx","../src/wallet/evmUiKitManager.ts","../src/wallet/components/EvmWalletUiRoot.tsx","../src/wallet/hooks/facade-hooks.ts","../src/wallet/hooks/useUiKitConfig.ts","../src/wallet/rainbowkit/components.tsx","../src/wallet/rainbowkit/componentFactory.ts","../src/wallet/utils/uiKitService.ts","../src/capabilities/ui-kit.ts"],"sourcesContent":["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\">Gas Pricing Strategy</label>\n        <Button variant=\"ghost\" size=\"sm\" onClick={onToggle} className=\"text-xs\" type=\"button\">\n          <Info className=\"h-3 w-3 mr-1\" />\n          API Requirements\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            The OpenZeppelin Relayer API requires exactly one pricing strategy: either a{' '}\n            <strong>Speed</strong> enum value (FASTEST, FAST, AVERAGE, SAFE_LOW) or{' '}\n            <strong>custom gas parameters</strong> (gasPrice for legacy, or maxFeePerGas +\n            maxPriorityFeePerGas for EIP-1559).\n          </p>\n        </div>\n      )}\n    </div>\n  );\n};\n","import { Circle } from 'lucide-react';\nimport React from 'react';\nimport { Control } from 'react-hook-form';\n\nimport {\n  Accordion,\n  AccordionContent,\n  AccordionItem,\n  AccordionTrigger,\n  BooleanField,\n  NumberField,\n} from '@openzeppelin/ui-components';\nimport { cn } from '@openzeppelin/ui-utils';\n\nimport { EvmRelayerFormData } from './useEvmRelayerOptions';\n\ninterface CustomGasParametersProps {\n  control: Control<EvmRelayerFormData>;\n  configMode: string;\n  gasType: string;\n  showGasLimit: boolean;\n  onGasTypeSwitch: (type: string) => void;\n}\n\nexport const CustomGasParameters: React.FC<CustomGasParametersProps> = ({\n  control,\n  configMode,\n  gasType,\n  showGasLimit,\n  onGasTypeSwitch,\n}) => {\n  return (\n    <div className=\"space-y-4\">\n      <div className=\"rounded-lg bg-muted/50 p-4\">\n        <p className=\"text-sm text-muted-foreground leading-relaxed\">\n          Manually configure gas parameters. You must provide either <strong>Legacy</strong>{' '}\n          (gasPrice) or <strong>EIP-1559</strong> (maxFeePerGas + maxPriorityFeePerGas) values.\n        </p>\n      </div>\n\n      <div className=\"space-y-3\">\n        <p className=\"text-xs text-muted-foreground font-medium uppercase tracking-wider\">\n          Select Gas Pricing Method\n        </p>\n\n        <Accordion\n          type=\"single\"\n          collapsible\n          value={gasType}\n          onValueChange={(value) => value && onGasTypeSwitch(value)}\n          className=\"w-full space-y-3\"\n        >\n          <AccordionItem\n            value=\"eip1559\"\n            className={cn(\n              'rounded-lg border shadow-sm overflow-hidden transition-all',\n              gasType === 'eip1559'\n                ? 'border-primary bg-primary/5'\n                : 'border-border bg-card hover:border-muted-foreground/50'\n            )}\n          >\n            <AccordionTrigger className=\"px-4 py-3 text-sm font-medium hover:no-underline\">\n              <div className=\"flex items-center justify-between w-full\">\n                <div className=\"flex items-center gap-3\">\n                  <div className=\"relative\">\n                    <Circle\n                      className={`h-4 w-4 ${gasType === 'eip1559' ? 'text-primary' : 'text-muted-foreground'}`}\n                    />\n                    {gasType === 'eip1559' && (\n                      <Circle className=\"h-4 w-4 absolute inset-0 text-primary fill-primary scale-50\" />\n                    )}\n                  </div>\n                  <span>EIP-1559</span>\n                </div>\n                {gasType === 'eip1559' && (\n                  <span className=\"text-xs text-primary font-medium mr-2\">Selected</span>\n                )}\n              </div>\n            </AccordionTrigger>\n            <AccordionContent>\n              <div className=\"px-4 pb-4 pt-4 grid gap-4 border-t bg-background/50\">\n                <NumberField\n                  id=\"maxFeePerGas\"\n                  label=\"Max Fee Per Gas\"\n                  name=\"transactionOptions.maxFeePerGas\"\n                  control={control}\n                  placeholder=\"30\"\n                  helperText=\"Maximum total fee per gas unit you're willing to pay (in gwei)\"\n                  step={0.1}\n                  min={0}\n                  validation={{ required: configMode === 'custom' && gasType === 'eip1559' }}\n                />\n\n                <NumberField\n                  id=\"maxPriorityFeePerGas\"\n                  label=\"Max Priority Fee Per Gas\"\n                  name=\"transactionOptions.maxPriorityFeePerGas\"\n                  control={control}\n                  placeholder=\"2\"\n                  helperText=\"Priority fee (tip) to incentivize miners (in gwei)\"\n                  step={0.1}\n                  min={0}\n                  validation={{ required: configMode === 'custom' && gasType === 'eip1559' }}\n                />\n              </div>\n            </AccordionContent>\n          </AccordionItem>\n\n          <AccordionItem\n            value=\"legacy\"\n            className={cn(\n              'rounded-lg border shadow-sm overflow-hidden transition-all',\n              gasType === 'legacy'\n                ? 'border-primary bg-primary/5'\n                : 'border-border bg-card hover:border-muted-foreground/50'\n            )}\n          >\n            <AccordionTrigger className=\"px-4 py-3 text-sm font-medium hover:no-underline\">\n              <div className=\"flex items-center justify-between w-full\">\n                <div className=\"flex items-center gap-3\">\n                  <div className=\"relative\">\n                    <Circle\n                      className={`h-4 w-4 ${gasType === 'legacy' ? 'text-primary' : 'text-muted-foreground'}`}\n                    />\n                    {gasType === 'legacy' && (\n                      <Circle className=\"h-4 w-4 absolute inset-0 text-primary fill-primary scale-50\" />\n                    )}\n                  </div>\n                  <span>Legacy Gas Price</span>\n                </div>\n                {gasType === 'legacy' && (\n                  <span className=\"text-xs text-primary font-medium mr-2\">Selected</span>\n                )}\n              </div>\n            </AccordionTrigger>\n            <AccordionContent>\n              <div className=\"px-4 pb-4 pt-4 border-t bg-background/50\">\n                <NumberField\n                  id=\"gasPrice\"\n                  label=\"Gas Price\"\n                  name=\"transactionOptions.gasPrice\"\n                  control={control}\n                  placeholder=\"20\"\n                  helperText=\"Fixed gas price for legacy transactions (in gwei)\"\n                  step={0.1}\n                  min={0}\n                  validation={{ required: configMode === 'custom' && gasType === 'legacy' }}\n                />\n              </div>\n            </AccordionContent>\n          </AccordionItem>\n        </Accordion>\n      </div>\n\n      <div className=\"space-y-2\">\n        <BooleanField\n          id=\"showGasLimit\"\n          label=\"Override gas limit\"\n          name=\"transactionOptions.showGasLimit\"\n          control={control}\n          helperText=\"Enable manual gas limit configuration\"\n        />\n\n        {showGasLimit && (\n          <div className=\"pl-6\">\n            <NumberField\n              id=\"gasLimit\"\n              label=\"Gas Limit\"\n              name=\"transactionOptions.gasLimit\"\n              control={control}\n              placeholder=\"Auto-detected by relayer\"\n              helperText=\"Leave empty to let the relayer estimate. Only override if you need a specific limit.\"\n              step={1000}\n              min={21000}\n            />\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\n\nimport { Speed } from '@openzeppelin/relayer-sdk';\nimport { RadioGroup, RadioGroupItem } from '@openzeppelin/ui-components';\n\ninterface SpeedSelectionProps {\n  selectedSpeed: Speed | undefined;\n  onSpeedChange: (speed: Speed) => void;\n}\n\nconst speedOptions = [\n  {\n    value: Speed.FASTEST,\n    label: 'Fastest',\n    description: 'Maximum priority, highest gas prices',\n  },\n  {\n    value: Speed.FAST,\n    label: 'Fast',\n    description: 'High priority, recommended for most transactions',\n    recommended: true,\n  },\n  {\n    value: Speed.AVERAGE,\n    label: 'Average',\n    description: 'Standard priority, balanced cost',\n  },\n  {\n    value: Speed.SAFE_LOW,\n    label: 'Safe Low',\n    description: 'Lower priority, minimal gas cost',\n  },\n];\n\nexport const SpeedSelection: React.FC<SpeedSelectionProps> = ({ selectedSpeed, onSpeedChange }) => {\n  return (\n    <RadioGroup\n      value={selectedSpeed || Speed.FAST}\n      onValueChange={(value) => onSpeedChange(value as Speed)}\n    >\n      <div className=\"space-y-3\">\n        {speedOptions.map((option) => (\n          <label\n            key={option.value}\n            htmlFor={`speed-${option.value}`}\n            className={`relative block rounded-lg border p-4 cursor-pointer transition-colors ${\n              selectedSpeed === option.value\n                ? 'border-primary bg-primary/5'\n                : 'border-border hover:border-muted-foreground/50'\n            }`}\n          >\n            {option.recommended && (\n              <span className=\"absolute -top-2 right-4 bg-primary text-primary-foreground text-xs px-2 py-0.5 rounded\">\n                Recommended\n              </span>\n            )}\n            <div className=\"flex items-start space-x-3\">\n              <RadioGroupItem\n                value={option.value}\n                id={`speed-${option.value}`}\n                className=\"mt-0.5\"\n              />\n              <div className=\"flex-1\">\n                <div className=\"font-medium\">{option.label}</div>\n                <p className=\"text-sm text-muted-foreground mt-0.5\">{option.description}</p>\n              </div>\n            </div>\n          </label>\n        ))}\n      </div>\n    </RadioGroup>\n  );\n};\n","import { useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport {\n  gweiToWei,\n  weiToGwei,\n  type EvmRelayerTransactionOptions,\n} from '@openzeppelin/adapter-evm-core';\nimport { Speed } from '@openzeppelin/relayer-sdk';\n\nexport interface EvmRelayerFormData {\n  transactionOptions: EvmRelayerTransactionOptions & {\n    showGasLimit?: boolean;\n  };\n}\n\ninterface UseEvmRelayerOptionsProps {\n  options: Record<string, unknown>;\n  onChange: (options: Record<string, unknown>) => void;\n}\n\nexport const useEvmRelayerOptions = ({ options, onChange }: UseEvmRelayerOptionsProps) => {\n  // Store latest onChange in a ref to avoid effect re-runs due to changing function identity\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 = {\n    speed: (() => {\n      const hasCustomSettings = Boolean(\n        options.gasPrice || options.maxFeePerGas || options.maxPriorityFeePerGas\n      );\n      return options.speed || (!hasCustomSettings ? Speed.FAST : undefined);\n    })() as Speed,\n    gasPrice: weiToGwei(options.gasPrice as number | undefined),\n    maxFeePerGas: weiToGwei(options.maxFeePerGas as number | undefined),\n    maxPriorityFeePerGas: weiToGwei(options.maxPriorityFeePerGas as number | undefined),\n    gasLimit: options.gasLimit as number | undefined,\n    showGasLimit: Boolean(options.gasLimit),\n  };\n\n  const { control, setValue, watch } = useForm<EvmRelayerFormData>({\n    defaultValues: {\n      transactionOptions: initialOptions,\n    },\n  });\n\n  const formValues = watch('transactionOptions');\n  const isInitialMount = useRef(true);\n\n  // Determine current mode and gas type\n  const hasCustomSettings = Boolean(\n    formValues.gasPrice || formValues.maxFeePerGas || formValues.maxPriorityFeePerGas\n  );\n  const configMode = hasCustomSettings ? 'custom' : 'speed';\n  const isEip1559 = Boolean(formValues.maxFeePerGas || formValues.maxPriorityFeePerGas);\n  const gasType = isEip1559 ? 'eip1559' : 'legacy';\n\n  // Handle initial mount - ensure the default speed value is communicated to parent\n  useEffect(() => {\n    if (isInitialMount.current) {\n      isInitialMount.current = false;\n\n      // Only notify parent if we have a default speed value that wasn't already in options\n      if (initialOptions.speed && !options.speed) {\n        const newOptions: EvmRelayerTransactionOptions = {};\n        if (initialOptions.speed) newOptions.speed = initialOptions.speed;\n        if (initialOptions.gasLimit) newOptions.gasLimit = initialOptions.gasLimit;\n\n        onChange(newOptions as Record<string, unknown>);\n      }\n      return;\n    }\n  }, []);\n\n  // Notify parent of changes after initial mount (watch specific fields to avoid loops)\n  useEffect(() => {\n    if (isInitialMount.current) {\n      return;\n    }\n\n    const timeoutId = setTimeout(() => {\n      const newOptions: EvmRelayerTransactionOptions = {};\n\n      if (formValues.speed) newOptions.speed = formValues.speed;\n      if (formValues.gasPrice) newOptions.gasPrice = gweiToWei(formValues.gasPrice);\n      if (formValues.maxFeePerGas) newOptions.maxFeePerGas = gweiToWei(formValues.maxFeePerGas);\n      if (formValues.maxPriorityFeePerGas) {\n        newOptions.maxPriorityFeePerGas = gweiToWei(formValues.maxPriorityFeePerGas);\n      }\n      if (formValues.gasLimit) newOptions.gasLimit = formValues.gasLimit;\n\n      onChangeRef.current(newOptions as Record<string, unknown>);\n    }, 100);\n\n    return () => clearTimeout(timeoutId);\n  }, [\n    formValues.speed,\n    formValues.gasPrice,\n    formValues.maxFeePerGas,\n    formValues.maxPriorityFeePerGas,\n    formValues.gasLimit,\n  ]);\n\n  // Event handlers\n  const handleSpeedChange = (speed: Speed) => {\n    setValue('transactionOptions', {\n      ...formValues,\n      speed,\n      gasPrice: undefined,\n      maxFeePerGas: undefined,\n      maxPriorityFeePerGas: undefined,\n    });\n  };\n\n  const handleModeChange = (mode: string) => {\n    if (mode === 'speed') {\n      setValue('transactionOptions', {\n        ...formValues,\n        speed: Speed.FAST,\n        gasPrice: undefined,\n        maxFeePerGas: undefined,\n        maxPriorityFeePerGas: undefined,\n      });\n    } else {\n      setValue('transactionOptions', {\n        ...formValues,\n        speed: undefined,\n        maxFeePerGas: 30,\n        maxPriorityFeePerGas: 2,\n      });\n    }\n  };\n\n  const handleGasTypeSwitch = (type: string) => {\n    if (type === 'eip1559') {\n      setValue('transactionOptions', {\n        ...formValues,\n        gasPrice: undefined,\n        maxFeePerGas: 30,\n        maxPriorityFeePerGas: 2,\n      });\n    } else {\n      setValue('transactionOptions', {\n        ...formValues,\n        maxFeePerGas: undefined,\n        maxPriorityFeePerGas: undefined,\n        gasPrice: 20,\n      });\n    }\n  };\n\n  return {\n    control,\n    formValues,\n    configMode,\n    gasType,\n    handleSpeedChange,\n    handleModeChange,\n    handleGasTypeSwitch,\n  };\n};\n","import React from 'react';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@openzeppelin/ui-components';\n\nimport { AdvancedInfo } from './AdvancedInfo';\nimport { CustomGasParameters } from './CustomGasParameters';\nimport { SpeedSelection } from './SpeedSelection';\nimport { useEvmRelayerOptions } from './useEvmRelayerOptions';\n\n/**\n * EVM-specific relayer transaction options component.\n *\n * Provides configuration for gas pricing strategies:\n * - Speed presets: Use predefined gas pricing levels (OpenZeppelin Relayer API)\n * - Custom: Manual gas parameter configuration for precise control\n *\n * We default to Speed mode with FAST preset to ensure valid API requests.\n * The OpenZeppelin Relayer API requires exactly one pricing strategy to be provided.\n */\nexport const EvmRelayerOptions: 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 {\n    control,\n    formValues,\n    configMode,\n    gasType,\n    handleSpeedChange,\n    handleModeChange,\n    handleGasTypeSwitch,\n  } = useEvmRelayerOptions({ options, onChange });\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=\"speed\">Speed</TabsTrigger>\n          <TabsTrigger value=\"custom\">Custom</TabsTrigger>\n        </TabsList>\n\n        <TabsContent value=\"speed\" className=\"space-y-4\">\n          <SpeedSelection selectedSpeed={formValues.speed} onSpeedChange={handleSpeedChange} />\n        </TabsContent>\n\n        <TabsContent value=\"custom\" className=\"space-y-4\">\n          <CustomGasParameters\n            control={control}\n            configMode={configMode}\n            gasType={gasType}\n            showGasLimit={formValues.showGasLimit || false}\n            onGasTypeSwitch={handleGasTypeSwitch}\n          />\n        </TabsContent>\n      </Tabs>\n    </div>\n  );\n};\n","/**\n * EVM UI Kit Manager\n *\n * Manages UI kit configuration for EVM networks using the shared factory from adapter-evm-core.\n */\n\nimport {\n  createUiKitManager,\n  ensureRainbowKitAssetsLoaded,\n  type UiKitManagerState,\n} from '@openzeppelin/adapter-evm-core';\n\nimport { getEvmWalletImplementation } from './utils/walletImplementationManager';\n\n/**\n * State interface for EVM UI Kit Manager.\n * This is a type alias to the shared UiKitManagerState for backwards compatibility.\n */\nexport type EvmUiKitManagerState = UiKitManagerState;\n\n/**\n * EVM UI Kit Manager instance.\n * Provides state management for UI kit configuration in EVM adapters.\n */\nexport const evmUiKitManager = createUiKitManager({\n  getWalletImplementation: getEvmWalletImplementation,\n  loadRainbowKitAssets: ensureRainbowKitAssetsLoaded,\n  logPrefix: 'EvmUiKitManager',\n});\n","import { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { WagmiProvider } from 'wagmi';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { WagmiProviderInitializedContext } from '@openzeppelin/adapter-evm-core';\nimport type { EcosystemReactUiProviderProps } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { evmUiKitManager, type EvmUiKitManagerState } from '../evmUiKitManager';\nimport type { RainbowKitKitConfig, RainbowKitProviderProps } from '../rainbowkit';\n\nconst stableQueryClient = new QueryClient();\n\nexport const EvmWalletUiRoot: React.FC<EcosystemReactUiProviderProps> = ({ children }) => {\n  const [managerState, setManagerState] = useState<EvmUiKitManagerState>(\n    evmUiKitManager.getState()\n  );\n\n  useEffect(() => {\n    const handleStateChange = () => {\n      setManagerState(evmUiKitManager.getState());\n    };\n    const unsubscribe = evmUiKitManager.subscribe(handleStateChange);\n    handleStateChange();\n    return unsubscribe;\n  }, []);\n\n  const queryClient = useMemo(() => stableQueryClient, []);\n\n  const { wagmiConfig, kitProviderComponent, isKitAssetsLoaded, currentFullUiKitConfig, error } =\n    managerState;\n\n  // Don't mount WagmiProvider until the real config is available.\n  // This ensures reconnectOnMount fires exactly once on the correct config,\n  // preventing the \"Connector already connected\" race condition that occurs\n  // when swapping from a placeholder config to the real one.\n  if (!wagmiConfig) {\n    return <>{children}</>;\n  }\n\n  let finalChildren = children;\n\n  // RainbowKit's provider component and CSS are imported dynamically, and\n  // uiKitManager deliberately clears kitProviderComponent / isKitAssetsLoaded and\n  // notifies listeners *before* that import resolves whenever the kit changes.\n  // During that window the kit is already 'rainbowkit' but the provider is absent,\n  // so rendering children would mount RainbowKit consumers (its ConnectButton)\n  // outside RainbowKitProvider -- which throws \"Transaction hooks must be used\n  // within RainbowKitProvider\" and white-screens the app. Withhold children until\n  // the provider is ready instead.\n  const needsKitProvider = currentFullUiKitConfig?.kitName === 'rainbowkit' && !error;\n  const isKitProviderReady = Boolean(kitProviderComponent) && isKitAssetsLoaded;\n  const isAwaitingKitProvider = needsKitProvider && !isKitProviderReady;\n\n  if (\n    currentFullUiKitConfig?.kitName === 'rainbowkit' &&\n    kitProviderComponent &&\n    isKitAssetsLoaded &&\n    !error\n  ) {\n    const DynKitProvider = kitProviderComponent;\n    const kitConfig: RainbowKitKitConfig = currentFullUiKitConfig.kitConfig || {};\n    const providerProps: RainbowKitProviderProps = kitConfig.providerProps || {};\n\n    logger.info(\n      'EvmWalletUiRoot',\n      'Wrapping children with dynamically loaded KitProvider (RainbowKit).'\n    );\n    finalChildren = <DynKitProvider {...providerProps}>{children}</DynKitProvider>;\n  } else if (currentFullUiKitConfig?.kitName === 'rainbowkit' && error) {\n    logger.error(\n      'EvmWalletUiRoot',\n      'RainbowKit configured, but failed to initialize:',\n      error.message\n    );\n  }\n\n  return (\n    <WagmiProvider config={wagmiConfig} reconnectOnMount={true}>\n      <QueryClientProvider client={queryClient}>\n        <WagmiProviderInitializedContext.Provider value={!error}>\n          {isAwaitingKitProvider ? null : finalChildren}\n        </WagmiProviderInitializedContext.Provider>\n      </QueryClientProvider>\n    </WagmiProvider>\n  );\n};\n","import {\n  useAccount,\n  useBalance,\n  useChainId,\n  useChains,\n  useConnect,\n  useSendTransaction,\n  useSignMessage,\n  useSignTypedData,\n  useSwitchChain,\n  useWaitForTransactionReceipt,\n  type UseAccountReturnType,\n  type UseBalanceReturnType,\n  type UseChainIdReturnType,\n  type UseChainsReturnType,\n  type UseConnectReturnType,\n  type UseDisconnectReturnType,\n  type UseSendTransactionReturnType,\n  type UseSignMessageReturnType,\n  type UseSignTypedDataReturnType,\n  type UseSwitchChainReturnType,\n  type UseWaitForTransactionReceiptReturnType,\n} from 'wagmi';\n\nimport { useManagedWagmiDisconnect } from '@openzeppelin/adapter-evm-core';\nimport type { EcosystemSpecificReactHooks } from '@openzeppelin/ui-types';\n\n/**\n * Direct export of wagmi hooks as our facade hooks\n * Using the EcosystemSpecificReactHooks interface which now accepts any function signatures\n */\nexport const evmFacadeHooks: EcosystemSpecificReactHooks = {\n  useAccount,\n  useConnect,\n  useDisconnect: useManagedWagmiDisconnect,\n  useSwitchChain,\n  useChainId,\n  useChains,\n  useBalance,\n  useSendTransaction,\n  useWaitForTransactionReceipt,\n  useSignMessage,\n  useSignTypedData,\n};\n\n// Re-export the wagmi hook types for convenience when consuming these hooks\nexport type {\n  UseAccountReturnType,\n  UseBalanceReturnType,\n  UseChainIdReturnType,\n  UseChainsReturnType,\n  UseConnectReturnType,\n  UseDisconnectReturnType,\n  UseSendTransactionReturnType,\n  UseSignMessageReturnType,\n  UseSignTypedDataReturnType,\n  UseSwitchChainReturnType,\n  UseWaitForTransactionReceiptReturnType,\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 EVM\n  kitConfig: {\n    showInjectedConnector: false, // Default to hiding the injected connector\n  },\n};\n\n// Singleton instance of the UI kit configuration\nlet uiKitConfig: UiKitConfiguration = { ...defaultConfig };\n\nexport function loadInitialConfigFromAppService(): UiKitConfiguration {\n  logger.debug('useUiKitConfig', 'Attempting to load initial config from AppConfigService...');\n  const configObj = appConfigService.getWalletUIConfig<UiKitConfiguration>('evm');\n\n  if (configObj && configObj.kitName) {\n    logger.info(\n      '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    'useUiKitConfig',\n    'No initial config found in AppConfigService, using module default.'\n  );\n  return { ...defaultConfig };\n}\n\n/**\n * Updates the UI kit configuration\n * @param config The new configuration to set. This should be the fully resolved\n *               config from the adapter, potentially including user-native settings.\n */\nexport function setUiKitConfig(config: UiKitConfiguration): void {\n  uiKitConfig = { ...config }; // Store a copy of the provided config\n  logger.info(\n    'useUiKitConfig:setUiKitConfig',\n    `Global uiKitConfig was SET to: kitName=${uiKitConfig.kitName}`,\n    `kitConfig: ${JSON.stringify(uiKitConfig.kitConfig)}`\n  );\n}\n\n/**\n * Helper to check if a specific config option is enabled\n * @param key The configuration key to check\n * @returns True if the configuration option is enabled, false otherwise\n */\nexport function isConfigEnabled(key: string): boolean {\n  return Boolean(uiKitConfig.kitConfig?.[key]);\n}\n\n/**\n * Hook to access the UI kit configuration.\n * The configuration is typically loaded at module initialization and when `setUiKitConfig` is called.\n * @returns The current UI kit configuration (module-level singleton).\n */\nexport function useUiKitConfig(): UiKitConfiguration {\n  // The module-level `uiKitConfig` is updated by `loadInitialConfigFromAppService` (called at module load)\n  // and `setUiKitConfig` (called by adapter's configureUiKit).\n  // Thus, this hook can simply return the current state of the module-level singleton.\n  return uiKitConfig;\n}\n\n/**\n * Getter function to access the current module-level UI kit configuration directly.\n * Useful for initializing adapter instance configurations.\n * @returns The current module-level UI kit configuration.\n */\nexport function getUiKitConfig(): UiKitConfiguration {\n  // Return the direct reference to the singleton. Setters should ensure immutability if needed elsewhere.\n  // For this flow, setUiKitConfig is the explicit mutator.\n  return uiKitConfig;\n}\n","/**\n * EVM Adapter RainbowKit Components\n *\n * This file exports only React components to support Fast Refresh.\n * Factory functions are in componentFactory.ts.\n */\nimport { createRainbowKitConnectButton } from '@openzeppelin/adapter-evm-core';\nimport type { BaseComponentProps } from '@openzeppelin/ui-types';\n\nimport { evmUiKitManager } from '../evmUiKitManager';\n\n/**\n * Props for the RainbowKitConnectButton component.\n */\nexport type RainbowKitConnectButtonProps = BaseComponentProps;\n\n/**\n * RainbowKitConnectButton component configured with the EVM UI kit manager.\n * This component lazily loads the RainbowKit ConnectButton and manages\n * its state through the evmUiKitManager.\n */\nexport const RainbowKitConnectButton: React.FC<RainbowKitConnectButtonProps> =\n  createRainbowKitConnectButton(evmUiKitManager);\n","/**\n * EVM Adapter RainbowKit Component Factory\n *\n * Factory function for creating RainbowKit components.\n * Separated from components.tsx to support React Fast Refresh.\n */\nimport { createRainbowKitComponents as coreCreateRainbowKitComponents } from '@openzeppelin/adapter-evm-core';\n\nimport { RainbowKitConnectButton } from './components';\n\n/**\n * Creates the complete set of RainbowKit wallet components for the EVM adapter.\n *\n * @returns An object containing all RainbowKit wallet components\n */\nexport function createRainbowKitComponents() {\n  return coreCreateRainbowKitComponents(RainbowKitConnectButton);\n}\n","import {\n  CustomAccountDisplay,\n  CustomConnectButton,\n  CustomNetworkSwitcher,\n  filterWalletComponents,\n  getComponentExclusionsFromConfig,\n} from '@openzeppelin/adapter-evm-core';\nimport type { EcosystemWalletComponents, UiKitConfiguration } from '@openzeppelin/ui-types';\nimport { logger } from '@openzeppelin/ui-utils';\n\nimport { createRainbowKitComponents, validateRainbowKitConfig } from '../rainbowkit';\n\n/** Service for resolving UI kit specific components and providers for the EVM adapter. */\n\n/**\n * Determines the final set of wallet components to be provided by the adapter\n * based on the UI kit configuration and any specified exclusions.\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    '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      '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    'uiKitService',\n    `Extracted component exclusions for ${currentKitName}: ${exclusions.join(', ') || 'none'}.`\n  );\n\n  // TODO: If many more UI kits are added, this conditional logic could be refactored\n  // using a map or strategy pattern to resolve components based on kitName.\n  // For example: const componentFactory = this.kitComponentFactories[currentKitName];\n  // if (componentFactory) { return filterWalletComponents(componentFactory(), exclusions, currentKitName); }\n  if (currentKitName === 'custom') {\n    const allCustomComponents: EcosystemWalletComponents = {\n      ConnectButton: CustomConnectButton,\n      AccountDisplay: CustomAccountDisplay,\n      NetworkSwitcher: CustomNetworkSwitcher,\n    };\n    return filterWalletComponents(allCustomComponents, exclusions, currentKitName);\n  }\n\n  if (currentKitName === 'rainbowkit') {\n    const validation = validateRainbowKitConfig(uiKitConfiguration.kitConfig);\n\n    if (!validation.isValid) {\n      logger.warn(\n        'uiKitService',\n        `Invalid RainbowKit configuration for components: ${validation.error}. No components provided.`\n      );\n      return undefined; // Fail fast for components if config is invalid for RainbowKit\n    }\n\n    // Get RainbowKit components and apply any exclusions\n    const rainbowKitComponents = createRainbowKitComponents();\n    logger.info('uiKitService', 'Providing RainbowKit components.');\n    return filterWalletComponents(rainbowKitComponents, exclusions, currentKitName);\n  }\n  // if (currentKitName === 'connectkit') { /* return ConnectKit components */ }\n  // if (currentKitName === 'appkit') { /* return AppKit components */ }\n  logger.warn(\n    'uiKitService',\n    `UI Kit \"${currentKitName}\" for getResolvedWalletComponents not explicitly supported. No components provided.`\n  );\n  return undefined;\n}\n","import type { TypedEvmNetworkConfig } from '@openzeppelin/adapter-evm-core';\nimport { createUiKit as createCoreUiKit } from '@openzeppelin/adapter-evm-core';\n\nimport { EvmRelayerOptions } from '../transaction';\nimport { EvmWalletUiRoot } from '../wallet/components/EvmWalletUiRoot';\nimport { evmUiKitManager } from '../wallet/evmUiKitManager';\nimport { evmFacadeHooks } from '../wallet/hooks/facade-hooks';\nimport { loadInitialConfigFromAppService } from '../wallet/hooks/useUiKitConfig';\nimport { getResolvedWalletComponents } from '../wallet/utils/uiKitService';\n\nexport function createUiKit(config: TypedEvmNetworkConfig) {\n  return createCoreUiKit(config, {\n    loadCurrentUiKitConfig: loadInitialConfigFromAppService,\n    onConfigureUiKit: (resolvedConfig) => evmUiKitManager.configure(resolvedConfig),\n    getEcosystemReactUiContextProvider: () => EvmWalletUiRoot,\n    getEcosystemReactHooks: () => evmFacadeHooks,\n    getEcosystemWalletComponents: (uiKitConfig) => getResolvedWalletComponents(uiKitConfig),\n    getRelayerOptionsComponent: () => EvmRelayerOptions,\n  });\n}\n"],"mappings":"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"}